Temat: Hashcat cz.2. Atak brute-force z wykorzystaniem zdefiniowanych masek. Ataki slownikowe w praktyce - wstep. Charakterystyka algorytmu bcrypt. Generowanie i weryfikacja hash-y bcrypt za pomoca skryptow .py. 1. W celu utrwalenia umiejetnosci z poprzednich zajec wykonaj generowanie 6 roznych hash-y sha256 za pomoca terminala(bash). Dla porownania dlugosci hashy oraz czasu ich odzyskiwania/lamania, wartosci hasel sa te same co wczesniej. - $ echo -n "163" | sha256sum >> hash_sha256.txt - $ echo -n "th45" | sha256sum >> hash_sha256.txt - $ echo -n "hdksie" | sha256sum >> hash_sha256.txt - $ echo -n "haslo5" | sha256sum >> hash_sha256.txt - $ echo -n "5ddf6"| sha256sum >> hash_sha256.txt - $ echo -n "password" | sha256sum >> hash_sha256.txt Nastepnie wyedytuj plik, usun z kazdego wiersza znak "-" i zapisz zmiany. -$ nano hash_sha256.txt 2. Odzyskiwanie/Lamanie wygenerowanych hash-y sha256 metoda silowa (brute-force). a) uruchomienie programu -$ hashcat -a3 -m1400 hash_sha256.txt -O b) optymalizacja metody brute-force Hashcat uzywajac metody brute-force w teorii powinien sprawdzic kazda mozliwa kombinacje, w praktyce sprawdza wedlug niektorych wzorcow (dla przyspieszenia odzyskiwania/lamania). W celu optymalizacji sprawdzania roznych kombinacji powinnismy wskazac programowi, ktorych znakow jawnie powinien uzywac. Domysle dobieranie znakow przez program nie jest najskuteczniejsze. Jakie znaki ma stosowac okreslaja tzw. maski. c) ponownie uruchom program -$ hashcat -a3 -m1400 hash_sha256.txt -O Podczas uruchomionego programu odszukaj wiersz: "Guess.Charset." jest to miejsce gdzie program informuje z jakich masek korzysta. fragment legendy: ?u - upper - wielka litera ?l - lower - mala litera ?d - digit - cyfra ?s - special character - znak specjalny Wiersz: "Guess.Mask." oznacza kombinacje masek. d) Analiza przykladowych masek W programie hashcat, zapis "Guess.Mask" odnosi sie do maski hasla uzywanej podczas ataku brute-force lub mask attack. Maski te definiuja wzor, wedlug ktorego hashcat probuje zgadywac hasla. Wyjasnienie dwoch przykladow: - Guess.Mask ?1?2?2?2?2?2 [6]: Ta maska mowi hashcat, by probowal hasla skladajace sie z 6 znakow. ?1 oznacza pierwszy rodzaj znaku, ktory jest zdefiniowany gdzies indziej w ustawieniach hashcat. Na przyklad, moze to byc zestaw cyfr (0-9), malych liter (a-z), duzych liter (A-Z), itp. ?2 oznacza drugi rodzaj znaku, rowniez zdefiniowany w ustawieniach. Moze to byc inny zestaw znakow niz ?1. W praktyce, hashcat wygeneruje hasla, gdzie pierwszy znak bedzie pochodzil z zestawu ?1, a nastepne piec znakow bedzie pochodzilo z zestawu ?2. - Guess.Mask ?1?2?2?2?2?2?2 [7]: Ta maska jest podobna do poprzedniej, ale dotyczy hasel skladajacych sie z 7 znakow. ?1 na poczatku oznacza, ze pierwszy znak hasla bedzie pochodzil z pierwszego zestawu znakow. ?2 jest uzyte dla kolejnych szesciu znakow, co oznacza, ze te znaki beda pochodzic z drugiego zestawu znakow. Podsumowujac, te maski pozwalaja hashcat na generowanie hasel wedlug zdefiniowanego wzorca, gdzie rozne miejsca w hasle moga pochodzic z roznych zestawow znakow. To zwieksza efektywnosc ataku poprzez skupienie sie na bardziej prawdopodobnych kombinacjach znakow. 3. Odzyskiwanie/Lamanie wygenerowanych hash-y sha256 metoda silowa (brute-force) z zastosowaniem samodzielnie zdefiniowanej maski. kali Wykonamy atak w ktorym wskazemy jakie znaki ma program sprawdzac: a) typowy atak brute-force: zostana sprawdzone wszystkie mozliwe kmbinacje tzn. male i wielkie litery, cyfry i znaki specjalne na kazdej pozycji w hasle, za taka kombinacje odpowiada parametr: ?a Na poczatku nalezy wygenerowac plik z hash-ami zawierajacymi znaki specjalne: -$ echo -n "r@23" | sha256sum >> hash2_sha256.txt -$ echo -n "r@#23" | sha256sum >> hash2_sha256.txt -$ echo -n "j@#2" | sha256sum >> hash2_sha256.txt -$ echo -n "t4>" | sha256sum >> hash2_sha256.txt -$ echo -n "t4%" | sha256sum >> hash2_sha256.txt -$ echo -n "t8%*" | sha256sum >> hash2_sha256.txt b) pelny atak brute-force: zostana sprawdzone wszystkie mozliwe kombinacje -$ hashcat -a3 -m1400 -w4 hash2_sha256.txt ?a?a?a?a?a?a -i -O OPIS: powtorzone 6 x ?a oznacza ze program bedzie sprawdzal szescio znakowe hasla, parametr -i oznacza iteracje, aby spradzanie rozpoczac od mniejszej liczby znakow c) wyswietlenie wynikow odzyskanych/zlamanych hash-y Do wczesniej podanej skladni hashcat wystarczy dopisac parametr "--show" -$ hashcat -a3 -m1400 -w4 hash2_sha256.txt ?a?a?a?a?a?a -i -O --show d) zapis masek Maski mozna zapisywac jawnie w poleceniu/skladni hashcat jak rowniez jako osobny plik z rozszerzeniem ".hcmack", jego nazwe wraz z rozszerzeniem nalezy wskazac w poleceniu/skladni hashcat. Ataki typu brute-force sa w pelni jesli zostana poprawnie dobrane maski. Wiekszosc nowoczesnych algorytmow hash-ujacych skonstruowana jest w taki sposob (m.in. solenie) aby silowe lamanie hasel trwalo bardzo dlugo. 4. Ataki slownikowe w praktyce. Bcrypt. a) charakterystyka algorytmu bcrypt Algorytm bcrypt jest funkcja skrotu opracowana pierwotnie dla systemu operacyjnego BSD. Jest szeroko uzywany, szczegolnie w kontekscie zabezpieczania hasel. Oto jego kluczowe cechy: - Oparty na Blowfish bcrypt bazuje na algorytmie szyfrowania Blowfish i zostal zaprojektowany przez Nielsa Provos i Davida Mazieres w 1999 roku. Jego konstrukcja opiera sie na modyfikacji algorytmu szyfrujacego Blowfish, dostosowujac go do potrzeb funkcji skrotu. - Soling bcrypt automatycznie integruje sol (unikalny ciag znakow) z kazdym haslem przed jego hashowaniem. Soling jest kluczowym elementem w zapobieganiu atakom slownikowym i rainbow tables (tablice teczowe), poniewaz nawet identyczne hasla po zahashowaniu z roznymi solami dadza rozne wyniki. - Adaptacyjnosc bcrypt pozwala na regulacje intensywnosci dzialania poprzez zastosowanie parametru pracy (cost factor), ktory okresla, ile razy haslo jest przetwarzane. Wiekszy parametr pracy zwieksza czas potrzebny do wygenerowania skrotu, co jest skuteczna obrona przed atakami silowymi, szczegolnie w obliczu rosnacej mocy obliczeniowej. - Odpornosc na Ataki Silowe Dzieki mozliwosci regulowania zlozonosci obliczeniowej, bcrypt jest odporny na ataki silowe. Nawet z wykorzystaniem nowoczesnych GPU, ataki na bcrypt sa znacznie trudniejsze niz na prostsze funkcje skrotu, takie jak MD5 czy SHA-1. - Powszechne Zastosowanie bcrypt jest szeroko stosowany w wielu systemach i aplikacjach do bezpiecznego przechowywania hasel. Jego popularnosc wynika z rownowagi miedzy bezpieczenstwem a wydajnoscia. - Implementacja bcrypt jest dostepny w wielu jezykach programowania i frameworkach, co ulatwia jego wdrozenie w praktyce. Pozostale informacje: Aktualizacja Parametru Pracy: W miare jak sprzet staje sie coraz bardziej wydajny, zaleca sie regularne aktualizowanie parametru pracy, aby utrzymac pozadany poziom bezpieczenstwa. Bezpieczne Uzytkowanie: Pomimo swojej odpornosci, bcrypt powinien byc stosowany z uwzglednieniem najlepszych praktyk bezpieczenstwa, w tym bezpiecznego przechowywania hasel i unikania ich przechowywania w postaci jawnej. bcrypt jest zatem cenionym wyborem dla systemow wymagajacych solidnej ochrony hasel, oferujac dobry kompromis miedzy bezpieczenstwem a wydajnoscia obliczeniowa. b) analiza budowy przykladowego hash-a bcrypt: Hash bcrypt jest zazwyczaj generowany z uzyciem soli oraz okreslonej liczby iteracji algorytmu Blowfish. Przykladowy hash bcrypt: $2b$12$eW5z8x6QeZM4M3oBBPFh6O9APdYnQOqmDX.VF7sYnd1XlysfPLmH2 Oznaczenia poszczegolnych czesci tego hasha: - $2b$: Jest to wersja algorytmu bcrypt. "2b" jest obecnie najczesciej uzywana wersja. - 12$: Jest to "cost factor", ktory mowi, ile razy haslo zostanie przetworzone. W tym przypadku 2^12 iteracji algorytmu Blowfish. Wyzszy "cost factor" oznacza, ze proces hashowania bedzie trwal dluzej, co wzmacnia bezpieczenstwo przed atakami brute-force. - eW5z8x6QeZM4M3oBBPFh6O: Jest to sol uzywana do hashowania hasla. W bcrypt sole sa generowane automatycznie i dolaczane do samego hasha, co zapewnia unikalnosc kazdego hasha nawet dla tego samego hasla wejsciowego. - 9APdYnQOqmDX.VF7sYnd1XlysfPLmH2: Jest to wlasciwy hash hasla. Przy generowaniu hasha bcrypt, nawet niewielka zmiana w oryginalnym hasle (np. zmiana jednej litery) spowoduje powstanie zupelnie innego hasha. Ponadto, dzieki soleniu i wysokiemu "cost factor", ataki slownikowe i brute-force staja sie znacznie trudniejsze. 5.Generowanie i weryfikacja hash-y bcrypt w Linux. Wiekszosc narzedzi do m.in. badania bezpieczenstwa systemow teleinformatycznych dostepna jest w terminalu (bash) systemu Linux, jesli jakies narzedzie nie wystepuje to mozna napisac wlasne samodzielnie z uzyciem Python-a :) a) zainstaluj Python (jesli jeszcze go nie masz) Python jest zazwyczaj zainstalowany domyslnie w wiekszosci dystrybucji Linux. Mozesz sprawdzic, czy masz Pythona, uzywajac polecenia python3 --version w terminalu. Jesli nie jest zainstalowany, mozesz go zainstalowac za pomoca menedzera pakietow swojej dystrybucji, na przyklad dla rodziny Debian (w tym Kali Linux): bash sudo apt-get update sudo apt-get install python3 b) zainstaluj PIP (Python Package Installer) PIP to system zarzadzania pakietami uzywany do instalacji i zarzadzania pakietami Pythona. Jesli nie masz PIP, zainstaluj go za pomoca: -$ sudo apt-get install python3-pip c) zainstaluj biblioteke bcrypt Uzyj PIP do zainstalowania bcrypt: -$ pip3 install bcrypt d) utworz skrypt Python do generowania hashy bcrypt Otworz edytor tekstowy, na przyklad uzywajac nano: -$ nano bcrypt_generator.py Wpisz nastepujacy kod: import bcrypt password = b"moje_tajne_haslo" # haslo powinno byc typu bytes hashed = bcrypt.hashpw(password, bcrypt.gensalt()) print(hashed) Zapisz i zamknij edytor (Ctrl+X, potem Y i Enter). e) utworz skrypt Python do weryfikowania hashy Otworz kolejny plik w edytorze: -$ nano bcrypt_verifier.py Wpisz kod do weryfikacji: import bcrypt password = b"moje_tajne_haslo" # to samo haslo co wczesniej # Zakladamy, ze 'hashed' to haslo zahashowane wczesniej hashed = b'$2b$12$u1aoqj3b2...' if bcrypt.checkpw(password, hashed): print("Match") else: print("Does not match") W miejsce b'$2b$12$u1aoqj3b2...' wstaw zahashowane haslo wygenerowane przez pierwszy skrypt. Zapisz i zamknij edytor. f) uruchomienie Skryptow Uruchom skrypty w terminalu: -$ python3 bcrypt_generator.py i -$ python3 bcrypt_verifier.py Pamietaj, aby w skrypcie bcrypt_verifier.py podac rzeczywiste zahashowane haslo wygenerowane przez bcrypt_generator.py. KONIEC cz.2.