
PXEThief est un ensemble d'outils permettant d'extraire des mots de passe de la fonctionnalité de déploiement de système d'exploitation dans Microsoft Endpoint Configuration Manager.
PXEThief est un ensemble d'outils qui implémente les axes d'attaque présentés lors du talk DEF CON 30 Pulling Passwords out of Configuration Manager (https://forum.defcon.org/node/241925) contre la fonctionnalité de déploiement du système d'exploitation (OSD) dans Microsoft Endpoint Configuration Manager (ou ConfigMgr, encore couramment appelé SCCM). Il permet la collecte d'identifiants depuis les comptes d'accès réseau configurés (https://docs.microsoft.com/fr-fr/mem/configmgr/core/plan-design/hierarchy/accounts#network-access-account) et depuis tout compte de séquence de tâches ou identifiants stockés dans les variables de collection ConfigMgr qui ont été configurées pour la collection « Tous les ordinateurs inconnus ». Ces comptes Active Directory sont souvent sur-privilégiés et permettent une élévation de privilèges menant à un accès administratif quelque part dans le domaine, du moins d'après mon expérience personnelle.
Probablement, l'attaque la plus sérieuse pouvant être exécutée avec ces outils implique le déploiement initié par PXE activé pour « Tous les ordinateurs inconnus » sur un point de distribution sans mot de passe, ou avec un mot de passe faible. La sur-privilégiation des comptes ConfigMgr exposés à l'OSD mentionnée plus haut permet ensuite d'exécuter une chaîne d'attaque complète Active Directory avec seulement un accès réseau à l'environnement cible.
python pxethief.py -h
pxethief.py 1 - Identifier et télécharger automatiquement le fichier média chiffré en utilisant une requête de démarrage PXE DHCP. Tente également d'exploiter un mot de passe média vide lorsque auto_exploit_blank_password est défini à 1 dans 'settings.ini'
pxethief.py 2 <Adresse IP du serveur DP> - Forcer un démarrage PXE contre un point de distribution MECM spécifique désigné par son adresse IP
pxethief.py 3 <nom-du-fichier-variables> <mot-de-passe-supposé> - Tenter de déchiffrer un fichier de variables média sauvegardé (obtenu depuis un média PXE, bootable ou préinstallé) et récupérer les données sensibles du DP MECM
pxethief.py 4 <nom-du-fichier-variables> <chemin-du-fichier-policy> <mot-de-passe> - Tenter de déchiffrer un fichier de variables média sauvegardé et un fichier XML de politique récupérés depuis un support de séquence de tâches autonome
pxethief.py 5 <nom-du-fichier-variables> - Afficher le hash correspondant à un fichier de variables média spécifié pour craquage avec Hashcat
pxethief.py 6 <identityguid> <identitycert-nom-du-fichier> - Récupérer les séquences de tâches en utilisant les valeurs obtenues à partir des clés de registre sur un DP
pxethief.py 7 <Valeur-Reserved1> - Déchiffrer le mot de passe PXE stocké dans la clé de registre du DP SCCM (reg query HKLM\software\microsoft\sms\dp /v Reserved1)
pxethief.py 8 - Écrire un nouveau fichier 'settings.ini' par défaut dans le répertoire PXEThief
pxethief.py 10 - Afficher la table des interfaces Scapy pour identifier les indices d'interface à utiliser dans 'settings.ini'
pxethief.py -h - Afficher le texte d'aide de PXEThief
pxethief.py 5 <nom-du-fichier-variables> doit être utilisé pour générer un « hash » d'un fichier de variables média qui pourra être utilisé pour des attaques de devinement de mot de passe avec le module Hashcat publié sur https://github.com/MWR-CyberSec/configmgr-cryptderivekey-hashcat-module.
Un fichier contenu dans le dossier principal de PXEThief est utilisé pour définir des options de configuration plus statiques. Les voici :
[SCAPY SETTINGS]
automatic_interface_selection_mode = 1
manual_interface_selection_by_id =
[HTTP CONNECTION SETTINGS]
use_proxy = 0
use_tls = 0
[GENERAL SETTINGS]
sccm_base_url =
auto_exploit_blank_password = 1
automatic_interface_selection_mode tentera de déterminer automatiquement la meilleure interface pour Scapy, par commodité. Il le fait en utilisant deux techniques principales. Si défini sur 1, il tentera d'utiliser l'interface qui peut atteindre la passerelle par défaut de la machine comme interface de sortie. Si défini sur 2, il cherchera la première interface qui possède une adresse IP qui n'est pas une adresse IP d'autoconfiguration ou localhost. Cela échouera à sélectionner l'interface appropriée dans certains scénarios, c'est pourquoi vous pouvez forcer l'utilisation d'une interface spécifique avec 'manual_interface_selection_by_id'.manual_interface_selection_by_id vous permet de spécifier l'index entier de l'interface que vous voulez que Scapy utilise. L'ID à utiliser dans ce fichier doit être obtenu en exécutant pxethief.py 10.sccm_base_url est utile pour remplacer le point de gestion (Management Point) avec lequel l'outil communiquera. Cela est utile si le DNS ne résout pas (donc la valeur lue depuis le fichier de variables média ne peut pas être utilisée) ou si vous avez identifié plusieurs points de gestion et souhaitez envoyer votre trafic vers un point spécifique. Il doit être fourni sous la forme d'une URL de base, par exemple http://mp.configmgr.com au lieu de mp.configmgr.com ou http://mp.configmgr.com/stuff.auto_exploit_blank_password modifie le comportement de pxethief 1 pour tenter automatiquement d'exploiter un point de distribution PXE non protégé par mot de passe. Définir ce paramètre sur 1 activera l'exploitation automatique, tandis que le définir sur 0 affichera la chaîne client tftp que vous devez utiliser pour télécharger le fichier de variables média. Notez que presque tout le temps vous voudrez que ce paramètre soit défini sur 1, car le PXE non protégé par mot de passe utilise une clé binaire envoyée dans la réponse DHCP que vous recevez lorsque vous demandez au point de distribution d'effectuer un démarrage PXE.Non implémentés dans cette version
pip install -r requirements.txt)pxethief.py 1 ou pxethief.py 2 pour identifier et générer un fichier de variables média, assurez-vous que l'interface utilisée par l'outil est la bonne. Si ce n'est pas le cas, définissez-la manuellement dans 'settings.ini' en identifiant le bon index ID à utiliser avec pxethief.py 10pxethief.py et l'adresse du proxy peut être définie à la ligne 693. Je prévois de déplacer cette fonctionnalité pour qu'elle soit configurable dans 'settings.ini' lors de la prochaine mise à jour du code.pywin32 pour utiliser certaines fonctions de cryptographie Windows intégrées. Cela n'est pas disponible sous Linux, car les API de cryptographie Windows ne le sont pas non plus :P Le code Scapy dans pxethief.py, cependant, est pleinement fonctionnel sous Linux, mais vous devrez supprimer (au moins) l'inclusion de win32crypt pour le faire fonctionner sous Linux.Attendez-vous à rencontrer des problèmes de gestion des erreurs avec cet outil ; il existe des nuances subtiles avec tout ce qui concerne ConfigMgr et bien que j'aie considérablement amélioré la gestion des erreurs en préparation de la sortie de l'outil, cela n'est en aucun cas complet. Si des cas limites échouent, créez un rapport détaillé ou corrigez-les et soumettez une pull request :) Je les examinerai pour voir où des améliorations raisonnables peuvent être apportées. Lisez le code / regardez le talk et comprenez ce qui se passe si vous l'utilisez dans un environnement de production. Gardez à l'esprit les termes de la licence – l'utilisation de l'outil est à vos propres risques.
Identifier et récupérer les identifiants des séquences de tâches SCCM/MECM – Dans cet article, j'explique tout le flux de découverte, téléchargement et déchiffrement des politiques ConfigMgr après l'obtention d'un certificat OSD valide. Je souhaite également souligner les deux premières références de cet article car elles montrent des recherches offensives très intéressantes sur SCCM qui sont en cours actuellement.
Slides DEF CON 30 – Lien vers les slides du talk
Copyright (C) 2022 Christopher Panayi, MWR CyberSec