Mirage HackTheBox (Hard)
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>nmap -sCV -p<PORTS> <IP>Info:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-27 04:07 PDT
Nmap scan report for 10.10.11.78
Host is up (0.044s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-10-27 18:07:37Z)
111/tcp open rpcbind?
| rpcinfo:
| program version port/proto service
| 100003 2,3 2049/udp nfs
| 100003 2,3 2049/udp6 nfs
| 100003 2,3,4 2049/tcp nfs
|_ 100003 2,3,4 2049/tcp6 nfs
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: mirage.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject:
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after: 2105-07-04T19:58:41
|_ssl-date: TLS randomness does not represent time
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: mirage.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject:
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after: 2105-07-04T19:58:41
|_ssl-date: TLS randomness does not represent time
2049/tcp open nfs 2-4 (RPC #100003)
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: mirage.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject:
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after: 2105-07-04T19:58:41
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: mirage.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject:
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after: 2105-07-04T19:58:41
4222/tcp open vrml-multi-use?
| fingerprint-strings:
| GenericLines:
| INFO
{"server_id":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","server_name":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","version":"2
.11.3","proto":1,"git_commit":"a82cfda","go":"go1.24.2","host":"0.0.0.0","port":4222,"headers":true,"auth_required":true,"max_payload":1048576,"jetstream":tr
ue,"client_id":436,"client_ip":"10.10.14.182","xkey":"XDWI5OZZKTZ22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2"}
| -ERR 'Authorization Violation'
| GetRequest:
| INFO
{"server_id":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","server_name":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","version":"2
.11.3","proto":1,"git_commit":"a82cfda","go":"go1.24.2","host":"0.0.0.0","port":4222,"headers":true,"auth_required":true,"max_payload":1048576,"jetstream":tr
ue,"client_id":437,"client_ip":"10.10.14.182","xkey":"XDWI5OZZKTZ22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2"}
| -ERR 'Authorization Violation'
| HTTPOptions:
| INFO
{"server_id":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","server_name":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","version":"2
.11.3","proto":1,"git_commit":"a82cfda","go":"go1.24.2","host":"0.0.0.0","port":4222,"headers":true,"auth_required":true,"max_payload":1048576,"jetstream":tr
ue,"client_id":438,"client_ip":"10.10.14.182","xkey":"XDWI5OZZKTZ22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2"}
| -ERR 'Authorization Violation'
| NULL:
| INFO
{"server_id":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","server_name":"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL","version":"2
.11.3","proto":1,"git_commit":"a82cfda","go":"go1.24.2","host":"0.0.0.0","port":4222,"headers":true,"auth_required":true,"max_payload":1048576,"jetstream":tr
ue,"client_id":435,"client_ip":"10.10.14.182","xkey":"XDWI5OZZKTZ22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2"}
|_ -ERR 'Authentication Timeout'
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49963/tcp open msrpc Microsoft Windows RPC
49974/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49975/tcp open msrpc Microsoft Windows RPC
49989/tcp open msrpc Microsoft Windows RPC
49994/tcp open msrpc Microsoft Windows RPC
50012/tcp open msrpc Microsoft Windows RPC
50028/tcp open msrpc Microsoft Windows RPC
63581/tcp open msrpc Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at
https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port4222-TCP:V=7.95%I=7%D=10/27%Time=68FF5275%P=x86_64-pc-linux-gnu%r(N
SF:ULL,1D1,"INFO\x20{\"server_id\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7W
SF:KI6U5R5X4Y3RUDO75EL\",\"server_name\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37Z
SF:QVLO7WKI6U5R5X4Y3RUDO75EL\",\"version\":\"2\.11\.3\",\"proto\":1,\"git_
SF:commit\":\"a82cfda\",\"go\":\"go1\.24\.2\",\"host\":\"0\.0\.0\.0\",\"po
SF:rt\":4222,\"headers\":true,\"auth_required\":true,\"max_payload\":10485
SF:76,\"jetstream\":true,\"client_id\":435,\"client_ip\":\"10\.10\.14\.182
SF:\",\"xkey\":\"XDWI5OZZKTZ22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2\
SF:"}\x20\r\n-ERR\x20'Authentication\x20Timeout'\r\n")%r(GenericLines,1D2,
SF:"INFO\x20{\"server_id\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X
SF:4Y3RUDO75EL\",\"server_name\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI
SF:6U5R5X4Y3RUDO75EL\",\"version\":\"2\.11\.3\",\"proto\":1,\"git_commit\"
SF::\"a82cfda\",\"go\":\"go1\.24\.2\",\"host\":\"0\.0\.0\.0\",\"port\":422
SF:2,\"headers\":true,\"auth_required\":true,\"max_payload\":1048576,\"jet
SF:stream\":true,\"client_id\":436,\"client_ip\":\"10\.10\.14\.182\",\"xke
SF:y\":\"XDWI5OZZKTZ22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2\"}\x20\r
SF:\n-ERR\x20'Authorization\x20Violation'\r\n")%r(GetRequest,1D2,"INFO\x20
SF:{\"server_id\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75
SF:EL\",\"server_name\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3
SF:RUDO75EL\",\"version\":\"2\.11\.3\",\"proto\":1,\"git_commit\":\"a82cfd
SF:a\",\"go\":\"go1\.24\.2\",\"host\":\"0\.0\.0\.0\",\"port\":4222,\"heade
SF:rs\":true,\"auth_required\":true,\"max_payload\":1048576,\"jetstream\":
SF:true,\"client_id\":437,\"client_ip\":\"10\.10\.14\.182\",\"xkey\":\"XDW
SF:I5OZZKTZ22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2\"}\x20\r\n-ERR\x2
SF:0'Authorization\x20Violation'\r\n")%r(HTTPOptions,1D2,"INFO\x20{\"serve
SF:r_id\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL\",\"s
SF:erver_name\":\"NDNXPIQW6IRVY5UQVX6O4RBRMV6C37ZQVLO7WKI6U5R5X4Y3RUDO75EL
SF:\",\"version\":\"2\.11\.3\",\"proto\":1,\"git_commit\":\"a82cfda\",\"go
SF:\":\"go1\.24\.2\",\"host\":\"0\.0\.0\.0\",\"port\":4222,\"headers\":tru
SF:e,\"auth_required\":true,\"max_payload\":1048576,\"jetstream\":true,\"c
SF:lient_id\":438,\"client_ip\":\"10\.10\.14\.182\",\"xkey\":\"XDWI5OZZKTZ
SF:22WXIABU4LKMDCWYYOKZD3FLDNUTJQYSAUX27SLOTHOS2\"}\x20\r\n-ERR\x20'Author
SF:ization\x20Violation'\r\n");
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_clock-skew: 6h59m59s
| smb2-time:
| date: 2025-10-27T18:08:42
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 81.77 secondsVeremos varias cosas interesantes y puertos interesantes, entre ellos el LDAP, WinRM, SMB, etc..., pero tambien veremos que hay un dominio llamado mirage.htb y un DC con un dominio de AD llamado dc01.mirage.htb, por lo que vamos añadirlo a nuestro archivo hosts.
Lo guardamos y ahora probaremos a exfiltrar informacion del puerto NFS (Network File System) que pertenece al puerto 2049, esto es muy interesante ya que con este puerto es un protocolo de sistema de archivos en red que permite montar directorios remotos como si fueran locales.
Vamos a montar dichos archivos con estos comandos:
Info:
Veremos que ha funcionado y vemos un NFS accesible por everyone llamado MirageReports, por lo que vamos a montarlo a nivel local.
Info:
Veremos 2 archivos PDF bastante interesantes, si lo empezamos a investigar veremos informacion del PDF llamado Incident_Report_Missing_DNS_Record_nats-svc.pdf que veremos esta informacion bastante interesantes:
Ya que es un archivo respecto a un reporte de un incidente en la empresa, como cuando se realiza un pentesting.


Vemos que se esta utilizando un nuevo dominio creado a nivel DNS llamado nats-svc, tambien detectamos un usuario llamado Dev_Account_A, pero no existe registro DNS oficial para este servicio nats-svc, la vulnerabilidad de todo esto es que el sistema aceptará respuestas DNS no autenticadas.
DNS Spoofing/DNS Poisoning
Hipotesis Grafica (Vuln)
Vamos añadir ese dominio a nuestro archivo hosts.
Ahora podemos utilizar diversas herramientas para realizar este ataque, en mi caso utilizare un script en python3 que primero envenenara los servidores DNS creando dicho dominio que vimos anteriormente DNS de la victima:
spoofingDNS.py
Ahora crearemos otro script que actue como proxy MITM para interceptar dicho trafico que pase por el mismo.
proxyMITM.py
Ahora vamos a ejecutarlo en este orden:
Info:
Con esto veremos que ha funcionado, se ha creado de forma correcta el dominio apuntando a nuestra IP atacante, ahora seguidamente ejecutaremos en otra terminal el segundo script para estar a la escucha de cualquier conexion que se realice en el dominio:
Info:
Veremos que ha funcionado y obtendremos unas credenciales:
Ha funcionado la autenticacion hacia nosotros con dichas credenciales, por lo que una vez teniendo estas credenciales vamos a intentar obtener toda la informacion que podamos mediante el puerto NATS con una herramienta de GitHub.
Exfiltrar informacion por NATS (Auth)
Una vez descargado la herramienta, vamos a utilizarla utilizando las credenciales obtenidas de esta forma para intentar obtener informacion mediante NATS de los logs de autenticacion.
Info:
No veremos nada interesante, pero sabemos que funciona, por lo que vamos a tirar por aqui, vamos a probar en vez de sacar la info, a visualizar los auth_logs de esta forma:
Info:
Vemos algo muy interesante y es que se autentico varias veces el usuario david.jjackson con el muestra la contraseña en texto plano, vamos a obtener el TGT de dicho usuario para utilizar la autenticacion mediante kerberos.
Obtener TGT david.jjackson
Info:
Ahora vamos a exportarlo en la variable de kerberos.
Ahora vamos a probar a enumerar los usuarios por LDAP de esta forma:
Info:
Vemos varios usuarios interesantes, por lo que vamos a probar a ver si algun usuario fuera vulnerable a kerberoasting utilizando esta herramienta:
Escalate user nathan.aadam
Kerberoasting user nathan.aadam
Info:
Veremos que hemos conseguido el hash de un usuario llamado nathan.aadam gracias a que es vulnerable a kerberoasting, por lo que vamos a probar a crackearlo de esta forma:
hash.nathan.aadam
Ahora vamos a crackearlo...
Info:
Veremos que ha funcionado, por lo que obtendremos dichas credenciales de dicho usuario, vamos a obtener el TGT del usuario para utilizar la autenticacion por kerberos.
Obtener TGT nathan.aadam
Info:
Ahora vamos a exportarlo por la variable de kerberos de esta forma como antes:
Hecho esto vamos a probar a conectarnos por WinRM utilizando la autenticacion de Kerberos, pero para que no de errores de zona horaria, vamos ha configurar kerberos5 con el KDC.
Ahora vamos a conectarnos con la herramienta de evil-winrm habiendo configurado ya todo y utilizando la autenticacion de kerberos.
evil-winrm user nathan.aadam
Info:
Veremos que habremos accedido de forma correcta al servidor de la maquina victima por WinRM, por lo que leeremos la flag del usuario.
user.txt
Escalate user MARK.BBOND
Vamos a dumpearnos en un ZIP la informacion del dominio para darsela a BloodHound y poder ver un poco los privilegios y escalada principal de forma mas clara.
Desde una terminal de nuestro atacante vamos a lanzar el siguiente comando:
Info:
BloodHound
Ahora vamos a instalar BloodHound de forma rapida en un docker:
URL = Download BloodHound en Docker
Info:
Ahora que esta importado en nuestro docker y levantado podremos acceder a el desde la siguiente URL.
Nos logueamos con las credenciales propocionadas por la herramienta, entrando nos pedira cambiar las credenciales y ya nos metera dentro:
Una vez dentro vamos a importar el .zip y tendremos que esperar un poco a que cargue todos los datos, despues cuando vayamos al dashboard principal veremos todos los datos, vamos a investigar el usuario nathan.aadam a ver que tiene.
WinPEAS
Veremos que con ese usuario no vemos nada interesante, por lo que vamos a realizar un fuzzing con WinPEAS a que nos scanee todo el sistema a ver que encuentra.
Ahora desde la utilidad de evil-winrm podremos subirlo con un comando:
Info:
Ahora vamos a ejecutarlo de esta forma:
Info:
Tambien veremos interesante este archivo de aqui:
Si lo leemos veremos lo siguiente:
Info:
Vemos lo que parecen credenciales, las cuales nos vamos a guardar para probarlas si nos hiciera falta en un futuro, pero es interesante saberlo.
Despues de investigar un rato en BloodHound veremos con el usuario mark.bbond que es muy interesante ya que puede forzar el cambio de contraseña respecto al usuario llamado JAVIER.MMARSHALL.

Este usuarios a su vez tendra los privilegios de ReadGMSAPassword respecto al servicio llamado MIRAGE-SERVICE$...

Esto es muy interesante ya que podremos obtener las credenciales de dicho servicio, vamos a empezar por escalar al usuario llamado MARK.BBOND de esta forma:
Primero vamos a probar las credenciales intentando obtener la informacion a nivel de objeto del usuario JAVIER.MMARSHALL.
Info:
Vemos que funciona, por lo que vamos a probar a resetear la contraseña del usuario javier.mmarshall de esta forma, pero antes vamos a obtener el TGT de dicho usuario para utilizar la autenticacion de kerberos:
Escalate user JAVIER.MMARSHALL
Info:
Veremos que ha funcionado, por lo que vamos a exportar la variable de kerberos:
Ahora vamos si vamos a resetear la contraseña de dicho usuario:
Info:
Veremos que funciono, por lo que vamos a obtener el TGT de dicho usuario para utilizar la autenticacion de kerberos, pero si lo intentamos veremos que algo lo esta rechazando, vamos a probar a deshabilitar el UAC de dicho usuario.
Info:
Hecho esto vamos a probar a obtener dicho TGT del usuario...
Info:
Veremos que nos da un error de que la cuenta puede estar dehabilitada o revocada por lo que vamos a probar desde la shell de powershell a ejecutar el siguiente comando:
Quitar restriccion (JAVIER.MMARSHALL)
Con esto lo que hacemos es crear una contraseña de forma segura, habilitar la cuenta y seguidamente limpiarle las restricciones de horario que pueda tener el usuario para que asi no de error, ahora desde la terminal de nuestro host vamos a repetir el mismo proceso de cambiar la contraseña de nuevo por si acaso.
Y ahora seguidamente obtenemos el TGT del usuario javier.mmarshall.
Escalate service Mirage-Service$
Info:
Veremos que ha funcionado, por lo que vamos a exportarlo en la variable de kerberos para utilizar la autenticacion de kerberos.
Ahora recordemos que podemos obtener el hash NTLM del servicio Mirage-Service$ por lo que lo obtendremos de esta forma:
Info:
Vemos que lo hemos obtenido de forma correcta, por lo que vamos a obtener el TGT del servicio utilizando el propio hash de esta forma:
Info:
Veremos que ha funcionado, teniendo esto vamos a exportarlo a nuestra variable de kerberos.
Escalate Privileges
Investigando un poco veremos que podremos realizar un abuso de certificado, para ello vamos a engañar al sistema haciendole creer que la cuenta de dc01$ se llama mirage-service$ para ello cambiaremos el UPN de la cuenta dc01$, para asignarle un nuevo UPN hacia el servicio mirage-service$.
Modificacion del UPN
Info:
Ahora que cambiamos el UPN podremos solicitar un certificado utilizando el TGT del usuario mark, ahora podremos solicitarlo ya que cambiamos el UPN al de dicho servicio.
Solicitud de certificado
Info:
Veremos que ha funcionado y obtendremos un archivo llamado dc01.pfx, con este podremos abrir una shell con privilegios de DC directamente utilizando el certificado.
Suplatacion de dc01$
Info:
Ahora dentro de dicha shell vamos a configurar el RBCD para que la cuenta nathan.aadam pueda suplantar a dc01$.
Info:
Veremos que ha funcionado por lo que vamos a volver a solicitar el TGT de dicho usuario:
Info:
Ahora vamos a exportar la variable kerberos de esta forma:
Hecho esto vamos a obtener el TGT del usuario dc01$ suplantandole con el TGT del usuario nathan.aadam como ya configuramos anteriormente:
Info:
Ahora vamos a exportarlo en nuestra variable de kerberos de esta forma:
Vamos a dumpearnos los secretos de windows gracias a este usuario de esta forma:
Dump secrets windows
Info:
Veremos que ha funcionado, por lo que podemos obtener el hash NTLM del usuario administrador para realizar un Pass-The-Hash con dicho usuario y conectarnos por WinRM, pero no funcionara por que dara un error, vamos a obtener un TGT del usuario administrador mejor.
evil-winrm Administrator (Domain)
Info:
Vemos que ha funcionado, por lo que vamos a exportarlo en nuestra variable de kerberos.
Ahora vamos a conectarnos por WinRM por la autenticacion de kerberos de esta forma:
Info:
Veremos que ha funcionado, por lo que vamos a leer la flag del admin.
root.txt
Last updated