unityTimelapse

Dificultad: Easy - OS: Windows

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

El CTF Timelapse propone un escenario de análisis y explotación de una máquina Windows dentro de un entorno Active Directory. El enfoque inicial consiste en realizar una enumeración de red mediante herramientas como Nmap, lo cual permite identificar servicios expuestos —particularmente SMB— y obtener acceso anónimo a un recurso compartido. Dentro de este recurso, se localiza un archivo comprimido que contiene una clave en formato PFX cifrada. La estrategia aquí involucra la utilización de técnicas de cracking de contraseñas (empleando herramientas como John the Ripper) para descifrar tanto el archivo ZIP como el contenido PFX. A partir de este proceso se extraen un certificado SSL y una clave privada, que permiten establecer una sesión autenticada en el servicio WinRM de la máquina objetivo.

Una vez obtenida la sesión inicial con privilegios limitados, el análisis se orienta a la búsqueda de credenciales adicionales y de posibles vectores de escalamiento de privilegios. La clave reside en la revisión de archivos de historial de PowerShell que contienen credenciales de un usuario de servicio con mayores permisos. A través de esta nueva cuenta, se descubre la pertenencia al grupo LAPS_Readers, que otorga permisos para leer contraseñas de cuentas locales administradas por la solución LAPS (Local Administrator Password Solution). Este es un componente de seguridad de Active Directory que gestiona de manera centralizada las contraseñas locales, y constituye un vector privilegiado para la escalada.

Finalmente, se explota este acceso a LAPS mediante la carga de un módulo de PowerShell diseñado para recuperar contraseñas administradas. Al obtener la contraseña del usuario administrador de la máquina, es posible establecer una nueva sesión WinRM con privilegios elevados. Así, el CTF plantea un recorrido que integra la enumeración de servicios, el cracking de contraseñas, la autenticación basada en certificados, y la explotación de mecanismos de gestión de credenciales corporativas como LAPS, conformando un caso de estudio completo sobre técnicas ofensivas en entornos Windows.

Enumeración de puertos/servicios

┌──(root㉿kali)-[/home/kali/Documents/HTB/TIMELAPSE]
└─# nmap -sCV --open -T4 -v -n 10.10.11.152 
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
53/tcp   open  domain            Simple DNS Plus
88/tcp   open  kerberos-sec      Microsoft Windows Kerberos (server time: 2025-06-13 11:24:17Z)
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: timelapse.htb0., Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http        Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ldapssl?
3268/tcp open  ldap              Microsoft Windows Active Directory LDAP (Domain: timelapse.htb0., Site: Default-First-Site-Name)
3269/tcp open  globalcatLDAPssl?
5986/tcp open  ssl/http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_ssl-date: 2025-06-13T11:25:42+00:00; +7h50m44s from scanner time.
| ssl-cert: Subject: commonName=dc01.timelapse.htb
| Issuer: commonName=dc01.timelapse.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-10-25T14:05:29
| Not valid after:  2022-10-25T14:25:29
| MD5:   e233:a199:4504:0859:013f:b9c5:e4f6:91c3
|_SHA-1: 5861:acf7:76b8:703f:d01e:e25d:fc7c:9952:a447:7652
|_http-server-header: Microsoft-HTTPAPI/2.0
| tls-alpn: 
|_  http/1.1
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2025-06-13T11:25:04
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
|_clock-skew: mean: 7h50m43s, deviation: 0s, median: 7h50m43s

En síntesis:

Algunos de los elementos que nos reveló el escaneo de nmap y que son relevantes para este contexto:

  • El puerto 445/tcp (SMB) está abierto y permite el acceso a recursos compartidos. Es el primer vector que podemos explotar para obtener archivos sensibles.

  • El puerto 5986/tcp (WinRM sobre SSL) está abierto, lo que nos permitirá autenticarnos de manera remota utilizando credenciales o certificados que hallemos más adelante.

  • Los puertos 389/tcp, 636/tcp, 3268/tcp y 3269/tcp muestran que la máquina es parte de un dominio Active Directory (dominio timelapse.htb), lo cual es clave para entender la estructura de privilegios y para la posterior explotación de LAPS.

  • El puerto 88/tcp confirma la presencia de Kerberos, lo que indica que la autenticación centralizada está habilitada y que podríamos encontrarnos con tickets o configuraciones útiles.

  • El puerto 445 permite enumerar shares SMB sin autenticación, desde donde se podrá obtener el archivo ZIP que inicia la cadena de explotación.

  • La diferencia horaria del servidor kerberos con mi equipo Kali: esto es importante en contextos de Kerberos, ya que este protocolo es muy sensible a la sincronización horaria. Una diferencia mayor a 5 minutos por defecto puede causar que el cliente no pueda autenticarse correctamente, afectando herramientas como Kerbrute o impacket cuando se realizan ataques como AS-REP Roasting o Kerberoasting.

  • Nmap también detectó información útil de dominio a través de servicios como LDAP y RDP (rdp-ntlm-info y certificados SSL), incluyendo:

    • timelapse.htb (dominio principal)

    • dc01.timelapse.htb (nombre FQDN del controlador de dominio)

    • DC01 (nombre del host NetBIOS)

    Para asegurar una correcta resolución DNS durante el CTF (especialmente para herramientas que dependen del nombre de dominio o de servicios Kerberos), es necesario mapear la IP de la máquina al dominio en el /etc/hosts del equipo Kali

Para setear estas últimas configuraciones vamos a usar los siguientes comandos:

Enumerando recursos del SMB con NXC

Aprovechando que se encuentra disponible el servicio SMB podemos intentar una enumeración de recursos autenticándonos como usuario guest (anónimo) mediante nxc

chevron-right📌 Recursos enumeradoshashtag

ADMIN$

  • Función: Share administrativo oculto que apunta a la carpeta del sistema (C:\Windows).

  • Uso típico: Utilizado por administradores y servicios del sistema para administración remota.

C$

  • Función: Share oculto que da acceso directo a la raíz del disco C:\.

  • Uso típico: Administración remota por parte de usuarios con privilegios altos.

IPC$

  • Función: “Inter-Process Communication share”.

  • Uso típico: Utilizado para establecer sesiones SMB, autenticaciones y conexiones de servicios como RPC o WinRM.

  • Permisos: READ → significa que podés usarlo como canal para consultas básicas.

NETLOGON

  • Función: Share del controlador de dominio que contiene scripts de inicio de sesión y políticas.

  • Uso típico: Usado en entornos Active Directory para desplegar scripts de inicio de sesión a usuarios del dominio.

SYSVOL

  • Función: Como NETLOGON, es parte de la infraestructura de Active Directory. Contiene políticas, GPOs y archivos públicos para clientes del dominio.

  • Uso típico: Distribuir configuraciones, scripts o políticas a los equipos del dominio.

Tenemos permisos de lectura sobre los recursos IPC y Shares. Ahora vamos a hacer uso del módulo --spider de nxc para enumerar todos los archivos que se encuentren allí y buscar alguno que nos resulte interesante para descargar

chevron-right📌 Parámetroshashtag
  • nxc smb → Llama a NXC en módulo de tipo smb.

  • timelapse.htb → Target: el host o dominio que vamos a atacar (podés usar IP o dominio).

  • -u 'guest' → Usuario con el que nos autenticamos, en este caso el usuario guest.

  • -p '' → Contraseña vacía (comillas simples vacías), para autenticarnos como guest sin password.

  • --spider Shares → Spidering: explora recursivamente los archivos dentro del share llamado Shares. El módulo Spidering nos permite descubrir todos los archivos y directorios dentro del share.

  • --regex "." → Filtro de archivos a mostrar con regex. En este caso "." significa "cualquier cosa" (expresión regular que matchea todo), así que va a listar todos los archivos.

Encontramos expuesto el archivo winrm_backup.zip, si lo queremos analizar en nuestro equipo lo tenemos que descargar de la siguiente manera

chevron-right📌 Parámetroshashtag
  • nxc smb → Llama a NXC en módulo de tipo smb.

  • timelapse.htb → Target: el host o dominio que vamos a atacar.

  • -u 'guest' → Usuario con el que nos autenticamos guest.

  • -p '' → Contraseña vacía.

  • --share Shares → Indica el nombre del recurso compartido (share) donde va a ingresar Shares.

  • --get-file "Dev/winrm_backup.zip" "winrm_backup.zip"descargaamos un archivo del directorio Share. → "Dev/winrm_backup.zip" → ruta interna dentro del share Shares hacia el archivo que queremos descargar. → "winrm_backup.zip" → nombre con el que vamos a guardar el archivo en local.

Password cracking con John

Al intentar descomprimir este archivo zip nos solicitan una contraseña, pero como no contamos con ella lo que vamos a realizar es una extracción del hash del archivo comprimido usando el complemento zip2john para después crackearlo con John the Ripper

Una vez que John nos devuelva la password del zip, lo descomprimimos y nos vamos a encontrar con un archivo de extensión .pfx el cual también se encuentra protegido con contraseña

¿Qué representa la extención .pfx?

La extensión .pfx corresponde a un archivo en formato PKCS#12, un contenedor cifrado que agrupa un certificado digital (clave pública) junto con su clave privada y, en algunos casos, una cadena de certificados intermedios. Este tipo de archivo se utiliza comúnmente para la autenticación y el cifrado en redes seguras, especialmente en entornos Windows, donde puede emplearse para habilitar la autenticación de usuarios o servicios mediante certificados. Los archivos .pfx suelen estar protegidos por contraseña y son utilizados, por ejemplo, para configurar conexiones seguras como WinRM sobre HTTPS, firmar software, o importar certificados a sistemas que requieren confianza criptográfica entre clientes y servidores.

Por suerte John cuenta con otro complementó que nos permite extraer hashes de este tipo de archivos para luego crackearlos y obtener su contraseña

PFX credential abuse

Ahora vamos a usar openssl para extraer los componentes internos del archivo .pfx (legacyy_dev_auth.pfx), que contiene un certificado digital y una clave privada, utilizando la contraseña que John nos devolvió. Estas dos salidas (certificate.pem y private-key.pem) son los componentes necesarios para autenticarse mediante el servicio WinRM con certificados

chevron-right📌 Parámetroshashtag

Primer comando

  • -in legacyy_dev_auth.pfx: especifica el archivo .pfx de entrada.

  • -nocerts: indica que no querés extraer el certificado, solo la clave privada.

  • -out private-key.pem: nombre del archivo de salida donde se guarda la clave privada.

  • -nodes: evita que se vuelva a cifrar la clave privada al exportarla (la deja en texto plano).

  • -password pass:thuglegacy: indica la contraseña del .pfx (evita que te la pida interactivo).

  • Resultado: se extrae la clave privada sin cifrar, y se guarda en private-key.pem

Segundo comando

  • -clcerts: extrae solo el certificado del cliente (evita certificados intermedios o de CA).

  • -nokeys: indica que no se debe extraer la clave privada.

  • -out certificate.pem: nombre del archivo de salida para el certificado.

  • El resto es igual: indica el archivo de entrada y la contraseña.

Certificate-based authentication abuse

Ya tenemos los certificados en nuestro poder, pero ahora ¿cómo los utilizamos? si revisamos el manual de comandos de EvilWinRM vamos a encontrar el parámetro -c y -k que son los que nos permitirán autenticarnos con certificados digitales, en vez de utilizar las credenciales por defecto, entonces eso es lo que haremos ahora

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.).

Al enumerar la información de los usuarios del sistema pudimos encontrar los siguientes objetivos de alto riesgo para escalar privilegios:

  1. El usuario TRX pertenece al grupo Domain Admins

  • Domain Admins es el grupo más privilegiado en un dominio de Active Directory. Cualquier cuenta que pertenezca a ese grupo tiene control total sobre el dominio, incluyendo la capacidad de ejecutar comandos en cualquier máquina, extraer hashes, y modificar políticas.

  • Puede ser útil para ataques tipo DCSync o dumping de ntds.dit si llegás a un controlador de dominio.

2. El usuario svc_deploy pertenece al grupo LAPS_Readers

  • El grupo LAPS_Readers tiene permiso para leer las contraseñas administradas por LAPS (Local Administrator Password Solution), que se almacenan en el atributo ms-Mcs-AdmPwd de los objetos de equipo en Active Directory.

  • Esto habilita un vector de escalada de privilegios vertical, ya que podemos usar LDAP o un módulo de PowerShell para leer la contraseña del administrador local de máquinas del dominio, incluyendo el propio DC.

3. Privilegios habilitados (whoami /priv)

  • SeMachineAccountPrivilege: permite agregar equipos al dominio.

  • SeChangeNotifyPrivilege: privilegio común, generalmente irrelevante.

  • SeIncreaseWorkingSetPrivilege: también de bajo impacto.

  • Por qué es importante: Aunque no hay privilegios como SeImpersonatePrivilege o SeDebugPrivilege (que son típicos vectores de escalada en entornos locales), la presencia de SeMachineAccountPrivilege puede ser útil en algunos contextos de dominio para ataques como Resource-based Constrained Delegation (RBCD), si se combinan con otras condiciones.

Otro elemento que podemos inspeccionar en busca de credenciales filtradas es el history powershell del usuario legacy, por default la ruta a este tipo de archivos es

AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

Otra forma más exhaustiva de enumeración local es cargando el winPEASx64.exe y ejecutarlo, allí también podemos encontrar la ruta a este archivo

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

Nos confirma el acceso al servicio winrm y lo que vamos a hacer es directamente descargar las credenciales de administrador local aprovechando el permiso LAPS_Readers del usuario svc_deploy

LAPSReader privilege abuse

LAPSReader privilege abuse es una técnica de post-explotación en la que un atacante, con acceso a una cuenta perteneciente al grupo LAPS_Readers (o con privilegios equivalentes), consulta el atributo ms-Mcs-AdmPwd de objetos de equipo en Active Directory. Este atributo contiene en texto claro la contraseña del administrador local gestionada automáticamente por LAPS (Local Administrator Password Solution). Algunas de las opciones para explotar este privilegio son:

chevron-right📌 Parámetroshashtag

Get-ADComputer -Filter * -Property ms-MCS-AdmPwd | Select-Object Name, ms-MCS-AdmPwd

  • Get-ADComputer → cmdlet de PowerShell para enumerar equipos del dominio.

  • -Filter * → selecciona todos los equipos sin filtrar ninguno.

  • -Property ms-MCS-AdmPwd → solicita específicamente que se incluya el atributo LAPS de contraseña administrada.

  • | Select-Object Name, ms-MCS-AdmPwd → muestra en pantalla solo el nombre del equipo y el atributo LAPS.

bloodyAD

  • --host '10.10.11.152' → dirección IP del controlador de dominio.

  • -d 'timelapse.htb' → nombre del dominio.

  • -u 'svc_deploy' → nombre de usuario.

  • -p 'E3R$Q62^12p7PLlC%KWaxuaV' → contraseña del usuario.

  • get search → comando interno de bloodyAD para realizar una búsqueda LDAP.

  • --filter '(ms-mcs-admpwdexpirationtime=*)' → filtra solo objetos que tengan ese atributo LAPS.

  • --attr ms-mcs-admpwd,ms-mcs-admpwdexpirationtime → atributos que se quieren obtener (contraseña + expiración).

nxc

  • nxc ldap 10.10.11.152 → ejecuta el módulo LDAP contra la IP objetivo.

  • -u 'svc_deploy' → nombre de usuario.

  • -p '...' → contraseña.

  • -M laps → módulo especializado que automatiza la búsqueda de contraseñas LAPS.

ldapsearch

  • -x → usa autenticación simple (bind directo).

  • -H ldap://DC01.timelapse.htb → URL del servidor LDAP.

  • -D 'svc_deploy@timelapse.htb' → usuario que realiza el bind (formato UPN).

  • -w '...' → contraseña del usuario.

  • -b 'DC=timelapse,DC=htb' → base del árbol LDAP (el dominio).

  • '(ms-Mcs-AdmPwd=*)' → filtro LDAP: busca objetos que tengan ese atributo.

  • ms-Mcs-AdmPwd → atributo que queremos ver: contiene la contraseña administrada.

Volvemos a testear estas credenciales con services_validation.sh y vamos a ver que tenemos acceso a casi todos los servicios, por lo tanto solo quedaría conectarnos al winrm y buscar las flags para terminar con el CTF

Bonus: habilitar la conexión RDP y apagar el defender para jugar con mimikatz

Aprovechando la sesión del usuario Administrator podemos realizar el siguiente paso a paso para obtener una conexión por RDP:

  • Habilitar RDP en el equipo comprometido

  • Abrir el firewall

  • Redirigir el puerto 3389 (RDP) con socat

  • Conectarte desde el Kali vía RDP

1) Desde la sesión de EvilWinRM del usuario Administrator habilitamos las conexiones RDP entrantes en el sistema, luego creamos las reglas del firewall para permitir el tráfico RDP (abrimos el puerto 3389 para TCP y UDP) y reiniciamos el servicio RDP. Por último dejamos cargado el ejecutable de mimikatz para usarlo desde rdp cuando nos conectemos

Paso opcional: si queremos conectarnos por RDP desde un segundo equipo que no se encuentra conectado a la VPN de HTB (por ejemplo mi equipo windows local), usamos socat, en la shell de Kali, para puentear la conexión a mi Windows:

Esto crea una escucha local en Kali (puerto 3389) que reenvía todo el tráfico al puerto RDP de la máquina víctima. ¿Por qué usamos socat? Porque HTB solo permite una conexión VPN activa por cuenta. Esto impide conectarnos directamente desde otro sistema Windows a la IP remota de HTB. Con socat, Kali actúa como intermediario, reenviando el tráfico RDP a través de la VPN.

3) Nos conectamos via RDP desde Kali

4) Si el Defender nos bloquea el binario de mimikatz podemos desactivarlo con el siguiente comando

Con el siguiente comando podemos elevar privilegios dentro de la sesión actual para acceder a información sensible protegida, específicamente los secrets almacenados por LSA (Local Security Authority)

Last updated