To nie jest kolejna analiza 10 milionów haseł
Napisał: Patryk Krawaczyński
24/02/2015 w Bezpieczeństwo Brak komentarzy. (artykuł nr 475, ilość słów: 1436)
J
akiś czas temu konsultant bezpieczeństwa Mark Burnett udostępnił plik zawierający 10 milionów loginów i haseł. Odpowiedzi na różne pytania dotyczące historii stworzenia, struktury itd. tego pliku możemy znaleźć w odpowiedzi na najczęściej zadawane pytania (FAQ). Rzadko zdarza się, że wycieki haseł posiadają takie ilości, a jeszcze rzadziej kiedy ktoś zbiera wycieki przez parę lat, skleja je w jedność i publikuje.
Bardzo szybko powstały różne analizy tego zbioru. Od najprostszych skryptów bash zwracających top 20 popularnych haseł:
export LC_ALL='C' awk '{ print $2 }' 10-million-combos-utf8.txt | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | head -n 20
oraz liczbę wplecionych roczników:
for i in {1900..2015} do echo "$i: `cat passwords.txt |grep $i |wc -l`" done
po trochę bardziej skomplikowane w framework’u Perl, a kończąc na najbardziej zaawansowanych w języku R z ładnymi wykresami w ggplot2. Powstała nawet gra podpowiadająca nam ile % haseł byśmy odgadnęli z tych 10 milionów.
Spróbujmy przeprowadzić w takim razie własną analizę, a że nasze lenistwo nie zna granic użyjemy do tego narzędzia napisanego w języku Python o nazwie PACK (Password Analysis and Cracking Toolkit), którego użycie ogranicza się do wydania polecenia:
python PACK-0.0.4/statsgen.py passwords.txt --hiderare
* plik passwords.txt
zawiera same hasła i został przygotowany poprzez polecenie:
awk '{ print $2 }' 10-million-combos-utf8.txt > passwords.txt
Raport z programu:
_ StatsGen 0.0.3 | | _ __ __ _ ___| | _ | '_ \ / _` |/ __| |/ / | |_) | (_| | (__| < | .__/ \__,_|\___|_|\_\ | | |_| iphelix@thesprawl.org [*] Analyzing passwords in [passwords.txt] [+] Analyzing 100% (9997986/9997986) of passwords [*] Length: [+] 8: 29% (2980856) [+] 6: 25% (2543979) [+] 7: 16% (1662858) [+] 9: 06% (680813) [+] 5: 04% (495019) [+] 10: 04% (471284) [+] 4: 03% (345143) [+] 11: 02% (263464) [+] 12: 01% (190978) [+] 13: 01% (135587) [*] Character-set: [+] loweralpha: 38% (3824585) [+] loweralphanum: 29% (2985680) [+] numeric: 20% (2035149) [+] mixedalphanum: 05% (570968) [+] mixedalpha: 02% (251579) [+] upperalphanum: 01% (110229) [+] upperalpha: 01% (109263) [*] Password complexity: [+] digit: min(0) max(35) [+] lower: min(0) max(40) [+] upper: min(0) max(39) [+] special: min(0) max(24) [*] Simple Masks: [+] string: 41% (4185427) [+] stringdigit: 21% (2173420) [+] digit: 20% (2035149) [+] digitstring: 05% (549643) [+] othermask: 05% (507861) [+] stringdigitstring: 03% (363760) [+] digitstringdigit: 01% (107776) [*] Advanced Masks: [+] ?l?l?l?l?l?l: 11% (1175675) [+] ?l?l?l?l?l?l?l?l: 08% (897376) [+] ?l?l?l?l?l?l?l: 07% (749500) [+] ?d?d?d?d?d?d?d?d: 07% (739504) [+] ?d?d?d?d?d?d: 07% (702940) [+] ?l?l?l?l?l: 03% (314444) [+] ?d?d?d?d?d?d?d: 02% (208532) [+] ?l?l?l?l?l?l?d?d: 01% (199591) [+] ?l?l?l?l?l?l?l?l?l: 01% (196952) [+] ?l?l?l?l: 01% (173537) [+] ?d?d?d?d: 01% (142090) [+] ?l?l?l?l?l?l?l?d: 01% (138451) [+] ?l?l?l?l?l?d: 01% (124788) [+] ?l?l?l?l?l?l?l?l?l?l: 01% (120657) [+] ?l?l?l?l?l?d?d: 01% (119001) [+] ?l?l?l?l?d?d?d?d: 01% (110166) [+] ?l?l?l?l?l?l?d: 01% (107369) [+] ?l?l?l?l?d?d: 01% (104593)
Z przeprowadzonej wstępnie analizy wynika, że najwięcej haseł posiada od 6 do 8 znaków, które są zestawem “loweralpha”, czyli składają się małych liter od “a” do “z”; nie posiadają oczywistej złożoności, ale za to większość z nich może zostać “przysłonięta” maską “ciągu znaków” (ang. string). Ostatnia sekcja: Advanced Masks
zawiera najczęściej występujące maski w formacie hashcat. Jeśli mamy wstępnie przeanalizowany plik – możemy zacząć wdawać się w szczegóły – na przykład przeanalizować tylko te wpisy, które miały największy procent (41%) prostej maski – czyli:
python PACK-0.0.4/statsgen.py passwords.txt --hiderare --simplemask string -q
Dalsze kroki i bardziej zaawansowane użycie reszty narzędzi z PACK znajdziemy na stronie Petera Kacherginskiego. Warto również zapoznać się z jego prezentacją z konferencji PasswordsCon13, z której wynika, że szybkie łamanie haseł nie powinno ograniczać się tylko do szybkiego sprzętu, ale wykrywania i analizy wzorów na podstawie jakich są one najczęściej tworzone.
Więcej informacji: Automatic password rule analysis and generation