
PXEThief è un insieme di strumenti in grado di estrarre password dalla funzionalità di distribuzione del sistema operativo in Microsoft Endpoint Configuration Manager.
PXEThief è un insieme di strumenti che implementa i percorsi di attacco discussi al DEF CON 30 nel talk Pulling Passwords out of Configuration Manager (https://forum.defcon.org/node/241925) contro la funzionalità di distribuzione del sistema operativo in Microsoft Endpoint Configuration Manager (o ConfigMgr, ancora comunemente noto come SCCM). Consente di raccogliere credenziali dai Network Access Accounts configurati (https://docs.microsoft.com/en-us/mem/configmgr/core/plan-design/hierarchy/accounts#network-access-account) e da qualsiasi Task Sequence Account o credenziali memorizzate all'interno delle Collection Variables di ConfigMgr configurate per la raccolta "All Unknown Computers". Questi account Active Directory sono spesso sovra-permissionati e consentono l'escalation dei privilegi verso l'accesso amministrativo in qualche parte del dominio, almeno per la mia esperienza personale.
Probabilmente, l'attacco più serio che può essere eseguito con questo strumento riguarderebbe la distribuzione avviata da PXE supportata per "All unknown computers" su un distribution point senza password, o con una password debole. Il sovra-permissionamento degli account ConfigMgr esposti a OSD menzionato in precedenza può quindi consentire l'esecuzione di una catena completa di attacchi ad Active Directory con il solo accesso di rete all'ambiente di destinazione.
python pxethief.py -h
pxethief.py 1 - Automatically identify and download encrypted media file using DHCP PXE boot request. Additionally, attempt exploitation of blank media password when auto_exploit_blank_password is set to 1 in 'settings.ini'
pxethief.py 2 <IP Address of DP Server> - Coerce PXE Boot against a specific MECM Distribution Point server designated by IP address
pxethief.py 3 <variables-file-name> <Password-guess> - Attempt to decrypt a saved media variables file (obtained from PXE, bootable or prestaged media) and retrieve sensitive data from MECM DP
pxethief.py 4 <variables-file-name> <policy-file-path> <password> - Attempt to decrypt a saved media variables file and Policy XML file retrieved from a stand-alone TS media
pxethief.py 5 <variables-file-name> - Print the hash corresponding to a specified media variables file for cracking in Hashcat
pxethief.py 6 <identityguid> <identitycert-file-name> - Retrieve task sequences using the values obtained from registry keys on a DP
pxethief.py 7 <Reserved1-value> - Decrypt stored PXE password from SCCM DP registry key (reg query HKLM\software\microsoft\sms\dp /v Reserved1)
pxethief.py 8 - Write new default 'settings.ini' file in PXEThief directory
pxethief.py 10 - Print Scapy interface table to identify interface indexes for use in 'settings.ini'
pxethief.py -h - Print PXEThief help text
pxethief.py 5 <variables-file-name> dovrebbe essere usato per generare un 'hash' di un file di variabili dei media che può essere utilizzato per attacchi di indovinamento password con il modulo Hashcat pubblicato su https://github.com/MWR-CyberSec/configmgr-cryptderivekey-hashcat-module.
Un file contenuto nella cartella principale di PXEThief viene utilizzato per impostare opzioni di configurazione più statiche. Queste sono le seguenti:
[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 tenterà di determinare automaticamente la migliore interfaccia per Scapy, per comodità. Lo fa utilizzando due tecniche principali. Se impostato su 1, tenterà di utilizzare l'interfaccia che può raggiungere il gateway predefinito della macchina come interfaccia di uscita. Se impostato su 2, cercherà la prima interfaccia che trova con un indirizzo IP che non sia un autoconfigure o un indirizzo IP localhost. Ciò potrebbe non riuscire a selezionare l'interfaccia appropriata in alcuni scenari, motivo per cui è possibile forzare l'uso di un'interfaccia specifica con 'manual_interface_selection_by_id'.manual_interface_selection_by_id consente di specificare l'indice intero dell'interfaccia che si desidera utilizzare con Scapy. L'ID da utilizzare in questo file deve essere ottenuto eseguendo pxethief.py 10.sccm_base_url è utile per sovrascrivere il Management Point con cui lo strumento parlerà. Ciò è utile se DNS non risolve (quindi il valore letto dal file delle variabili dei media non può essere utilizzato) o se sono stati identificati più Management Points e si desidera inviare il traffico a uno specifico. Deve essere fornito come URL di base, ad esempio http://mp.configmgr.com invece di mp.configmgr.com o http://mp.configmgr.com/stuff.auto_exploit_blank_password modifica il comportamento di pxethief 1 per tentare automaticamente di sfruttare un PXE Distribution Point non protetto da password. Impostarlo su 1 abiliterà lo sfruttamento automatico, mentre impostarlo su 0 stamperà la stringa del client tftp che si dovrebbe usare per scaricare il file delle variabili dei media. Si noti che quasi sempre si vorrà impostare questo su 1, poiché un PXE non protetto da password utilizza una chiave binaria che viene inviata nella risposta DHCP ricevuta quando si chiede al Distribution Point di eseguire un PXE boot.Non implementate in questa versione
pip install -r requirements.txt)pxethief.py 1 o pxethief.py 2 per identificare e generare un file di variabili dei media, assicurarsi che l'interfaccia utilizzata dallo strumento sia impostata su quella corretta; se non è corretta, impostarla manualmente in 'settings.ini' identificando l'ID indice giusto da usare da pxethief.py 10pxethief.py e l'indirizzo del proxy può essere impostato alla riga 693. Ho intenzione di spostare questa funzionalità per renderla configurabile in 'settings.ini' nel prossimo aggiornamento del codice base.pywin32 per utilizzare alcune funzioni crittografiche integrate di Windows. Questo non è disponibile su Linux, poiché le API crittografiche di Windows non sono disponibili su Linux :P Il codice Scapy in pxethief.py, tuttavia, è completamente funzionante su Linux, ma sarà necessario rimuovere (almeno) l'inclusione di win32crypt per poterlo eseguire su Linux.Aspettatevi di incontrare problemi con la gestione degli errori con questo strumento; ci sono sottili sfumature in tutto ciò che riguarda ConfigMgr e, sebbene abbia notevolmente migliorato la gestione degli errori in preparazione al rilascio dello strumento, questa non è in alcun modo completa. Se ci sono casi limite che falliscono, create una segnalazione dettagliata o risolvetelo e fate una pull request :) Esaminerò queste per vedere dove possono essere apportati miglioramenti ragionevoli. Leggete il codice/guardate il talk e capite cosa sta succedendo se intendete eseguirlo in un ambiente di produzione. Tenete presente i termini di licenza - cioè l'uso dello strumento è a proprio rischio.
Identifying and retrieving credentials from SCCM/MECM Task Sequences - In questo post spiego l'intero flusso di come vengono trovati, scaricati e decifrati i criteri di ConfigMgr dopo aver ottenuto un certificato OSD valido. Voglio anche evidenziare i primi due riferimenti in questo post, poiché mostrano interessanti ricerche offensive su SCCM attualmente in corso.
Slide DEF CON 30 - Link alle slide del talk
Copyright (C) 2022 Christopher Panayi, MWR CyberSec