
Quebre desafios/respostas MSCHAPv2 rapidamente usando um banco de dados de hashes NT
Quebre desafios/respostas MSCHAPv2/NTLMv1 rapidamente usando um banco de dados de hashes NT
Assless CHAPs é uma maneira eficiente de recuperar o hash NT usado em uma troca MSCHAPv2/NTLMv1 se você tiver o desafio e a resposta (por exemplo, de um ataque WiFi EAP WPE).
Requer um banco de dados de hashes NT, instruções sobre como criá-los a partir de listas existentes ou usando hashcat com wordlists e regras estão disponíveis abaixo. Incluí um banco de dados de exemplo do SecLists. Você precisará descomprimir com bunzip.
Uma troca MSCHAPv2 não exige que a senha em texto claro seja "quebrada"; em vez disso, precisamos apenas do NThash usado.
MSCHAPv2 divide o NThash em três partes e usa cada parte como chaves diferentes para criptografar DES o mesmo desafio (derivado dos desafios do par e do autenticador). O NTHash é dividido em duas chaves de 7 bytes e uma chave de 2 bytes. Isso significa que a última chave é preenchida com NULLs para formar uma chave do comprimento necessário. Isso pode ser rapidamente forçado por brute force devido à eficiência da operação DES e a um espaço de chaves de 65.535. Uma vez que temos esses dois bytes, podemos procurar todos os NThashes em nosso banco de dados que terminam nesses dois bytes. Isso fornece um conjunto muito menor de hashes possíveis para verificar.
Esta é uma forma de compromisso entre espaço e tempo, semelhante a uma tabela rainbow. Também é uma forma de hash shucking.
Isso foi apresentado pela primeira vez no Defcon 29's RF Hacking Village. Os slides estão incluídos neste repositório.
Aqui está a comparação para três amostras de desafio/resposta e três wordlists diferentes: uma pequena privada, rockyou e a lista Have I Been Pwned. Os testes foram feitos no meu Macbook Pro 2016. O Hashcat está usando este kernel de hash shucking e as duas GPUs integradas, e um kernel puro em vez de otimizado (pois este último ainda não existe). Hash3 não está nas listas para simular o pior caso de desempenho. Não estou incluindo o tempo que o hashcat leva para construir o cache do dicionário na primeira execução.
Hash1
Small hashlist:
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
Rockyou hashlist:
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
HIBP hashlist:
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
Hash 2
Small hashlist:
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
Rockyou hashlist:
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
HIBP hashlist:
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
Hash 3
Hash 3 doesn't exist in any of the hashlists to simulate a worst case lookup performance.
Small hashlist:
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
Rockyou hashlist:
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
HIBP hashlist:
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
A versão em Rust requer SQLite 3.6.8 ou mais recente.
A versão em Python requer python3, sqlite3 e pycryptodome.
O utilitário de criação do banco de dados requer python3 e a CLI do sqlite3.
Isso se aplica apenas à versão em Rust. Você precisará do cargo.
Com o cargo instalado, basta mudar para o diretório assless-chaps-rs e compilar com:
cargo build --release
O binário resultante estará no diretório target/release/.
O Assless requer o desafio, a resposta e o banco de dados de NThashes. Opcionalmente, a versão em Python pode usar o arquivo de consulta de dois bytes otimizado incluído. O uso mais simples é assim:
./assless-chaps <Challenge> <Response> <hashes.db>
Por exemplo:
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
A saída deve parecer com:
[-] 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
O hash completo final 8846f7eaee8fb117ad06bdd830b7586c é o hash NT para password.
Passei algum tempo construindo uma lista de todos os 65.535 valores possíveis de dois bytes, ordenados pelos mais prevalentes em um grande corpus de senhas. Este arquivo está incluído como twobytes. Você pode simplesmente passá-lo como o quarto argumento para o assless.
Isso geralmente economiza algumas rodadas de DES, mas não faz uma grande diferença de velocidade. Pode fazer se você estiver processando muitos hashes.
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
O arquivo mksqlitedb.py ajudará a transformar um arquivo CSV de hashes no banco de dados.
python3 mksqlitedb.py <database name> <csv file>
O arquivo CSV requer três colunas:
Por exemplo, o hash 8846f7eaee8fb117ad06bdd830b7586c se tornará:
586c,8846f7eaee8fb1,17ad06bdd830b7
Um exemplo de transformação regexp para isso seria:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
Você pode usar uma lista existente de hashes (como as listas Have I Been Pwned) ou gerar a sua própria usando hashcat e suas combinações favoritas de wordlist/regras.
As listas de senhas HIBP já são baixáveis como hashes NT, basta remover a contagem do arquivo e convertê-las para o formato CSV para serem importadas para o banco de dados.
Isso pode ser feito usando o utilitário Unix padrão sed da seguinte forma:
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
Após o que pode ser importado usando mksqlitedb.py hibp.db hibp.csv.
Para converter uma wordlist simples em uma hashlist de nthashes, você pode usar nthasher, que processa grandes wordlists rapidamente. Os hashes resultantes precisarão ser transformados no formato CSV necessário, conforme descrito acima.
Um nthasher muito mais lento, que gera os hashes diretamente no formato CSV necessário, está incluído neste repositório e é executado simplesmente com:
python3 nthash-from-clear.py <wordlist> > hashlist.csv
Se você quiser expandir a wordlist com regras, veja a próxima seção sobre o uso do hashcat.
Você precisará fazer uma pequena alteração no código do módulo OpenCL do modo 1000 para fazê-lo gerar todos os hashes, em vez de apenas aqueles que correspondem ao seu candidato de quebra. Por padrão, ele gerará o hash no formato CSV correto necessário.
OpenCL do seu 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.csvO banco de dados SQLite é tipicamente 61% maior que o arquivo CSV usado para criá-lo. Também pode levar algum tempo para criar o banco de dados, dependendo do tamanho dos arquivos. Prepare os requisitos do seu sistema de arquivos adequadamente.
Aqui está um exemplo usando o dicionário rockyou:
Você poderia economizar espaço convertendo e inserindo cada hash dinamicamente, pulando a necessidade do arquivo CSV intermediário.
NTLMv1 funcionará exatamente da mesma forma, a menos que esteja usando SSP. Você saberá se o SSP está em uso se obtiver uma resposta LM que termina em vários zeros. Você pode usar o ntlm-ssp.py incluído para produzir o desafio do servidor que o assless precisará.
Execute assim:
python3 ntlm-ssp.py <lm response> <challenge>
Por exemplo, se usarmos o exemplo de desafio/resposta NTLMv1-SSP dos hashes de exemplo do hashcat:
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
Você passaria o LM e o desafio assim:
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
E obteria a seguinte resposta:
The server challenge is: 724edf24aea0d68b
Que pode então ser quebrado com assless-chaps normalmente:
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db