tom@home.htb:~$

Blog o HTB

5 November 2020

Port forwarding, proxy a protokolové mosty jako exploitační primitivum

Úvod a kontext

Port forwarding, proxychains, socat nebo různé reverzní tunely se často popisují jen jako pomocné utility. Něco, co se „hodí navíc“, když už má útočník foothold. V praxi ale bývají mnohem důležitější. Často nejde o komfortní doplněk, ale o samotný bridge krok, bez kterého se útok dál nepohne.

Právě to je smysl tohoto článku. Nejde o seznam nástrojů ani o cheat sheet syntaxe. Jde o rozhodovací logiku: kdy má větší smysl postavit si most k interní službě než dál hledat veřejně dostupnou zranitelnost.

Co z těchto technik dělá skutečný primitiv

Společné mají tři vlastnosti:

To je důležitý rozdíl proti „obyčejnému tunelu“. Útok se přes ně neposouvá jen technicky. Posouvá se bezpečnostně, protože najednou zpřístupní:

Příklad z praxe: ServMon a localhost-only NSClient++

ServMon je nejčistší ukázka toho, proč port forwarding není vedlejší detail. První část řetězce vede přes NVMS-1000 a končí SSH účtem Nadine. To je důležité, ale ještě neřeší root.

Skutečný posun přichází až ve chvíli, kdy je potřeba sáhnout na NSClient++ na portu 8443. Tato služba sice na hostu běží, ale je určená k lokální správě. Bez tunelu by šlo o slepou stopu.

Právě proto byl rozhodující příkaz:

ssh Nadine@$IP -L 8443:127.0.0.1:8443

Najednou se z interního API stane lokálně dosažitelná služba, proti které lze použít běžný curl. Až díky tomu šlo:

ServMon ukazuje, že forwarding tady nebyl „pohodlnější přístup“. Byl to samotný exploit bridge mezi běžným uživatelským kontextem a admin API.

Příklad z praxe: Tentacle a proxychains jako cesta k internímu SMTP

Na Tentacle byla situace jiná. Šlo o interní host dostupný jen přes veřejný Squid. Bez mostu přes proxy by OpenSMTPD na druhém segmentu nešlo ani osahat, natož exploitovat.

Tady se bridge stavěl přes:

To je důležité rozlišit. proxychains tady neřeší anonymizaci ani „lepší recon“. Řeší samotnou dosažitelnost cíle. Ve chvíli, kdy nástroj začne brát interní SMTP jako normální síťový endpoint, může útok pokračovat úplně běžným způsobem.

Příklad z praxe: Zetta a most mezi IPv4 a IPv6

Zetta ukazuje třetí variantu: problém není jen v tom, že služba je interní, ale i v tom, že běží na jiné adresní rodině. Po odhalení interní IPv6 adresy a rsync portu bylo potřeba vytvořit most, který dovolí používat standardní rsync klienty z lokální IPv4 strany:

socat TCP4-LISTEN:8730,fork TCP6:[dead:beef::250:56ff:feb9:f660]:8730

To je přesně okamžik, kdy se bridge mění v primitiv. Bez něj by bylo potřeba řešit jiný toolchain, jiné adresování a složitější práci s klientem. Díky mostu se interní IPv6 rsync tváří jako lokální IPv4 služba a další práce probíhá už standardně.

Nejde tedy jen o „tunel pro pohodlí“. Jde o překlad mezi dvěma síťovými realitami.

Příklad z praxe: BigHead a tunel k internímu SSH

BigHead ukazuje ještě jiný typ mostu. Po prvním shellu bylo potřeba dostat se k internímu SSH na portu 2020, které nebylo součástí původního veřejného povrchu. Teprve po tunelování a přihlášení jako nginx bylo možné pohodlně pracovat s lokálními aplikacemi a následně zneužít linkto.php.

To je důležitý vzor:

Kdy má smysl stavět most místo hledání dalšího exploitu

Prakticky se vyplatí zastavit a přemýšlet o mostu ve chvíli, kdy platí alespoň jedno z toho:

1. Znáš interní službu, ale nevidíš ji zvenku

Typicky:

2. Máš foothold, ale špatný pracovní kontext

Jednorázová command injection nebo křehký webshell často stačí jen k tomu, aby sis otevřel lepší přístupovou cestu:

3. Cíl běží v jiné síťové vrstvě nebo na jiném transportu

IPv6, proxy-only cesta, SOCKS most, localhost-only listener nebo jiný síťový segment jsou typické důvody, proč přestat řešit payloady a místo toho řešit dopravu.

Na co se při návrhu mostu zaměřit

Kde přesně je hranice

Jak moc „věrný“ musí most být

Někdy stačí jednoduché ssh -L. Jindy je potřeba:

Klíčová není značka nástroje, ale to, jak dobře odpovídá dopravnímu problému.

Co se po mostu otevře

Most sám o sobě není cíl. Důležitá je služba za ním. Proto má smysl stavět ho hlavně tehdy, když za ním čeká:

Rozdíl proti blízkým tématům

Není to článek o síťové topologii jako leaku

Tam řešíš, jak se vůbec dozvíš, že interní služba existuje. Tady řešíš, jakmile už to víš, jak si k ní postavit funkční cestu.

Není to článek o localhost službách

Lokálně dostupné služby po footholdu řeší, co na localhostu hledat. Tento text řeší, jak si k nim nebo k jiným interním službám vytvořit dopravní vrstvu, která dovolí normální práci.

Není to toolbox článek

Smyslem není vyjmenovat chisel, socat, plink, ssh -L a proxychains. Smyslem je naučit čtenáře, kdy má most vyšší hodnotu než další enumerace veřejného povrchu.

Obrana a hardening

1. Nezaměňovat localhost za bezpečnostní hranici

ServMon ukazuje, že jakmile útočník získá běžný účet, localhost-only API je jen o jednu vrstvu tunelování dál.

2. Omezit laterální použitelnost interních služeb

Interní admin API, debug endpointy a management porty musí počítat i s kompromitovaným lokálním účtem. Nestačí je jen schovat za jiný interface.

3. Hlídát proxy a mosty jako bezpečnostní událost

Neočekávané lokální forwardy, reverzní tunely nebo bridge procesy typu socat bývají velmi silný indikátor post-exploitation práce.

4. Segmentaci navrhovat i proti kompromitovanému hostu

Pokud interní služba důvěřuje všemu, co přijde z lokálního hostu nebo z interní sítě, tunel z obyčejného footholdu udělá plnohodnotný administrační kanál.

5. Monitoring držet na úrovni dopravního vzoru, ne jen procesu

Jeden útočník použije ssh -L, jiný socat, další agent s reverzním tunelem. Důležitější než konkrétní binárka je to, že host začíná fungovat jako most do jiné zóny.

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: tunneling - pivot - proxy - port-forwarding - socat - proxychains - ssh