… 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.

 

John the ripper

 

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 ;)

Partagez cet article !