Quebrando tudo: HPC com Cluster Debian e John The Ripper
Há bastante tempo venho estudando uma forma de aumentar a diversidade de formatos(hashs) suportados, e também a potência e velocidade das minhas auditorias locais em arquivos de senha utilizando força bruta.
O bom e velho John The Ripper (versão open source) em algumas situações deixa a desejar, pois os únicos formatos de hash que consegue testar são DES/BSDI/MD5/BF/AFS/LM, em determinadas situações quando preciso avaliar senhas do MySQL, ORACLE, MSSQL, MD5(apache) por exemplo, acabava ficando sem alternativa.
Depois de algumas pesquisas e estudos no Oráculo, vi que algumas pessoas também sentiram a mesma necessidade e criaram projetos que potencializam o John The Ripper, criaram patches para aumentar a diversidade de formatos suportados e também suporte à processamento paralelo. (HPC)
Analisando o projeto criado por Ryan Lim, que atualmente é atualizado e mantido por John Anderson traz excelentes possibilidades, dentre elas aumento do número de formatos(37) suportados pelo John e outro que traz suporte ao processamento paralelo utilizando bibliotecas MPI.
Abaixo demonstro como criar em poucos passos um cluster com Debian (Lenny) utilizando MPICH2 para processamento paralelo e como instalar/utilizar o John The Ripper *BOMBADO* neste ambiente.
Para construção do lab utilizei dois desktops que tenho em casa, mas isso pode/deve ser ampliado para quantas máquinas você quiser/puder, quanto mais máquinas conseguir melhor, pois o processamento aumenta e por consequência a velocidade para quebrar uma senha em um teste de força bruta aumentará.
Para esclarescer rapidamente o que é um cluster recomendo a leitura rápida no wikipedia e se quiser aprofundar pra valer no assunto sobre custer e processamento paralelo recomendo a leitura do Guia de Cluster escrito pelo meu amigo Mussi que é um excelente material e referência em português.
CONSTRUINDO O CLUSTER
Instale nas duas máquinas o Debian Lenny padrão, sem ambiente gráfico o ambiente deve ficar assim:
DESKTOP 1:
IP: 192.168.1.100
NOME: master
DESKTOP 2:
IP: 192.168.1.101
NOME: node01
Configure o arquivo /etc/hosts nas máquinas, os arquivos devem ficaram exatamente assim:
127.0.0.1 localhost
#127.0.1.1 master.localdomain master
192.168.1.100 master.localdomain master
192.168.1.101 node01.localdomain node01
ATENÇÃO: Na segunda linha comentei o endereço 127.0.1.1 para evitar problemas com o MPICH2, o mesmo deve ser feito em todos os nós.
Neste tutorial abordo uma forma rápida e prática de criar cluster em casa/laboratório com poucos computadores, se for utilizar muitas máquinas fica inviável editar /etc/hosts de cada uma, soluções utilizando BIND + DHCP podem ser vista no projeto Debian Clusters.
Adicione nas máquinas o usuário/grupo que será utilizado por todos os hosts, lembre-se que o usuário deve ter o mesmo uid e gid em todas as máquinas.
# groupadd --gid 1100 mpigroup
# adduser --home /cluster --uid 1100 --gid 1100 mpiuser
Como estou utilizando poucos computadores adicionar os usuários na mão não é problema, se for criar um cluster em diversas máquinas e também utilizado por diversos usuários recomendo que utilize um servidor de autenticação centralizado (OpenLDAP), no projeto Debian Clusters você encontra tutoriais de como fazer.
No MASTER instale pacotes necessários:
master:~# aptitude install nfs-kernel-server
Compartilhe o diretório /cluster para toda rede. Não vou abordar métodos de hardening. O ambiente que estou criando está em uma “rede confiável”, neste caso minha lan dentro de casa.
master:~# echo "/cluster *(rw,sync,no_subtree_check)" >> /etc/exports
Reinicie o servico:
master:~# invoke-rc.d nfs-kernel-server restart
Será construído todo o ambiente do cluster/JtR dentro deste diretório, que ficará disponível para qualquer NÓ montá-lo.
Monte o diretório /cluster em TODOS os NÓS da rede:
# mount master:/cluster /cluster
Caso queira, acrescente no /etc/fstab a entrada abaixo nos NÓS para montararem automaticamente a cada boot:
master:/custer /cluster nfs defaults 0 0
Em todas as máquinas instale e prepare o SSH com chaves trocadas para acesso sem senha entre o MASTER e os NÓS:
# aptitude install openssh-server
No MASTER, com o usuário mpiuser crie a chave e acicione-a no authorized_keys:
master:~# su - mpiuser
Gere a chave, deixe a passphrase em branco (ENTER):
mpiuser@master:~$ ssh-keygen -t dsa
Adicione a chave gerada ao arquivo authorized_keys:
mpiuser@master:~$ cd .ssh
mpiuser@master:~/.ssh$ cat id_dsa.pub >> authorized_keys
Assim não será necessário executar este comando em todos os NÓS, pois os mesmos irão montar o diretório /cluster.
Para testar, execute algum comando via ssh no NÓ remoto e verifique se a senha será solicitada:
mpiuser@master:~$ ssh node01 hostname
NÓ configurado, MASTER configurado agora é preciso instalar o MPICH2.
INSTALAÇÃO MPICH2
Instale dependências necessárias para compilação:
master:~# aptidude install build-essential
MPICH2 da suporte a diversos outros tipos de compiladores e S.O.’s, para maiores informações consulte o site do projeto.
Baixe o source do MPICH2, que na data da criação deste documento a versão estável é a 1.0.7, descompacte, configure, compile e instale:
mpiuser@master:~$ mkdir src
mpiuser@master:~$ mkdir mpich2
mpiuser@master:~$ cd src
mpiuser@master:~/src$ wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.0.7/mpich2-1.0.7.tar.gz
mpiuser@master:~/src$ tar xvzf mpich2-1.0.7.tar.gz
mpiuser@master:~/src$ cd mpich2-1.0.7
mpiuser@master:~/src$ ./configure --prefix=/cluster/mpich2
mpiuser@master:~/src$ make
mpiuser@master:~/src$ make install
Acrescente ao /cluster/.bashrc um PATH com o caminho para os binários/bibliotecas do MPICH2:
mpiuser@master:~$ echo "export PATH=/cluster/mpich2/bin:$PATH" >> ~/.bashrc
mpiuser@master:~$ echo “LD_LIBRARY_PATH=/cluster/mpich2/lib:$LD_LIBRARY_PATH” >> ~/.bashrc
mpiuser@master:~$ echo “export PATH LD_LIBRARY_PATH” >> ~/.bashrc
Recarregue o .bashrc e verifique se os seguintes utilitários estão disponíveis na PATH.
mpiuser@master:~$ source ~/.bashrc
mpiuser@master:~$ which mpiexec mpdboot
É preciso configurar o mpd, que é o principal serviço do cluster. Para isto crie no home do usuário mpiuser o arquivo /cluster/mpd.hosts e acrestente todas as máquinas envolvidas no cluster:
mpiuser@master:~$ vi /cluster/mpd.hosts
node01
master
Um requisito para execução do mpd é ter o arquivo de configuração com senha para sua comunicação:
mpiuser@master:~$ echo "secretword=SENHAFORTE" >> ~/.mpd.conf
Defina permissão para o arquivo:
mpiuser@master:~$ chmod 600 .mpd.conf
E finalmente teste-o, inicie o serviço:
mpiuser@master:~$ mpdboot -n 2 -f ~/mpd.hosts
Fraça um “trace” e verifique se os NÓS respondem:
mpiuser@master:~$ mpdtrace -l
Deve aparecer a mesma lista de servidores que adicionou no arquivo ~/mpd.hosts
Pare o cluster:
mpiuser@master:~$ mpdallexit
Com o cluster configurado e testado vamos a instalação, configuração e uso do John.
INSTALAÇÃO JOHN THE RIPPER COM SUPORTE MPI
No MASTER, instale algumas dependências:
master:~# aptitude install libssl-dev openssl
Baixe o fonte com os patches aplicados do site do John Anderson:
mpiuser@master:~$ wget http://www.bindshell.net/tools/johntheripper/john-1.7.3.1-all-2-mpi8.tar.gz
Descompacte:
mpiuser@master:~$ tar xvzf john-1.7.3.1-all-2-mpi8.tar.gz
mpiuser@master:~$ cd john-1.7.3.1-all-2-mpi8/src
Compile e instale, para isto, no diretório src execute o comando make e aparecerá uma lista com arquiteturas para compilar. No meu caso utilizei a opção linux-x86-any.
mpiuser@master:~/john-1.7.3.1-all-2-mpi8/src$ make linux-x86-any
Terminado a compilação os binários estarão no diretório ~/john-1.7.3.1-all-2-mpi8/run
Agora com o cluster configurado e o John instalado vamos para parte legal. :-)
TESTANDO O AMBIENTE (PoC)
Inicie o cluster:
mpiuser@master:~$ mpdboot -n 2 -f /cluster/mpd.hosts
O comando acima inicia o cluster com algumas opções:
-n 2 – quantidade de nós que vão iniciar
-f – aponta para lista de nós à serem incluidos
Só para confirmar faça um “trace” e veja se todos os NÓS estão funcionando:
mpiuser@master:~$ mpdtrace -l
E finalmente execute o benchmark, para perceber a diferença execute o John sem utilizar o cluster:
$ cd /cluster/john-1.7.3.1-all-2-mpi8/run
$ ./john --test --format=DES
Benchmarking: Traditional DES [24/32 4K]... DONE
Many salts: 202415 c/s real, 224417 c/s virtual
Only one salt: 194281 c/s real, 215630 c/s virtual
Agora utilizando todos os NÓS e processadores:
$ mpiexec -m -n 4 ./john --test --format=DES
Benchmarking: Traditional DES [24/32 4K]... DONE
Many salts: 807070 c/s real, 868429 c/s virtual
Only one salt: 779285 c/s real, 849099 c/s virtual
Deu para perceber a DiFerEnçA? ;-)
Para entender os parâmetros:
-m – suprime o stdout dos outros nós
-n 4 – numero de processadores que vou utilizar no meu caso 4 (ver logo abaixo)
Caso queira fazer um benchmark completo com todas as 37 hashs possíveis… DES, BSDI, MD5, BF, AFS, LM, NT, XSHA, PO, raw-MD5, IPB2, raw-sha1, md5a, hmac-md5, KRB5, bfegg, nsldap, ssha, oracle, MYSQL, mysql-sha1, mscash, lotus5, DOMINOSEC, NETLM, NETNTLM, NETLMv2, NETHALFLM, mssql, mssql05, epi, phps, mysql-fast, pix-md5, sapG, sapB, md5ns
mpiuser@master:~/tools/john-1.7.3.1-all-2-mpi8/run$ ./john --test
ou utilizando o cluster:
mpiuser@master:~/tools/john-1.7.3.1-all-2-mpi8/run$ mpiexec -m -n 4 ./john --test
ATENÇÃO: Os benchmarks acima apresentados foram executados com os seguintes processadores:
DESKTOP 1 (master):
mpiuser@master:~$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU E6750 @ 2.66GHz
stepping : 11
cpu MHz : 2666.714
cache size : 4096 KB
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU E6750 @ 2.66GHz
stepping : 11
cpu MHz : 2666.714
cache size : 4096 KB
DESKTOP 2 (node01):
mpiuser@node01:~$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 CPU T7200 @ 2.00GHz
stepping : 6
cpu MHz : 1995.239
cache size : 4096 KB
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 CPU T7200 @ 2.00GHz
stepping : 6
cpu MHz : 1995.239
cache size : 4096 KB
Recomendo fazer os testes com um terminal aberto visualizando os processadores com o famoso top ou no modo gráfico com o gnome-system-monitor para maiores emoções. ;P
Utilizando cluster é possível ampliar os recursos utilizados por uma determnada aplicação, neste tutorial utilizei o John pois meu objetivo era específico, poderia ser qualquer outro tipo de aplicação que estivesse preparada para utilizar as bibliotecas MPI.
Importante frisar que não existe somente o MPICH2 de opção para processamento paralelo, alguns outros projetos e suas diferenças você encontra aqui.
Conforme demonstrado, após a criação do MASTER, para adicionar NÓS ao cluster é muito simples, pode ser feito inclusive com o uso de um Live CD, bastando inicializar a máquina, adicionar o usuario mpiuser (não esqueça do uid/gid), montar o diretório nfs (/cluster), adicionar os nomes no /etc/hosts e ir pro abraço! :)
Quem criar um cluster em casa/laboratório/trabalho se possível postem seus resultados aqui no blog, quantidade de máquinas, processadores, benchmarks, etc…
Enjoy! ;)
REFERÊNCIAS
http://wiki.lazarus.freepascal.org/MPICH
https://wiki.ubuntu.com/MpichCluster
http://www.mcs.anl.gov/research/projects/mpich2/documentation/index.php?s=docs
http://pt.wikipedia.org/wiki/Sistema_de_processamento_distribuído



Agora só falta ter um repositório com tudo isso empacotado.
Excelente Ulisses! Vou realizar alguns testes e escrevo sobre.
Abs.
Do caralho, mas prefiro hash pré computada.
Ow, precisamos colocar a conversa em dia, cara.
Abraços!!
Miguel já existe repositório para isto! :)
Coloquei desta forma no blog, pois funciona em qualquer *nix, inclusive em Mac OS também!
Valeu Wager! Assim que eu for conseguindo mais computadores vou adicionando os resultados aqui também!
Ae Jack, meu Jedi favorito! :)
Hash pré computada (rainbow tables) não é tão eficiente quanto você utilizar o John em modo “incremental”..
./john –incremental
Bora juntar no skype pra por os papo em ordem!!
Abraço a todos!
Ulisses.
Seu texto ficou muito bom cara. Inclusive pretendo subir um cluster experimental e quem sabe isso reverta em alguma boa ferramenta na minha universidade e no instituto onde faço iniciação científica.
Muito bom, tem uma distribuição chamada BackTrack que faz algo relacionado com isso tb
http://www.remote-exploit.org/backtrack.html
ulisses,
muito bom interessante seu texto…
parabens!!!
Fala ai Ulisses,
Ótimo material, vou usar para quebrar muitos hashs heheh. Abraços!
Excelente tutorial. Parabéns cara.
Se eu fosse você (não seria eu, duh) viveria como pró-blogger!