writeup Mist HTB
Mist es una maquina de la maxima dificultad. esta maquina enseña como ganar acceso a una maquina en un entorno Active directory para despues pivoterar y comprometer la maquina domain controller. para lo cual vamos a usar pivoting, bypass de el defender, relay attacks, petitPotam, pass the hash, obtencion de certificados, tikets para kerberos etc
RESALTAR QUE GUSTO CUANDO ESTOY ESCRIBIENDO ESTO (9/11/24 A LAS 19:54) LA MAQUINA A SIDO RETIRADA DEL PLAN GRATUITO Y PUES SOLO ME A DADO TIEMPO A COMPLETARLA UNA VEZ
AQUI PRUEVAS DE ELLO POR LO QUE NO E TENDO TIEMPO PARA COMPLETARLA UNA SEGUDA VEZ PARA MIS APUNTES Y EL WRITE UP POR LO QUE NO VA A VER NIGUNA CAPTURA Y SI HAY ES DE OTRO WRITE UP QUE ALLA PILLADO
TAMBIEN AÑADIR QUE E TARDADO MUCHO EN SUBIR ESTE WRITE UP PORQUE SE ME A ECHO MUY PESADO LA VERDAD PERO ES UNA INCREIBLE MAQUINA DE ECHO EN LOS TAGS VEREIS QUE LA TENGO CATALOGADA COMO MEJOR MAQUINA Y QUE ME LA TENGO QUE ESTUDIAR MAS AL 100% XDD
lo primero va a ser un nmap como siempre
nmap -p- --open -sT --min-rate 5000 -vvv -n -Pn 10.10.11.17 -oG allports
<snip>
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 126
<\snip>nmap -sVC -p80 10.10.11.17 -oN target
Nmap scan report for 10.10.11.17
Host is up (0.24s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.52 ((Win64) OpenSSL/1.1.1m PHP/8.1.1)
| http-title: Mist - Mist
|_Requested resource was http://10.10.11.17/?file=mist
|_http-generator: pluck 4.7.18
| http-robots.txt: 2 disallowed entries
|_/data/ /docs/
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.52 (Win64) OpenSSL/1.1.1m PHP/8.1.1
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.84 secondsel escaneo ya nos chiva algo de info. es un servicio apache 2.4.52 y hay un gestor de contenido pluck v4. 7. 18
si vamos a a http://10.10.11.17 veremos de primeras lo siguiente:
vale este es el panel de pluck. si vemos abajo pone admin si le pinchamos sale un panel de login vale puestoas aqui si nos ponemos a investigar descubrimos el siguiente CVE:
CVE-2024-9405 https://nvd.nist.gov/vuln/detail/CVE-2024-9405
basicamente lo que dice el CVE es que nos permite leer archivo en remoto por lo que puede aver filtraciones de datos
si buscamos mas sobre el CVE descubrimos que por ejemplo una ruta a probar para ver si hay filtracion es la siguiente /data/modules/albums/albums_getimage.php
por lo que vamos a provarla:
bump tenemos 200 por lo que tenemos acceso
por lo que segun la informacion del CVE si hago lo siguiente deveria ver el contenido:
y bump lo tenemos
si nos ponemos a mirar por los directorios encontramos /data/settings/modules/albums que tiene algo interesante
vemos que hay un admin_backup.php
si nos lo descargamos con wget:
si intentamos ver el contenido veremos que esta vacio
pero solo a nostros. porque dijo esto? porque si investigamos la ruta /data/modules/albums/albums_getimage.php en internet descubrimos que podemos leer archivo atraves de el
por lo que podemos hacer lo siguiente:
obtenemos un hash vamso a identificarlo con hash-identifier:
tiene pinta de ser un un hash SHA-512
por lo que lo metemos en un archivo y lo pasamos por john:
vemos que la contraseña es lexypoo97
ahora dimplemente la ponemos en el panel de admin y ale listo estamos
lo primero que vamos a intentar es instalar modulos. para ello vamos a options y manage modules y al entrar veremos lo siguiente: en la esquina superior derecha aparece un boton para instalar modulos por lo que le damos
ahora toca crear un modulo malicioso para ello vamos a tener que hacerlo de la siguiente forma:
creamos un archivo php que contenga lo siguiente:
creamos un directorio llamado shell (lo puedes llamar como quieras)
movemos el archivo php a dentro del directorio
lo comprimimos en un .zip
ahora donde pone browse simplemente selecionamos shell.zip y lo subimos
(NOTA: los modulos se reinician cada un x tiempo y hay que volver a subirlos)
por lo que si todo a salido bien si hacemos el sigiente curl deveriamos ver una carpeta shell
vale pues vamos a ver si tenemos ejecucion remota
y tenemos ejecucion remota por loq ye vamos a usar una revshell
mas especificamente esta https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellTcpOneLine.ps1
lo unico hay qu hacerle unas modificaciones para bypasear windows defende, las modifcaciones consisten en poner todo en su diminutivo aqui os dejo la comparativa:
tambien para evitar el defender podemos usar un servidor python externo y asi quitarnos mas problemas. tendriamos que hacer una peticion en get a nuestro servidor atacante para que la maquina victima descarge la revershell y asi ganar acceso
para esto primero tenemos que crear el payload para que ejecute la accion y tenemos que encodearlo en utf-16le y segido de otro encodeado en base64
vale pues una vez echo esto levantamos el servidor python en el directorio donde esta la rever
nos ponemos en escucha con netcat:
y hazemos la siguiente peticion en:
y estamos dentro
si nos vamos a la raiz veremos un directorio raro para una raiz common Applications, en el hay 3 aplicaciones .lnk
vale los .lnk se pueden modificar para que sean maliciosos por lo que vamos a modificar un poco el de la calculadora: 1.
vale ahora tenemos que ser rapidos y mantener el servidor python encendido y ponernos en escucha otra vez
pasado un rato ganaremos acceso como
(NOTA: cada vez que el usuario mist\brandon.keywarp nos da la shell se restableze el .lnk malicioso por lo que hay si la perdemos hay que reacerlo)
(NOTA: recomiendo rehacer el proceso 3 veces para tener 3 shell, se entiende el porque mas adelante)
algo curioso es que los usuarios tienen el prefijo mist pero en el escaneo de nmap solo a aparecido el puerto 80 y nada de active directory
si hacemos un ipconfig:
vemos que nustra ip actual es la 192.168.100.101 vamos a probar a hacer un nslookup al dominio mist.htb aver que sale:
vale tenemos una ip mas la .100
investigando por internet descubri que esta maquina en la que estoy se llama MS01 y la Domain Controller DC01
vamos a comprobar esto
vale era correcta esa info y segun esa info si hago un ipconfig /all:
pues si estamos en una maquina virtual
vale nos vamos a hacer un tunel con chisel para ello vamos a necesitar descargar el chisel para linux y para windows en la maquina atacante y despues por server python pasar el de windows a la maquina victima
y de hay nos pasamos a hacer un wget para descarganos el chisel
vale ahora en la maquina atacante ejecutamos el chisel en modo servidor por el puerto 1234
y en la maquina victima:
(NOTA: PORFAVOR ACUERDATE DE AÑADIR LAS CONFIGURACIONES DEL SOCK A PROXYCHAINS QUE SINO NO FUNCIONA Y DESPUES TE RAYAS Y LLORAS)
ahora añadimos todos los dominios y ips a el etc/hosts:
y de hay con netexec junto a proxychains vamos a ver si vemos el dominio MIST.HTB y tambien la mquina DC01
y emos podido pivotear juju perfect ahora dessde la maquina victima vamos a intentar obtener informacion del dominio con la herramienta SharpHound (para subirlo el mismo procedimiento de server python)
una vez echo debería de generar un archivo .zip, donde además he traspasado un binario de netcat a la máquina víctima el cual usaré para pasar el archivo .zip desde la mqaquina víctima a nuestra máquina de atacante:
en la maquina atacante nos ponemos en escucha para recibir los datos:
y en la victima:
y ahora subimos el archivo a bloodhunt para ver la estructura
vemos que el usuario puede solicitar certificados pero el defender nos jode bastante por lo que hay buscar algun directorio que este en la "lista blanca" segun chatgpt este cmando me deveria dar los directorios:
y vemos que el directorio c:\xampp\htdocs es lista blanca
por lo vamos a ese directorio y descargamos el certify.exe mediante server python
y lo ejecutamos
pues valla no a encontrado nada pues vamos a intentar conseguir el certificado del usuario brandon.keywarp y ya de hay tirar de rubeus para conseguir el hash
y me las da
por lo que nos lo copiamos en un archivo a la maquina atacante y con openssl para generar un nuevo certificado sin contraseña:
vale ahora a la maquina victima tenemos que pasarle Rubeus.exe y el archivo brandon_keywarp_cert.pfx al directorio c:\xampp\htdocs y hay ejecutar de esta forma
lo tenemos
reisamos que el hash funcione
y vemos que esta bien
vale pues vamos a ver si la data enviada a traves de LDAP esta firmada
bueno entonces podemos hacer un Relay Attack pero bastante jodido la verdad
lo primero es hacer un segundo tunel con chisel (por esto lo de al menos 3 terminales) sin matar el otro
creamos un nuevo túnel (básicamente un Local Port Forwarding) entre el puerto 5050 de la máquina MS01 y el puerto 80 de nuestra máquina de atacante usando nuevamente Chisel. Creamos una nueva terminal como el usuario brandon.keywarp y en aquella terminal volvemos a ejecutar Chisel:
ahora necesitamos una version especial de Impacket que se descarga asi en nuestra maquina atacante:
ahora importante toda la instalacion se deve hacer como root:
los ejecutamos una vez para ver que todo este bien:
y si todo esta bien lo devemos de ejcutar de la siguiente forma:
y lo dejamos a la escucha
primero vamos a pasar este codigo a la mquina victima para crear un web client temporal en la máquina víctima
primero lo descargamos en nuestra maquina de esta forma:
pasamos el archivo por server python y lo ejecutamos
y ahora ejecutamos el ataque PetitPotam
vemos que el ataque a salido bien porque si volvemos a al ntlmrelayx.py que emos dejado en segundo plano veremos entre muchas cosas esto:
ya con esto tenemos que ir rapido a ponernos en eschucha por el puerto 11000 para entrar en el servicio LDAP
y ganamos acceso a una sell si escribimos help podemos ver los comandos que nos sirven para este ataque: clear_shadow_creds y set_shadow_creds
y ahora ejecutamos esos comandos:
(NOTA: SI ESTE ULTIMO COMANDO NO OS A FUNCIONA Y OS PONE ALGO DE PKCS12 TIENE SOLUCION. LO QUE TENEIS QUE HACER ES SALIR DE LA SHELL DE LDAP, UNA VEZ EN NUSTRA SHELL ATACANTE JECUTAR LO SIGUIENTE
UNA VEZ ECHO VOLVER A HACER EL PROCESO DESDE QUE DEJAIS EN SEGUNDO PLANO LA HERRAMIENTA DE IMPACKET NTLMRELAYX.PY)
esto nos genera un archivo (se guarda en el directorio en el que estuvieramos al hacer la conexion) y una contraseña para el archivo que tenemos que pasarle a la maquina victima para ejecutar con Rubeus
y tenemos el hash NTLM de la cuenta MS01
(NOTA: SI NOS SALE UN ERROR DE KERBEROS O DEMAS ES POR QUE EL CERTIFICADO SE A RENOVADO POR LO QUE TENMOS QUE REALIZAR OTRA VEZ EL PROCESO PARA GENERAR UN NUEVO CERTIFICADO)
provamos a ver si funciona el hash NTLM que emos conseguido:
y vemos que funciona por lo que podemos solicitar con rubeus un ticket de Administrator lo primero que devemos hacer para ello es esto
copiamos el certificado y eejcutamos lo siguiente:
esto ultimo ticket nos lo guardamos en nuestra maquina local en un archivo llamado MS01_Administrator_ticket_base64.kirbi (se le puede llamar como sea pero tiene que ser .kirbi)
una vez echo tenemos que convertirlo a base64:
y con impacket lo tenemos que convertir en un .ccache
y ya nos ponemos a hacer trastadas con kerberos para sacar los hash NTML de toda la maquina MS01:
vamos a probar tanto en la maquina MS01 como en la DC01 si funciona:
vemos que en la maquina MS01 si que hay acceso pero en la DC01 no para conectarnos podemos usar evil-winrm (lo tiene activo)
Revisando C:\Users muestra un nuevo directorio el cual no se encontraba anteriormente:
El directorio Sharon.Mullard es nuevo.
Buscando por archivos en este directorio muestra:
Podemos ver un archivo .kdbx (archivo KeePass) e imágenes .png.
Descargamos el archivo .kdbx y usamos kpcli para ver su contenido (instalable con sudo apt install kpcli), pero nos pregunta por contraseña:
La cual, de momento, no tenemos.
Descargando las imágenes .png, una de ellas muestra algo interesante:

Está usando CyberChef (https://gchq.github.io/CyberChef/) para encodear un texto. Este texto parece ser algo así como una contraseña (texto encerrado en el rectángulo rojo), pero en total tiene un largo de 15 caracteres (rectángulo naranjo). El texto que se muestra en pantalla son sólo 14 caracteres, de manera que hay un caracter que falta. Para hallar el caracter que falta y así obtener la contraseña del archivo .kdbx podemos usar keepass2johny luego usar Hashcat para tratar de crackear la contraseña. Basados en la página web de Hashcat con ejemplos deberíamos de usar -m 13400 para este hash. Por tanto, ejecutamos:
donde --user es usada para saltarse el texto sharon: al inicio del hash. El caracter faltante era @, por lo que contraseña del KeePass es UA7cpa[#1!_*ZX@.
Usamos esta contraseña con kpcli:
y empezamos a buscar info en éste:
Tenemos lo que parece ser una contraseña: ImTiredOfThisJob:(.
De vuelta a Bloodhound y buscando sharon muestra 2 usuarios:

Tenemos 2 usuarios. Uno es Sharon.Mullard y el otro es op_sharon.mullard.
Podemos ver si la contraseña encontrada en el KeePass le corresponse a alguno de estos usuarios:
De manera que tenemos credenciales: op_sharon.mullard:ImTiredOfThisJob:(.
Además, este usuario se puede conectar a DC01 a través de WinRM:
Tenemos acceso a la máquina DC01.
De vuelta a Bloodhound, clickeando en op_sharon.mullard y luego en Outbound Object Control al lado derecho nos lleva a lo siguiente:

Tenemos el permiso ReadGMSAPassword sobre el usuario svc_ca$.
Esto quiere decir que podemos obtener la contraseña o hash de este usuario usando NetExec:
Obtenemos el hash NTLM de este usuario.
Revisamos si este hash funciona:
Revisando los privilegios de svc_ca$ con Bloodhound podemos ver:

svc_ca$ tiene permisos sobre el usuario svc_cabackup.
Podemos ver la diferencia entre estos 2 usuarios al comparar su atributo User Account Control en Bloodhound:

Yendo a la documentación oficial de Microsoft para estos valores podemos ver que el usuario svc_ca$, con valor 4096, está catalogado como WORKSTATION_TRUST_ACCOUNT; mientras que el usuario svc_cabackup tiene valor 66048 catalogado como DONT_EXPIRE_PASSWORD. Es decir, este último usuario es un usuario normal.
Adicionalmente, en Bloodhound clickeando en Cypher -> Active Directory Certificates -> Enrollment rights on CertTemplates with OIDGroupLink somos capaces de ver que podemos inscribir certificados gracias al certificado ManagerAuthentication. Revisando qué es lo que puede hacer el usuario svc_cabackup, podemos ver:

Hay un camino que nos lleva al certificado BackupSvcAuthentication, lo cual nos debería de permitir de realizar respaldos de archivos importantes del sistema.
Por tanto, en Bloodhound, clickeando en Pathfinding en la parte superior izquierda podemos buscar cómo llegar desde svc_cabackup al grupo Backup Operators:

Primero lo primero. Dado que teníamos la propiedad/derecho AddKeyCredentialLink sobre el usuario svc_cabackup podemos impersonar este usuario utilizando la herramienta PyWhisker (descargable desde su repositorio de Github). Usaremos una versión levemente vieja de éste usando un viejo commit, e instalar todas las viejas dependencias en un entorno virtual:
Lo ejecutamos usando el hash de svc_ca$:
Obtenemos un certificado.
Tal cual dice el output, podemos usar PKINITtools (descargable desde su repositorio de Github) para usar este certificado (o podríamos usar Rubeus como lo hicimos anteriormente). Instalamos PKINITtools en un nuevo entorno virtual, copiamos el certificado generado por PyWhisker, junto con la contraseña generada por éste, y los usamos:
También necesitamos guardar la key (el string que empieza con 30a0bb... en este caso en específico).
Luego, solicitamos el hash NT usando getnthash.py:
Este hash funciona:
Siguiendo la secuencia de ataques recomendada por Bloodhound podemos usar Certipy para solicitar un certificado. Ejecutamos entonces:
Tenemos un nuevo certificado.
Usamos Certipy de nuevo para crear un nuevo archivo .kirbi, y usamos ticketConverter.py de Impacket para convertir este archivo a uno .ccache:
Podemos usar Certipy nuevamente, pero esta vez usando el ticket Kerberos generado que a su vez usa el certificado ManagerAuthentication para autenticarse, cambiando el certificado que queremos solicitar que esta vez es BackupSvcAuthentication:
Podemos usar entonces este certificado para solicitar un ticket .kirbi y convertirlo nuevamente:
En resumen, hemos solicitado el certificado ManagerAuthentication como el usuario svc_cabackup y generamos un nuevo ticket para este usuario el cual tendrá “privilegios” contenidos por este primer certificado. Luego, utilizando el primer ticket para autenticarnos (el cual nos da “permisos” para solicitar otros certificados), solicitamos el certificado BackupSvcAuthentication. Finalmente, usamos este segundo certificado para forjar un último ticket de Kerberos. Este ticket nos otorgará los “permisos” para respaldar archivos importantes del sistema.
Usando el ticket generado, creamos copias de los archivos SAM, SECURITY y SYSTEM usando impacket-reg. Notamos, de la sesión del usuario op_sharon.mullard de evil-winrmen DC01, que existe un directorio C:\ps:
De manera que ejecutamos impacket-reg usando el ticket generado y guardando los archivos de respaldo en el directorio /ps en la máquina DC01:
Descargamos estos archivos usando la función download de evil-winrm desde la sesión del usuario op_sharon.mullard en DC01:
Una vez descargados, extraemos los hashes usando secretsdump.py:
Sin embargo, este hash para el usuario Administrator no funciona en la máquina DC01.
No obstante, tenemos un hash de $MACHINE.ACC (o DC01$). Podemos revisar si este hash funciona:
Funciona.
Podemos entonces performar un ataque DCSync (basados en este blog) usando esta cuenta y impacket-secretsdump:
Finalmente, usamos este hash del usuario Administrator para loguearnos como el usuario Administrator en la máquina principal DC01:
Última actualización