Writeup #LeHACK 2019, WorldGolfChampion
En cette année 2019 le niveau des challenges était bien plus équilibré que l’année dernière qui était particulièrement ardue de l’aveu même des organisateurs. On a terminé cinquantième sur un peu plus de trois cents avec un score supérieur à zéro, et j’ai quelques faits d’arme à mon actif 🙂 Je ne vais pas tout écrire, à la limite je partagerai ceux des confrères (et je sauvegarderai aussi), on commence donc par un petit exercice au pays de Wireshark et de Keepass.
l’exercice repose donc sur un fichier pcap. L’analyse de celui-ci montre la présence d’une session telnet. On filtre donc dessus et on admire :
Oui, connexion serveur avec login, mot de passe, pas pour rien qu’ont dit qu’il faut préférer SSH. En regardant les commandes il tente d’ouvrir un coffre fort Keepass, sans grand succès, manifestement il ne se souvient pas de son mot de passe, c’est dommage parce qu’à cause de telnet on voit pas mal de choses en clair. Pire, pour une raison que j’ignore, il nous affiche un base64 du fichier, c’est magique, on peut le récupérer :
1 2 3 |
$ echo "A9mimmf7S7UBAAMAAhAAMcHy5r9xQ1C........." |base64 -d > keepass.kdbx $ file keepass.kdbx keepass.kdbx: Keepass password database 2.x KDBX |
Il reste alors à l’attaquer, sans surprise les mots de passes présents dans la capture ne fonctionnent pas. Il y a donc eu un petit moment de flottement à bases de recherche de techniques de bruteforce, via keepass2john, mais je n’ai pas réussi à le faire fonctionner. C’est alors qu’un voisin de circonstance, Gabin a eu l’idée déterminante : il s’avère que tous les mots de passe testés ont le même format (ouais la fatigue faisait déjà son office à ce moment-là), à savoir « woods » suivi de quatre chiffres. Il n’en fallait pas plus pour écrire un petit script de bruteforce à base de kpcli pour tester les 10000 combinaisons possibles, et bingo :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ cat script.sh #!/bin/bash source /etc/profile for i in $(seq -w 9999); do echo -ne "${i}\n"; echo "woods$i" | kpcli --kdb=keepass.kdbx && exit 0 ; done $ ./script.sh (...) 0179 Please provide the master password: ************************* Couldn't load the file keepass.kdbx: The database key appears invalid or else the database is corrupt. 0180 Please provide the master password: ************************* WARNING: There is an entry with a blank title in /Root/! KeePass CLI (kpcli) v3.2 is ready for operation. Type 'help' for a description of available commands. Type 'help <command>' for details on individual commands. kpcli:/> |
Il y a trois mots de passe dans le coffre-fort, le premier sans nom (le « blank title ») est le bon 🙂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
kpcli:/> ls === Groups === Root/ kpcli:/> cd Root/ kpcli:/Root> ls === Entries === 0. 1. My Best Friend 2. My best plan boards.4channel.org/sp kpcli:/Root> show -f 0 Title: Uname: Pass: lh_{I1oVeG0lfAndSex..W4IT.MyWiFe} URL: Notes: |
Encore merci Gabin pour le temps gagné 🙂
Une méthode plus rapide quand le nombre de passwords à tester est plus grand : utiliser John The Ripper et attaquer un condensat du fichier KDBX en utilisant keepass2john.
Exemple :
keepass2john db.kdbx >hash.txt
john –format=KeePass –wordlist=wordlist.txt hash.txt
Comme je l’ai dit keepass2john n’a pas fonctionné chez moi (et j’avais pas spécialement envie de voir pourquoi sur le moment, d’autant que quand on me dit qu’un script bash bien crade peut faire l’affaire, je suis faible et je l’écris :D)
on pouvait utiliser keepass2john avec une wordlist correspondant au format woodsXXXX, ca a pris que quelques secondes
L’encodage en base64 du kdbx, ça doit être parce que le mec voulait récupérer le fichier à l’arracher depuis son serveur. Vu que c’est un fichier binaire, il peut copier le fichier encodé à la main et le décoder en local.
Merci beaucoup pour ce WriteUp, j’ai bloqué dessus car j’ai essayé avec john sans succès. Bien joué pour la méthode scriptée.
Heu…c’était aussi la date de naissance de sa femme -_-‘ 😀