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ů
- Kritická nebyla každá slabina zvlášť, ale kombinace open redirectu a důvěry v JWT hlavičku
jku. - Administrátorský token otevřel cestu ke zdrojovým kódům a k SSH údajům účtu
code. - Root část byla důsledkem privilegovaného wrapperu kolem
curl, který zaměnil data za přepínače příkazu.
Co si odnést do praxe
- Přístupové údaje je potřeba oddělovat mezi službami a minimalizovat jejich opětovné použití, jinak se z jedné slabiny rychle stane plnohodnotný vstup do systému.
- Pravidla
sudoa jiné privilegované cesty mají být co nejmenší a bez možnosti ovlivnit příkaz, vstup nebo prostředí z neprivilegovaného kontextu. - Stejné techniky mají smysl pouze v laboratorním nebo jinak autorizovaném testovacím prostředí.