Este post irá abordar o processo de ataque de dicionário contra containers criptografados através de Luks, para isso, será demonstrado a criação de um container, o processo de extração do header e posteriormente o ataque de força bruta por ataque de dicionário.
O que é Luks:
Configuração Unificada de Chave Linux ou Linux Unified Key Setup (LUKS) é uma especificação de criptografia de disco criada por Clemens Fruhwirth em 2004 e originalmente destinada ao Linux.
Enquanto a maioria dos softwares de criptografia de disco implementa formatos diferentes e incompatíveis, não documentados, o LUKS especifica um formato padrão em disco independente de plataforma para uso em várias ferramentas. Isso não apenas facilita a compatibilidade e a interoperabilidade entre os diferentes programas, mas também garante que todos eles implementem o gerenciamento de senhas de maneira segura e documentada
A implementação de referência para o LUKS opera no Linux e é baseada em uma versão aprimorada do cryptsetup, usando o dm-crypt como o backend de criptografia de disco. No Microsoft Windows, os discos criptografados pelo LUKS podem ser usados com o LibreCrypt (antigo DoxBox).
Você já deve ter visto então ao instalar seu kali linux a opção de criptografar o disco com Luks, correto? É justamente sobre isso que nós vamos falar.
Criando o container
Antes de continuarmos, precisamos de um container, right? Para criar um bloco de dados no linux, nós podemos utilizar o comando dd, esse comando pode ser utilizado para realizar cópia bit a bit, ou seja, diferente do cp, o dd copia literalmente os bits de uma origem para um destino.
$ dd if=/dev/zero of=luks-container.img bs=1M count=10
O comando acima irá copiar zeros (/dev/zero) para um arquivo chamado luks-container.img, definindo o tamanho de cada bloco em 1Mb repetindo 10 vezes.
Formatando o Container
A próxima etapa, como você talvez tenha imaginado (eu espero) é utilizar o utilitário cryptsetup para manipular o nosso container de 10mb (ainda não é um container mas ta quase nascendo). O CryptSetup tem uma opção chamada LuksFormat, essa opção irá formatar o bloco de dados de 10mb em um arquivo LUKS e nesse mesmo momento você define a chave de criptografia, entenda chave como passphrase (É possível usar outros arquivos como chave de criptografia mas não é a vibe aqui)
$ cryptsetup luksFormat luks-container.img
WARNING!
========
This will overwrite data on luks-container.img irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for luks-container.img:
Verify passphrase:
Se vocẽ chegou até aqui, primeiramente parabéns, em segundo lugar, agora você tem um arquivo LUKS, contudo, ainda não é um filesystem, para isso, vamos formatar ele novamente, sim é confuso, mas você vai entender. Você não vai formatar o container novamente, vocẽ vai formatar os blocos dentro dele para um sistema de arquivos válido para então poder colocar seus arquivos dentro do container, como um pendrive digital criptografado, feel me?
Enfim, o filesystem
Primeiramente, precisamos abrir nosso container, para isso, vamos utilizar novamente o cryptsetup, contudo, com a opção luksOpen, me diz ai, luksOpen é bem intuitivo né? Holy fuc&
sudo cryptsetup luksOpen luks-container.img OpenContainer
Então é o seguinte, o comando anterior vai abrir o container luks-container.img e criar um mapeamento dele em /dev/mapper/OpenContainer.
Agora nós podemos formatar o container para um filesystem, vamos ir de ext4 porquê é bonito, versátil e é linux!
Para formatar, o comando mkfs.ext4 é utilizado, ele irá realizar a formatação do filesystem.
sudo mkfs.ext4 /dev/mapper/OpenContainer
Agora nós podemos montar a partição ext4, como se fosse um pendrive, para isso, basta usar o ?????? (sim, você adivinhou, o comando mount, se não advinhou, desculpe mas você precisa dar uma lida no FOCA).
sudo mount /dev/mapper/OpenContainer /mnt
Agora você pode acessar normalmente o container simplesmente indo até o /mnt (Ou o diretório onde você montou) e adicionar seus arquivos lá para que sejam criptografados quando você fechar o container.
Antes de continuarmos, só mais algumas dicas, para fechar o container, você precisa desmontar ele:
sudo umount /mnt
Com a partição desmontada, você precisa fechar o container LUKS:
sudo cryptsetup luksClose OpenContainer
Agora está tudo pronto!
Identificação de LUKS
Para determinar se o arquivo é de fato um arquivo LUKS, o comando file pode ser adotado.
$ file luks-container.img
luks-container.img: LUKS encrypted file, ver 1 [aes, xts-plain64, sha256] UUID: d282d74d-de89-41e1-9d6b-de43fc53e9a3
Como vocês podem ver, o comando retorna a seguinte informação: LUKS encrypted file, ver 1 [aes, xts-plain64, sha256] UUID: d282d74d-de89-41e1-9d6b-de43fc53e9a3
O próximo passo é identificar o Offset do container, o offset é a localização do header, geralmente começa no 0 e vai até o final do offset.
$ cryptsetup luksDump luks-container.img | grep -i payload
Payload offset: 4096
Agora nós precisamos extrar o header para poder trabalhar em cima dele, para isso, adicione um byte no offset, totalizando em 4097. Para isso, nós podemos usar o dd novamente, lendo os primeiros 4097 bits do container e salvando no arquivo luks-header.
dd if=luks-container.img of=luks-header bs=512 count=4097
4097+0 records in
4097+0 records out
2097664 bytes (2,1 MB, 2,0 MiB) copied, 0,0156522 s, 134 MB/s
Cracking the header
Agora é a hora que nós puxamos o hashcat da gaveta, o gatohash vai nos ajudar a realizar o ataque de dicionario. O Ataque de dicionario consiste em ter uma wordlist, no caso estamos usando a rockyou.txt, o ataque vai tentar todas as senhas dessa wordlist contra o header e a mágica do hashcat vai realizar a identificação da senha correta.
Alguns outros detalhes, a opção -m define o LUKS, -a define o tipo de ataque e o -w define o load(sendo de 0 a 4, onde 0 é o mais suave).
$ hashcat --force -m 14600 -a 0 -w 1 luks-header rockyou4k.txt -o container_password
Session..........: hashcat
Status...........: Cracked
Hash.Name........: LUKS
Hash.Target......: luks-header
Time.Started.....: Sat Oct 3 16:53:48 2020 (4 mins, 35 secs)
Time.Estimated...: Sat Oct 3 16:58:23 2020 (0 secs)
Guess.Base.......: File (rockyou4k.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 15 H/s (3.74ms) @ Accel:128 Loops:256 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 4000/4000 (100.00%)
Rejected.........: 0/4000 (0.00%)
Restore.Point....: 3584/4000 (89.60%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:1688320-1688527
Candidates.#1....: fresa -> timmy1
Started: Sat Oct 3 16:53:23 2020
Stopped: Sat Oct 3 16:58:24 2020
Uma vez que o hashcat finalize, ele irá armazenar a senha em container_password.
$ cat container_password
luks-header:thepassword
Referências
- https://hackernoon.com/cracking-linux-full-disc-encryption-luks-with-hashcat-832d5543101f
- https://diverto.github.io/2019/11/18/Cracking-LUKS-passphrases
- https://darkocode.wordpress.com/2018/12/10/hidden-volume-dmcrypt/
- https://linuxconfig.org/how-to-use-a-file-as-a-luks-device-key
- https://blog.canadianwebhosting.com/how-to-create-an-encrypted-container/
- https://pt.wikipedia.org/wiki/Linux_Unified_Key_Setup