NFsec Logo

To nie jest kolejna analiza 10 milionów haseł

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

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , , , , ,

Komentowanie tego wpisu jest zablokowane.