Entendendo os Hashes

Se gerarmos o hash da string "teste123", temos alguns exemplos das saídas a seguir.

Exemplo em MD5
aa1bf4646de67fd9086cf6c79007026c
Exemplo em SHA 256
289160db0d9f39f9ae1754c4ec9c16f90b50e32e09c5fb5481ae642b3d3d1a36

Independente se está sendo gerado uma hash de uma única string, o hash sempre terá esses tamanhos fixos de acordo com o tipo.

Modos de uso

Armazenamento de senhas no banco de dados

As aplicações atualmente, armazenam as senhas dos usuários em formato de hash, pois uma vez que o hash é gerado, não é possível voltar o valor original, ou seja, ele é irreversível (one way). Para que a autenticação então aconteça, o que a aplicação faz é comparar o valor inserido pelo usuário, gerar o hash desse valor e comparar com o hash que já está salvo no banco de dados, se caso os hashes forem idênticos irá autenticar o usuário, caso contrário não irá.

Integridade

Alguns programas ou arquivos que baixamos em determinados sites, possui um checksum que gerado assim que ele foi criado. Isso garante que o conteúdo dentro desse programa esteja íntegro com base nesse hash gerado. Suponhamos que há outro site que disponibiliza esse mesmo arquivo ou programa, pode-se então tirar o checksum dele e comparar com o arquivo original para ver se os hashes são os mesmos. Se caso não for, esse programa foi modificado de alguma forma e com isso sabemos que ele não é íntegro, ou seja, não é confiável.

Gerando hashes

Para gerar os hashes, basta utilizar da seguinte forma. (Usando o MD5 e SHA256 como exemplos)

user@xubuntu:~$ echo -n "teste123" | md5sum
aa1bf4646de67fd9086cf6c79007026c  -

user@xubuntu:~$ echo -n "teste123" | sha256sum
289160db0d9f39f9ae1754c4ec9c16f90b50e32e09c5fb5481ae642b3d3d1a36  -

Se quisermos gerar um hash em MD5 de determinado arquivo, basta utilizar da seguinte forma.

md5sum <arquivo>

One way x Two way

Uma vez que o hash é gerado, não é possível voltar o valor original, ou seja, ele é irreversível (one way), não existe um "decode" para o hash. Para "quebrar um hash" então, é necessário que haja uma wordlist com diversas possíveis senhas e sejam gerados os hashes dessas senhas, fazendo assim um bruteforce até descobrir se alguma das possibilidades bate de acordo com o hash verdadeiro.

No entanto, existem métodos de codificação, por exemplo base64, que é próprio para codificar e decodificar (diferente do hash).

user@xubuntu:~$ echo -n "teste123" | base64
dGVzdGUxMjM=

user@xubuntu:~$ echo -n "dGVzdGUxMjM=" | base64 -d
teste123

Com isso, conseguimos passar um valor para codificar e se passarmos o resultado da codificação, é possível fazer o processo reverso, sendo assim two way.

Podemos também codificar arquivos com bas64 e depois reverter, fazendo virar um arquivo novamente.

user@xubuntu:~/Desktop$ cat teste.png | base64 > arquivoCodificado

user@xubuntu:~/Desktop$ head -n 5 arquivoCodificado 
iVBORw0KGgoAAAANSUhEUgAADwAAAAQ4CAIAAAA7d75QAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4
nOzdeVwTd/o48Gdyh5AACYRL7nB4IKAcnohYq3grnrXtttLa2sOe/pRtu2W33W3t8d22aw9b3aqt
tepWq2Ct9QI8EbkEBeVQ7puEhDAJOeb3RyAGkiAoiNLn/Xr5eiWTyWeemXzyzMfhyWeIHWrvxLin
pMxvwr03MEQT95Kpub7HljPKv+YkbfwBJle/WRWzwVExfS9btSOy/m+w4eO2pMSj9lL/l8alrnOM
f3kvtfTsWP81siMJnOuFM3acnv7NT4988kVy+tYVr59ZP/Lpn6ljig8ufACBdiNXtxY+lxXAvQxb


user@xubuntu:~/Desktop$ cat arquivoCodificado | base64 -d > arquivoCodificado.png

user@xubuntu:~/Desktop$ head -n 5 arquivoCodificado.png 
�PNG

IHDR;w�Ps��O� IDATx���y\w�8�gr��	�K�px ���X�x+�������Þ��m�e��m��ݶk[ݪ���V�`��<��P�0	9��G � (����z�z%��g��|�����g�j�ĸ���o½70D�����ǖ3ʿ�$m�&W�Y��Q1}/[�#��o��㶤ģ�R��ƥ�s�y/���X�5�#	��3v����O�|�Er����Y?�韩c�.|�v#W�>���

Identificando hashes

Existem alguns softwares que podemos utilizar para identificar os hashes, que são: hashid e hash-identifier. Basta utilizar

$ hash-id <hash>
$ hash-identifier 
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------
 HASH:

Ataques a hashes: Ferramentas

John

Usando o john dessa forma, ele irá tentar identificar qual é o tipo de hash.

john <arquivo com hash>

Para informar o formato do hash e passar uma wordlist.

john --format=Raw-MD5 <arquivo com hash> --wordlist=<wordlist>

Hashcat

A diferença do hashcat para outras ferramentas, é que ele permite utilizar a GPU para tentar descobrir o hash, automatizando o processo.

hashcat -m <modo hash> <arquivo com hash> <wordlist> --force

Last updated