John the ripper multi-core grâce à Open MPI…
John JEAN
Posté le 28 septembre 2009
… 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.
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 ;)
Tagged: bruteforce, comparatif, cuda, GPU, john the ripper, multi-core, munin, open-mpi

À quand la version mpi et réseau ? =D
On peut egalement faire tourner plusieurs machines avec mpirun et jtr. ;)
Sorcier, tu donnes dans JTR maintenant ? :)
Bravo pour tes articles, et spécialement celui-ci !
Continue comme ça John ! :)
++
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
Je n’ai rien compris mais ça a l’air puissant ^^
Ca permet de jouer au démineur avec une grille de 500*500 ?
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 »
Super.
Mais j’avais deja essaye il y a pas mal de temps, et en faisant par hasard un test, j’etais tombe sur un pb : certaines combinaisons semblent ne pas etre faites (difficile a debugger tellement la gestion des combinaisons est compliquee sous JTR).
Par exemple, le fichier suivant :
abc:$1$46QSN0ss$6woB9diuA1knNVY6wNgMc0
le mot de passe est le MD5 de « abc’
john tout seul trouve le mot de passe
john mpi sur 16 cpus trouve le mot de passe
john mpi sur 17 cpus ne trouve rien
j’utilise john 1.7.3.1 avec patch mpi10 (idem avec patch mpi8)
dans john.conf :
[Incremental:Lejav]
File = $JOHN/all.chr
MinLen = 3
MaxLen = 3
CharCount = 95
# mpiexec -recvtimeout 10 -n 16 ./john –incremental=Lejav test
=> trouve le mot de passe
# mpiexec -recvtimeout 10 -n 17 ./john –incremental=Lejav test
=> ne trouve rien
J’avais contacte a l’epoque le developpeur mais il n’a manifestement pas eu le temps de le debugger (il etait bien occupe a l’epoque).
Si tu peux tester ce cas chez toi, ca m’interesse de savoir si c’est lie a ma config ou non.
Hello,
Des nouvelles versions sont sorties depuis, tu as pu regarder ?
Hello,
Je n’ai pas trouve de version plus recente que la 1.7.3.1 mpi10
Re,
Je viens de m’apercevoir que le patch mpi est maintenant integre avec le jumbo.
J’ai donc re-essaye avec la derniere version : john-1.7.9-jumbo-6
Et la, c’est bon, je n’ai plus le probleme !
A+
Je confirme le jumbo intègre le MPI.
Autre sujet, qui a déjà essayé OpenCL ? Pour lancer sur plusieurs machines ?