tom@home.htb:~$

Blog o HTB

14 December 2020

Luke

Úvod a kontext

Luke je typický stroj o informačním úniku a špatně oddělených službách. Nejde o jednu RCE, ale o řetězec, kde anonymní FTP zpřístupní zdrojové kódy, API na portu 3000 pustí po úspěšném přihlášení další interní data a administrační panel Ajenti nakonec promění reuse hesla rovnou v root přístup.

Proto je důležité nečíst Luke jako obyčejný brute-force příklad. Heslové hádání má smysl až ve chvíli, kdy z úniku zdrojáků vyplyne, který účet a která služba za to opravdu stojí.

Počáteční průzkum

FTP se zdrojáky, API a Ajenti

Hned první scan ukazuje, že host nepublikuje jen web. Vedle Apache na 80/tcp běží i JSON API na 3000/tcp a Ajenti na 8000/tcp. To je samo o sobě zajímavé, ale skutečný posun přinese až anonymní FTP, které zpřístupní adresář webapp a krátkou interní zprávu o tom, že zdrojové kódy jsou na serveru dočasně vystavené.

21/tcp    open     ftp     vsftpd 3.0.3+ (ext.1)
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x    2 0        0             512 Apr 14 12:35 webapp
22/tcp    open     ssh?
80/tcp    open     http    Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)
3000/tcp  open     http    Node.js Express framework
8000/tcp  open     http    Ajenti http control panel
Dear Chihiro !!

As you told me that you wanted to learn Web Development and Frontend, I can give you a little push by showing the sources of
the actual website I've created.
Normally you should know where to look but hurry up because I will delete them soon because of our security policies !

Derry

Jakmile jsou k dispozici zdrojáky a několik navzájem propojených služeb, dává větší smysl mapovat workflow aplikace a účty než bezhlavě fuzzovat další cesty.

Analýza zjištění

API účet admin jako rozumný cíl

Zdrojové kódy ukazují, že web na 80/tcp je jen jedna vrstva nad API na 3000/tcp a že klíčovým účtem je admin. To je přesně ten moment, kdy je heslové hádání obhajitelné: nejde o náhodný spray proti celé infrastruktuře, ale o cílený pokus proti účtu, který má v aplikaci zjevně privilegovanou roli.

Po úspěšném přihlášení API vrací další interní informace o uživatelích a jejich přístupových údajích. Právě tím se z jedné chyby stává řetězec: hesla, která aplikace používá interně, se opakují i na systémových službách.

Získání přístupu

Z API na stabilní shell

Nejdůležitější mezikrok na Luke není další exploit, ale převod uniklých dat do stabilního přístupu. Přihlašovací údaje z API stačí k prvnímu běžnému shellu a tím pádem i k přečtení user.txt. Tady je podstatné hlavně to, že nejde o jednorázový webový kontext, ale o opakovatelný přístup založený na platných pověřeních.

Další postup už stojí na credential reuse. Stejná nebo úzce příbuzná hesla fungují i na dalších službách, které host provozuje.

Eskalace oprávnění

Ajenti jako rovnou root rozhraní

Na Luke není root část klasická privilege escalation z běžného shellu. Rozhodující je to, že Ajenti na 8000/tcp je plnohodnotný administrační panel. Jakmile se do něj podaří přihlásit pomocí zrecyklovaných hesel, webový terminál nebo příkazový modul už běží s oprávněními, která stačí ke čtení root.txt.

Luke tak dobře ukazuje rozdíl mezi lokální eskalací a převzetím administrativní služby. K rootu se tu nejde přes kernel nebo špatná ACL, ale přes panel, který už je sám o sobě root ekvivalent.

Shrnutí klíčových poznatků

Co si odnést do praxe

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