Luks Encripted Container: BruteForce Attack

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

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.