
Decifra rapidamente challenge/risposte MSCHAPv2 utilizzando un database di hash NT.
Cracca rapidamente challenge/response MSCHAPv2/NTLMv1 usando un database di hash NT
Assless CHAPs è un modo efficiente per recuperare l'hash NT usato in uno scambio MSCHAPv2/NTLMv1 se si dispone della challenge e della response (ad esempio da un attacco WPE su WiFi EAP).
Richiede un database di hash NT; le istruzioni su come crearli da liste esistenti o usando hashcat con wordlist e regole sono disponibili più avanti. Ho incluso un database di esempio da SecLists. Dovrai decomprimerlo con bunzip.
Uno scambio MSCHAPv2 non richiede che la password in chiaro venga "craccata", ma solo l'NThash utilizzato.
MSCHAPv2 divide l'NThash in tre parti, e usa ciascuna parte come chiave diversa per crittografare con DES la stessa challenge (derivata dalle challenge peer e authenticator). L'NTHash viene diviso in due chiavi da 7 byte e una chiave da 2 byte. Ciò significa che l'ultima chiave viene riempita con NULL per ottenere la lunghezza richiesta. Questo può essere forzato rapidamente grazie all'efficienza dell'operazione DES e a uno spazio delle chiavi di 65.535. Una volta ottenuti quei due byte, possiamo cercare tutti gli NThash nel nostro database che terminano con quei due byte. Questo fornisce un insieme molto più piccolo di possibili hash da verificare.
Questa è una forma di compromesso spazio/tempo, simile a una rainbow table. È anche una forma di hash shucking.
È stato presentato per la prima volta al Defcon 29's RF Hacking Village. Le slide sono incluse in questo repository.
Ecco il confronto per tre sample challenge/response e tre diverse wordlist: una piccola privata, rockyou e la lista Have I Been Pwned. Test effettuati sul mio Macbook Pro 2016. Hashcat utilizza questo kernel di hash shucking e le due GPU integrate, con un kernel puro anziché ottimizzato (perché quest'ultimo non esiste ancora). Hash3 non è presente nelle liste per simulare le prestazioni nel caso peggiore. Non includo il tempo impiegato da hashcat per costruire la cache del dizionario al primo avvio.
Hash1
Lista piccola:
hashcat 0.50s user 0.27s system 55% cpu 1.405 total (8597.8 kH/s)
assless 0.05s user 0.00s system 294% cpu 0.018 total
Lista rockyou:
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
Lista HIBP:
hashcat 59.97s user 11.72s system 136% cpu 52.603 total (5620.6 kH/s)
assless 0.05s user 0.00s system 292% cpu 0.018 total
Hash2
Lista piccola:
hashcat 0.51s user 0.27s system 55% cpu 1.409 total (8704.7 kH/s)
assless 0.03s user 0.00s system 248% cpu 0.012 total
Lista rockyou:
hashcat 2.20s user 0.46s system 110% cpu 2.409 total (5798.4 kH/s)
assless 0.03s user 0.00s system 231% cpu 0.015 total
Lista HIBP:
hashcat 65.37s user 12.74s system 135% cpu 57.712 total (5768.7 kH/s)
assless 0.03s user 0.00s system 249% cpu 0.013 total
Hash3
Hash3 non esiste in nessuna delle liste per simulare le prestazioni di ricerca nel caso peggiore.
Lista piccola:
hashcat 0.67s user 0.34s system 66% cpu 1.526 total (7550.1 kH/s)
assless 0.02s user 0.00s system 211% cpu 0.012 total
Lista rockyou:
hashcat 2.71s user 0.52s system 94% cpu 3.415 total (5685.4 kH/s)
assless 0.02s user 0.01s system 181% cpu 0.014 total
Lista HIBP:
hashcat 125.19s user 27.62s system 139% cpu 1:49.75 total (5634.9 kH/s)
assless 0.06s user 0.03s system 115% cpu 0.075 total
La versione Rust richiede SQLite 3.6.8 o successivo.
La versione Python richiede python3, sqlite3 e pycryptodome.
L'utility di creazione del database richiede python3 e la CLI di sqlite3.
Questo vale solo per la versione Rust. Avrai bisogno di cargo.
Con cargo installato, basta entrare nella directory assless-chaps-rs e compilare con:
cargo build --release
Il binario risultante si troverà nella directory target/release/.
Assless richiede challenge, response e database di NThash. Opzionalmente, la versione Python può utilizzare il file di lookup a due byte ottimizzato incluso. L'uso più semplice è il seguente:
./assless-chaps <Challenge> <Response> <hashes.db>
Ad esempio:
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
L'output dovrebbe essere simile a:
[-] Two byte lookup file not provided, will brute force instead.
[+] Found in 22636 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
L'hash completo finale 8846f7eaee8fb117ad06bdd830b7586c è l'NT hash di password.
Ho speso un po' di tempo per creare una lista di tutti i 65.535 possibili valori a due byte ordinati per prevalenza su un ampio corpus di password. Questo file è incluso come twobytes. Puoi passarlo come quarto argomento ad assless.
Questo in genere risparmia qualche giro di DES, ma non fa una grande differenza di velocità. Potrebbe se stai elaborando molti hash.
python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes
[+] Found in 65533 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
Il file mksqlitedb.py aiuta a trasformare un file CSV di hash nel database.
python3 mksqlitedb.py <nome database> <file csv>
Il file CSV richiede tre colonne:
Ad esempio, l'hash 8846f7eaee8fb117ad06bdd830b7586c diventa:
586c,8846f7eaee8fb1,17ad06bdd830b7
Una trasformazione regexp di esempio per questo sarebbe:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
Puoi prendere una lista di hash esistente (come le liste Have I Been Pwned) o generare la tua con hashcat e le tue combinazioni preferite di wordlist/regole.
Le liste password HIBP sono già scaricabili come hash NT; basta rimuovere il conteggio dal file e convertirle in formato CSV per importarle nel database.
Questo può essere fatto con l'utility standard Unix sed in questo modo:
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
Successivamente può essere importato usando mksqlitedb.py hibp.db hibp.csv.
Per convertire una wordlist semplice in una lista di hash NT, puoi usare nthasher che gestisce grandi wordlist velocemente. Gli hash risultanti dovranno essere convertiti nel formato CSV richiesto come descritto sopra.
Un nthasher molto più lento che produce direttamente gli hash nel formato CSV richiesto è incluso in questo repository e si esegue semplicemente con:
python3 nthash-from-clear.py <wordlist> > hashlist.csv
Se vuoi espandere la wordlist con regole, vedi la sezione successiva sull'uso di hashcat.
Dovrai apportare una piccola modifica al codice del modulo OpenCL per la modalità 1000 per fargli stampare ogni hash, invece di solo quelli che corrispondono al tuo candidato. Per default, genererà l'hash nel formato CSV corretto richiesto.
OpenCL di hashcat: cd hashcat/OpenCLpatch < m01000_a0-pure.cl.patchecho 11111111111111111111111111111111 > impossible_hashhashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csvpython3 mksqlitedb.py rockyou.db rockyou.csvIl database SQLite è in genere il 61% più grande del file CSV usato per crearlo. Può anche richiedere un po' di tempo per creare il database a seconda della dimensione dei file. Preparati di conseguenza per i requisiti del filesystem.
Ecco un esempio usando il dizionario rockyou:
Potresti risparmiare spazio convertendo e inserendo ogni hash dinamicamente, saltando la necessità del file CSV intermedio.
NTLMv1 funzionerà esattamente allo stesso modo, a meno che non utilizzi SSP. Saprai se SSP è in uso se ottieni una risposta LM che termina con una serie di zeri. Puoi usare lo script incluso ntlm-ssp.py per produrre la challenge del server di cui assless ha bisogno.
Eseguilo in questo modo:
python3 ntlm-ssp.py <lm response> <challenge>
Ad esempio, se usiamo la challenge response NTLMv1-SSP di esempio dagli hashcat example hashes:
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
Passeresti l'LM e la challenge in questo modo:
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
E otterresti la seguente risposta:
The server challenge is: 724edf24aea0d68b
Che può poi essere craccata con assless-chaps come al solito:
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db