tom@home.htb:~$

Blog o HTB

13 November 2020

Špatně vystavené datové, storage a cloud-like služby

Úvod a kontext

Mnoho prostředí obsahuje služby, které se neberou jako “hlavní aplikace”. Jsou to úložiště, registry, cache, exporty, backup share nebo interní cloud-like API. Právě proto bývají podceněné. Tým je vnímá jako pomocnou vrstvu, která přece nemá být z internetu důležitá. Jenže útočník to vidí opačně: právě tato vrstva často drží tajemství, cizí data nebo přímo možnost něco zapsat do prostoru, který už aplikace sama považuje za důvěryhodný.

To je důvod, proč má smysl spojit Redis, NFS backupy, Docker registry, S3-like storage, DynamoDB endpointy nebo rsync do jednoho článku. Ne proto, že by šlo o stejnou technologii. Ale proto, že sdílejí stejný bezpečnostní vzorec: interní nebo pomocná datová služba se ocitla ve špatné zóně, bez autentizace nebo s většími právy, než odpovídá jejímu účelu.

Proč jsou tyto služby tak cenné

Veřejná aplikace často ukáže jen omezený výřez systému. Datové a storage služby naopak obsahují:

Právě proto bývá špatně vystavené storage rozhraní často hodnotnější než samotná titulní stránka webu.

Tři základní typy dopadu

Ne každá vystavená storage služba znamená totéž. Prakticky se vyplatí rozlišit tři úrovně.

1. Read-only leak

Služba sice nepovolí zápis, ale vrátí:

To stačí na tajemství, hashe, klíče a velmi často i na přímý přístup do jiné služby.

2. Write primitive

Ještě nebezpečnější je situace, kdy lze do úložiště něco zapisovat:

V tu chvíli už nejde jen o leak. Jde o možnost vložit data do důvěryhodného workflow.

3. Nepřímý administrativní přístup

Některé služby působí jako datová vrstva, ale ve skutečnosti jsou velmi blízko správě:

Tady se storage mění z pasivního úložiště v most k plnohodnotnému administrativnímu přístupu.

Jak tenhle vzorec vypadal v různých případech

Na jednom hostu běželo S3-like a DynamoDB rozhraní bez autentizace. To samo o sobě stačilo k vyčtení uživatelských hesel z tabulky a zároveň k zápisu souboru do bucketu adserver, odkud ho hlavní aplikace sama publikovala. Je to učebnicový příklad spojení read a write primitiva v jedné “pomocné” službě.

Jiný případ stál na veřejném NFS exportu /site_backups. Nebylo třeba obcházet aplikaci ani získávat první login. Záloha sama vydala databázi Umbraco a provozní logy, z nichž šlo složit aktuální admin heslo. NFS tedy neposkytlo shell přímo, ale poskytlo přesně ta data, která shell umožnila.

U dalšího systému nebyla hlavní slabina na webu, ale v Docker registry odhalené TLS certifikátem. Stažení image vrstev odhalilo shell history a passphrase k soukromému klíči. Tady je dobře vidět, že registry není jen přepravní sklad pro image. Je to archiv provozních artefaktů, které mohou být bezpečnostně cennější než běžící kontejner.

Ve storage rodině je i veřejný Redis bez autentizace. Ten nevydal data pasivně. Dovolil přímý zápis do /var/lib/redis/.ssh/authorized_keys, a tím okamžitý SSH foothold. Je to krásný příklad služby, kde je write primitive ve skutečnosti rychlejší než jakýkoli read.

Další případ využil rsync export domácího adresáře uživatele. Jakmile se podařilo získat heslo k modulu, nešlo jen o čtení souborů. Bylo možné do home directory i zapisovat a podstrčit vlastní authorized_keys. To už není “sdílený souborový prostor”. To je de facto vzdálený SSH onboarding pro útočníka.

Co mají tyto služby společné

Na povrchu jsou rozdílné, ale spojuje je několik vzorců.

Služba je vnímaná jako pomocná, ne bezpečnostní hranice

Právě proto bývá méně chráněná než veřejná aplikace:

Obsah služby už někdo jiný považuje za důvěryhodný

To je klíčové hlavně u write primitive:

Storage tedy sama nemusí umět spouštět kód. Stačí, že jí věří jiná vrstva.

Data jsou historická, ale stále platná

Zálohy, image vrstvy, logy nebo staré klíče se často podceňují, protože “už nejsou aktivně používané”. Jenže:

Jak takové služby hodnotit při analýze

Při průzkumu i při review se vyplatí projít tři otázky.

Co přesně jde číst

Co přesně jde zapisovat

Kdo této vrstvě dál věří

Třetí otázka bývá rozhodující. Bez ní je storage jen leak. S ní se z ní stává přímý execution nebo credential pivot.

Obrana a bezpečnější návrh

1. Helper služby chránit stejně přísně jako hlavní aplikaci

NFS export, Redis, rsync, registry nebo S3-compatible endpoint nejsou vedlejší technická drobnost. Jsou to produkční rozhraní s vlastním bezpečnostním dopadem.

2. Oddělit read a write přístup

Tam, kde není zápis nutný, nesmí existovat. Write primitive má téměř vždy výrazně vyšší dopad než samotný read-only leak.

3. Nepublikovat artefakty určené pro vnitřní provoz

Image vrstvy, zálohy, shell history, logy a exporty musejí být chráněné stejně jako produkční databáze. Často v nich leží přesně ta tajemství, která už z běžící aplikace zmizela.

4. Nepovažovat uložený obsah automaticky za důvěryhodný

To platí hlavně pro:

5. Segmentovat sítě a identity

Storage služba nemá být dostupná ze stejné zóny jako veřejný web, pokud to není nezbytné. A tajemství získané z jedné vrstvy nemá automaticky fungovat i na SSH, WinRM nebo admin nástroji.

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: storage - redis - nfs - registry - s3