Olá,
Você já deve ter se perguntado: como que o
Linux faz para autenticar um usuário no arquivo
/etc/shadow?!?!
Hoje vou mostrar como podemos utilizar o
OpenSSL para realizar um ataque de dicionário contra as senhas armazenadas no arquivo /etc/shadow.
Primeiramente irei setar a senha do usuário marcelo para finger. Coloquei finger?!?! Porque é uma palavra que está cadastrada no arquivo
/usr/share/dict/linux.words, que será o arquivo de dicionário que irei utilizar como fonte de senhas.
# echo finger | passwd --stdin marcelo
Changing password for user marcelo.
passwd: all authentication tokens updated successfully.
Sim, podemos dizer que o arquivo /usr/share/dict/linux.words pode ser chamado de dicionário hacker, embora existam muito mais arquivos utilizados para essa finalidade e alguns com gigabytes de tamanho.
Para quebrarmos a senha com sucesso, precisamos entender como funciona o campo de senha do arquivo /etc/shadow.
# grep marcelo /etc/shadow
marcelo:$1$zFsqshA3$Sol9g2OAEwswwladdDCax0:14529:0:99999:7:::
Note que o caractere $ é utilizado como separador de argumentos dentro do campo de senha.
$1$ - Indica que estamos trabalhando com hashes em MD5. Algoritmos de MD5 são chamados de também de algoritmos de hash e possuem a característica de ser one-way, isto é, você fornece um arquivo ou uma string e ele gerará um conjunto de números (hash) que servirá como integridade do arquivo. Quando esse número for diferente, o arquivo ou a entrada foram alterados. One-way porque com o hash gerado você nunca conseguirá converter novamente na entrada ou arquivo original.
# echo linux rocks | md5sum
6453bea88e9acdd8d3ccead424063432 -
# echo Linux Rocks | md5sum
9d96c752c61fd1f96ddce20ec0be1dd4 -
$zFsqshA3$ - Campo destinado para o salt. Salt é uma string randomizada que é gerada no momento em que você cadastra a senha. Como trabalhamos com senhas com hash MD5, se não utilizássemos o salt, dois ou mais usuários que tivessem a mesma senha iriam ter o mesmo hash armazenado no arquivo /etc/shadow.
$Sol9g2OAEwswwladdDCax0 - A senha do usuário. Esse campo é a composição da senha + salt | hash md5
Vamos ao que interessa. Utilizaremos o comando openssl, chamando a função passwd para interpretar as informações do arquivo /etc/shadow e fazer um ataque de dicionário.
# openssl passwd --help
Usage: passwd [options] [passwords]
where options are
-crypt standard Unix password algorithm (default)
-1 MD5-based password algorithm
-apr1 MD5-based password algorithm, Apache variant
-salt string use provided salt
-in file read passwords from file
-stdin read passwords from stdin
-noverify never verify when reading password from terminal
-quiet no warnings
-table format output as table
-reverse switch table columns
Agrupando as informações:
# openssl passwd -1 -salt 'zFsqshA3' -table -in /usr/share/dict/linux.words | grep 'Sol9g2OAEwswwladdDCax0'
finger $1$zFsqshA3$Sol9g2OAEwswwladdDCax0
Depois de 49 segundos a senha do usuário foi descoberta.
Faça o teste em seu servidor, teste a complexidade de sua senha e sempre lembre: alterne ao máximo o caracteres de sua senha com números, caracteres especiais, maiúsculas e minúsculas.
Grande abraço.
Dica originalmente publicada em meu blog:
http://tchellomello.blogspot.com/2009/10/ataque-de-dicionario-com-openssl.html