Les fichiers Microsoft Office peuvent être protégés par mot de passe. Selon la méthode utilisée pour définir le mot de passe, tout le fichier peut être chiffré et son contenu peut demeurer inaccessible en cas d'oubli du mot de passe.
L'application John The Ripper permet de tenter un décryptage par force brute.
Le temps nécessaire à l'opération de décryptage est variable et dépendra:
Le fichier MS Office ne sera pas exploitable directement par john. Un script permet d'extraire et de mettre en forme le hash pour John The Ripper:
office2john.py crackme.xlsx > hash_office1.txt
La sortie du script office2john est enregistrée dans le fichier hash_office1.txt, c'est ce fichier qui va pouvoir être éprouvé par john.
Dans un premier temps on éprouve le hash via des wordlists courtes. Si aucune correspondance n' est trouvée, on peut passer à des ensembles plus importants puis à des attaques par force brute incrémentales:
john --wordlist=/path/to/wordlists/us_cities.txt hash_office1.txt
Ici john s’arrête s'il trouve une correspondance ou lorsqu'il a éprouvé le hash à tous les mots de la wordlist.
Les mots contenus dans les wordlists peuvent être altérés par le préprocesseur de texte lorsque l'option --rules est utilisée en complément. Chaque mot de la wordlist sera transformé par le préprocesseur de texte en fonction des règles définies dans les sections respectives du fichier de configuration john.conf
Dans l'exemple ci-dessous, un fichier crackme2.xlsx est chiffré avec le mot de passe “ZEPHYR”. Ce mot de passe n'est pas contenu dans notre wordlist qui ne contient que “Zephyr”. La premier passage de john échouera donc:
john --verbosity=5 --wordlist=/path/to/wordlists/us_cities.txt hash_office2.txt
La commande retourne les messages suivants:
initUnicode(UNICODE, UTF-8/ISO-8859-1)
UTF-8 -> UTF-8 -> UTF-8
Using default input encoding: UTF-8
Loaded 1 password hash (Office, 2007/2010/2013 [SHA1 256/256 AVX2 8x / SHA512 256/256 AVX2 4x AES])
Cost 1 (MS Office version) is 2007 for all loaded hashes
Cost 2 (iteration count) is 50000 for all loaded hashes
Will run 4 OpenMP threads
Loaded 20 hashes with 16 different salts to test db from test vectors
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:12 DONE (2020-05-10 16:05) 0g/s 1696p/s 1696c/s 1696C/s Zuni..Zwolle
Session completed.
La wordlist a été parcourue en 12 secondes, mais aucune correspondance trouvée.
On relance la commande avec l'option --rules. La documentation précise que lorsque l'option est utilisé sans argument, ce sont les règles de la section [List.Rules:Wordlist] qui s'appliquent.
john --verbosity=5 --rules --wordlist=/home/yoann/wordlists/us_cities.txt hash_office2.txt
La commande retourne les messages suivants:
initUnicode(UNICODE, UTF-8/ISO-8859-1)
UTF-8 -> UTF-8 -> UTF-8
Using default input encoding: UTF-8
Loaded 1 password hash (Office, 2007/2010/2013 [SHA1 256/256 AVX2 8x / SHA512 256/256 AVX2 4x AES])
Cost 1 (MS Office version) is 2007 for all loaded hashes
Cost 2 (iteration count) is 50000 for all loaded hashes
Will run 4 OpenMP threads
Loaded 20 hashes with 16 different salts to test db from test vectors
Press 'q' or Ctrl-C to abort, almost any other key for status
ZEPHYR (crackme2.xlsx)
1g 0:00:01:11 DONE (2020-05-10 16:06) 0.01393g/s 1708p/s 1708c/s 1708C/s YUCCA..ZEPHYR
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Cette fois ci, la même wordlist permet de trouver le mot de passe “ZEPHYR” en 1 minute 11 secondes. Les règles définies dans la section [List.Rules:Wordlist] retravaillent chaque mot de la liste. Une des règles passe le mot en majuscules.
Dans cet autre exemple on spécifie deux jeux de règles. Pour les anciennes versions d'office quelques règles spécifique ont été regroupées, elles peuvent être utilisées ainsi:
john --rules=List.Rules:Wordlist,List.Rules:OldOffice --wordlist=/path/to/wordlists/us_cities.txt hash_office1.txt