Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
assless-chaps — Decifra rapidamente challenge/risposte MSCHAPv2 utilizzando un database di hash NT. | Kitploit
Strumenti/GitHubGitHub/sensepost/assless-chaps
Password CrackingAuditing Wi-FiAnalisi HashCrittografiaPenetration Testing
GitHubsensepost/assless-chaps

assless-chaps

Decifra rapidamente challenge/risposte MSCHAPv2 utilizzando un database di hash NT.

Vedi Repository
1411927 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

assless-chaps

Cracca rapidamente challenge/response MSCHAPv2/NTLMv1 usando un database di hash NT

Introduzione

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.

Tecnica

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.

Presentazione

È stato presentato per la prima volta al Defcon 29's RF Hacking Village. Le slide sono incluse in questo repository.

Velocità

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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
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

Installazione

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.

Compilazione

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/.

Utilizzo

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:

root@kitploit:~
[-] 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.

Lookup a due byte - Solo Python

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

root@kitploit:~
[+] Found in 65533 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c

Creare il proprio dizionario di hash

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:

  • Gli ultimi due byte dell'hash (gli ultimi quattro caratteri ASCII)
  • I primi 7 byte (i primi 14 caratteri ASCII)
  • I secondi 7 byte (i caratteri ASCII dal 15° al 29°)

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.

Utilizzo di Have I Been Pwned

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.

Conversione di una wordlist in una lista di hash

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.

Utilizzo di hashcat per creare un file CSV di hash da wordlist e regole

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.

  • Accedi alla directory OpenCL di hashcat: cd hashcat/OpenCL
  • Applica la patch: patch < m01000_a0-pure.cl.patch
  • Prepara un file con un hash NT impossibile da craccare, ad esempio: echo 11111111111111111111111111111111 > impossible_hash
  • Cracca normalmente, ma disabilita il potfile e reindirizza l'output su un file: hashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csv
  • Crea il database degli hash: python3 mksqlitedb.py rockyou.db rockyou.csv

Nota su spazio su disco e dimensioni dei file

Il 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:

  • Dizionario base rockyou: 129M
  • rockyou.csv generato da hashcat: 462M
  • Database SQLite risultante rockyou.db: 746M
  • BZip2 compressione massima rockyou.db.bz2: 339M

Potresti risparmiare spazio convertendo e inserendo ogni hash dinamicamente, saltando la necessità del file CSV intermedio.

NTLMv1 SSP

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

Scarica lo strumento