Home > Article > Quebrando tudo: HPC com Cluster Debian e John The Ripper

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

Categories: Article Tags: , , ,
  1. October 3, 2008 at 12:48 pm | #1

    Agora só falta ter um repositório com tudo isso empacotado.

  2. October 3, 2008 at 7:20 pm | #2

    Excelente Ulisses! Vou realizar alguns testes e escrevo sobre.

    Abs.

  3. October 4, 2008 at 1:44 pm | #3

    Do caralho, mas prefiro hash pré computada.

    Ow, precisamos colocar a conversa em dia, cara.

    Abraços!!

  4. October 4, 2008 at 6:28 pm | #4

    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!

  5. October 6, 2008 at 5:38 pm | #5

    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.

  6. Rogério
    October 6, 2008 at 8:16 pm | #6

    Muito bom, tem uma distribuição chamada BackTrack que faz algo relacionado com isso tb

    http://www.remote-exploit.org/backtrack.html

  7. ismael
    October 6, 2008 at 10:11 pm | #7

    ulisses,
    muito bom interessante seu texto…
    parabens!!!

  8. Kleyton
    October 7, 2008 at 1:58 pm | #8

    Fala ai Ulisses,

    Ótimo material, vou usar para quebrar muitos hashs heheh. Abraços!

  9. October 8, 2008 at 12:59 pm | #9

    Excelente tutorial. Parabéns cara.

  10. Eriksen Costa
    October 10, 2008 at 12:24 am | #10

    Se eu fosse você (não seria eu, duh) viveria como pró-blogger!

  1. October 6, 2008 at 5:03 pm | #1