Casser un p12 (ou pfx) avec JohnTheRipper

PenTest Physique et casser un p12

Aujourd’hui je vais vous montrer comment casser un p12 (ou pfx) avec JohnTheRipper ! Un p12 est un format de fichier type PKCS qui protège un certificat et la clé privé associée. Ce format est souvent utilisé par les PKI pour délivrer le certificat et la clé au détenteur final. Mais on le trouve parfois comme moyen de protection de certificats stockés en production.

Pour casser des mots de passes, un des outils de références dans le milieu c’est : JohnTheRipperOpen-source, et disponible directement sous forme de paquets dans la majorité des distributions linux, il existe aussi sous Windows. Une version pro existe aussi pour modique somme de 171,05€. Enfin, on trouve des variantes comme celle que je vais utiliser dans ce TP : la « community-enhanced » (ou Jumbo). Souvent utilisé en PenTest pour casser les hash de mots de passe de comptes, John permet en fait d’attaquer à peu près tout ce qui se fait comme protections des mots de passe… Et casser un p12, ça en fait partie !

Un petit tour sur la page Wikipédia du projet vous indiquera tout ce que vous avez besoin de savoir sur le projet. 

Jumbo : la version community-enhanced de JohnTheRipper

Running John - casser un P12
Running John

On va donc compiler depuis les sources de la version Jumbo. Elle donne accès à l’exécutable pfx2john nécessaire pour extraire les hash des fichier pkcs#12. Pfx2john n’est pas présent dans la version officielle de JohnTheRipper. Simplement parce que John ne permet pas d’attaquer directement des fichiers protégés, il est nécessaire de lui extraire les hashs dans un fichiers texte pour qu’il travaille dessus.

Pour installer JohnTheRipper, rien de plus simple que de suivre la doc d’installation sur une Debian 8.5 :

# installer les dépendances
apt-get install libssl-dev libssl1.0.0 libpcap0.8 git \
   libnss3 libkrb5-3 libgmp10 libnss3-dev libkrb5-dev libgmp-dev

# cloner les sources 
git clone https://github.com/magnumripper/JohnTheRipper.git
cd JohnTheRipper
cd src

# Compiler !
./configure && make # plein d'options possible.

# Les exécutables se trouvent dans :
cd ../run

Et c’est bon pour l’installation.

Générer un P12 pour mieux le brute-forcer

Point légal : ce que je vous montre dans ce TP n’a pas vocation a être utilisé à des fins malveillantes ou illégales : seulement académiques, ou pour des PenTest encadrés contractuellement.

Du coup, je vais générer un pfx juste pour le plaisir de le péter après, comme ça : pas besoin de casser celui de quelqu’un d’autre.
On va donc générer un certificat auto-signé et sa clé privé avec openssl.

openssl req -new -x509 -sha256 -nodes -days 365 -out test.crt -keyout test.key

Au passage vous pouvez vérifier les informations du certificat et de la clé à l’aide des commandes suivante :

openssl rsa -in test.key -check
openssl x509 -in test.crt -text

Empaquetez ensuite le tout (le certificat et sa clé) dans un P12  :

openssl pkcs12 -export -out test.pfx -inkey test.key -in test.crt
>Enter Password:

Pour récupérer les infos sur le P12 ainsi généré :

openssl pkcs12 -info -in test.pfx

Note :

On récupère au passage le chiffrement utilisé pour le P12 :

Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048

Il est possible de changer ce cipher à l’aide de l’option « -keypbe <cipher> » lors de la génération du P12.

Casser un P12 avec JohntheRipper

Je l’ai dit, par défaut John ne prend pas des P12 (ou Pfx) directement en entrée. Il faut lui extraire les hashs à casser à l’aide de la commande pfx2john (disponible dans la version communautaire) :

pfx2john test.pfx > testpfxhashes.txt

Ensuite comme promis, pour casser un P12 :

john --session=TESTPFX --fork=2 testpfxhashes.txt

Et c’est parti pour le brute-force, il suffit de laisser tourner… N’oubliez pas que john pique un peu pour le CPU de votre machine :

PID   USER PR NI VIRT   RES   SHR  S %CPU %MEM TIME+   COMMAND
35777 test 39 19 231036 43128 7656 R 99,6 2,1  7:09.19 john
35778 test 39 19 231036 40044 4572 R 99,6 2,0  7:09.22 john
utilisation CPU pour casser un P12 sur un Xeon avec 8 CPU
Utilisation CPU avec john the ripper pour casser un P12 sur un Xeon avec 8 CPU

Je vous conseille de le laisser tourner en tâche de fond (dans un screen par exemple). Si vous deviez interrompre le processus. Il suffit de le relancer à l’aide de la commande suivante pour qu’il reprenne là ou il en était :

john --restore=TESTPFX

Dans ce TP, j’ai mis un mot de passe très simple. Il lui a suffit de quelques minutes avec une VM bi-processeur à 1.80Ghz  :

john --show testpfxhashes.txt
test:toto
1 password hash cracked, 0 left

Si on réessaye avec un mot de passe un peu plus complexe comme « G33keries.Org » ? Bein, ca fait 20h que ca tourne sur un Xeon 16CPU@2.67Ghz et il n’a toujours rien trouvé… Et je pense qu’il en a pour le week-end, au moins… HOW SECURE IS MY PASSWORD? dit 5 millions d’années… Je peux peut être espérer être à la retraite à ce moment là ?

C’est là ou la méthode brute-force montre ses limites. Il faudrait essayer avec des dictionnaires et pas seulement celui de quelques milliers de mots fournis de base avec john. En effet, la majorité des mots de passes sont souvent les mêmes. Et dans la majorité des cas, une attaque par dictionnaire fonctionne contre les mots de passe des utilisateurs lambda. Vous trouverez aisément sur les z’internets des dictionnaires de mots de passe (gratuit ou non) à mettre en entrée de l’option –wordlist=dico.txt de john.

Analyse

Bon que dire ? Oui, JohnTheRipper est un outil « puissant » qui permet « retrouver les mots de passe oublié de vos p12 » à certaines conditions :

  1. Avoir de la puissance de calcul à disposition ;
  2. que les mots de passe ne soient pas trop complexe ;
  3. que le « cipher/hash » qui les protège ne soit pas trop solide ;
  4. et que, et que… etc.

Au final, ce n’est pas si violent que ça. Il suffit d’appliquer une politique de mots de passe un peu solide et homogène pour rendre très inefficace ce genre d’outil. Par contre, en entreprise c’est rare que cette politique soit appliquée absolument partout, et on trouve toujours un compte applicatif, local ou de service qui laisse trainer un hash un peu faible par sa taille ou son algo (qui a dit MD5 ?)

Bref, il faut savoir que ca existe et que jusqu’à ce qu’on mette en place quelque chose de mieux que les mots de passe pour s’authentifier, ca reste à prendre en compte.

Conclusion

Comme d’habitude j’espère que ca vous a intéressé et que vous avez compris que les protections des mot de passe ne sont infaillibles. Si vous avez eu peur, je vous invite à jeter un œil à des solutions comme LastPass, KeePass ou encore Dashlane.

Petit exercice pour finir :

Si pour casser un p12 avec le mots de passe « G33keries.Org », à l’aide d’un Xeon 16 Coeurs @ 2.67Ghz on mets, disons : 10 000 ans.
Combien de temps faut-il à un supercalculateur comme Titan (n°3 au top 500 actuellement) avec ces 100 384 coeurs @ 2.20GHz pour faire le même boulot  (on n’utilise pas les GPU) ?

     16 CPU @2.67 => 10 000 ans
100 384 CPU @2.20 => ?
casser un P12
padlock

Si vous êtes tombé amoureux de john, sachez que vous pouvez acheter des T-Shirt officiel sur le site : zerodayclothing. Ca ne s’invente pas comme nom de site…

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.