unityHeist

Dificultad: Easy - OS: Windows

chevron-right¯\_( ͡° ͜ʖ ͡°)_/¯ Machine infohashtag

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  
chevron-right📌 Parámetroshashtag
  • sCV:

    • -sCEjecuta scripts de detección predeterminados → Usa los scripts de nmap ubicados en /usr/share/nmap/scripts/, los cuales buscan información adicional en los puertos abiertos.

    • -sVDetección de versiones → Intenta identificar el software y su versión en los puertos abiertos.

  • -nNo resuelve nombres de dominio (reduce el tiempo del escaneo).

  • --openMuestra solo puertos abiertos → Filtra la salida para no mostrar puertos cerrados o filtrados.

  • -T4Ajusta la velocidad del escaneo → T4 es un nivel "agresivo" que acelera el escaneo, útil en redes rápidas.

  • -vModo 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/A

Algunos 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

chevron-right📌 Parámetroshashtag
  • 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.sharrow-up-right

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

chevron-right📌 Parámetroshashtag
  • 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 a IPC$ 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.sharrow-up-right

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.sharrow-up-right 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 -accepteula acepta 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 6420 se 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

chevron-right📌 Sintaxishashtag
  • 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 comando strings y 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 que grep realice 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_username o login_password. El símbolo \| es un operador OR en grep para 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