
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 :