Introdução
Em um post anterior do blog [1], eu mostrei como quebrar senhas de arquivos ZIP por força bruta (ataque de dicionário), utilizando somente o programa unzip. Hoje irei mostrar o mesmo procedimento, porém para arquivos RAR e utilizando o unrar.
O método
Como já abordei esse assunto em [1], neste post serei bem breve. Primeiramente, vamos observar a man page do comando unrar e verificar se há opções úteis para nosso objetivo:
$ unrar --help UNRAR 4.20 beta 3 freeware Copyright (c) 1993-2012 Alexander Roshal Usage: unrar <command> -<switch 1> -<switch N> <archive> <files...> <@listfiles...> <path_to_extract\> <Commands> ... t Test archive files ... <Switches> ... id[c,d,p,q] Disable messages ... p[password] Set password ...
Temos a opção t para testar um arquivo, a opção p para passar a senha do rar e as flags cdpq que habilitam/desabilitam certas mensagens do programa unrar.
Vejamos alguns exemplos:
# Compactando arquivo qualquer $ rar -p a arquivocomsenha.rar /etc/passwd 12345 # Senha: 12345 # Descompactando com senha inválida $ unrar -idq -psenhainvalida t arquivocomsenha.rar CRC failed in the encrypted file etc/passwd. Corrupt file or wrong password. # Descompactando com senha correta $ unrar -idq -p12345 t arquivocomsenha.rar $
Os resultados nos mostram que: ao se utilizar uma senha incorreta, o unrar retorna “CRC failed in the…” em stderr. Por outro lado, ele retorna vazio quando a senha está correta.
Assim, temos nosso algoritmo:
1) Se há palavras no dicionário para ler: Leia uma palavra do dicionário de palavras para a variável senhateste. 2) Execute: unrar -idq -psenhateste t arquivocomsenha.rar. 3) Verifique se a saída é vazia. Se sim, a senha do arquivo é senhateste e finalize o processo. 4) Volte para o passo 1.
Isto é o suficiente para montarmos nosso shell script para quebrar a senha de um arquivo RAR por força bruta.
O script: quebrarar.sh
#!/bin/bash # [quebrarar.sh] # Quebra senha de arquivos rar pelo método # da força bruta. # # [Autor] # Marcos Paulo Ferreira (Daemonio) # undefinido gmail com # https://daemoniolabs.wordpress.com # # [Uso] # $ ./quebrarar.sh arquivocomsenha.rar wordlist.txt # .... # .... # Senha: "senha" # # Versão 1.0, by daemonio @ Sun Jul 29 19:57:33 BRT 2012 # # Arquivo rar com senha ARQUIVORAR= # Dicionário de senhas WORDLIST= # Recebe cada senha do dicionário senhateste= # Função de ajuda. function show_help { echo 'quebrarar.sh - by daemonio' echo '[uso] $ ./quebrarar.sh arquivocomsenha.rar wordlist.txt' exit 1 } # Função chamada quando se interrompe # o script com um ctrl+c. Essa função mostra # a senha usada no momento da interrupção. function pegarctrlc { echo "[+] Processo abortado. Senha atual: $senhateste" exit 1 } # Instala um signal handler pro ctrl+c trap pegarctrlc SIGINT # Obtém os parâmetros. ARQUIVORAR="$1" WORDLIST="$2" # Flag. Tem valor 1 se a senha foi quebrada e # 0 caso contrário. SENHAQUEBRADA=0 # Testa os parâmetros. [ -e "$ARQUIVORAR" ] && [ -e "$WORDLIST" ] || show_help # Processo de quebragem. echo '[+] Espere. Quebrando a senha...' while read senhateste do SAIDA=$(unrar -idq -p"$senhateste" t "$ARQUIVORAR" 2>&1) # Se a variável estiver vazia é porque a senha foi quebrada. [ -z "$SAIDA" ] && SENHAQUEBRADA=1 && break done < "$WORDLIST" # Informa se a senha foi quebrada ou não. if [ "$SENHAQUEBRADA" = '1' ] then echo '[+] Senha quebrada: '$senhateste else echo '[+] Senha NAO quebrada. Tente outra lista de palavras.' fi #EOF
Salve o código como quebrarar.sh e dê permissão de execução:
$ chmod +x quebrarar.sh
Para executar o script, passe o arquivo rar como primeiro parâmetro e a lista de palavras como segundo:
$ ./quebrarar.sh arquivocomsenha.rar senhas.txt [+] Espere. Quebrando a senha... [+] Senha quebrada: 12345
Podemos aumentar a eficiência desse script utilizando o xargs para executá-lo em várias threads. O conceito por trás do xargs pode ser visto em [2] e também em [1].
A seguir o código para a versão paralelizável desse script:
#!/bin/bash # [xquebrarar.sh] # Quebra senha de arquivos rar pelo método # da força bruta. # # [Autor] # Marcos Paulo Ferreira (Daemonio) # undefinido gmail com # https://daemoniolabs.wordpress.com # # [Uso] # $ ./xquebrarar.sh arquivocomsenha.rar senha1, senha2, ..., senhaN # .... # .... # Senha: "senha" # # Versão 1.0, by daemonio @ Sun Jul 29 20:30:49 BRT 2012 # # Função de ajuda. function show_help { echo 'xquebrarar.sh - by daemonio' echo '[uso] $ ./quebrarar.sh arquivocomsenha.rar senha1, senha2, ..., senhaN' exit 1 } # Obtém os parâmetros. ARQUIVORAR="$1" # Flag. Tem valor 1 se a senha foi quebrada e # 0 caso contrário. SENHAQUEBRADA=0 # Testa os parâmetros. [ -e "$ARQUIVORAR" ] || show_help # Desloca os parâmetros. shift # Lê as senhas da linha de comando. for senhateste in $* do SAIDA=$(unrar -idq -p"$senhateste" t "$ARQUIVORAR" 2>&1) # Se a variável estiver vazia é porque a senha foi quebrada. [ -z "$SAIDA" ] && SENHAQUEBRADA=1 && break done # Informa se a senha foi quebrada ou não. if [ "$SENHAQUEBRADA" = '1' ] then echo '[+] Senha quebrada: '$senhateste # Executando esse script no xargs precisamos matar # o próprio xargs (processo pai) para finalizar as # outras threads. kill $PPID fi #EOF
Salve o código como xquebrarar.sh e dê permissão de execução:
$ chmod +x xquebrarar.sh
Em seguida execute-o pelo xargs: (obs: 10 threads)
$ xargs -a senhas.txt -n 20 -P 10 ./xquebrarar.sh arquivocomsenha.rar [+] Senha quebrada: 12345 Terminated
A versão paralelizável é mais rápida do que a sequencial, e isso já era de se esperar. Os tempos de execução para duas versões são semelhantes àqueles vistos em [1]. Para o ataque ser eficiente é necessário ter uma boa lista de senhas.
Referências
[1] Quebrando a Senha de Arquivos ZIP Por Brute Force by Daemonio (Acessado em: Julho/2012)
https://daemoniolabs.wordpress.com/2012/05/27/quebrando-a-senha-de-arquivos-zip-por-brute-force/
[2] Paralelismo com o xargs by Daemonio (Acessado em: Julho/2012)
https://daemoniolabs.wordpress.com/2012/04/07/paralelismo-com-o-xargs/
velho ta mto bem explicado acredito, mas eu não tenho muita expeciencia com “scripts” n entendi nada, faz uma vídeo aula vai ajudar mto, vlw !
Olá Vinicius,
tenho pouca experiência em fazer vídeos mas posso tentar depois.
Porém, basicamente, a ideia do método é: dado um arquivo rar com senha, como se comporta o programa unrar caso ele receba uma senha válida? e uma inválida? Vemos que quando passamos uma senha inválida ele retorna “CRC failed in the encrypted”, e com isso, já obtemos um teste para saber se a senha passada é válida ou não.
Baseando nisso, o script lê várias opções de senha de um arquivo texto e testa uma por uma usando o programa unrar. Caso o unrar não retorne “CRC failed in the encrypted”, então a senha do arquivo foi encontrada.
Se você tem um arquivo encriptado e queira descobrir a senha, você precisará do shell script (não precisa entender como ele funciona, basta executá-lo) e de um dicionário de senhas (você encontra isso facilmente na inernet). Feito isso, basta digitar no terminal do Linux:
$ ./quebrarar.sh arquivocomsenha.rar senhas.txt
onde quebrar.sh é o script, o arquivocomsenha.rar é seu arquivo encriptado e senhas.txt é seu dicionário de senhas. O processo de quebra pode demorar um pouco, dependendo do dicionário de dados. Existem programas mais rápidos para isso, se a necessidade for tanta, então aconselho baixá-los.
Abraços
Não funciona..
Ola Antonio,
crie um arquivo de teste (com senha conhecida), gere uma wordlist contendo a senha do arquivo e depois teste o script. Se você tentou quebrar a senha de um arquivo e não conseguiu é porque a wordlist não continha a senha.
Abraços