segunda-feira, 26 de outubro de 2015

Auditando e Quebrando Senhas com John The Ripper



Há tempos fizemos um artigo abordando o funcionamento da ferramenta Hashcat para descriptografar senhas por meio de brute force, e hoje iremos realizar um pequeno Lab utilizando o John the Ripper, uma ferramenta muito robusta de brute force em hashs capaz de quebrar qualquer criptografia. Claro, lembrando que isso demanda tempo e custo computacional.

O John é famoso por realizar 3 tipos de procedimento

Wordlist - Utilizando como referência uma lista com possíveis passwords
Single Crack - Testando combinações de Login/Senha pegando informações do usuário como sua home. Há quem diga que este é muito mais performatico que o modo Wordlist
Incremental - Realizando testes de caracter por caracter tentando quebrar a senha, talvez o modulo mais robusto e mais custoso a nível computacional do John

Fazendo um Benchmark de todos os algoritmos de criptografias com o John The Ripper

 # john --test  

Caso queira fazer algo mais específico em um algorítimo que você quer testar em específico

Para acessar o help do John é só chama-lo no terminal sem parâmetro algum. Você irá notar que a ferramenta é muito autoexplicativa.

 root@debian:~# john   
 John the Ripper password cracker, version 1.7.8  
 Copyright (c) 1996-2011 by Solar Designer  
 Homepage: http://www.openwall.com/john/  
   
 Usage: john [OPTIONS] [PASSWORD-FILES]  
 --single          "single crack" mode  
 --wordlist=FILE --stdin  wordlist mode, read words from FILE or stdin  
 --rules          enable word mangling rules for wordlist mode  
 --incremental[=MODE]    "incremental" mode [using section MODE]  
 --external=MODE      external mode or word filter  
 --stdout[=LENGTH]     just output candidate passwords [cut at LENGTH]  
 --restore[=NAME]      restore an interrupted session [called NAME]  
 --session=NAME       give a new session the NAME  
 --status[=NAME]      print status of a session [called NAME]  
 --make-charset=FILE    make a charset, FILE will be overwritten  
 --show           show cracked passwords  
 --test[=TIME]       run tests and benchmarks for TIME seconds each  
 --users=[-]LOGIN|UID[,..] [do not] load this (these) user(s) only  
 --groups=[-]GID[,..]    load users [not] of this (these) group(s) only  
 --shells=[-]SHELL[,..]   load users with[out] this (these) shell(s) only  
 --salts=[-]COUNT      load salts with[out] at least COUNT passwords only  
 --format=NAME       force hash type NAME: DES/BSDI/MD5/BF/AFS/LM/crypt  
 --save-memory=LEVEL    enable memory saving, at LEVEL 1..3  
 root@debian:~#   
   



Vamos realizar um procedimento simples em um servidor de testes.

Primeiro vamos transformar todos os passwords em um pequeno banco de dados onde vamos aplicar o bruteforce com o John

 root@debian:~# unshadow /etc/passwd /etc/shadow >> pass.db  
 root@debian:~# john pass.db   

 root@debian:~# john pass.db   
 Loaded 7 password hashes with 7 different salts (generic crypt(3) [?/32])  
 123       (sporte)  
 winner     (root)  
 123123    (modafoca)  



Tentando o Single Crack

 root@debian:~# john --single pass.db   
 Loaded 7 password hashes with 7 different salts (generic crypt(3) [?/32])  
 Remaining 4 password hashes with 4 different salts  
 guesses: 0 time: 0:00:00:25 12% c/s: 59.74 trying: sysadmin - sysadmin_  
 guesses: 0 time: 0:00:00:27 13% c/s: 60.06 trying: deanalista\ - analistasuporte|  
 guesses: 0 time: 0:00:01:30 37% c/s: 60.75 trying: IsuporteSuporte - Ldsuporte  
 guesses: 0 time: 0:00:01:33 38% c/s: 60.71 trying: PsuporteAnalista - SAnalistaSuporte  
 guesses: 0 time: 0:00:01:34 38% c/s: 60.74 trying: SASuporte - VSuporteAnalista  
 guesses: 0 time: 0:00:01:36 38% c/s: 60.72 trying: VSAnalista - ZAnalistasuporte  
 guesses: 0 time: 0:00:01:39 39% c/s: 60.77 trying: &asuporte - ,sanalista  
 guesses: 0 time: 0:00:02:06 49% c/s: 60.93 trying: dSuPorte - SuporteDe  
 guesses: 0 time: 0:00:02:07 50% c/s: 60.86 trying: suporteANalista - analIstade  
   



Usando uma Wordlist

Criei uma wordlist simples chamada wordlist.txt e utilizei a mesma com a sintaxe

 # john --wordlist=wordlist.txt pass.db  


Agora podemos visualizar o resultado com o parâmetro --show

 root@debian:~# john --wordlist=wordlist.txt senha.db   
 Loaded 7 password hashes with 7 different salts (generic crypt(3) [?/32])  
 Remaining 3 password hashes with 3 different salts  
 guesses: 0 time: 0:00:00:33 100% c/s: 65.43 trying: winner123123 - winner  
 root@debian:~# john --show senha.db   
 root:winner:0:0:root:/root:/bin/bash  
 joao:teste:1001:1001:,,,:/home/joao:/bin/bash  
 sporte:123:1003:1003:,,,:/home/sporte:/bin/bash  
 modafoca:123123:1006:1006:,,,:/home/modafoca:/bin/bash  
   
 4 password hashes cracked, 3 left  
 root@debian:~#   
   


Usando o Incremental Crack

O incremental Crack, como já foi dito, é o modo mais robusto do John. Ele é muito inteligente, mas necessita de muito desempenho computacional. Pode demorar de 1 minuto à 1 ano para terminar.

 # john --incremental pass.db  



Outros parâmetros uteis

Ignorando Shells inválidas - O John vai passar por todas senhas e ignorar as apresentadas no comando.

 # john --shells=-/bin/false pass.db  


Especificando o numero de saltos - Neste caso o John vai tentar quebrar as  senhas com os tamanhos pre definidos na sintaxe

 # john --salts 8 pass.db  

SOBRE O AUTOR

Matheus Fidelis

http://msfidelis.github.io/

Power Ranger, Piloto de Helicópteros e Astronauta da NASA. Desenvolvedor Web PHP com foco em Backend e POO, Linux SysAdmin DevOps e Entusiasta Python. Criou esse site pra contribuir com a comunidade com coisas que aprende dentro de um setor maluco de TI :)

Postar um comentário

 
Nanoshots | Open Source Security, Linux e Tutoriais © 2015 - Designed by Templateism.com