Posts Tagged ‘Debian’

Quebrando tudo: HPC com Cluster Debian e John The Ripper

October 3, 2008

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