John the ripper multi-core grâce à Open MPI…

Le 28 septembre 2009 par John JEAN Laisser un commentaire »

multicore… ou comment multiplier la rapidité de bruteforce de John the Ripper par 8 ou plus. J’ai écrit il y a quelques temps, un billet présentant un comparatif des méthodes de bruteforce CPU / GPU sur des hashs de type MD5. J’avais expliqué que la méthode GPU (avec l’aide de cuda) explosait allègrement les méthodes CPU, même avec du dual core. C’est toujours le cas. Sauf que cette méthode a ses limites: elle manque cruellement de softs permettant de bruteforcer tout et n’importe quoi. Le soft de référence pour avaler à peu près tous les hashs est John the ripper, mais il prend malheuresement assez cher face à des softs comme BarsWF. C’était sans compter sur un patch de bindshell.net qui permet d’exécuter autant d’instances du soft qu’on a de core.

Pour les besoins du boulot, nous avons monté un serveur relativement puissant et efficace: 16 Go de RAM et surtout du double quadruple coeurs (Intel Bi Xeon Quad 8x 2.00+ GHz). J’en ai donc profité pour tester l’objet de mes plus grands fantasmes :) (Bah oui, tout le monde n’a pas un 8 core sur son laptop, et les méthodes GPU sur un serveur sans CG…), et le résultat est sans appel:

Avant:

john-laptop:~/johntheripper/run# ./john -test
Benchmarking: Traditional DES [128/128 BS SSE2-16]... DONE
Many salts: 1912K c/s real, 1912K c/s virtual
Only one salt: 1631K c/s real, 1631K c/s virtual

Après:

john-laptop:~/john-1.7.2-bp17-mpi8/run# mpirun -np 8 ./john -test
Benchmarking: Traditional DES [128/128 BS SSE2-16]... DONE
Many salts: 15269K c/s real, 15273K c/s virtual
Only one salt: 12997K c/s real, 13000K c/s virtual

 

Avant:

Benchmarking: BSDI DES (x725) [128/128 BS SSE2-16]... DONE
Many salts: 62387 c/s real, 62512 c/s virtual
Only one salt: 60723 c/s real, 60723 c/s virtual

Après:

Benchmarking: BSDI DES (x725) [128/128 BS SSE2-16]... DONE
Many salts: 497326 c/s real, 496954 c/s virtual
Only one salt: 484527 c/s real, 484527 c/s virtual

 

Avant:

Benchmarking: FreeBSD MD5 [32/64 X2]... DONE
Raw: 8592 c/s real, 8592 c/s virtual

Après:

Benchmarking: FreeBSD MD5 [32/64 X2]... DONE
Raw: 68862 c/s real, 68844 c/s virtual

 

Avant:

Benchmarking: OpenBSD Blowfish (x32) [32/64 X2]... DONE
Raw: 518 c/s real, 518 c/s virtual

Après:

Benchmarking: OpenBSD Blowfish (x32) [32/64]... DONE
Raw: 2415 c/s real, 2416 c/s virtual

 

Avant:

Benchmarking: Kerberos AFS DES [48/64 4K]... DONE
Short: 285330 c/s real, 285330 c/s virtual
Long: 911564 c/s real, 911564 c/s virtual

Après:

Benchmarking: Kerberos AFS DES [48/64 4K]... DONE
Short: 2281K c/s real, 2279K c/s virtual
Long: 7241K c/s real, 7241K c/s virtual

 

Avant:

Benchmarking: LM DES [128/128 BS SSE2-16]... DONE
Raw: 9688K c/s real, 9688K c/s virtual

Après:

Benchmarking: NT LM DES [128/128 BS SSE2-16]... DONE
Raw: 79468K c/s real, 79587K c/s virtual

 

Et en bonus, juste pour la version 8 core cette fois:

Benchmarking: Apache MD5 [32/64 X2]... DONE
Raw: 68674 c/s real, 68674 c/s virtual

Benchmarking: mysql [mysql]... DONE
Raw: 20638K c/s real, 20643K c/s virtual

Benchmarking: Netscape LDAP SHA [SHA1]... DONE
Raw: 14961K c/s real, 14961K c/s virtual

Benchmarking: NT MD4 [TridgeMD4]... DONE
Raw: 18830K c/s real, 18844K c/s virtual

Benchmarking: Lotus5 [Lotus v5 Proprietary]... DONE
Raw: 1204K c/s real, 1205K c/s virtual

Benchmarking: M$ Cache Hash [mscash]... DONE
Raw: 12567K c/s real, 12567K c/s virtual

Benchmarking: Raw MD5 [raw-md5]... DONE
Raw: 19448K c/s real, 19448K c/s virtual

Benchmarking: IPB2 MD5 [Invision Power Board 2.x salted MD5]... DONE
Raw: 10592K c/s real, 10587K c/s virtual

Benchmarking: Eggdrop [blowfish]... DONE
Raw: 136593 c/s real, 136627 c/s virtual

Benchmarking: Raw SHA1 [raw-sha1]... DONE
Raw: 14720K c/s real, 14720K c/s virtual

Benchmarking: MS-SQL [ms-sql]... DONE
Raw: 15442K c/s real, 15446K c/s virtual

Benchmarking: HMAC MD5 [hmac-md5]... DONE
Raw: 5473K c/s real, 5477K c/s virtual

Benchmarking: WPA PSK [wpa-psk]... DONE
Raw: 472 c/s real, 472 c/s virtual

Benchmarking: Netscape LDAP SSHA [salted SHA1]... DONE
Raw: 14922K c/s real, 14926K c/s virtual

Ca c’est pour la théorie. Maintenant pour la pratique, j’ai encodé via htpasswd le mot de passe suivant blogjohn; et j’ai testé la vitesse de bruteforce avec les deux logiciels, le classique et le multi-thread donc.

John the ripper:

guesses: 1 time: 0:11:01:58 c/s: 1704K trying: blogji1X - blogjoek
Loaded 1 password hash (Traditional DES [128/128 BS SSE2-16])
blogjohn (john)

Soit 11h01 de travail.

John the ripper n-core (ici 8, bindshell.net):

thread: 0 guesses: 1 time: 0:01:27:22 c/s: 1702K trying: blogjim9 - blogjone

Soit 1h30 de travail !

Je sors un petit graphique de munin pour l’occasion, le premier histo est donc le john classique et le second le multi-core. Pour la petite histoire, cela a bien duré 1h30, mais on continue de voir une utilisation CPU parce que je n’ai pas stoppé les 7 autres threads.

johntheripper

 

 

 

 

 

 

 

 

 

 

 

Donc pour conclure, comment on utilise la bête ?

Tout d’abord on récupère le john tunné pour l’occasion (il est aussi disponible sous forme de diff à appliquer, au choix):

wget http://www.bindshell.net/tools/johntheripper/john-1.7.2-bp17-mpi8.tar.gz

On untar:

tar zxvf john-1.7.2-bp17-mpi8.tar.gz

Ensuite on installe libopenmpi-dev pour compiler cette version de john sinon on a pas mpicc et openmpi-bin pour utiliser mpirun:

apt-get install libopenmpi-dev
apt-get install openmpi-bin

Puis on compile john:

cd john-1.7.2-bp17-mpi8/src/
make //ici il va vous lister les possibilités de compilation optimisée selon votre OS, ce qui donne chez moi:
make clean linux-x86-64
cd ../run

Et enfin, notre salvateur:

mpirun -np <NUMPROCS> ./john -i pass.txt //<NUMPROCS> correspond bien entendu au nombre de core que vous avez à disposition.

Voilà amusez vous bien, et ne le faites pas tourner n’importe où, comme vu sur le graph, ca fera hurler munin et tous les softs de monitoring du sysadmin ;)

7 commentaires

  1. waffle dit :

    À quand la version mpi et réseau ? =D

  2. Sorcier_FXK dit :

    On peut egalement faire tourner plusieurs machines avec mpirun et jtr. ;)

  3. mathilde dit :

    Sorcier, tu donnes dans JTR maintenant ? :)

  4. Eaque dit :

    Bravo pour tes articles, et spécialement celui-ci !
    Continue comme ça John ! :)

    ++

  5. Nesta dit :

    Bonjour,
    Je n’arrive pas à installer « apt-get install libopenmpi-dev »

    Voici le message d’erreur:
    « bash: apt-get: command not found
     »

    Merci de me donner un coup de main

  6. Arthur dit :

    Je n’ai rien compris mais ça a l’air puissant ^^
    Ca permet de jouer au démineur avec une grille de 500*500 ?

  7. rmoz dit :

    Install, compile sans pb mais que doit contenir le fichier pass.txt (réponse de run: « no password hashed loaded ») après avoir fait « unshadow /etc/passwd /etc/shadow > pass.txt »

Laisser un commentaire