Heist
Dificultad: Easy - OS: Windows
¯\_( ͡° ͜ʖ ͡°)_/¯ Machine info
El reto Heist es un CTF de dificultad sencilla centrado en un entorno Windows, que expone un portal web accesible mediante IIS. A través de este sitio, se obtiene acceso a un archivo de configuración de un router Cisco, el cual contiene hashes de contraseñas de tipo 5 y 7. El análisis de estos hashes representa el primer vector de entrada, ya que pueden ser crackeados usando herramientas específicas como John the Ripper o scripts para contraseñas Cisco. Con las credenciales obtenidas, se realizan ataques de fuerza bruta sobre el servicio SMB, aprovechando la técnica de enumeración RID para identificar otros usuarios válidos en el sistema.
El segundo eje del CTF involucra el uso de credenciales válidas para autenticarnos con uno de los usuarios mediante WinRM, utilizando herramientas como Evil-WinRM. A partir de aquí se consolida el acceso inicial y se continúa con una fase de post-explotación. La observación de los procesos en ejecución revela que el usuario comprometido tiene Firefox abierto, lo cual sugiere una oportunidad para explotar la memoria del proceso y acceder a datos sensibles. El atacante aprovecha esta situación utilizando la herramienta procdump para extraer el contenido en memoria de firefox.exe, que luego analiza en busca de información útil.
La escalada de privilegios se logra al descubrir que Firefox conserva credenciales en memoria relacionadas al portal web, específicamente a través del parámetro login_password. El análisis del volcado de memoria permite recuperar una contraseña de administrador, completando así el acceso total al sistema. Este flujo pone en práctica técnicas de recolección pasiva de credenciales, explotación de configuraciones débiles y herramientas nativas de Windows para movernos lateralmente y escalar privilegios dentro del entorno comprometido.
Enumeración de puertos/servicios
┌──(root㉿kali)-[/home/kali/Documents/HTB/HEIST]
└─# nmap -sCV --open -T4 -v -n 10.10.10.149 📌 Parámetros
sCV:-sC→ Ejecuta scripts de detección predeterminados → Usa los scripts denmapubicados en/usr/share/nmap/scripts/, los cuales buscan información adicional en los puertos abiertos.-sV→ Detección de versiones → Intenta identificar el software y su versión en los puertos abiertos.
-n→ No resuelve nombres de dominio (reduce el tiempo del escaneo).--open→ Muestra solo puertos abiertos → Filtra la salida para no mostrar puertos cerrados o filtrados.-T4→ Ajusta la velocidad del escaneo → T4 es un nivel "agresivo" que acelera el escaneo, útil en redes rápidas.-v→ Modo verbose → Muestra más detalles sobre el progreso del escaneo.
Resultado:
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
| http-title: Support Login Page
|_Requested resource was login.php
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
135/tcp open msrpc Microsoft Windows RPC
445/tcp open microsoft-ds?
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
|_clock-skew: -9m26s
| smb2-time:
| date: 2025-07-03T19:44:46
|_ start_date: N/AAlgunos de los elementos que nos reveló el escaneo de nmap y que nos pueden ayudar para resolver el ctf son los siguientes:
Puerto 80 (HTTP - IIS 10.0):
Sitio web activo con página de login (
login.php), indicando posible vector web.El título "Support Login Page" sugiere un sistema de soporte, potencialmente con archivos adjuntos o información sensible.
Puerto 5985 (WinRM):
Servicio expuesto de Windows Remote Management, fundamental para obtener una shell remota usando credenciales válidas con herramientas como
evil-winrm.
Reconocimiento del puerto 80
Visitando la página web de la máquina nos vamos a encontrar con el siguiente panel de login que nos permite loguearnos como usuario "guest"


Hardcode Credentials
Inspeccionando el "Issues" vamos a encontrar una conversación entre un usuario de soporte y un cliente llamado "Hazard", que manifiesta tener un problema con un producto de Cisco, luego adjunta un "Attachment" en el chat con el siguiente contenido:
Bingo! ( ͡• ͜ʖ ͡•)
Encontramos 3 credenciales expuestas, vamos a intentar crackearlas con John the Ripper
Password Cracking with John
Copie todos los hashes a un archivo y se lo pase a John para intentar crackear las contraseñas con el diccionario Rockyou.txt
Solo pudimos descifrar la primer credencial, sin embargo, si buscamos información sobre las últimas credenciales vamos a encontrar que están relacionadas con Cisco password 7
Cisco password tipo 7 es un método de ofuscación reversible utilizado por dispositivos Cisco para proteger contraseñas en configuraciones
Existen muchas páginas que nos permiten descifrar estas credenciales de forma online, cualquiera de ellas esta bien, lo importante es que nos de el siguiente resultado


Password Spraying con nxc
Ahora que tenemos credenciales vamos a implementar la técnica password spraying con nxc para buscar al usuario que haga "match" con alguna de estas passwords. Primero vamos a hacer dos diccionarios uno con los usuario que hallamos y otro con las credenciales. Luego usaremos el siguiente comando de nxc para implementar el ataque
📌 Parámetros
smb→ Módulo que indica que se trabajará contra el servicio SMB (Server Message Block)10.10.10.149→ Dirección IP del objetivo, es decir, el host sobre el cual se intentará la autenticación SMB.-u users→ Define el archivo o lista de usuarios que se usarán para autenticarse.-p passwords→ Define el archivo o lista de contraseñas a probar.--continue-on-success→ Indica que NetExec no debe detenerse si encuentra credenciales válidas. Por defecto, NetExec puede dejar de intentar combinaciones después de un éxito, pero con esta opción seguirá probando todas las combinaciones posibles (útil cuando se espera más de un usuario con credenciales válidas).
Las credenciales que hicieron el match fueron hazard:stealth1agent
Una vez que logramos obtener un nuevo par de credenciales lo más recomendable es testear a que servicios nos podemos conectar/logear, de esta forma tendremos una idea de por donde continuar el ataque/intrusión. Para automatizar esta tarea diseñe un script en bash que lo podes obtener del siguiente repositorio: service_validation.sh
Enumerando recursos del SMB con NXC
Los resultados del script anterior nos indica que podemos acceder al smb, por ende vamos a listar esos recursos y verificar si tenemos algún permiso nuevo sobre alguno de los directorios usando nxc
📌 Parámetros
smb→ Indica que se utilizará el módulo SMB, que permite interactuar con recursos compartidos de red (carpetas, impresoras, etc.).10.10.10.149→ Dirección IP del host objetivo, que expone el servicio SMB y al cual se intentará autenticar.-u 'hazard'→ Especifica el nombre de usuario con el que se intentará autenticar (en este caso,'hazard').-p 'stealth1agent'→ Especifica la contraseña correspondiente al usuario anterior (en este caso,'stealth1agent').--shares→ Ordena a NetExec que, una vez autenticado, enumere los recursos compartidos SMB disponibles en el sistema remoto (por ejemplo,C$,ADMIN$,Users, etc.), junto con los permisos de acceso que el usuario autenticado tiene sobre ellos (lectura, escritura, etc.).
User enumeration con lookupsid_enum.sh
Los resultados de la enumeración del smb nos muestran que tenemos permisos de lectura sobre el recurso IPC$, este recurso es clave porque nos permite enumerar más objetos del dominio con herramientas como impacket-lookupsid
¿Qué es IPC$?
IPC$(Inter-Process Communication share) es una carpeta especial que permite conexiones remotas a funciones administrativas, como autenticación, sesión de servicios, etc.No contiene archivos visibles, pero sí podemos conectarnos a
IPC$, significa que el usuario tiene algún tipo de privilegio en el dominio, como para usar llamadas RPC.Aunque no tengamos acceso a otras carpetas de archivos (
users,shared, etc.), acceder aIPC$ya es suficiente para enumerar información sensible, como usuarios y grupos, usando RPC.
Ahora vamos a usar un script que diseñe en bash que implementa la enumeración de usuarios con lookupsid pero también parcea el output y nos deja una lista con los nombres de los usuarios en limpio para un posterior ataque. El script lo podes descargar desde el siguiente repositorio: lookupsid_enum.sh
Password Spraying con nxc
Ahora usaremos este nuevo diccionario de usuarios para verificar si alguna de las contraseñas obtenidas previamente coincide con alguno de estos nombres de usuario.
Encontramos nuevas credenciales, ahora vamos a implementar nuevamente el script service_validation.sh para intentar buscar algún servicio al que tengamos autorización para acceder con las nuevas contraseñas
Tenemos credenciales válidas para acceder al WinRM, ahora podemos usar EvilWinRM y acceder al sistema.
Local enumeration
Una vez que logramos ingresar al equipo comprometido y tenemos RCE lo mejor es centrarnos en recolectar información crítica del entorno con el objetivo de:
Identificar usuarios privilegiados o cuentas de interés.
Enumerar pertenencias a grupos (
net user,whoami /groups).Revisar archivos sensibles (como historiales, scripts, contraseñas almacenadas).
Detectar servicios, tareas programadas o configuraciones mal implementadas.
Evaluar posibles vectores de escalada (como LAPS, ACLs, binarios con privilegios, etc.).
Process memory dumping con procdump.exe
Al enumerar los procesos que están corriendo en el sistema vamos a encontrar uno muy peculiar y es el de firefox, lo que podemos hacer es un Process memory dumping de este programa: se trata de una técnica de post-explotación cuyo objetivo es extraer información sensible directamente de la memoria RAM de un proceso activo en el sistema comprometido. Para lograr esto vamos a necesitar cargar el ejecutable procdump64.exe al equipo mediante la sesion de EvilWinRM. Primero vamos a descargar el programa desde el sitio oficial y luego lo descomprimimos
Para cargar este ejecutable primero debemos conectarnos a EvilWinRM desde el directorio en donde se encuentra el procdump64.exe, y luego con el comando upload podremos subirlo.
Nota: el comando
-accepteulaacepta automáticamente los términos de licencia de Sysinternals (EULA). Es un paso necesario la primera vez que se usa ProcDump, para evitar que aparezca una ventana interactiva.El comando
.\procdump64.exe -ma 6420se encarga de:
-ma: Genera un full memory dump (no solo un minidump).
6420: Es el ID del proceso a dumpear.
Credential Harvesting
Una vez que ya tenemos el archivo .dmp lo vamos a descargar a nuestro equipo Kali y mientras se realiza la descarga filtraremos contenido con la palabra "password", como se trata de un archivo muy extenso a medida que avance la descarga podremos ir ejecutando el comando para filtrar contenido y veremos mas lineas con mas información
📌 Sintaxis
strings→ Herramienta que extrae texto imprimible (cadenas legibles en ASCII o Unicode) de archivos binarios.firefox.exe_250704_103443.dmp→ Archivo de entrada, en este caso un volcado de memoria del proceso Firefox.|→ El pipe toma la salida del comandostringsy la envía como entrada al siguiente comando (grep), permitiendo que solo las líneas relevantes sean filtradas.grep→ Utilidad para buscar patrones de texto dentro de la entrada proporcionada. En este caso, busca líneas que contengan nombres de parámetros relacionados a autenticación.-i→ Opción que hace quegreprealice la búsqueda ignorando mayúsculas y minúsculas (case-insensitive).-e "login_username\|login_password"→ Expresión regular que define dos patrones a buscar:login_usernameologin_password. El símbolo\|es un operador OR engreppara combinar múltiples patrones.
Encontramos nuevas credenciales que parecen ser del Administrator, ahora vamos a chequear a qué servicios podemos conectarnos con ellas
Nuevamente contamos con acceso al servicio WinRM, entonces podemos usar EvilWinRM y conectarnos como el usuario administrator para buscar las flags
Last updated