łamanie haseł

Łamanie haseł w chmurze AWS – 221 gigahashy na sekundę

Łamanie haseł – na czym to polega?

Łamanie haseł polega na poszukiwaniu ciągu znaków, z którego przy użyciu funkcji skrótu (np. MD5, SHA) lub innego algorytmu powstał tzw. hash (np. „9743A66F914CC249EFCA164485A19C5C” jest hashem jednego z popularniejszych w naszym kraju haseł ;). Sam hash najczęściej zdobywany jest przez przechwycenie komunikacji sieciowej lub dotarcie do pochodzącej z wycieku bazy danych, w której w takim właśnie formacie zaleca się przechowywanie haseł. Hashe mogą być dodatkowe „solone” lub modyfikowane na inne sposoby, ale to jest temat, który poruszę być może w innym artykule.

Łamanie haseł metodą słownikową

Załóżmy, że mamy już nasz przechwycony, lub w inny sposób pozyskany hash i chcemy się dowiedzieć z jakiego ciągu znaków on powstał, czyli jakie hasło reprezentuje. Ponieważ hashe tworzone są przy użyciu funkcji jednokierunkowych, nie da się z zaszyfrowanego ciągu znaków odzyskać wartości orginalnej. Jedynym sposobem jest zatem szyfrowanie tą samą funkcją kolejnych słów ze słownika i porównywanie otrzymywanych hashy z poszukiwanym wzorcem. Słownik to tekstowa baza danych zawierająca w poszczególnych wierszach słowa (hasła). Od wielkości słownika zależy zatem powodzenie całej operacji. Czym większym słownikiem dysponujemy, tym większa szansa, że znajdzie się w nim poszukiwane hasło. Jednak tutaj pojawia się problem, ponieważ wyliczenie hasha dla każdego z zawartych w słowniku haseł wymaga czasu. Przykładowo jeden z popularnych słowników, który daje już jakieś efekty zawiera ponad 120 milionów haseł w pliku wielkości 1,5 GB. Ale dostępne są też słowniki o rozmiarze dziesiątek gigabajtów, w których znajdują się miliardy haseł. Skąd takie wielkości skoro np. w języku polskim mamy według szacunków około 250 tys. słów? Otóż w słownikach do łamania haseł znajdują się nie tylko słowa z wielu języków i nazwy własne, ale też np. popularne hasła pochodzące z różnych wycieków. Ponadto każde z nich może występować z popularnymi modyfikacjami (np. liczbami i znakami specjalnymi na końcu). Przeszukajmy wspomniany wcześniej słownik zawierający ponad 120 mln. pozycji pod kątem haseł zawierających słowo „Jakub” pisane dużą lub małą literą:

> grep [J,j]akub slownik.txt | wc -l
30886

Jak widać, mamy ponad 30 tys. wyników dla jednego tylko imienia. W słowniku znaleźć też możemy hasła, które wydawać by się mogło wcale nie są hasłami słownikowymi, przykładowo:

00Ar430w
00Avilagw23484light
00bananananananana
+-00000a
zxcvbnm123123
zyciejestpiekne
Zzg2BxS768

Te przykłady wystarczą chyba do zobrazowania jak duże mogą być słowniki i ilu obliczeń wymaga znalezienie hasła na podstawie jego hasha.

Ile czasu zajmuje łamanie hasła?

To zależy oczywiście od wielkości słownika i tego jakim algorytmem został wygenerowany hash. Wartości mogą się bardzo różnić. Używane do łamania haseł narzędzie „hashcat” na moim laptopie z procesorem Intel Core i7 (2 GHz) zwraca następujące wyniki w benchmarku:

intel i7 cracking benchmark

Dla porównania zapamiętajmy wartość 138,7 Mega hashy na sekundę dla funkcji skrótu MD5 (przy okazji widać dlaczego ten algorytm nie jest już uznawany za wystarczająco bezpieczny).

Weźmy jeszcze jeden, bardziej praktyczny przykład – mianowicie łamanie hasła WPA2. Hasło takie łamie się na podstawie przechwyconej komunikacji pomiędzy urządzeniem klienckim a punktem dostępowym w momencie gdy nawiązywane jest połączenie (tzw. handshake). Z użyciem wspomnianego wcześniej słownika zawierającego 120 mln. pozycji na tym samym laptopie trwa to około 20 godzin. Wydaje się to wartością zadowalającą, ale co w przypadku słowników kilkukrotnie większych? Albo gdy w ramach testów penetracyjnych uda nam się przechwycić kilkadziesiąt hashy (bądź handshake’ów)  i wszystkie powinniśmy poddać próbie? Tutaj możliwości zwykłego komputera się kończą.

Jak przyspieszyć łamanie haseł?

Lepsze wyniki da się oczywiście uzyskać na wieloprocesorowych serwerach wyposażonych w bardziej zaawansowane jednostki obliczeniowe, np. Intel Xeon. Ale tutaj przyspieszymy o kilka, może kilkanaście razy. O rząd wielkości możemy natomiast przyspieszyć posługując się już nie procesorami, a układami graficznymi. Wyposażenie komputera w kilka kart dedykowanych do zaawansowanych obliczeń da nam bardzo zadowalające efekty. Do pewnego momentu jednak możliwość skorzystania z tak wydajnej stacji obliczeniowej wiązała się z koniecznością wydatku rzędu kilkudziesięciu tys. złotych. W chwili obecnej jeden z najwydajniejszych na rynku układów obliczeniowych Nvidia Tesla V100 wykorzystywany m.in. do uczenia maszynowego kosztuje około 40 tys. złotych. Czy zwykły śmiertelnik może skorzystać z maszyny wyposażonej w taką kartę? Okazuje się, że tak. I to nie tylko w jedną, ale również cztery lub nawet osiem. Z pomocą przychodzi nam bowiem chmura Amazon Web Services.

Najwydajniejsze maszyny AWS

W chmurze Amazona uruchomić możemy jedną z 3 instancji maszyn wyposażonych we wspomniane układy obliczeniowe:

maszyny aws do łamania haseł

jednak tylko pierwsze dwie maszyny są w chwili obecnej dostępne na żądanie, bez konieczności wykupu określonej liczby godzin. Możemy zatem uruchomić sobie serwer zawierający 8 procesorów Intel Xeon oraz jeden układ Tesla V100 w cenie około $3 na godzinę lub serwer zawierający 32 procesory Intel Xeon i 4 układy Tesla V100 w cenie około $12 na godzinę. Sprawdźmy w praktyce jak takie maszyny będą sobie radziły z tymi samymi zadaniami, które wykonywałem wcześniej na laptopie z procesorem Intel i7 i ile nas to wszystko będzie kosztowało.

Uruchamiamy serwer do łamania haseł

Wśród obrazów systemów gotowych do uruchomienia w AWS mamy najnowszą na dzień dzisiejszy wersję systemu Kali Linux (2019.2). Jego zaletą jest to, że jest to system darmowy i posiada wszystkie potrzebne do łamania haseł narzędzia, a do tego nie wymaga żadnej dodatkowej konfiguracji. Pozostaje nam go jedynie uruchomić i wgrać na dysk słowniki. Na początek dobrze jest wybrać tańszą wersję maszyny aby nie przepłacać bez potrzeby za czas stracony na wgrywanie na serwer słowników. Później będziemy ją mogli wyłączyć i zmienić typ na wydajniejszy. Uruchamiam więc instancję maszyny p3.2xlarge z systemem Kali Linux i wgrywam na niego wspominany wcześniej słownik o wielkości 1,5 GB (w formie skompresowanej 300 MB) oraz testowy plik zawierający handshake WPA2. Cała operacja zajmuje jakieś 30min., a jej koszt około 5zł.  Poniżej wyniki benchmarku (hashcat -b) uruchomionego na tym serwerze:

nvidia tesla v100 benchmark

Pamiętacie 138 MH/s dla MD5 na moim laptopie? Tutaj mamy 55 tys. MH/s. Wzrost prawie 400-krotny! Zobaczmy jeszcze ile zajmie przeszukanie wgranego słownika pod kątem hasła zawartego w testowym handshake-u WPA2:

łamanie wpa2 na nvidia tesla v100 w amazon aws

3,5 minuty w odniesieniu do 20 godzin na laptopie. Wzrost wydajności podobny jak w przypadku benchmarku. Już się nie możecie doczekać co będzie dalej?

Uruchamiamy potwora

Po niecałej godzinie zabawy z pierwszą instancją, która kosztowała mnie ok. 10zł wyłączam serwer i zmieniam jego typ na p3.8xlarge. Nie wymaga to żadnych zmian w systemie, Kali startuje i od ręki widzi 32 procesory Intel Xeon oraz 4 układy Tesla V100. Nie przedłużajmy więc, poniżej wyniki benchmarku:

benchmark hashcat amazon aws p3.8xlarge

Wynik okazuje się przewidywalny. Zamiast jednego układu Tesla V100 mamy cztery, zatem zamiast 55 GH/s mamy ponad 220 GH/s dla algorytmu MD5. Z ciekawości powtórzmy jeszcze test z łamaniem handshake-a WPA2:

łamanie wpa2 na nvidia tesla v100 w amazon aws p3.8xlarge

Tutaj, patrząc po czasie wykonania, wydaje się, że wzrost wydajności nie jest 4-krotny, ale wynika to z faktu, że hashcat przy uruchamianiu inicjalizuje kolejno układy graficzne co zajmuje mu kilka sekund dla każdej karty. Patrząc jednak na parametr „speed” widzimy 2231 kH/s w porównaniu do wcześniejszych 618 kH/s, czyli wszystko się zgadza.

Podsumowując, za niecałe 50zł / godz. otrzymujemy wydajność pozwalającą na łamanie hashy MD5 z prędkością 220 GH/s lub kluczy WPA2 z prędkością 2231 kH/s. Dla gubiących się w jednostkach bardziej obrazowo: ponad 220 miliardów porównań na sekundę dla hasha MD5 i ponad 2 miliony dla klucza WPA2!

Kilka spostrzeżeń na koniec

Z praktycznego punktu widzenia uruchamianie droższej maszyny ma sens tylko wówczas, gdy planujemy dużą ilość porównań z użyciem wielkich słowników. Pamiętajmy, że płacimy za cały czas uruchomienia maszyny, a nie tylko za czas obliczeń. Do wgrywania wielkich słowników najlepiej jest uruchomić możliwie najmniejszą instancję maszyny wirtualnej (np. t2.micro) z dodatkowym dyskiem, a po skopiowaniu i umieszczeniu słowników na tym dysku odpiąć go i podłączyć do wydajniejszej i droższej maszyny, na której będziemy dokonywać obliczeń. Pamiętajcie jednak, że przestrzeń dyskowa powyżej standardowej wielkości zawartej w cenie maszyny (25GB) kosztuje dodatkowo. A nade wszystko pamiętajcie o skonfigurowaniu alertów cenowych na swoim koncie. Gdyby zdarzyło Wam się zapomnieć i pozostawić włączoną na kilkanaście dni maszynę w cenie 12$/godz to zarobek z testów penetracyjnych może nie wystarczyć na pokrycie kosztów :).

 

 

Podobał Ci się tekst? Pomóż nam w jego promocji.

3 komentarze

Leave a Reply

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.