Metodyka odzyskiwania haseł

Do tworzenia tego artykułu będę posługiwał się dwoma programami (hashcat i oclhashcat), dwoma gdyż oclhashcat+ i oclhashcat-lite uznajemy jako pakiet oclhashcat. Możliwości tych programów zostały opisane już w temacie “Jak łamać hashe?”, więc nie będę tego przypominał, teraz posługiwać będziemy się tylko trybem tekstowym (u mnie konsola linux).

Zacznijmy od pokazania jakie opcje posiada:

hashcat:

agilob@Asus-PC:~/Tools/hashcat$ ./hashcat-cli64.bin -h
hashcat, advanced password recoveryUsage: ./hashcat-cli64.bin [options] hashfile [wordfiles|directories]
Startup:
-V, --version print version
-h, --help print help
--eula print eula
Logging and Files:
--remove enable remove of hash from hashlist once it is cracked
-r, --rules-file=FILE rules-file for hybrid-attack
-o, --output-file=FILE output-file for recovered hashes
--output-format=NUM 0 = hash:pass
1 = hash:hex_pass
2 = hash:pass:hex_pass
-e, --salt-file=FILE salts-file for unsalted hashlists
--debug-file=FILE debug-file
--debug-mode=NUM 1 = save finding rule (hybrid only)
2 = save original word (hybrid only)
3 = save mutated word (hybrid and attack mode 5 only)
-p, --seperator-char=CHAR seperator-char for hashlists
Resources:
-n, --threads=NUM number of threads
-c, --segment-size=NUM number of mb to cache from wordfile
-s, --words-skip=NUM skip number of words (for resume)
-l, --words-limit=NUM limit number of words (for distributed)
Attacks:
-g, --generate-rules=NUM number of self-generating rules
--generate-rules-func-min=NUM force number of functions per rule min
--generate-rules-func-max=NUM force number of functions per rule max
-a, --attack-mode=NUM number of attack-mode
0 = Straight *
1 = Combination *
2 = Toggle-Case
3 = Brute-Force
4 = Permutation
5 = Table-Lookup
* = for Hybrid-Attack use -r or -g
-m, --hash-mode=NUM number of hash-mode
0 = MD5 200 = MySQL
1 = md5($pass.$salt) 300 = MySQL4.1/MySQL5
2 = md5($salt.$pass) 400 = MD5(Wordpress)
3 = md5(md5($pass)) 400 = MD5(phpBB3)
4 = md5(md5(md5($pass))) 500 = MD5(Unix)
5 = md5(md5($pass).$salt) 600 = SHA-1(Base64)
6 = md5(md5($salt).$pass) 700 = SSHA-1(Base64)
7 = md5($salt.md5($pass)) 800 = SHA-1(Django)
8 = md5($salt.$pass.$salt) 900 = MD4
9 = md5(md5($salt).md5($pass)) 1000 = NTLM
10 = md5(md5($pass).md5($salt)) 1100 = Domain Cached Credentials
11 = md5($salt.md5($salt.$pass)) 1200 = MD5(Chap)
12 = md5($salt.md5($pass.$salt)) 1300 = MSSQL
30 = md5($username.0.$pass)
31 = md5(strtoupper(md5($pass)))
100 = SHA1 1400 = SHA256
101 = sha1($pass.$salt) 1600 = MD5(APR)
102 = sha1($salt.$pass) 1700 = SHA512
103 = sha1(sha1($pass)) 1800 = SHA-512(Unix)
104 = sha1(sha1(sha1($pass)))
105 = sha1(strtolower($username).$pass)
Toggle-Case specific:
--toggle-min=NUM number of alphas in plain minimum
--toggle-max=NUM number of alphas in plain maximum
Brute-Force specific:
--bf-pw-min=NUM password length minimum
--bf-pw-max=NUM password length maximum
--bf-cs-buf=CHARS charset for attack
Permutation specific:
--perm-min=NUM number of chars in plain minimum
--perm-max=NUM number of chars in plain maximum
Table-Lookup specific:
--table-min=NUM number of chars in plain minimum
--table-max=NUM number of chars in plain maximum
--table-file=FILE table file

Jak widać stek bzdur… spora ilość obsługiwanych hashy rzuca się w oczy.

oclhashcat:

agilob@Asus-PC:~/Tools/hashcat$ ./oclhashcat64.bin -h
oclHashcat, advanced password recoveryUsage: ./oclhashcat64.bin [options] hashlist dict_left|mask_left dict_right|mask_right
Startup:
-V, --version print version
-h, --help print help
--eula print eula
Logging and Files:
--quiet enable quiet
--remove enable remove of hash from hashlist once it is cracked
-o, --output-file=FILE output-file for recovered hashes
--output-format=NUM 0 = hash:pass
1 = hash:hex_pass
2 = hash:pass:hex_pass
-e, --salt-file=FILE salts-file for unsalted hashlists
Resources:
-d, --gpu-devices=STR CUDA devices to use, seperate with comma
-n, --gpu-accel=NUM workload tuning: choose 1, 8, 40, 80 or 160
scales best if you choose the number of SP per SM
--gpu-loops=NUM workload fine-tuning if -n is not precise enough
Built-in charsets:
?l = abcdefghijklmnopqrstuvwxyz
?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
?d = 0123456789
?s = !"#$%&'()*+,-./:;<=>?@[]^_`{|}~
?h = ISO-8859 characters from 0xc0 - 0xff
Custom charsets:
-1, --custom-charset1=CS user-definable charsets
-2, --custom-charset2=CS example:
-3, --custom-charset3=CS --custom-charset1=?dabcdef
-4, --custom-charset4=CS sets charset ?1 to 0123456789abcdef
Attack options:
--increment enable increment mode
-j, --rule-left=RULE rule applied to each word from left dict
-k, --rule-right=RULE rule applied to each word from right dict
Attack modes:
-m, --hash-mode=NUM number of hash-mode
0 = MD5 200 = MySQL
1 = md5($pass.$salt) 300 = MySQL4.1/MySQL5
2 = md5($salt.$pass) 900 = MD4
3 = md5(md5($pass)) 1000 = NTLM
5 = md5(md5($pass).$salt) 1100 = Domain Cached Credentials
100 = SHA1
101 = sha1($pass.$salt)
102 = sha1($salt.$pass)

1.

Po pierwsze musisz mieć jakiś słownik. Byle jaki, żeby miał tylko koło 100MB, później będziesz go poszerzał przy okazji odzyskania nowych haseł (też metodą brute-force).

Do pokazu używali będziemy pliku przykladowabaza.txt ktory zawiera kilkaset tysięcy hashy md5.

Moje ulubione opcje hashcata to:

-g n | która sporządza n reguł według których tworzy kolejne hasła z podanego słownika, czyli jeśli w słowniku jest wyraz “kot” opcja stworzyć może wyraz “Kot”, “Kot1”, “kot1”, “koT”, “kot1234”, “kot!” itp. Używane tylko przy słownikowym ataku.

-a 4 | opcja ta łączy słowniki, każdy wyraz z pierwszego słownika z każdym z wyrazów z drugiego słownika.

-a 5 | opcja ta działa podobnie do tego z regułami, używa jednak odpowiednich reguł, zapisanych w pliku, wg nich mutuje wyrazy odczytane ze słownika. Wymaga pliku z “tablicami zamian”.

–remove | po co trzymać w pliku z hashami odzyskane hasło? Opcja usuwa taki hash.

-o plik.txt | chyba każdy rozumie

2.

Pokaz.

Jak widać poniżej plik przykladowabaza.txt zawiera 704993 hashy:

agilob@Asus-PC:~/Tools/hashcat$ wc -w przykladowabaza.txt
704993 przykladowabaza.txt

Sprawdzimy jaki będziemy wynik pod koniec odzyskiwania.

Najpierw usuń hasła słownikowe z pliku, żeby później bruteforce szybciej działał.

agilob@Asus-PC:~/Tools/hashcat$ ./hashcat-cli64.bin przykladowabaza.txt –remove -o odzyskane.txt slowniki/1.txt

Ja tej komendy teraz nie wykonam ze względu na zbyt duże słowniki, odzyskałem przypadkiem 72% bazy co mija się z celem pokazania innych metod ;)

3.

Brute-force przez GPU.

agilob@Asus-PC:~/Tools/hashcat$ ./oclhashcat64.bin przykladowabaza.txt --remove -o odzyskane.txt -1 ?d?s?l ?1?1?1?1 ?1?1?1 --increment
oclHashcat v0.25 starting...
<p>Powyższy zapis oznacza tyle co:</p>
<p>z pliku przykladowabaza.txt bierz hashe, odzyskane wrzucaj do odzyskane.txt, szukaj haseł do długości 7znaków zbudowanych z:</p>
<p><em>?d</em> - cyfr</p>
<p><em>?l</em> - małych liter</p>
<p><em>?s</em> - znaków specjalnych</p>
<p>Twórz wszystkie możliwe permutacje.</p>
Status....: Running
Mode.Left.: Mask '?1?1?1?1' (22667121)
Mode.Right: Mask '?1?1' (4761)
Speed.GPU*: 148.5M/s
Recovered.: 35640/622478 Digests, 0/1 Salts
Progress..: 98266060800/107918163081 (91.06%)
Running...: 8 mins, 0 secs
Estimated.: 1 min, 5 secs

Jak widać samych 5 i 6 znakowych haseł odzyskało dość dużo, na koniec 7znakowych nie czekałem, przerwałem wykonywanie programu ze względu na czas.

4.

Moja ulubiona opcja:

-g 1000 | stworzy dla każdego słowa ze słownika 1000 kombinacji innych wyrazów, powstałych na bazie tego słownikowego.

Do boju!

agilob@Asus-PC:~/Tools/hashcat$ ./hashcat-cli64.bin przykladowabaza.txt --remove -o odzyskane.txt slowniki/2 -g 1000
Initializing with 8 threads and 32mb segment-size...
NOTE: press enter for status-screen
Added hashes from file przykladowabaza.txt: 579327 (1 salts)
Added rules from rule-generator: 1000
Wordlist..: slowniki/2
Index.....: 1/67 (segment), 3032520 (words), 33550346 (bytes)
Recovered.: <strong>44392</strong>/577638 hashes, 0/1 salts
Speed/sec.: 23.81M plains, 23.81k words
Progress..: 478592/3032520 (15.78%)
Running...: 00:00:00:20
Estimated.: 00:00:01:47

Opcja warta odczekania i po zakończeniu powtórzenia, o ile odzyskane hasła, doda się do słownika, co go bardzo wzmocni.

5.

(nie)słownikowe hasła.

spora ilość ludzi tworzy hasła typu:

misio1992

czy

asia1234

jak łatwo odzyskać jakie hasła?

agilob@Asus-PC:~/Tools/hashcat$ ./oclhashcat64.bin przykladowabaza.txt -o odzyskane.txt –remove slowniki/1.txt ?d?d?d?d
oclHashcat v0.25 starting…

polecenie to dopisze do każdego wyrazu ze słownika ?d?d?d?d

gdzie

?d to dowolna cyfra

czyli z każdego wyrazu stworzy 10 000 kombinacji dodając na koniec wyrazu 4 cyfry. Odzyskasz dzięki temu hasła, które na końcu mają jakiś rok czy są celowo przedłużane by “wzmocnić hasło”.

Czasochłonna, jednak warta tego metoda, to samo należy zrobić z poleceniem, ale dodając po słowniku, jak i przed słownikiem!

?d?d?d

?d?d

?d

I tutaj już tylko 1,2,3 znakowe końcówki.

-1 ?l?s

?1?1?1

?1?1

?1

Czyli razem 13 poleceń dla oclhashcat’a.

6.

Rules and tables:

Mój plik rules dla hashcata, tak bardzo obszerny, jak ktoś lubi mieć ciepło w pokoju to tym można zastąpić oclhashcata.

rule

Plik z tables, do opcji -a 5

table

7.

oclhashcat ostateczny brute-force.

Skoro słownik już dokładnie przeczesany, haseł zostało mało do odzyskania, to pora na ostateczny brute-force, czyli szukanie najdziwniejszych haseł, które da się odzyskać na szybko brute-forcem.

Polega to na niczym innym jak na brute-force z nietypowymi dla haseł znakami, np. polskie litery.

W oclhashcat dostępne pod wyrażeniem ?h.

agilob@Asus-PC:~/Tools/hashcat$ ./oclhashcat64.bin przykladowabaza.txt –remove -o odzyskane.txt -1 ?d?s?h?l ?1?1?1 ?1?1?1 –increment
oclHashcat v0.25 starting…
[Total: 0    Average: 0/5]