tom@home.htb:~$

Blog o HTB

28 January 2021

Unicode

Úvod a kontext

Unicode je stroj z Hack The Box, který staví na chybné práci s JWT a na nebezpečném wrapperu kolem curl. Dobře na něm vynikne, že i zdánlivě malé aplikační nedostatky mohou v kombinaci vést až k plnému převzetí systému.

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 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 fd:a0:f7:93:9e:d3:cc:bd:c2:3c:7f:92:35:70:d7:77 (RSA)
|   256 8b:b6:98:2d:fa:00:e5:e2:9c:8f:af:0f:44:99:03:b1 (ECDSA)
|_  256 c9:89:27:3e:91:cb:51:27:6f:39:89:36:10:41:df:7c (ED25519)
80/tcp    open   http    nginx 1.18.0 (Ubuntu)
|_http-favicon: Unknown favicon MD5: __CENSORED__
| http-methods:
|_  Supported Methods: HEAD OPTIONS GET
|_http-title: Hackmedia
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-generator: Hugo 0.83.1
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

http://10.10.11.126/checkout/
http://10.10.11.126/dashboard/
http://10.10.11.126/debug/
http://10.10.11.126/display/
http://10.10.11.126/error/
http://10.10.11.126/internal/
http://10.10.11.126/login/
http://10.10.11.126/logout/
http://10.10.11.126/redirect/
http://10.10.11.126/register/
http://10.10.11.126/upload/

Získání přístupu

Získání user flagu

User flag zde slouží hlavně jako potvrzení, že už mám běžný uživatelský kontext a mohu pokračovat v lokální analýze systému.

Unicode kombinuje dvě aplikační slabiny, které samy o sobě nepůsobí kriticky: open redirect a důvěru v JWT hlavičku jku. Pokud server načítá ověřovací klíče podle adresy z tokenu a současně dovolí obejít omezení přes redirect, lze jej přimět, aby stáhl útočníkem připravený JWK set a přijal podvržený administrátorský token.

Tímto způsobem šlo získat administrátorský přístup do interní části aplikace. Odtud už vedla cesta ke zdrojovým kódům nebo konfiguračním datům, ve kterých byly SSH přihlašovací údaje pro účet code.

ssh code@10.10.11.126
cat user.txt

Eskalace oprávnění

Získání root flagu

Tento krok ukazuje, jak se nalezená slabina nebo chyba v delegaci oprávnění mění v privilegovaný přístup.

Účet code mohl přes sudo spouštět pomocný program, který interně volal curl s parametrem ovlivnitelným uživatelem. Tady je důležité rozlišit data a přepínače: pokud wrapper nepředá uživatelský vstup bezpečně, může se z argumentu stát další volba curl.

Další krok spočíval v tom, že šlo curl přimět zapsat útočníkem připravený obsah do /bin/bash, nastavit na něj SUID bit a následně použít bash -p pro root shell.

/bin/bash -p
cat /root/root.txt

Kořenový problém tedy neležel v curl, ale v privilegovaném wrapperu, který nerozlišoval mezi bezpečnými daty a interpretovanými přepínači příkazu.

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: linux - ssh - exploit - enumeration - privesc - hackthebox