Tuto: Récupération d’une master key LUKS2 depuis une machine en fonctionnement

Bonjour tout le monde,

Un petit retour sur une mésaventure qui m’est arrivée, que cela puisse servir à d’autres.
Le SSD de mon ordinateur personnel m’a lâché avant-hier, sans signes avant-coureurs (pas d’alerte smartctl au préalable). Le contrôleur NVMe a tout simplement lâché, le disque n’était plus détectable.

Et pour diverses raisons, je n’avais pas fait de sauvegarde (borg backup) depuis pas moins de 7 mois.
J’ai perdu beaucoup de données, mais surtout du perso : la plupart des données relatives à l’asso sont sur nos serveurs (nextcloud, partagées dans un salon, git, ou sur la configuration des serveurs directement).

Note à ce sujet : rassurez-vous, on est plus à cheval sur les sauvegardes des serveurs de l’asso que sur les miennes, on fait des sauvegardes toutes les 3 heures sur un serveur distant.

Le problème que j’ai rencontré, c’est que mon KeePass était obsolète et qu’il me manquait le mot de passe de déchiffrement LUKS de l’une de nos machines. Une machine de CI/CD, donc pas très importante, avec peu de données dessus… Et j’étais la seule personne à posséder le mot de passe, qui se retrouve maintenant perdu.

J’avais encore une clé SSH fonctionnelle, alors j’ai essayé de récupérer la clé LUKS.

Prérequis :

  • Vous devez posséder un accès root à la machine (donc potentiellement, avoir sa clé SSH).
  • La machine doit être allumée et la partition LUKS ouverte.
  • Votre kernel ne doit pas être en mode lockdown.

Voilà un petit tuto, si ça vous arrive un jour.

  1. Récupérez d’abord des informations sur votre partition chiffrée avec cryptsetup luksDump /dev/votre_partition.

    • Si LUKS indique Version: 1, c’est super facile, récupérez la master key avec dmsetup table --showkeys et passez à l’étape 8.
    • Si LUKS indique Version: 2, suivez la suite du tutoriel.
    • Vérifiez la taille de la clé. Cipher key: 512 bits impliquera de concaténer deux clés AES de 256 bits, tandis que Cipher key: 256 bits ne nécessitera que d’en trouver qu’une.
  2. Réalisez un backup complet de la machine : tar cf root.tar --exclude /home/user/root.tar --one-file-system / puis le récupérer avec scp.

    • Si vous avez d’autres backups qui contiennent assurément tout ce dont vous avez besoin pour remonter la machine, vous pouvez passer cette étape ; mais ça peut aider d’avoir un backup sous le coude quand même.
  3. En root, téléchargez le binaire avml de Microsoft, qui marche vachement bien (j’avais testé avec LiME mais le projet étant abandonné, il n’a pas donné le résultat escompté).

  4. Utilisez avml output.lime pour dump la mémoire RAM de votre système dans le fichier output.lime.

  5. Téléchargez et compilez findaes (de préférence, car on l’utilisera dans un script plus tard), sinon aeskeyfind.

  6. Exécutez ./findaes output.lime > keys pour récupérer toutes les clés AES présentes dans le dump de la mémoire.

  7. Si vous avez une clé de 512 bits (voir étape 1) : utilisez ce script python qui va concaténer chaque clé AES détectée pour créer un set de clés à tester. Les clés doivent être concaténées dans le sens inverse (clé2+clé1) parce qu’elles sont sauvegardées en little endian.

    • python3 ./script.py /dev/votre_partition. Si à un moment donné le programme vous demande de saisir une nouvelle passphrase, c’est gagné.
  8. Si vous avez une clé de 256 bits (voir étape 1) : formatez les clés comme attendu par cryptsetup, puis essayez chaque clé détectée jusqu’à trouver la bonne.

    • Dans le fichier keys retourné par findaes, une clé se compose de 64 caractères hexadécimaux. Il vous faut retirer les espaces entre chaque bloc hexadécimal et stocker la clé en format binaire, comme ceci : echo "0123456789abcdef" | xxd -r -p > key1.bin
    • Répétez l’opération avec toutes les clés dans votre fichier, puis testez chacune d’entre elles :
    • cryptsetup --master-key-file keyX.bin luksAddKey /dev/votre_partition
    • Si cryptsetup vous demande de saisir une nouvelle passphrase, c’est gagné.

Et voilà, vous avez saisi une nouvelle phrase de passe, la machine est sauvée. Pensez à tout supprimer derrière vous. Ça m’a pris trois heures le temps de comprendre le fonctionnement des outils, j’aurais sans doute mis plus de temps à remonter la machine de zéro, donc c’était rentable.

Si vous voulez vous prémunir du retrait de vos clés par un dump de la RAM en root, pensez à activer le kernel_lockdown (si votre système vous le permet). Mais faites vos backups avant. :innocent:

(et si vous venez me faire la morale, économisez votre temps, je n’en ai pas besoin :slight_smile: )

8 Likes