Análisis de Abuso de ACL en Active Directory
Resumen
Las Listas de Control de Acceso (ACL) de Active Directory definen permisos sobre objetos de AD a través de Listas de Control de Acceso Discrecionales (DACL) que contienen Entradas de Control de Acceso (ACE). Las ACE mal configuradas pueden otorgar a usuarios no privilegiados permisos peligrosos como GenericAll (control total), WriteDACL (modificar permisos), WriteOwner (tomar propiedad) y GenericWrite (modificar atributos) sobre objetos sensibles como grupos de Administradores de Dominio, controladores de dominio o GPO.
Esta habilidad utiliza la biblioteca Python ldap3 para conectarse a un Controlador de Dominio, consultar objetos con su atributo nTSecurityDescriptor, analizar el descriptor de seguridad binario a formato SDDL (Security Descriptor Definition Language) e identificar ACE que otorgan permisos peligrosos a entidades no administrativas. Estas configuraciones erróneas son la base de las rutas de ataque basadas en ACL descubiertas por herramientas como BloodHound.
Cuándo Usarlo
- Cuando se investigan incidentes de seguridad que requieren analizar abusos de ACL en Active Directory
- Cuando se construyen reglas de detección o consultas de caza de amenazas para este dominio
- Cuando los analistas del SOC necesitan procedimientos estructurados para este tipo de análisis
- Cuando se valida la cobertura de monitoreo de seguridad para técnicas de ataque relacionadas
Prerrequisitos
- Python 3.9 o posterior con la biblioteca ldap3 (
pip install ldap3) - Credenciales de usuario de dominio con acceso de lectura a objetos de AD
- Conectividad de red al Controlador de Dominio en el puerto 389 (LDAP) o 636 (LDAPS)
- Comprensión del modelo de seguridad de Active Directory y el formato SDDL
Pasos
-
Conectar al Controlador de Dominio: Establecer una conexión LDAP usando ldap3 con autenticación NTLM o simple. Usar LDAPS (puerto 636) para conexiones cifradas en producción.
-
Consultar objetos objetivo: Buscar en la OU objetivo o en todo el dominio objetos que incluyan usuarios, grupos, equipos y OUs. Solicitar los atributos
nTSecurityDescriptor,distinguishedName,objectClassysAMAccountName. -
Analizar descriptores de seguridad: Convertir el nTSecurityDescriptor binario a su representación de cadena SDDL. Analizar cada ACE en la DACL para extraer el SID del fiduciario, la máscara de acceso y el tipo de ACE (permitir/denegar).
-
Resolver SIDs a entidades: Mapear los identificadores de seguridad (SID) a nombres de cuenta legibles por humanos mediante consultas LDAP al dominio. Identificar SIDs conocidos para grupos integrados.
-
Verificar permisos peligrosos: Comparar la máscara de acceso de cada ACE con las máscaras de bits de permisos peligrosos: GenericAll (0x10000000), WriteDACL (0x00040000), WriteOwner (0x00080000), GenericWrite (0x40000000) y WriteProperty para derechos extendidos específicos.
-
Filtrar fiduciarios administrativos: Excluir los fiduciarios administrativos esperados (Administradores de Dominio, Administradores de Empresa, SYSTEM, Administradores) y marcar las ACE donde usuarios o grupos no privilegiados tengan permisos peligrosos.
-
Mapear rutas de ataque: Para cada hallazgo, documentar la cadena de ataque potencial (ej., GenericAll sobre un usuario permite restablecer contraseña, WriteDACL sobre un grupo permite agregarse a sí mismo al grupo).
-
Generar informe de remediación: Generar un informe JSON con todas las ACE peligrosas, objetos afectados, fiduciarios no administrativos y pasos de remediación recomendados.
Salida Esperada
{
"domain": "corp.example.com",
"objects_scanned": 1247,
"dangerous_aces_found": 8,
"findings": [
{
"severity": "critical",
"target_object": "CN=Domain Admins,CN=Users,DC=corp,DC=example,DC=com",
"target_type": "group",
"trustee": "CORP\\helpdesk-team",
"permission": "GenericAll",
"access_mask": "0x10000000",
"ace_type": "ACCESS_ALLOWED",
"attack_path": "GenericAll sobre el grupo Domain Admins permite agregar miembros arbitrarios",
"remediation": "Eliminar la ACE GenericAll para helpdesk-team en Domain Admins"
}
]
}