Credenziali nelle Group Policy Preferences: Group Policy Preferences (T1552.006)

Quando un amministratore di dominio utilizza le Group Policy Preferences per configurare account locali, password o mapped drive, le credenziali vengono salvate in file XML all'interno della share SYSVOL del domain controller. Il problema è strutturale: la chiave AES-256 usata per cifrare queste password è stata pubblicata da Microsoft nella documentazione MSDN, rendendo la "cifratura" di fatto inesistente. Qualsiasi utente autenticato nel dominio può navigare SYSVOL, individuare i file XML contenenti l'attributo cpassword e decifrarlo in chiaro in pochi secondi.

La tecnica ricade nella tattica Credential Access (TA0006), ovvero la fase della kill chain in cui l'avversario punta a ottenere credenziali valide — nomi utente e password — per muoversi lateralmente, elevare privilegi o garantirsi persistenza. Il rischio è amplificato dal fatto che le GPP spesso contengono credenziali di account amministrativi locali, condivise su centinaia di macchine.

Due gruppi APT documentati e due tool offensivi noti sfruttano attivamente questa tecnica. L'impatto è particolarmente critico in ambienti enterprise che non hanno applicato la patch KB2962486 o che mantengono file GPP legacy nella share SYSVOL.

L'estrazione di credenziali GPP è uno dei quick win più efficaci in un engagement interno. Il flusso operativo è semplice: enumerare la share SYSVOL, individuare i file XML con attributo cpassword, decifrare la password. L'intera catena può completarsi in meno di un minuto dalla compromissione iniziale di un qualsiasi account di dominio.

Il primo passo è l'enumerazione. Da una shell su un host domain-joined, il comando nativo è sufficiente:

*dir \<DOMINIO>\SYSVOL<DOMINIO>\Policies\ /s /b .xml

Questo restituisce ricorsivamente tutti i file XML nelle policy. I file di interesse sono tipicamente Groups.xml, Services.xml, ScheduledTasks.xml, DataSources.xml, Drives.xml e Printers.xml. Cercate la stringa cpassword all'interno di ciascun file: se presente, contiene la password cifrata con la chiave AES nota.

Per la decifrazione automatizzata, lo strumento più diretto è Get-GPPPassword, disponibile come modulo di PowerSploit (open source, repository archiviato). Da una sessione PowerShell:

Get-GPPPassword

Il cmdlet enumera autonomamente SYSVOL, identifica i file XML con cpassword e restituisce in chiaro username, password, data di modifica e il path della GPO. Wizard Spider ha impiegato esattamente questo approccio con Get-GPPPassword e il complementare Find-GPOPassword per raccogliere credenziali in reti compromesse.

In Metasploit Framework (open source), dopo aver ottenuto una sessione Meterpreter su un host domain-joined:

use post/windows/gather/credentials/gpp set SESSION <id_sessione> run

Il modulo esegue la stessa logica: naviga SYSVOL, estrae e decifra le cpassword. È l'approccio usato anche in contesti di red team automatizzato.

Per ambienti dove si preferisce operare da Linux, lo script gpprefdecrypt.py (open source) accetta direttamente la stringa cpassword e restituisce la password in chiaro. Il flusso prevede di montare la share SYSVOL via SMB, copiare il file XML e poi eseguire:

python3 gpprefdecrypt.py "<stringa_cpassword>"

Un'alternativa integrata è SILENTTRINITY (open source), un framework C2 post-exploitation che include un modulo dedicato per l'estrazione delle password GPP cached. È utile in scenari dove il red team opera già attraverso un impianto SILENTTRINITY e vuole evitare di caricare tool aggiuntivi.

Come validazione, confrontate le credenziali estratte con gli account locali sulle macchine target usando CrackMapExec (open source) per verificare se le password sono ancora valide e su quali host funzionano.

Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?

Scarica la guida gratuita e segui il percorso corretto fin dal primo passo