Łamanie haseł (hash cracking) część pierwsza

Opublikowany: 02-05-2011 16:37 przez Krystian

Odkąd moja zawodna pamięć sięga wstecz pytany byłem niezliczaną ilość razy (nawet podczas pisania tego artykułu) o to "jak złamać hasło do x?", albo "jak włamać się na czyjeś konto na x?" gdzie x to znany serwis udostępniający pocztę, portal społecznościowy, nazwa systemu operacyjnego czy co tam jeszcze jest związanego z komputerami i zabezpieczane hasłem.


Zacznę od samego początku i spraw podstawowych, dla wielu osób oczywistych. Trochę miejsca mi to zajmie, za to lepiej wejdę w temat i dokładniej go omówię. W kilku miejscach pojawią się odnośniki do stron, które rozwiną dane zagadnienie, ponieważ sam nie jestem w stanie w sensownym czasie napisać o wszystkim.


Jest to część pierwsza, pierwsza z dwóch dodam. W drugiej dokładniej skupię się na konkretnych atakach z użyciem konkretnych narzędzi, na konkretnych danych, które wyciekły do Internetu z różnych serwisów.


Wstęp

Gro osób niebędących informatykami ma skrzywione (głównie przez Hollywood i kiepskich dziennikarzy, których obecnie mamy na kopy) postrzeganie tematu haseł i ich łamania. Z pewnością nieścieralne piętno odcisnęły tu filmy, w których genialne autystyczne dziesięciolatki (lub źli naukowcy, którzy po x latach wyszli z paki, albo genialni zahukani spece od IT z pryszczami na twarzy), po kilkudziesięciu sekundach myślenia coś tam wklepują na klawiaturze i obchodzą wszystkie zabezpieczenia systemu, lub podają z miejsca poprawne hasło. Bywały też inne filmy, w których grupa bohaterów rozważa głośno czy hasłem jest data urodzin kuzyna ze strony ojca terrorysty (czy innego gamonia, który akurat robi za "złego", który nie kocha hamburgerów, coli, "demokracji" i wujaszka Sama), czy może jego rozmiar buta pomnożony przez liczbę Pi i podzielony przez cenę chrzanu w pobliskim spożywczaku, a może panieńskie nazwisko matki jego pokojówki. W końcu jeśli ktoś planuje zniszczyć świat, to z pewnością nie będzie specjalnie głowił się nad hasłem. Przecież wydał grube miliony na kupno (głowicy atomowej z dawnego bloku wschodniego)/(bakterii wąglika z państwa trzeciego świata)/(broni chemicznej od arabów)/(kosmicznej technologii od skorumpowanego pułkownika USA Army, chcącego dorobić sobie do emerytury) - niepotrzebne skreślić, więc już się wystarczająco natrudził. Gdzie by tam miał głowę do jakiegoś długiego i skomplikowanego hasła.


Oczywiście jest to z mojej strony pewne przerysowanie, delikatna karykatura (z drugiej strony niezbyt odległa od fabuł konkretnych filmów), chciałem zwrócić uwagę na pewne oderwanie się od rzeczywistości i szybowanie przez scenarzystów wysoko ponad chmurami. Mówię rzecz jasna o filmach, które aspirują do miana realistycznych, lub w miarę realistycznych z punktu widzenia przeciętnego widza. Pomijam więc wszystkie filmy, gdzie hakowanie itd. odbywa się w jak w jakieś z d*** wyjętej przestrzeni 3D, a zabezpieczeniem systemu jest trójwymiarowy smok, którego haker pokonuje machając cyfrowym mieczem, bo i takie kurioza przyszło mi poznać kiedy z jakiś przyczyn jedyną możliwą chwilowo rozrywką był telewizorek.


Nie chodzi wcale o to, że wcześniejsze przykłady (te z trzeciego akapitu) są zupełnie wyssane z palca. Oparte są na rzeczywistych problemach, o których już za chwilę. Po prostu te rozwiązania są niebywale oklepane, przez co straszliwie nudne (za to jest już klasyczne, tak jak klasyczne są bronie bez limitu amunicji w magazynku na filmach). Wszak w tego typy produkcjach wszystko musi być jasne i oczywiste, albo białe, albo czarne, żeby przypadkiem widz nie musiał uruchomić mózgu pomiędzy upchnięciem popcornu w gębie, a siorbnięciem koli. "Zły i bogaty" (lub zły i z plecami czy jak tam się scenarzyście wykoncypowało) musi być głupi, a dobry koniecznie cwany. Inaczej światopogląd przeciętnego widza legnie w gruzach. Zły i ogarnięty to byłoby nie do przełknięcia, mogłoby wywoływać koszmary senne oraz nocne moczenia u nieszczęsnego widza.


Miłą odmianą była druga część Matrixa. Gdzie Trinity najpierw wyszukuje nmap’em otwarte porty, a potem korzysta z jakiegoś starego exploita na ssh, którego demon na filmowym serwerze nie był załatany. Widać jak się chce to można zrobić coś co się kupy trzyma. Nie jest to jedyny film, sam nmap pojawił się chociażby w Ultimatum Bourna, Szklanej Pułapce 4.0 oraz w kilku innych produkcjach. Nie zawsze więc jest tak tragicznie (-:


Tworzenie haseł - myślenie użytkownika

Zostawmy z boku filmy i zajmijmy się czymś konkretnym. Prawdą jest, że większość używanych haseł jest stosunkowo prosta lub przewidywalna. Zrobiłem na potrzeby tego artykułu mały research w sieci i utworzyłem mini ranking najpopularniejszych haseł. Naturalnie jeśli ktoś brał pod uwagę inne dane pobrane z innych serwisów mógłby mieć nieco inne wyniki. W każdym razie najpopularniejsze to:


1. 123456
2. password
3. qwerty
4. letmein
5. iloveyou
6. abc123
7. princess

Do tego rzecz jasna dochodzi w zależności od nazwy serwisu hasło będące nazwą serwisu (o ile podczas zakładania konta takie hasło może zostać podane). Jeśli chodzi o pierwszą pozycję w rankingu to ilość kolejnych cyferek zależy od minimalnej długości hasła, więc dla serwisu, który dopuszcza wszystko powyżej 5 znaków będzie to właśnie 123456, zaś dla takich, które chcą powyżej 8 będzie to 123456789. BARDZO popularne są również imiona (własne oraz ukochanej/ukochanego tudzież psa/chomika/kreta czy innego stwora). W zasadzie gdyby podsumować rankingi, na które natrafiłem w Internecie, to większość haseł to właśnie imię. Fakt, że imion jest sporo nie poprawia jednak niczego. Popularne są również nazwy dyscyplin sportowych, wulgaryzmy czy nazwy organów płciowych (-:


Przerażać może fakt, że te siedem powyższych pozycji to około 3% (patrząc po tych danych, które ja uwzględniałem) wszystkich haseł w większości serwisów. Razem z mutacjami cyferkowymi (od 123456 do 123456789), imionami, nazwami dyscyplin sportowych, przekleństwami i nazwami organów płciowych z stanowią przytłaczającą większość. Na dodatek jak łatwo zauważyć, większość z nich ogranicza się głownie do małych liter.


No dobrze, ale co jest przyczyną tego stanu? Z pewnością głównie ludzka natura, czyli podświadome lub świadome ułatwianie sobie życia (czyli "po co mam mieć długie i trudne hasło, skoro mogę mieć łatwe, z pewnością nikt nie będzie chciał dostać się do mojego konta!"). Rzeczywiście, 99,99 % osób może mieć rację, zwłaszcza jeśli mówimy o kontach, które mają wartość bliską zeru.


Chciałem w pierwszej chwili do ludzkiej natury dodać jeszcze rosnącą ilość kont na coraz większej ilości serwisów, ale jest to nieprawda. To w zasadzie nie ma wpływu, bo większość osób korzysta albo z haseł mających związek z daną stroną (przykładowo: antonimyspace, antonigmail, antoniyoutube), albo z jednego dla wszystkich serwisów. Można łatwo stracić przez to całą cyfrową tożsamość, zwłaszcza jeśli dotyczy to też loginów do kont.


Parę lat temu zrobiłem ze znajomym małe badania nad zachowaniem się użytkowników pewnej strony oraz pracowników pewnej firmy w zależności od polityki związanej z hasłami. Niech naszym przykładem będzie nieśmiertelne rodzime hasło, czyli "dupa". Nie chodzi o konkretne przykłady tylko o ogólne zachowania userów jakie zaobserwowaliśmy. Pozwala to przeanalizować tok myślenia. Zaczynamy od zwykłej dupy, ograniczonej limitem trzech znaków. Dupa w sam raz pasuje, bo ma cztery znaki. Po zmianie limitu na 5 znaków dupa okazała się za krótka (vide za wąska, wedle uznania czytelnika i jego poziomu humoru), więc kreatywnie leniwi użytkownicy tworzą mutacje w rodzaju: dupadupa, dupaaaa, dupa i jakieś znaczki do niej doklejone (do wyrazu oczywiście, a nie dosłownie!), zwykle litery lub cyfry sąsiadujące ze sobą na klawiaturze. Po dodaniu kolejnego ograniczenia, które wymaga, aby była minimum jedna mała i minimum jedna duża litera pojawiają się rozwiązania w stylu Dupadupa, dUPADUPA itd. Czyli cały czas najprościej jak się da do zapamiętania. Kiedy dochodzi kolejne ograniczenie, wymagające użycia minimum jednej cyfry na początku hasła pojawiła się jedna cyfra lub na końcu hasła pojawiła się jedna cyfra (czasem powtórzona kilka razy), lub cyfry "123", czy coś podobnego. Gdyby do tego trzeba było użyć jednego znaku specjalnego zapewne pojawiłby się za cyframi. W każdym razie pojawia się pewnego rodzaju wzorzec. Ustalmy, że takim końcowym efektem jest Dupadupa123* - hasło uznane za silne (pośladki ze stali) przez większość skryptów sprawdzających (-:


Tutaj pojawia się sporo miejsca na eksperymenty przy procesie zwanym łamaniem hasła, do którego esencji przejdziemy za kilkanaście akapitów.


Typowe błędy

Im bardziej bezwartościowe zasoby chroni hasło tym większa szansa na przetrwanie w cyfrowej dżungli. Problem pojawia się kiedy hasło z powyższej grupy zabezpiecza coś interesującego. Taka sytuacja wynika przeważnie z nieświadomości zagrożenia, błędnej oceny wartości chronionego obiektu, lub wprowadzenia do środowiska produkcyjnego urządzenia (czy czegoś co ma hasło) wprost z testów bez zmiany hasła tymczasowego. Przykładowo może być to laptop, stacja robocza, urządzenie sieciowe, z tymczasowym kontem administratora, które zwykle tworzone jest w dziale IT kiedy sprzęt przygotowywany jest do pracy. W końcu znacznie wygodniej się pracuje kiedy wszędzie konto roota ma przykładowo nazwę będącą nazwą firmy i powiedzmy z prostym hasłem "test". To dość typowe, sam się z czymś takim spotkałem. Nie jest to problem dla większości osób, w końcu na tych maszynach nie ma jeszcze poufnych danych firmy. Kłopoty mogą jednak wyniknąć jeśli jeden z pracowników działu będzie miał niezbyt przyjazne zamiary, przez to będzie mógł zainstalować co chce na wszystkich urządzeniach. Drugim problemem jest sytuacja kiedy to konto tymczasowe nie zostanie usunięte, chociażby przez zwykłe przeoczenie. Jeden router czy komputer z taką słabością może otworzyć drogę do całej sieci zewnętrznemu intruzowi. W końcu obrona jest tak silna jak silny jest najsłabszy jej element.


Jeśli chodzi o pierwszy przypadek, czyli nieświadomość zagrożenia to zawsze łączy się to z brakiem wiedzy użytkownika. Jedyny środek zaradczy to edukowanie, lub rozbudowane skrypty analizujące wprowadzane hasło - za krótkie? do poprawki, brakuje dużej litery, cyfry, znaku specjalnego? do poprawki, zawiera, nazwę serwisu/firmy? do poprawki, zawiera popularny wyraz ze słownika? do poprawki. Fakt, że jest to rozwiązanie bardzo niewygodne dla szarego użytkownika, to w miejscach z wartościowymi danymi coś takiego jest po prostu nieodzowne.


Druga sprawa, czyli błędna ocena wartości, nie wymaga chyba większych wyjaśnień. Na tym samym opierają się w sporej części ataki socjotechniczne. Budując tożsamość, czy też pracując nad zwiększeniem zaufania sprawnemu socjotechnikowi wystarczy garść pozornie właśnie bezwartościowych dla większości pracowników informacji.


Wektory ataku - wstęp

Wystarczy już tego nieco mętnego wywodu. Najprościej będzie przejść przez cały proces "pracy z hasłem" i zatrzymać się w punktach, w których możliwy jest atak. Nie będę wchodził jeszcze w szczegóły techniczne, wybranymi technikami zajmiemy się dalej.


Mamy więc naszego osobnika, który popijając poranną kawę siedzi przed swoim komputerem i chce dostać się do swojego konta na pewnej stronie internetowej, lub jeśli siedzi w pracy to chce zalogować się na swój profil, który jest mu niezbędny do wykonywania czynności służbowych.


Wektory ataku - głowa

Pierwszy wektor mamy zanim jeszcze palce naszego hipotetycznego osobnika dotkną klawiatury komputera. Jest to atak socjotechniczny. Dzwoni do niego facet (zakładamy scenariusz, że siedzi w pracy). Przedstawia się jako Ben Smith z działu IT. Co prawda nasz osobnik nie zna Bena osobiście, jednak słyszał o nim w kilku rozmowach na korytarzu. Wie, że jest to szef działu IT. Ben pyta czy nasz osobnik może zalogować się na swoje konto służbowe. Osobnik stwierdza z przerażeniem, że nie ma zupełnie dostępu do sieci, ani zewnętrznej ani wewnętrznej. Ben uspokaja go wspominając o rekonfiguracji sprzętu sieciowego, która powinna skończyć się lada moment. Obiecując szybkie załatwienie sprawy prosi o podanie hasła. Osobnik podaje je bez wahania.


Typowy atak socjotechniczny, wyssany z palca oczywiście, chociaż realny w pełnym wymiarze. Socjotechnik zebrał informacje na temat szefa działu IT. Tuż przed telefonem do naszego osobnika zadzwonił jeszcze do działu IT, lub konkretnie do ludzi od sieci i podszywając się pod kogoś jeszcze innego poprosił o odłączenie na kilka minut (ze względu chociażby na "wymianę sprzętu" czy coś w tym rodzaju, wywołując u niego "awarię") naszego osobnika. Na nim zadziałał autorytetem (wszak dzwoni nie byle kto, sam szef działu IT), obietnicą pomocy (fajnie, ktoś chce mi pomóc w pracy!) oraz bezczelnością (przecież żaden haker nie będzie dzwonił do mnie i pytał o hasło).


Idziemy dalej. Nasz osobnik ma już ręce na klawiaturze i myszce. Teraz otwiera przeglądarkę, wklepuje adres strony i … no dostał się pod ogień DNS Cache Poisoning lub czegoś dającego podobny efekt. Teoretycznie wszedł na stronę, na której chciał być jednak na jego nieszczęście jest to podróbka. Wprowadzone dane lądują u hakera.


Wektory ataku - 127.0.0.1

Załóżmy jednak, że nic takiego się nie zdarzyło. User jest na właściwej stronie i wszystko gra. Wpisuje hasło i jeszcze zanim naciśnie enter zostaje zaatakowany. To sprzętowy keylogger pomiędzy wtyczką klawiatury, a portem komputera, który podłożyła mu żona chcąc dostać się do jego kont na portalach i do komunikatorów oraz poczty elektronicznej, i sprawdzić czy jej przypadkiem nie zdradza.


Gdyby akurat nie miał żony i ogólnie nie było żadnego sprzętowego keyloggera, pozostaje jeszcze keylogger programowy, który na komputerze mógł pojawić się zupełnie przypadkiem. Chociażby kiedy jego ośmioletni kuzyn przyszedł z rodzicami i bawił się przy komputerze kiedy dorośli rozmawiali i pili kawę w pokoju obok. Albo kiedy sam użytkownik znudzony łóżkową rutyną szukał piersiastych blondynek w Internecie i kliknął przypadkiem jakieś okienko, chociaż jednak nic nie pobrał. Lub gdy dostał maila, mówiącego o wielkiej wygranej lub spadku od Pana Johnssona z Nigerii i otworzył zaciekawiony załącznik do listu.


Jak zaatakować? No cóż, trzeba stać się architektem ludzkiego umysłu. Dzięki temu możliwy będzie atak socjotechniczny niezależnie czy to przez telefon, czy przez email. Trzeba zainwestować w sprzętowego keyloggera, albo go samemu zbudować. W tym drugim przypadku mamy szersze pole do popisu, można chociażby przerobić klawiaturę, tak aby konieczne było rozmontowanie w celu dojrzenia loggera. Obie te sprawy wykraczają po za temat tego artykułu. Programowego keyloggera można samemu zrobić (hmmm niezły temat na oddzielny artykuł), albo skorzystać z gotowego, których pełno w Internecie. Radziłbym jednak przetestować go (sprawdzić, co i gdzie wysyła) najpierw w wirtualnym środowisku, żeby przy okazji nie zrobił i nam "kuku", albo żebyśmy nie oberwali rykoszetem.


Przeciwdziałanie jest stosunkowo nietrudne. Wystarczy myśleć (to jednocześnie mało i dużo w dzisiejszych czasach), co skutecznie pomiesza szyki większości socjotechników niezależnie od wektora ataku. Można posprawdzać połączenia fizyczne, czy czasem coś nie tkwi w dziwnym miejscu udając przejściówkę. Przed softwareowymi keyloggerami obroni nas skanowanie systemu (przynajmniej przed pewną częścią). Przyda się też zerknąć na listę zainstalowanych programów, bo czasem keylogger jest częścią programu do zdalnej administracji. Do tego również analiza aktywnych procesów, chociaż sprawa będzie utrudniona jeśli keylogger podróżuje razem z rootkitem.


Powiedzmy jednak, że system jest czysty. Nikt niczego złowrogiego nie umieścił w nim, a strona jest prawdziwą stroną, na której nasz osobnik chciał się zjawić.


Wektory ataku - PoLANie (no w sensie takie plemię)

Wciska więc ten nieszczęsny enter i hasło idzie w świat. No może świat to wielkie słowo, ponieważ ciekawski sąsiad z sieci osiedlowej postanowił się pobawić w ARP Poisoning i przeprowadził atak MITM. Nasz osobnik zalogował się na swoje konto, ale po drodze wszystkie informacje przeszły przez komputer wścibskiego sąsiada.


Gdyby jednak siedział w pracy to samo mogłoby się przytrafić, ale również coś nieco innego. Możliwe, że ze względów na oszczędności nasz osobnik wpięty jest razem z całym pomieszczeniem nie do switcha, lecz do huba i problemem nie jest wścibski sąsiad lecz, ciekawski kolega ze stanowiska/pokoju obok, który bez wysiłku (bez okłamywania przełącznika dokonującego mikrosegregacji) zbiera wszystkie ramki jakie docierają do jego komputera po włączeniu karty sieciowej w tryb nasłuchu.


Raczej niewielki są szanse, że gdzieś na WANie hasło zostanie podpatrzone, chociaż oczywiście nie można wykluczyć i tego scenariusza.


Jak dokonać tego typu ataków? ARP Poisoning można wykonać chociażby za pomocą prostego skryptu pod UNIXem z wykorzystaniem jakiegoś craftera pakietów. Istnieją rzecz jasna gotowe programy, które zrobią to za nas. Nie będę się nad tym rozwodził tutaj, wystarczy wpisać ARP Poisoning w ulubioną wyszukiwarkę i znaleźć co trzeba. Oczywiście i tutaj wypada przetestować to wcześniej. W przypadku huba wystarczy przełączyć kartę w tryb nasłuchu, można to zrobić za pomocą sterownika, jeśli umożliwia takie wygibasy, albo za pomocą programu z sieci. Teraz wystarczy tylko odpalić ulubionego sniffera, jak chociażby Wireshark i wyszperać co nam potrzeba.


Atak na WANie? Jeśli uda nam się przejąć jakieś urządzenie pośredniczące to czemu nie. Można by też rozważyć fizyczne podłączenie się pomiędzy LANem, a WANem chociażby, chociaż to zadanie bardzo trudne (skrajnie), a i wpadka to już sprawa poważna podchodząca pod szpiegostwo przemysłowe. Nie jest to oczywiście niewykonalne (-:


Przeciwdziałanie opiera się z jednej strony na umiejętnościach administratora sieci, który można temu przeciwdziałać na różne sposoby. Można oczywiście samemu przyglądać się tablicy ARP i sprawdzać czy przypadkiem coś dziwnego się z nią nie dzieje.


Najlepszym rozwiązaniem jest oczywiście szyfrowane połączenie zdalne. SSL, SSH itd. a już idealnie jeśli można zestawić VPN. Konkretnie do uwierzytelnienia można użyć SRPP (Secure Remote Password Protocol), który nie wysyła hasła tylko matematyczny dowód na znajomość tego hasła (-:


Pozostałe Wektory

No dobrze nie są to wszystkie możliwe przypadki punktów gdzie hasło może wyciec. W końcu może dojść do sytuacji, że strona, na której się logujemy została zaatakowana, a w wyniku ataku pobrano całą bazę danych. Wiele tutaj zależy od ogarnięcia projektanta strony, czy hasła są składowane bezpiecznie (o tym w drugiej części). Inna sprawa to atak konkretnie na nasze konto polegający na pełnym przeglądzie wszystkich haseł. Wypadałoby, żeby strona ograniczała to w jakiś sposób. Chociażby blokując konto po 10 nieudanych próbach logowania. Jest to oczywiście sposób ataku bardzo brutalny i nieelegancki.


Strona techniczna

Zajmijmy się samą esencją procesu łamania haseł. Pomińmy kwestię kiedy do dyspozycji mamy hasło w formie czystego tekstu - przykładowo po podsłuchaniu w sieci lokalnej lub przez keyloggera. Zostawmy też ataki na szyfrowane połączenie, to temat na oddzielny artykuł.


Hasło przechowywane jest (w zasadzie to powinno być bo czasem tak nie jest) w formie skrótu zwanego hashem. Pojęcie hasha jest głównym zagadnieniem łamania haseł. Funkcja hashująca to algorytm, który zmienia nasze hasło na odpowiednią dla danego algorytmu formę. Podstawą jest to, żeby ta zmiana była jednoznaczna, czyli, żeby dla danego hasła był jeden i tylko jeden wynik obliczeń. Użyjmy przykładu:


Hasłem naszym będzie wspomniana wcześniej Dupadupa123* funkcja hashująca to SHA256. W wyniku procesu wyliczania funkcji skrótu otrzymaliśmy:

44a5b5a700e62e377f717aeea76e36c8194ac9dc65c0e0165aca122a53682ccb

Siła funkcji hashujących polega na tym, że nie można odwrócić procesu i otrzymać pierwotnego hasła. Dlatego też mówi się o tych funkcjach jako o jednokierunkowych funkcjach skrótu.


Kolejna ważna sprawa to różnice w wyniku pomiędzy bardzo podobnymi hasłami. Łatwo to udowodnić. Zmieniamy nasze hasło na dupadupa123* nie zmieniliśmy żadnego znaku, jedynie zamiast dużego D mamy małe d. A wynik? Proszę bardzo:

3bb282ce26e24f52ee2dc942a6cff0305fc7fbab297d06945c4dd53d84f40f0b

Nie ma podobieństwa nawet w najmniejszym stopniu. Nie ma więc mowy o oszukaniu poprzez podanie podobnego hasła (-:
Dla rozruszania kilka haszy dla hasła Dupadupa123* wygenerowanych przez różne algorytmy:


Md4 23c7fb858bc9bd2a1f7db3a85f288573
Md5 dfd3d5822e27b67afbeb8ac893851856
Md5md5 d29c5ee11d69446711e5feef2e62ea87
Sha1 320fee48975d5d5219e90c6134afed7ecb1a032c
Sha256 44a5b5a700e62e377f717aeea76e36c8194ac9dc65c0e0165aca122a53682ccb
Sha384 72da8b131b0c4299fe6f8fbb32d1087307d487f9848e5e35aea6db90c758979ed14a2f752af82eb6da633a01654feb66
Sha512 390ec594301728dd62dc74f7c673209ad08929dedd13e1b1193b4ff911b9d943f31f2c3b6b3c0c9350dd58cee0860ec4c7768e24e2ab90f17246ee233989cd86
Ripemd128 e8dea118e11e3dc865be40138b983382
Ripemd256 d14fc32fd14a394412fb703dca78744d0e4e3249620853ae6444fd85e4b4a890
Ripemd320 2350894b5bee552ff2ba5eefb560eeb48e36f2b782c25a8dbafbb9cb339b93eda9ce9121438eaf92
Whirlpool b8737c75507d9f6331ab49ae85ddcee35f0630779e856d54cf0de6c57e27387ff4edb10bc43a57ac811ee87ecb5f64ec06eb98886d7b10cc38975b939bdae126
Tiger192,3 ba13161635b3c56a33a4442e313998d900d5ff43e5ef0230
Tiger192,4 7b23f1abdff35814e36620e8487f85b9dccfacec2080defd
Snefru 33129ab09301cf30980706e6084c222f128780dc7db93528c69e4ec280df94c2
Gost 5100d96f57141fa2a35f764db4affebc5c9549480cbfbe61b6aa793ca336a1c4
Crc32 7bac3318
Crc32b 03a4bd7f
Haval128,3 a88f1b651368d86558e960d8e1c0a969
Haval256,3 716b0b45d33a951ad341924654f269770077f166206b5c3031124f4a3ec515ff
Haval128,4 994245e6469ce7584545e8cbc104c039
Haval256,4 89ff7332173987a913eb863fe5cc148abddc54b211f6c31d4a09ac015d1dbee4
Haval128,5 7f1690e846289a53fe0814e66282c981
Haval256,5 b18af2223df3ced325b6a75b6a3438ad4dd65967ed24c9cf9a7377fbe1a0fc4f
base64 RHVwYWR1cGExMjMq

Jak widać mamy wyniki różnej długości. Bardzo istotne jest, aby odwzorowanie było jednoznaczne w obie strony. ¯eby jeden skrót odpowiadał jednemu hasłu, albo, żeby trafienie na podobieństwo było skrajnie trudne. Oczywiście jeśli wartości wejściowe są krótkie (przykładowo krótsze niż wynik skrótu) to do kolizji dojść musi. Nie można jednak pozwolić, żeby dochodziło do nich zbyt często. Prawdopodobieństwo szybkiego znalezienia kolizji musi być odstraszająco niskie (-:


Przykład z historii. W Outlooku używany był (również dotyczy to najnowszej wersji nie wiem, wersja 2007 użyta została jako przykład) CRC32 do zabezpieczenia hasłem archiwum PST. CRC32 nie był zaprojektowany jako funkcja skrótu. Wykorzystywany był do tworzenia krótkich sum kontrolnych, chociażby do sprawdzania czy pakiet, ramka czy cokolwiek innego nie zostało uszkodzone podczas transmisji w sieci. Lub do szybkiego wyliczenia sumy pliku w celu sprawdzenia, czy ktoś przypadkiem go nie modyfikował. To widać oczywiście na pierwszy rzut oka, bo dla naszego hasła Dupadupa123* efekt pracy CRC32 to :


2143134723

Bardzo krótki skrót. Wystarczy znaleźć inne hasło, które da nam tę samą wartość skrótu CRC i już mamy dostęp. Nie musimy nawet zgadnąć hasła. Wystarczy odnaleźć poszukiwaną kolizję CRC (-:


Problem jak wspomniałem dotyczy każdej funkcji skrótu, skala problemu zależy od długości ciągu wyjściowego.
Ok, koniec gadania, czas na przykład prosto z życia!


Mamy archiwum .pst wygenerowane przez Outlooka 2007. Atakujemy je znanym i lubianym narzędziem specjalnie przeznaczonym do tego, czyli PstPassword firmy Nirsoft, do pobrania pod tym adresem. Sposób jest bardzo prosty, uruchamiamy PstPassword, wybieramy sobie plik .pst z archiwum, zaznaczymy go i wciskamy F8, lub wybieramy "Get More Passwords" i po chwili mamy listę wszystkich pasujących haseł, które mają kolizję z naszym prawdziwym hasłem. ¯eby dostać się do zawartości owego archiwum podajemy dowolne hasło z tej listy. Każde będzie pasować, bo każde generuje taką samą wartość hasha CRC :


3705358653

Wcale nie musimy wiedzieć, że hasło to rotfl1, bo mamy pokaźną listę pasujących do niego wyników, które nam wystarczają do dostania się do archiwum. Kilka wyników dających ten sam rezultat co rotfl1:


gZCDjP
4UEWCQ
vkigmR
XkEnjY
WxT3LZ
1pGw0g
b2lYtn
NChsGp
qrnYGy
Cp3l9z
3LBiiz

Mam nadzieję, że przykład był ciekawy. Każdy zresztą może sam w ciągu kilku minut sprawdzić u siebie, że to działa. Umiejętność dostania się do czyjegoś archiwum .pst może się czasem przydać (-;


Brute-force CPU

Dobrze to jeszcze na koniec mała pokazówka. Zaatakujemy za pomocą pełnego przeglądu (Brute-force) następujące hasła zhashowane za pomocą funkcji SHA1: dupa, dupadupa oraz Dupa123. Porównamy dzięki temu czas jaki potrzebny jest na złamanie różnej długości hasła o różnej złożoności. Zrobimy to za pomocą narzędzia hashcat oraz oclhashcat/cudahashcat. Dwa razy, raz korzystając z CPU (hashcat) raz z… karty graficznej (cudahashcat), bo to potężne narzędzie, które nie tylko potrafi generować piękne sceny w grach komputerowych, ale też wykonywać złożone obliczenia. Zobaczmy różnice pomiędzy nimi. Do roboty!


Zaczynamy od hashcata, który wykorzysta moc naszych procesorów (ile ich tam w systemie mamy). Otwieramy notatnik i umieszczamy tam wcześniej wygenerowany hash dla hasła dupa. Uruchamiamy hashcata, zaznaczamy plik wejściowy, wybieramy też wyjściowy gdzie zapisany będzie nasz wynik. Wybieramy metodę ataku - brute-force oraz zakres znaków. To bardzo ważne, ponieważ zbyt szeroki zakres spowoduje, że obliczenia trwać będą bardzo długo. Dopuszczamy się więc oszustwa i wybieramy tylko małe litery. Jak widać dla hasła dupa, atak trwał bardzo krótko. Cztery znaki to stanowczo za mało na hasło.


Oczywiście jest tu pewne oszustwo, wiemy, że hasło to małe litery, dlatego trzeba wykonać 26*26*26*26, czyli 456 976 operacji. Stosunkowo niewiele. Gdyby hasło składało się z jednej małej litery, z jednej dużej i jednego znaku specjalnego, a dodatkowo nie wiedzielibyśmy co na której pozycji występuje musielibyśmy wykonać, aż 26 (małe) + 26 (duże)+ 10 (cyfry) + 33 (specjalne) operacji na każdym z czterech pól to daje 95 do czwartej potęgi czyli 81 450 625 operacji hashowania. To 178 razy więcej niż przy haśle składającym się z samych małych liter. Różnica już poważna.


Czas teraz na zdublowaną dupę. Wszystko pozostawiamy bez zmian. Jak widać czas potrzebny na złamanie hasła jest już całkiem duży. Na screenie widać, że sprawdzenie wszystkich kombinacji poniżej 8 znaków zabrało 26 minut. Znalezienie dupadupa (8 znaków) zabrało prawie 7 godzin. Wymagało dokonania 26 do 8 potęgi operacji, czyli 208827064576. Oczywiście nie wykonaliśmy wszystkich operacji, musielibyśmy to zrobić gdyby nasze hasło było dokładnie ostatnią kombinacją. Widać pojawia się tutaj pewien hazard. Gdyby tak było zabrałoby to prawie pół dnia.


Możemy wyliczyć ile mojemu CPU zabierają czasu różne obliczenia. W przypadku SHA1 procesor jest w stanie wykonać nieco ponad 5 milionów porównań. Bazując na tej wielkości można wyliczyć różny czas poszukiwań dla różnych długości hasła. Wszystkie wyniki są maksymalne, czyli pesymistyczne. Można natrafić na poszukiwaną wartość znacznie szybciej, jednak pesymistyczny wariant nadal obowiązuje. Można za to z 50% prawdopodobieństwem założyć, że wystarczy połowa poniższego czasu.


Zacznijmy może od haseł złożonych z samych małych liter (podstawa to 26 znaki):


4 znaki (np. dupa) - 1/10 sekundy
5 znaków (np. dupad) - nieco ponad 2 sekundy
6 znaków (np. dupadu) - nieco ponad minuta
7 znaków (np. dupadup) - 26 minut
8 znaków (np. dupadupa) - 11 i pół godziny
9 znaków (np. dupadupad) - 301 godzin (12 i pół dnia)
10 znaków (np. dupadupadu) - 7842 godzin (326 dni, czyli prawie rok)

Widać, że powyżej pewnej wielkości na tym procesorze (dość stary dwurdzeniowy Athlon) atak siłowy staje się pozbawiony sensu.


Przeliczmy teraz przypadek kiedy hasło składa się z małych i dużych liter (podstawa to 52 znaki):


4 znaki (np. DuPa) - 1,5 sekundy
5 znaków (np. DuPaD) - 76 sekund
6 znaków (np. DuPaDu) - 65 minut
7 znaków (np. DuPaDuP) - 57 godzin
8 znaków (np. DuPaDuPa) - 2969 godzin (123 dni)

Obliczenia jeszcze szybciej tracą sens. Zobaczmy jeszcze sytuację kiedy hasło składa się z małych i dużych liter oraz z cyfr (podstawa 62 znaki):


4 znaki (np. DuP1) - 3 sekundy
5 znaków (np. DuP12) - 3 minuty
6 znaków (np. DuP12D) - 190 minut (ponad 3 godziny)
7 znaków (np. DuP12Du) - 196 godzin (8 dni)
8 znaków (np. DuP12Du1) - 505 dni

I gwoli redaktorskiej ścisłości przypadek kiedy mamy małe i duże litery, cyfry oraz znaki specjalne (95 znaków w sumie, zakładając 33 znaki specjalne):


4 znaki (np. Du1&) - 16 sekund
5 znaków (np. Du1&P) - 25 minut
6 znaków (np. Du1&Pa) - 40 godzin
7 znaków (np. Du1&Pa3) - 161 dni

Czyli marnie. Znalezienie rozwiązania dla niby śmiesznego hasła, które pojawiło się wcześniej Dupadupa123*zajęłoby na tym procesorze 3,5 mld lat (niech mnie pręt reaktora w pięty połechce jeśli się mylę). Jak można poprawić ataki brute-force?


Zacznijmy może od wymiany procesora na szybszy i zaopatrzony w większą ilość rdzeni. Weźmy więc współczesny procek Intela wart około tysiąc złotych - Core i7. Cztery rdzenie, każdy 3 razy wydajniejszy niż rdzenie w moim komputerze. Moc obliczeniowa jest więc 6 razy większa, to daje 30 milionów wyliczonych hashy na sekundę. Przyspieszenie sześciokrotne daje nam taki czas obliczeń:


7 znaków (np. dupadup) - 4,3 minuty
8 znaków (np. dupadupa) - niecałe 2 godziny
9 znaków (np. dupadupad) - 50 godzin
10 znaków (np. dupadupadu) - 54 dni
7 znaków (np. DuPaDuP) - 9 i pół godziny
8 znaków (np. DuPaDuPa) - 494 godzin (20 dni)
7 znaków (np. DuP12Du) - 32 godziny
8 znaków (np. DuP12Du1) - 84 dni
6 znaków (np. Du1&Pa) - 6 godzin 40 minut
7 znaków (np. Du1&Pa3) - 27 dni

Nieźle, jest sens sprawdzenia nieco dłuższych haseł. Jednak nadal to rozwiązanie jest bardzo nieefektywne dla dużych wartości. Dalszą poprawę przyniosłoby dołożenie kolejnych procesorów. Zauważmy jednak, że taki przyrost "mocy ogniowej" jest liniowy, podczas gdy złożoność haseł wzrasta geometrycznie, więc jakkolwiek byśmy do tego się nie zabrali od tej strony, w którymś wykres zaczyna się rozjeżdżać i zabawa przestaje się opłacać.


Zostało nam ostatnie hasło. Przyznam się, że nie ma sensu liczyć tego na moim komputerze, Dupa123 jest dla procesora zbyt złożona. To 62 do 7 potęgi, co zabrałoby mi 196 godzin (ponad 8 dni).


Brute-force GPU

Jak wygląda to przy wykorzystaniu oclhashcata oraz potęgi GPU? Popatrzmy. Dupa, nie stanowi przeszkody (wiem, głupio brzmi), podobnie jak nie stanowiła jej wcześniej. Jak widać również dupadupa nie zabrała wiele czasu - 28 sekund (to prawie nic w porównaniu czasem, który spędził nad tym samym procesor!). Usprawiedliwieniem jest fakt, iż wartość znaleziono po przeszukaniu zaledwie 0,42% wszystkich możliwości. Widać jednak zdecydowaną przewagę GPU. Ponadto GPU jest w stanie łamać jednocześnie bardzo dużą ilość hashy, wszystko dzięki niebywale rozwiniętej równoległości obliczeń.


Wykonałem też test dla Dupa123. Jak widać zajęło to tylko 9 minut, chociaż również i w tym przypadku bardzo szybko trafiliśmy na rozwiązanie (w najgorszym przypadku zabrałoby to nam nawet 30 godzin!).


Na screenie zauważyć można, że GPU jest w stanie wykonać 31 milionów porównań SHA1, to tyle co podany wcześniej najnowszy czterordzeniowiec, a jego przeciwnikiem jest marna karta, bo to 8600GT, kupiona ponad 3 lata temu za około 300zł (obecnie można na śmietniku taką wygrzebać) (-: Cenowym odpowiednikiem tamtego procesora jest Radeon 5870, który jest w stanie dokonać w ciągu sekundy… 2,3 miliarda porównań SHA1, to jest 74 razy więcej niż 8600GT oraz procesor o tej samej cenie. Różnica jest kolosalna! 74 krótszy czas obliczeń, prawdziwy potwór. Zobaczmy jak to się odbija na realnym czasie obliczeń:


7 znaków, same małe (np. dupadup) - 3,5 sekundy
8 znaków, same małe (np. dupadupa) - 90 sekund
9 znaków, same małe (np. dupadupad) - 39 minut
10 znaków, same małe (np. dupadupadu) - 17 godzin
7 znaków, małe i duże (np. DuPaDuP) - 7 i pół minuty
8 znaków, małe i duże (np. DuPaDuPa) - 6 i pół godziny
7 znaków, małe, duże oraz cyfry (np. DuP12Du) - 25 minut
8 znaków, małe, duże oraz cyfry (np. DuP12Du1) - 26 godzin
6 znaków, małe, duże, cyfry oraz znaki specjalne (np. Du1&Pa) - nieco ponad 5 minut
7 znaków, małe, duże, cyfry oraz znaki specjalne (np. Du1&Pa3) - 8 i pół godziny

Zeszliśmy w zasadzie o rząd wielkości w dół, to co zabierało minuty zabiera sekundy, to co zabierało godziny zabiera minuty itd.


Można oczywiście zbudować zestaw taki jak ten, złożony z wielu jeszcze mocniejszych kart. Jest w stanie wykonać nawet 14.1B/sec wyliczeń SHA1 nadal jest to mało na pokonanie 12 znakowego hasła, o którym nic nie wiemy (kolejność i ilość znaków różnego typu), a składa się i z małych i z dużych liter oraz z cyfr i znaków specjalnych.


Ufff, wystarczy już tej brutalności. Czuję się jak jaskiniowiec machający pałką, bo do tego można brute-force porównać. Co prawda dzięki postępowi jaskiniowiec zamiast maczugi ma głowice atomowe (zestawy najpotężniejszych kart graficznych), dalej jednak koszt złamania hasła jest nieproporcjonalnie duży. W drugiej części zajmiemy się czymś znacznie subtelniejszym i eleganckim. Porównując to do broni zamiast głowic atomowych użyjemy snajperów, którzy będą mieli precyzyjne cele do zdjęcia, lub ulotnych niczym noc wojowników ninja. Chirurgiczna precyzja to będzie podstawa naszych działań w drugiej części. They’ll never know what hit them (-:


See ya soon, bro
Brak komentarzy