
BitCracker é a primeira ferramenta de código aberto para quebra de senhas em unidades de memória criptografadas com BitLocker.
O BitCracker é a primeira ferramenta de cracking de senhas de código aberto para dispositivos de armazenamento (Disco Rígido, Pendrive USB, cartão SD, etc...) criptografados com BitLocker, um recurso de criptografia disponível no Windows Vista, 7, 8.1 e 10 (edições Ultimate, Pro e Enterprise). O BitLocker oferece diferentes métodos de autenticação para criptografar um dispositivo de armazenamento, como Trusted Platform Module (TPM), Smart Card, Senha de Recuperação, Senha fornecida pelo usuário.
Através de um ataque de dicionário, o BitCracker tenta encontrar a Senha de Usuário correta ou a Senha de Recuperação para descriptografar o dispositivo de armazenamento criptografado. Ele foi implementado em CUDA e OpenCL.
Vários periódicos atrasaram a publicação do nosso artigo sobre o BitCracker (quase 3 anos, com rejeição final após várias revisões) que explica os detalhes do nosso ataque, o formato de volume BitLocker Drive Encryption (BDE) e possíveis fraquezas no procedimento de criptografia/descriptografia. Finalmente, publicamos o artigo aqui: https://arxiv.org/abs/1901.01337 . Por favor, sinta-se à vontade para comentar e compartilhar.
Para executar o BitCracker-CUDA, os requisitos mínimos são:
Para executar o BitCracker-OpenCL, os requisitos mínimos são qualquer GPU ou CPU compatível com OpenCL (você pode encontrar ajuda aqui.
O BitCracker requer pelo menos 260 MB de memória do dispositivo.
Recomendamos fortemente executar seu ataque em uma GPU em vez de CPU por razões de desempenho (veja a seção Desempenho).
Executar o script build.sh gera 4 executáveis dentro do diretório build: bitcracker_hash, bitcracker_rpgen, bitcracker_cuda, bitcracker_opencl.
Para compilar o bitcracker_cuda de forma compatível com sua GPU NVIDIA e versão do CUDA, você precisa modificar o src_CUDA/Makefile escolhendo a versão SM correta. Como referência, você pode usar a seguinte tabela:
Você precisa criar a imagem do seu dispositivo de armazenamento criptografado com BitLocker usando, por exemplo, o comando dd:
sudo dd if=/dev/disk2 of=/caminho/para/imagemCriptografada.img conv=noerror,sync
4030464+0 records in
4030464+0 records out
2063597568 bytes transferred in 292.749849 secs (7049013 bytes/sec)
Em seguida, você precisa executar o executável bitcracker_hash na sua imagemCriptografada.img para:
Se a execução for concluída corretamente, bitcracker_hash produz 1 ou 2 arquivos de saída:
Volumes criptografados com BDE podem ter formatos diferentes para diferentes métodos de autenticação. Se o bitcracker_hash não conseguir encontrar a Senha de Recuperação na sua imagem criptografada, por favor abra uma issue ou entre em contato comigo
Um exemplo:
/build/bitcracker_hash -o test_hash -i ./Images/imgWin7
---------> BitCracker Hash Extractor <---------
Abrindo arquivo ./Images/imgWin7
....
Assinatura encontrada em 0x02208000
Versão: 2 (Windows 7 ou posterior)
Entrada VMK encontrada em 0x022080bc
VMK criptografado com senha de usuário encontrada!
VMK criptografado com AES-CCM
Entrada VMK encontrada em 0x0220819c
VMK criptografado com chave de recuperação encontrada!
VMK criptografado com AES-CCM
Hash de Senha de Usuário:
$bitlocker$0$16$89a5bad722db4a729d3c7b9ee8e76a29$1048576$12$304a4ac192a2cf0103000000$60$24de9a6128e8f8ffb97ac72d21de40f63dbc44acf101e68ac0f7e52ecb1be4a8ee30ca1e69fbe98400707ba3977d5f09b14e388c885f312edc5c85c2
Hash de Chave de Recuperação:
$bitlocker$2$16$8b7be4f7802275ffbdad3766c7f7fa4a$1048576$12$304a4ac192a2cf0106000000$60$6e72f6ef6ba688e72211b8cf8cc722affd308882965dc195f85614846f5eb7d9037d4d63bcc1d6e904f0030cf2e3a95b3e1067447b089b7467f86688
Arquivo de saída para ataque de senha de usuário: "hash_user_pass.txt"
Arquivo de saída para ataque de senha de recuperação: "hash_recv_pass.txt"
Você pode usar este tipo de ataque se o dispositivo de armazenamento foi criptografado com uma senha fornecida pelo usuário, conforme mostrado na imagem a seguir.
O BitCracker realiza um ataque de dicionário, portanto, você precisa fornecer uma wordlist de possíveis senhas de usuário.
Para iniciar o ataque, você precisa:
hash_user_pass.txtUm exemplo de linha de comando:
./build/bitcracker_cuda -f hash_user_pass.txt -d wordlist.txt -t 1 -b 1 -g 0 -u
Onde:
-f : caminho para o arquivo hash_user_pass.txt-d : caminho para sua wordlist-t : número de senhas processadas por cada thread CUDA-b : número de blocos CUDA-g : ID do dispositivo GPU NVIDIA-u : especifica que você deseja um ataque de senha de usuárioPara todas as opções disponíveis, digite ./build/bitcracker_cuda -h.
Para obter o melhor desempenho, consulte a tabela na seção Desempenho para configurar corretamente as opções t e b de acordo com sua GPU NVIDIA.
As mesmas considerações podem ser aplicadas ao executável bitcracker_opencl.
Um exemplo de saída:
====================================
Dispositivo selecionado: GPU Tesla K80 (ID: 0)
====================================
....
Lendo arquivo de hash "hash_user_pass.txt"
$bitlocker$0$16$0a8b9d0655d3900e9f67280adc27b5d7$1048576$12$b0599ad6c6a1cf0103000000$60$c16658f54140b3d90be6de9e03b1fe90033a2c7df7127bcd16cb013cf778c12072142c484c9c291a496fc0ebd8c21c33b595a9c1587acfc6d8bb9663
====================================
Ataque
====================================
Tipo de ataque: Senha de Usuário
Threads CUDA: 1024
Blocos CUDA: 1
Senhas por thread: 1
Máx de senhas por kernel: 1024
Dicionário: wordlist.txt
Verificação Estrita (-s): Não
Comparação MAC (-m): Não
Execução do kernel CUDA:
Stream 0
Número efetivo de senhas: 12
Faixa de Senhas:
abcdefshhf
.....
blablalbalbalbla12
Tempo: 28.651947 sec
Senhas por segundo: 0.42 pw/sec
================================================
....
Senha encontrada: paperino
================================================
Atualmente, o BitCracker é capaz de processar senhas de entrada com comprimento entre 8 e 55 caracteres.
Durante a criptografia de um dispositivo de armazenamento (independentemente do método de autenticação), o BitLocker pede ao usuário para armazenar em algum lugar uma Senha de Recuperação que pode ser usada para restaurar o acesso ao dispositivo de armazenamento criptografado no caso de ele/ela não conseguir desbloquear a unidade normalmente. Assim, a Senha de Recuperação é uma espécie de passe-partout para todos os métodos de autenticação e consiste em uma chave de 48 dígitos como esta:
236808-089419-192665-495704-618299-073414-538373-542366
Veja documentos da Microsoft para mais detalhes.
Assim como para a senha de usuário, o BitCracker é capaz de realizar um ataque de dicionário para encontrar a Senha de Recuperação correta gerada pelo BitLocker para criptografar o dispositivo de armazenamento. Por favor, note que atualmente somos capazes de atacar a Senha de Recuperação apenas se o dispositivo de armazenamento não foi criptografado com o TPM.
Para iniciar o ataque, você precisa:
hash_recv_pass.txtGerar e armazenar todas as senhas possíveis é um problema difícil. Por esta razão, criamos um gerador de Senhas de Recuperação chamado bitcracker_rpgen. Com esta ferramenta, você pode criar várias wordlists de Senhas de Recuperação para usar em seus ataques. Como exemplo:
./build/bitcracker_rpgen -n 300 -p 10000000 -s 000000-000011-000022-000033-000044-000055-008459-015180
Isso gera:
-n : número de wordlists-p : número de Senhas de Recuperação por wordlist-s : gerar Senhas de Recuperação a partir destaVocê pode usar a configuração padrão executando sem opções:
./build/bitcracker_rpgen
************* Gerador de wordlists de Senha de Recuperação BitCracker *************
Executando com esta configuração:
### Criar 100 wordlists
### Senhas de Recuperação por wordlist=5000000
### Permitir duplicatas=Não
### Gerar a partir de=000000-000011-000022-000033-000044-000055-000066-000077
Criando wordlist "bitcracker_wlrp_0.txt" com 5000000 senhas
Primeira senha=000000-000011-000022-000033-000044-000055-000066-000077
Última senha= 000000-000011-000022-000033-000044-000055-000902-217822
...
Note que a opção -s pode ser usada para reiniciar a geração a partir da sua última Senha de Recuperação gerada (em vez de reiniciar sempre da inicial).
A opção -d permite a possibilidade de ter duplicatas na mesma Senha de Recuperação. Por exemplo:
000000-000011-000055-000055-000044-000055-000902-217822
Para todas as opções disponíveis, digite ./build/bitcracker_rpgen -h.
NOTA: Por favor, note que a quantidade de Senhas de Recuperação possíveis é enorme:
senha de recuperação = 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536 x 65536
De acordo com nossa pesquisa, a distribuição de senhas é uniforme e não há maneira de encontrar números "mais prováveis". Até agora, não encontramos uma regra para reduzir a quantidade de candidatos possíveis. Isso significa que o ataque de Senha de Recuperação pode levar uma eternidade (o ataque de Senha de Usuário é sempre o preferido). Em breve, modificaremos a ferramenta bitcracker_rpgen para gerar Senhas de Recuperação de forma aleatória em vez de em sequência ordenada.
Um exemplo de linha de comando:
./build/bitcracker_cuda -f hash_recv_pass.txt -d bitcracker_wlrp_0.txt -t 1 -b 1 -g 0 -r
Onde as opções são as mesmas que no caso de Senha de Usuário, mas em vez de -u, você precisa especificar -r. Um exemplo de saída:
====================================
Dispositivo selecionado: GPU Tesla K80 (ID: 0)
====================================
...
Lendo arquivo de hash "hash_recv_pass.txt"
$bitlocker$2$16$432dd19f37dd413a88552225628c8ae5$1048576$12$a0da3fc75f6cd30106000000$60$3e57c68216ef3d2b8139fdb0ec74254bdf453e688401e89b41cae7c250739a8b36edd4fe86a597b5823cf3e0f41c98f623b528960a4bee00c42131ef
====================================
Ataque
====================================
Tipo de ataque: Senha de Recuperação
Threads CUDA: 1024
Blocos CUDA: 1
Senhas por thread: 8
Máx de senhas por kernel: 8192
Dicionário: wordlist.txt
Verificação Estrita (-s): Não
Comparação MAC (-m): Não
Execução do kernel CUDA:
Senhas efetivas: 6014
Faixa de Senhas:
390775-218680-136708-700645-433191-416240-153241-612216
.....
090134-625383-540826-613283-563497-710369-160182-661364
Tempo: 193.358937 sec
Senhas por segundo: 31.10 pw/sec
================================================
Ataque CUDA concluído
Senhas avaliadas: 6014
Senha encontrada: 111683-110022-683298-209352-468105-648483-571252-334455
================================================
Por padrão, o BitCracker faz um ataque rápido (para ambos os modos de senha de Usuário e Recuperação) que pode retornar alguns falsos positivos. Nesse caso, você pode reexecutar seu ataque com a opção -m, que ativa a verificação MAC (solução mais lenta).
Para testar o BitCracker em seu sistema antes de iniciar o ataque real, fornecemos várias imagens de dispositivos de armazenamento criptografados.
Você pode atacar essas imagens com ambos os modos de Senha de Usuário e Recuperação, usando as wordlists armazenadas na pasta Dictionary.
Aqui relatamos os melhores desempenhos do BitCracker no caso de ataque rápido (padrão) para a Senha de Usuário (opção -u).
Desempenho:
N.B. Cada senha requer cerca de 2.097.152 SHA-256
Lançamos o BitCracker como o formato OpenCL-BitLocker no John The Ripper (--format=bitlocker-opencl).
Os arquivos de hash gerados pelo bitcracker_hash (veja a seção How To) são totalmente compatíveis com o formato John.
No GTV100, a taxa de senhas é de cerca de 3150p/s. A equipe do JtR desenvolveu a versão CPU deste ataque (--format=bitlocker); em uma CPU Intel(R) Xeon(R) v4 2.20GHz, a taxa de senhas é de cerca de 78p/s.
Este é um trabalho em andamento...
Nov 2021: Código atualizado para executar em GPU NVIDIA Ampere usando CUDA 11.x
Por favor, compartilhe e teste nosso projeto: precisamos do seu feedback!
Agradecimentos especiais à equipe do John The Ripper, aos projetos Dislocker e LibBDE.
Este é um projeto de pesquisa em colaboração com o Conselho Nacional de Pesquisa da Itália, lançado sob licença GPLv2.
Copyright (C) 2013-2021 Elena Ago (elena dot ago at gmail dot com) e Massimo Bernaschi (massimo dot bernaschi at gmail dot com)
Forneceremos mais informações sobre o ataque do BitCracker em um artigo futuro.
Embora usemos a licença GPLv2, estamos abertos a colaborações. Para qualquer informação adicional, colaborações ou relatório de bug, por favor, entre em contato conosco ou abra uma issue.
| Arquitetura GPU | CUDA Sugerido | Makefile |
|---|
| Kepler | CUDA 7.5 | arch=compute_35,code=sm_35 |
| Maxwell | CUDA 8.0 | arch=compute_52,code=sm_52 |
| Pascal | CUDA 9.0 | arch=compute_60,code=sm_60 |
| Volta | CUDA 9.0 | arch=compute_70,code=sm_70 |
| Acrônimo GPU | GPU | Arch | CC | # SM | Clock | CUDA |
|---|
| GFT | GeForce Titan | Kepler | 3.5 | 14 | 835 | 7.0 |
| GTK80 | Tesla K80 | Kepler | 3.5 | 13 | 875 | 7.5 |
| GFTX | GeForce Titan X | Maxwell | 5.2 | 24 | 1001 | 7.5 |
| GTP100 | Tesla P100 | Pascal | 6.1 | 56 | 1328 | 8.0 |
| GTV100 | Tesla V100 | Volta | 7.0 | 80 | 1290 | 9.0 |
| AMDM | Radeon Malta | - | - | - | - | - |
| Versão | GPU | -t | -b | Senhas por kernel | Senhas/seg | Hash/seg |
|---|
| CUDA | GFT | 8 | 13 | 106.496 | 303 | 635 MH/s |
| CUDA | GTK80 | 8 | 14 | 114.688 | 370 | 775 MH/s |
| CUDA | GFTX | 8 | 24 | 106.608 | 933 | 1.957 MH/s |
| CUDA | GTP100 | 1 | 56 | 57.344 | 1.418 | 2.973 MH/s |
| CUDA | GTV100 | 1 | 80 | 81.920 | 3.252 | 6.820 MH/s |
| OpenCL | AMDM | 32 | 64 | 524.288 | 241 | 505 MH/s |
| OpenCL | GFTX | 8 | 24 | 196.608 | 884 | 1.853 MH/s |