Le mot que vous connaissez déjà : crib drag sur un XOR à clé répétée
Le défi
L'outil de déploiement de Thornbury écrit une copie chiffrée du fichier d'environnement de chaque service à côté du fichier en clair, et quelqu'un a versionné le fichier chiffré du service ledger sans le fichier en clair. L'outil appelle cela du chiffrement. C'est un XOR à clé répétée, et la clé est un mot que personne n'a noté. Vous n'avez pas besoin de la clé pour commencer, car tous les fichiers d'environnement produits par cet outil débutent par les mêmes douze caractères, et le XOR vous rend tout ce que vous lui donnez et que vous n'y aviez pas mis. Récupérez la clé, puis lisez le mot de passe de la base de données.
Ce que tu vas apprendre
- Expliquer pourquoi le XOR est sa propre inverse et ce que cela implique pour la récupération de la clé
- Utiliser un préfixe de clair connu comme crib pour extraire une clé répétée
- Reconnaître un motif répété dans la sortie comme confirmation que le crib était correct
- Appliquer la clé récupérée pour déchiffrer l'ensemble du message
- Identifier les formats de fichiers fixes qui rendent les cribs disponibles en pratique
Compétences testées
Prérequis
- Ce que fait le XOR bit par bit
- Lecture de l'hexadécimal
Comment ça marche
Le XOR a une propriété qui explique tout ceci : appliquer deux fois la même valeur redonne l'original. Le chiffrement s'écrit ciphertext = plaintext XOR key, donc le déchiffrement s'écrit plaintext = ciphertext XOR key, et le troisième arrangement est celui qu'utilisent les attaquants : key = ciphertext XOR plaintext. Si vous pouvez deviner une portion quelconque du clair, vous obtenez gratuitement les octets de clé qui se trouvaient dessous.
Cette supposition s'appelle un crib, et elle est presque toujours disponible. Les données réelles ont des débuts fixes : un fichier d'environnement commence par un nom de variable, une réponse HTTP commence par HTTP/1.1, un PNG commence par sa signature, JSON commence par une accolade. Quand la clé se répète et qu'elle est plus courte que le crib, les octets récupérés se répètent aussi, et cette répétition est votre preuve : du bruit signifie que la supposition était fausse, un cycle visible signifie qu'elle était correcte et vous indique la longueur de la clé du même coup d'œil.
Un masque jetable évite tout cela en étant aussi long que le message et en n'étant jamais réutilisé. Une clé de six lettres appliquée en XOR sur tout un fichier n'est pas une version affaiblie de cette idée, c'est une chose entièrement différente : la clé est récupérable à partir de n'importe quel fragment correctement deviné, et après cela le fichier est en clair.
Erreurs fréquentes
- Chercher une chaîne qui décode en une seule passe. Le premier XOR est une mesure, pas un déchiffrement. Vous exécutez l'outil deux fois avec des clés différentes.
- Abandonner quand la sortie devient du bruit. Seule la portion couverte par le crib est significative. Tout ce qui suit est du charabia attendu.
- Utiliser toute la chaîne répétée comme clé.
PLOVERPLOVERest la clé écrite deux fois. N'en utilisez qu'une occurrence. - Oublier de décoder l'hexadécimal en premier. Le XOR opère sur des octets. Appliqué au texte hexadécimal lui-même, il ne produit rien d'utile.
- Omettre le signe égal du crib.
ENVIRONMENTfait onze caractères etENVIRONMENT=en fait douze : un crib plus court fonctionne quand même ici, mais chaque caractère correct confirme un octet de clé supplémentaire.
Comment s'en protéger
Aucune des deux moitiés ne devrait exister : ni le chiffrement, ni le fichier.
- Ne mettez pas de secrets dans le dépôt, chiffrés ou non. Injectez-les au moment du déploiement depuis un gestionnaire de secrets, pour qu'il n'y ait aucun artefact à committer.
- Si des fichiers doivent être chiffrés au repos dans un dépôt, utilisez un véritable outil avec chiffrement authentifié et clés gérées. Un XOR fait maison n'est pas un chiffrement faible, c'est un encodage avec un argument en forme de mot de passe.
- Scannez les commits à la recherche de blobs à haute entropie autant que de clés en clair. Ce fichier passerait n'importe quelle regex cherchant
DB_PASS=. - Effectuez une rotation de l'identifiant maintenant. Il a été committé, donc traitez-le comme public dès l'instant du commit, et non depuis l'instant où quelqu'un s'en est aperçu.