
Craquer le chiffrement zip legacy avec l'attaque de texte clair connu de Biham et Kocher.
Cassez le chiffrement zip hérité avec l'attaque à texte clair connu de Biham et Kocher.
Une archive ZIP peut contenir de nombreuses entrées dont le contenu peut être compressé et/ou chiffré. En particulier, les entrées peuvent être chiffrées avec un algorithme de chiffrement symétrique basé sur un mot de passe, appelé chiffrement traditionnel PKWARE, chiffrement hérité ou ZipCrypto. Cet algorithme génère un flux pseudo-aléatoire d'octets (keystream) qui est combiné par XOR avec le contenu de l'entrée (texte clair) pour produire des données chiffrées (texte chiffré). L'état du générateur, constitué de trois entiers de 32 bits, est initialisé à l'aide du mot de passe puis continuellement mis à jour avec le texte clair au fur et à mesure du chiffrement. Cet algorithme de chiffrement est vulnérable aux attaques à texte clair connu, comme l'ont montré Eli Biham et Paul C. Kocher dans l'article de recherche A known plaintext attack on the PKZIP stream cipher. Étant donné un texte chiffré et 12 octets ou plus du texte clair correspondant, l'état interne du générateur de keystream peut être récupéré. Cet état interne suffit pour déchiffrer entièrement le texte chiffré ainsi que d'autres entrées qui ont été chiffrées avec le même mot de passe. Il peut également être utilisé pour bruteforcer le mot de passe avec une complexité de nl-6 où n est la taille du jeu de caractères et l est la longueur du mot de passe.
bkcrack est un outil en ligne de commande qui implémente cette attaque à texte clair connu. Les principales fonctionnalités sont :
Vous pouvez obtenir la dernière version officielle sur GitHub.
Des paquets précompilés pour Ubuntu, MacOS et Windows sont disponibles au téléchargement. Extrayez l'archive téléchargée où vous le souhaitez.
Sous Windows, les bibliothèques d'exécution Microsoft sont nécessaires pour exécuter bkcrack. Si elles ne sont pas déjà installées sur votre système, téléchargez et installez le dernier package Microsoft Visual C++ Redistributable.
Sinon, vous pouvez compiler le projet avec CMake.
Tout d'abord, téléchargez les fichiers sources ou clonez le dépôt git.
Ensuite, exécutez les commandes suivantes dans l'arborescence des sources pour créer une installation dans le dossier install.
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
cmake --build build --config Release
cmake --build build --config Release --target install
bkcrack est disponible dans les dépôts de paquets listés ci-dessous. Ces paquets sont fournis par des mainteneurs externes.
Vous pouvez voir une liste des noms d'entrées et des métadonnées dans une archive nommée archive.zip comme ceci :
bkcrack -L archive.zip
Les entrées utilisant le chiffrement ZipCrypto sont vulnérables à une attaque à texte clair connu.
L'attaque nécessite au moins 12 octets de texte clair connu. Au moins 8 d'entre eux doivent être contigus. Plus le texte clair connu contigu est grand, plus l'attaque est rapide.
Avec une archive zip encrypted.zip dont l'entrée cipher est le texte chiffré et plain.zip dont l'entrée plain est le texte clair connu, bkcrack peut être exécuté comme ceci :
bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain
Avec un fichier cipherfile contenant le texte chiffré (commençant par les 12 octets correspondant à l'en-tête de chiffrement) et plainfile contenant le texte clair connu, bkcrack peut être exécuté comme ceci :
bkcrack -c cipherfile -p plainfile
Si le texte clair correspond à une partie autre que le début du texte chiffré, vous pouvez spécifier un décalage. Il peut être négatif si le texte clair inclut une partie de l'en-tête de chiffrement.
bkcrack -c cipherfile -p plainfile -o offset
Si vous connaissez peu de texte clair contigu (entre 8 et 11 octets), mais que vous connaissez certains octets à certains décalages connus, vous pouvez fournir ces informations pour atteindre l'exigence d'un total de 12 octets connus.
Pour ce faire, utilisez le drapeau -x suivi d'un décalage et des octets en hexadécimal.
bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21
Si l'attaque réussit, les données déchiffrées associées au texte chiffré utilisé pour l'attaque peuvent être sauvegardées :
bkcrack -c cipherfile -p plainfile -d decipheredfile
Si les clés sont connues d'une attaque précédente, il est possible d'utiliser bkcrack pour déchiffrer des données :
bkcrack -c cipherfile -k 12345678 23456789 34567890 -d decipheredfile
Les données déchiffrées peuvent être compressées selon que la compression a été utilisée ou non lors de la création du fichier zip.
Si la compression deflate a été utilisée, un script Python 3 fourni dans le dossier tools peut être utilisé pour décompresser les données.
python3 tools/inflate.py < decipheredfile > decompressedfile
Pour accéder à toutes les entrées de l'archive chiffrée en une seule étape, vous pouvez générer une nouvelle archive avec le même contenu mais sans chiffrement. Cela suppose que chaque entrée a été initialement chiffrée avec le même mot de passe.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -D decrypted.zip
Il est également possible de générer une nouvelle archive chiffrée avec le mot de passe de votre choix :
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip new_password
Vous pouvez également définir le nouveau mot de passe par sa représentation interne correspondante.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 --change-keys unlocked.zip 581da44e 8e40167f 50c009a0
Ces deux commandes peuvent être utilisées ensemble pour modifier le contenu d'une archive chiffrée sans connaître le mot de passe mais en connaissant uniquement les clés internes : vous pouvez faire une copie chiffrée avec le mot de passe de votre choix, puis modifier la copie avec un gestionnaire d'archives en entrant le mot de passe choisi lorsqu'il est demandé, et enfin faire une copie de l'archive modifiée avec les clés de chiffrement originales.
Étant donné les clés internes, bkcrack peut essayer de trouver le mot de passe original.
Vous pouvez rechercher un mot de passe en utilisant des caractères d'un jeu donné :
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p
Vous pouvez restreindre la recherche aux mots de passe d'une longueur donnée ou d'une plage de longueurs :
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 9
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 8..10
L'option -r <length> <charset> est un raccourci pour -l 0..<length> -b <charset> :
bkcrack -k 1ded830c 24454157 7213b8c5 -r 10 ?p
Si vous avez une idée de la façon dont le mot de passe est formé, vous pouvez spécifier un masque pour restreindre l'espace de recherche et rendre la récupération beaucoup plus rapide. Ceci est pertinent pour les mots de passe longs (tels que ceux de 12 caractères ou plus) pour lesquels la force brute devient très chronophage.
Par exemple, en supposant que vous vous souvenez vaguement que votre mot de passe est composé de 8 lettres minuscules, d'un trait d'union et de 6 chiffres décimaux, vous pouvez utiliser cette commande :
bkcrack -k 1940e266 d3fd3d89 71ce9871 -m ?l?l?l?l?l?l?l?l-?d?d?d?d?d?d
Cela s'exécute en millisecondes, alors que l'alternative par force brute prend des heures.
L'espace de recherche pour la récupération par force brute et par masque est défini par des jeux de caractères. Un jeu de caractères est une séquence de caractères ou de raccourcis pour des jeux de caractères existants. Les jeux de caractères prédéfinis sont listés ci-dessous.
En plus des jeux de caractères prédéfinis, vous pouvez définir des jeux de caractères personnalisés avec l'option -s.
Les jeux de caractères personnalisés peuvent référencer des jeux prédéfinis ou d'autres jeux personnalisés.
Ils sont particulièrement utiles pour spécifier précisément l'espace de recherche de la récupération par masque.
Par exemple, si vous savez que votre mot de passe est composé de 10 lettres (majuscules ou minuscules) et de 5 chiffres binaires, vous pouvez utiliser cette commande :
bkcrack -k b8c377a6 f603160f 1832a78b -m ?x?x?x?x?x?x?x?x?x?x?y?y?y?y?y -s x ?u?l -s y 01
Un tutoriel est fourni dans le dossier example.
Pour plus d'informations, consultez la documentation et lisez le code source.
N'hésitez pas à suggérer des améliorations ou à soumettre des demandes de tirage (pull requests) sur GitHub.
Si vous souhaitez montrer votre soutien au projet, vous pouvez faire un don ou parrainer le projet via GitHub Sponsors.
Ce projet est fourni sous les termes de la licence zlib/png.
| Raccourci | Description | Valeur |
|---|
?l | lettres minuscules | abcdefghijklmnopqrstuvwxyz |
?u | lettres majuscules | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
?d | chiffres décimaux | 0123456789 |
?s | caractères spéciaux | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
?a | caractères alphanumériques | identique à ?l?u?d |
?p | caractères ASCII imprimables | identique à ?l?u?d?s |
?b | tous les octets | 0x00 .. 0xff |