PEnetration TEsting Proxy (PETEP)
Zachytávání síťové komunikace stavějící na TCP protokolu a její modifikace pomocí vytváření specializované man-in-the-middle proxy, je jedna z mnoha používaných praktik hledání bezpečnostních chyb v síťových aplikacích. V tomto článku se zaměříme na využití multiplatformní open-source aplikace PETEP pro testování tlustých klientů využívajících TCP protokoly a ukážeme si zjednodušený postup útoků na ukázkové zranitelné aplikaci.
Během penetračního testování tlustých klientů vycházíme z komplexních metodik a používáme široké spektrum nástrojů. Velká část testů je věnována snaze narušit logiku fungování testované aplikace, a to mnoha různými způsoby – jedním z nich je právě modifikace přenášené komunikace. K těmto účelům běžně využíváme nástroje jako EchoMirage, Burp, Zap, Wireshark (pro analýzy) a mnoho dalších.
Při testování aplikací, které využívají jiné protokoly stavějící na TCP než HTTP/WebSockets, jsme však mnohdy naráželi na nedostatky současných řešení, a to zejména při rozsáhlejších a složitějších testech, při nichž je nutné komunikaci efektivně zanalyzovat a následně také efektivně řídit. Z tohoto důvodu došlo ke vzniku nového nástroje zvaného PETEP (PEnetration TEsting Proxy).
PETEP je open-source nástroj naprogramovaný v Javě, jenž umožňuje vytvářet proxy a pracovat s komunikací pomocí funkcionalit jako jsou pravidly řízené označování, modifikace, logování a zachytávání datových jednotek přenášených pomocí TCP protokolu. Pro pohodlnou práci s komunikací lze navíc nástroj napojit na existující nástroje pro práci s HTTP protokolem, jako jsou Burp Suite a Zaproxy. Aplikace je také plně rozšiřitelná o nové protokoly a různé moduly pro zpracování dat, a to za pomoci vývoje vlastních Java archive balíčků.
Pro názornou ukázku bude využita jednoduchá aplikace vyvinutá pro účely demonstrace útoků, a to konkrétně základní zranitelný chat. V praxi jsou samozřejmě obdobné útoky značně složitější a časově náročnější, avšak jejich princip bývá mnohdy velmi podobný.
Vytváření a konfigurace projektu
Samotný test prostřednictvím nástroje PETEP začíná vytvořením projektu, při němž si volíme požadované moduly, které budeme potřebovat při práci. Následně provádíme konfiguraci jednotlivých proxy modulů a interceptor modulů (pro zpracování dat). Interceptor moduly pak lze v obou směrech komunikace poskládat a nakonfigurovat dle konkrétních potřeb.
Analýza komunikace
Rozsáhlé síťové aplikace častokrát využívají vlastních protokolů postavených na TCP a pro důkladné otestování je nutné porozumět přenášeným zprávám a orientovat se v nich. Z tohoto důvodu většinou předchází snaze o narušení komunikace fáze analýz, při níž se zabýváme fungováním použitého protokolu a nastavujeme pravidla pro automatické označování datových jednotek. Nástroj za pomoci těchto pravidel následně na základě obsahu, délky a dalších parametrů označuje jednotlivé jednotky určitými štítky jako "login", "account_balance_check", "heartbeat", ...
Ukázková aplikace využívá velmi jednoduchý plain-textový protokol, který má v obou směrech následující formát:
Například:
Z toho je zřejmé, že pokud chceme provést označení jednotlivých datových jednotek, vystačíme si s detekcí začátku dat – například pokud datové jednotky začínají "print ", můžeme je označit štítkem "print". (Viz následující video.)
Označování jednotlivých dat je pak užitečné zejména při práci s aplikacemi, u nichž dochází k přenosu velkého množství zpráv, které by jinak bylo velmi obtížné filtrovat. Pomocí přiřazování štítků datovým jednotkám je následně snadné provést jejich filtraci.
Za další praktické využití automatického označování dat, se kterým se při testech v praxi setkáváme, lze považovat situace, kdy potřebujeme pozastavovat, logovat či jinak pracovat pouze s určitými daty a ostatní je nutné bez prodlevy propouštět, aby nedošlo k zastavení navázaného spojení.
Ruční modifikace přenášených dat
Po analytické fázi přecházíme ke snaze narušit fungování testovaného systému za pomoci různých modifikací, replay útoků a dalších technik.
Na ukázkové aplikaci si ukážeme velmi snadný a přesto často efektivní útok, při kterém využijeme zranitelnosti aplikace, v níž není prováděna správná autorizační kontrola na straně serveru a k autorizaci dochází pouze na straně klienta.
Konkrétně půjde o použití příkazu "secret", který je dostupný pouze administrátorům zranitelného chatu. Pokud uživatel zadá tento příkaz do vstupního políčka, vypíše mu aplikace chybové hlášení o nedostatečných právech. Pro překonání client-side validace by pak šlo využít několik různých přístupů jako jsou například:
- modifikace aplikace za pomoci metodik reverzního inženýrství,
- přímé zaslání příkazu "secret" na server,
- změna práv na straně klienta za pomoci modifikace komunikace.
My se podíváme na variantu, při níž provedeme změnu práv na straně klienta, kdy přesvědčíme naši klientskou aplikaci o tom, že jsme se přihlásili pod právy administrátora, ač na straně serveru budeme nadále evidovaní jako běžný uživatel. Tuto modifikaci provedeme záměnou role "USER" za roli "ADMIN" v příkazu, který posílá server klientovi po úspěšném přihlášení.
S obdobnými zranitelnostmi se lze často setkat nejen u tlustých klientů, ale i u webových SPA (Single Page Application). Autorizaci je vždy nutné vykonávat na straně serveru, avšak mnohdy se stane, že dojde k opomenutí autorizačních kontrol u některých akcí, a útočník tak může v systému snadno napáchat zásadní škody.
Automatizovaná modifikace dat
Ruční modifikace dat je vhodná pro manuální testování zranitelností, avšak pro kontinuální využívání dané zranitelnosti je výhodné zneužití zranitelnosti zautomatizovat.
V předešlé sekci jsme si ukázali, jakým způsobem lze ruční modifikací zasílaných dat obejít client-side kontrolu privilegií a využívat tak s uživatelským účtem administrátorského příkazu "secret". Tento postup můžeme velmi snadno zautomatizovat, a to pomocí vytvoření pravidla pro označení příkazu "principal" a vytvoření modifikačního pravidla pro záměnu role "USER" za roli "ADMIN" v tomto příkazu.
Po nastavení automatické záměny uživatelské role nám bude při každém dalším přihlášení ihned nastavená administrátorská role, a tak můžeme v testech pokračovat s aplikací přepnutou do administrátorského módu.
Automatizovaná modifikace se mnohdy hodí také pro provádění komplexnějších útoků, při nichž je nutné modifikovat větší množství dat v různých datových jednotkách. Zejména je tomu tak v případě aplikací, u nichž způsobí delší prodleva mezi zprávami automatické ukončení spojení.
Napojení PETEP na externí HTTP proxy
Pro pohodlnou a efektivní práci s přenášenými daty (modifikace, opakování, fuzzing) často využíváme nástroje, na něž jsme zvyklí z penetračních testů webových aplikací, a to zejména Zaproxy a Burp Suite. Pro jejich využití v testech tlustých klientů využijeme funkcionality modulu External HTTP Proxy, který dovede serializovat veškeré datové jednotky procházející přes nastavené proxy a zapouzdřit je do HTTP požadavků. Výsledná konfigurace komunikace pak lze popsat následujícím schématem.
Uvnitř nástroje PETEP tak vzniká simulace webového klienta a webového serveru, která vede k možnosti napojení na běžné testovací HTTP proxy.
V tomto módu můžeme využívat například veškeré funkce aplikace Burp Suite, a to zejména moduly Repeater a Intruder. Pro lepší pochopení využití se podívejme na následující ukázku, v níž dojde k propojení nástroje PETEP s Burp Suite, a poté k následujícím činnostem:
- 1:36 – opakované zaslání datové jednotky pomocí Repeateru,
- 2:10 – změna privilegií na straně klienta zasláním datové jednotky s modifikovanou rolí a využití chybějící autorizace na serveru pro spuštění administrátorského příkazu "secret",
- 3:30 – automatizované zasílání datových jednotek pomocí Intruderu pro SPAM,
- 4:50 – slovníkový útok na administrátorské heslo pomocí Intruderu.
Rozšiřitelnost aplikace
Důležitou vlastností aplikace PETEP je, že je multiplatformní a plně rozšiřitelná, což nám umožňuje vyvíjet nová rozšíření přidávající určitou funkcionalitu, a to i na míru pro konkrétní testy. Pomocí rozšíření do aplikace totiž lze přidat podporu pro další komunikační protokoly, vlastní interceptor moduly či označovací/modifikační pravidla. (Viz vývojářská příručka.)
Závěrem
Penetrační testy tlustých klientů jsou složitou disciplínou, u níž dochází k širokému spektru aktivit, jako jsou analýzy souborů, reverzní inženýrství, analýzy paměti, analýzy a modifikace síťové komunikace a další. Pro tyto účely jsou pak využívány různorodé nástroje a metodiky, aby bylo dosaženo úplného prověření současného zabezpečení. V tomto článku jsme se zabývali konkrétně využitím nástroje PETEP pro analýzu a práci se síťovou komunikací testovaných aplikací a ukázali jsme si, jak mohou vypadat některé útoky ve zjednodušeném formátu.
Pokud bychom měli dát doporučení k zabezpečení aplikace před obdobnými zranitelnostmi, je nutné připomenout, že jakákoliv opatření na straně klienta jsou vždy překonatelná a je pouze otázkou času, než útočníci najdou způsob, jakým tato opatření obejít. Proto je v každém případě nezbytné provádět veškeré bezpečnostní kontroly na straně serveru a důkladně prověřit jejich funkčnost před nasazením aplikace do produkčního prostředí.