Laboratorium 14 - łamanie haseł

Dlaczego nie przechowujemy haseł otwartym tekstem

Aby zidentyfikować użytkownika potrzebujemy sprawdzić, czy jego hasło jest zgodne z oczekiwanym. Najprostszą metodą jest zapisanie hasła w pliku dostępnym tylko dla uprawnionych programów. Jednak wtedy nawet chwilowe uzyskanie przez atakującego dostępu do tego pliku powoduje, że może on zapisać sobie hasła do późniejszego wykorzystania. Aby obronić się przed tym niebezpieczeństwem zwykle przechowujemy nie samo hasło, a jego skrót otrzymany za pomocą kryptograficznej funkcji skrótu, czyli takiej funkcji haszującej, dla której m.in. jest trudno zgadnąć wartość wejściową znając tylko wartość wyjściową. Gdy użytkownik przedstawia swoje hasło obliczamy dla niego wartość tej samej funkcji skrótu i porównujemy wyniki aby sprawdzić, czy hasło jest poprawne.

Dlaczego czasami przechowujemy hasła otwartym tekstem

Istnieją (stosunkowo rzadkie) przypadki, kiedy nie da się zastosować opisanej wyżej metody. Na przykład mechanizm uwierzytelniania Digest w protokole HTTP wymaga znajomości całego hasła do sprawdzenia, czy przedstawione dane logowania są poprawne -- zyskiem jest brak konieczności przedstawiania przez użytkownika całego hasła.

Solenie hashy, rainbow tables

Samo zastosowanie funkcji skrótu nie wystarcza niestety do zapewnienia bezpieczeństwa: możemy raz obliczyć wartości funkcji dla haseł (np. dla rozsądnej długości) i potem wszędzie gdzie stosowana jest ta sama funkcja skrótu wystarczy znaleźć wynikach hasło odpowiadającemu danej wartości funkcji skrótu. Aby efektywnie wykorzystać tę technikę stosujemy specjalną strukturę danych -- tęczowe tablice. Aby się przed takim atakiem obronić stosujemy solenie, czyli dopisujemy do każdego hasła losową wartość (sól), którą zapisujemy otwartym tekstem razem z hasłem.­Atakujący, aby dostosować swój atak, musiałby obliczyć skróty wszystkich haseł dla wszystkich możliwych wartości soli, co czyni ten atak niepraktycznym.

Łamanie haszy

Brute-force i koledzy

Najprostszą metodą znalezienia hasła jest atak brute-force. Praktycznie wszystkie powszechnie używane funkcje skrótu można efektywnie obliczać na kartach graficznych, na przykład na karcie Nvidia GTX 1080 można obliczać około 2800 milionów skrótów SHA256 na sekundę.

Ataki słownikowe

W praktyce rzadko zdarza się, aby użytkownicy wybierali naprawdę losowe hasła, zazwyczaj są to wariacje na temat słów ze znanych użytkownikowi języków, imion, dat itp. Korzystając z tej wiedzy możemy istotnie zmniejszyć przestrzeń przeszukiwanych potencjalnych haseł, a co za tym idzie czas potrzebny do znalezienia hasła pod warunkiem, że dysponujemy

John the Ripper

Jednym z popularnych darmowych programów do łamania skrótów jest John The Ripper.

Instalacja

apt-get install -y john

Listy słów

Do złamania hasła potrzebujemy listy słów z języka używanego przez użytkowników. Jedną z takich list, udostępnioną do łatwej instalacji w Debiana, znajdziemy w pakiecie wpolish.

Dodatkowo słowa z listy mogą być modyfikowane przez reguły opisujące popularne modyfikacje, takie jak dopisanie jedynki na końcu czy zamiana pierwszej litery na wielką. Więcej o regułach można przeczytać na odpowieniej stronie wiki.

Uruchamianie

Przykładowe sposoby uruchomienia JTR są przystęnie opisane tutaj.

Ćwiczenia (niepunktowane)

Rozgrzewka

Korzystając z programu aspell wygeneruj listę wszystkich słów w języku polskim

Ćwiczenie właściwe

Użytkownik ma hasło o skrócie $6$in0qP2A9H12Z$4cgtWknDOBfJo1m.H9hrHiy7cmkFaHlX1uj.S9AKMXoqchyexcZY2B.ncbua2LdZOHBndDAtRaGog/ktYdW7j/. Wiemy, że hasło jest słowem występującym w przykładowej pracy dyplomowej z literą wstawioną w jakimś miejscu słowa. Przygotuj listę słów dla programu JTR i znajdź za jego pomocą hasło użytkownika.

Materiały