PDF Verze - Kybernetická bezpečnost
Transkript
PDF Verze - Kybernetická bezpečnost
WEB_SECURITY David Sýkora Webové aplikace tvoří v dnešní době bránu do kyber prostoru, který se stává součastí všedního života téměř všech lidí a právě proto je potřeba se zamýšlet nad problematikou bezpečnosti této k o m u n i k a c e . Te n t o dokument by měl pomoci vyvojařům pochopit základní aspekty bezpečnosti a naučit je jak otestovat jejich kod. Phishing (123) 456-7890 Well known exploits (123) 456-7890 CSRF (123) 456-7890 Session hijacking (123) 456-7890 Cryptography issues (123) 456-7890 Bad configuration (123) 456-7890 Data leakage (123) 456-7890 XSS (123) 456-7890 Broken Auth (123) 456-7890 Injection (123) 456-7890 Úvod do penetračního testování .........................4 Co je penetrační testování? ..............................................................................................4 Proč bychom měli aplikace testovat? ...............................................................................4 Etika ..................................................................................................................................4 Report ...............................................................................................................................4 Typy penetračních testů ...................................................................................................5 Metodiky testování ..............................................6 Co to je metodika? ............................................................................................................6 OSSTMM...........................................................................................................................6 OWASP..............................................................................................................................7 ISSAF ................................................................................................................................7 RSA ...................................................................................................................................7 Souhrn metodik ................................................................................................................ 8 Automatické nástroje ..........................................9 Úvod ..................................................................................................................................9 V čem jsou automatické skennery dobré? ........................................................................9 V čem nejsou automatické skennery dobré? ....................................................................9 Hodnocení jednotlivých skennerů..................................................................................10 Injekce ................................................................11 Úvod .................................................................................................................................11 SQL Injection (SQLi) ....................................................................................................... 11 Command Injection ........................................................................................................12 Cross-site scripting (XSS) ..................................13 Úvod ................................................................................................................................13 Persistent XSS (stored) ...................................................................................................13 Non-persistent XSS (reflected / DOM) ..........................................................................13 Obrana .............................................................................................................................14 Autentifikace a šifrování ....................................15 Úvod ................................................................................................................................15 Útoky na autentifikaci .....................................................................................................15 Phishing..............................................................15 Úvod ................................................................................................................................15 Spear Phishing ................................................................................................................15 Detekce ............................................................................................................................16 Prevence ..........................................................................................................................16 Úvod do penetračního testování Co je penetrační testování? Penetrační testování je způsob jak ověřit bezpečnost nějakého systému. Provádíme ho za účelem odhalit nedostatky v systému. Můžeme testovat aplikace, operační systémy i chování zaměstnanců. V tomto dokumentu se budem zabývat způsobem testování webových aplikací. Proč bychom měli aplikace testovat? Aplikaci testujeme za účelem předejít reálným bezpečnostním incidentům. Nahlížíme na aplikaci očima útočníka, který se snaží způsobit vývojářem nezamýšlené chování aplikace. Tímto předcházíme potencionální ztrátě financí, zákazníků nebo úniku citlivých údajů. Etika Když chceme aktivně testovat, vždy musíme mít nejen písemný souhlas vlastníka aplikace, ale také souhlasy všech lidí, kterých by se mohlo testování nějak dotknout. Tím myslím poskytovatele internetu, poskytovatele hostingových služeb, správce doménových jmen etc. Při testování provádíme úkony, které by pravěpodobně prováděl i útočník a tak je potřeba se nějak odlišit od lidí, kteři provádí trestní činnost. Musímě předpokládat, že by se situace obrátila proti nám a například by někdo podal trestní oznámení. Tester poté musí mít důkazy o legálnosti každého jeho úkonu. Před jakýmkoliv testem se musí stanovit jasné mantinely. Určí se čas, cíle testu (adresy, domény, emaily, osoby) a často i něco co vás odliší od ostatních při zpětném šetření (user-agent, IP, specifická hlavička HTTP etc.). Report Po skončení testu podáváme klientovi tzv. report, ve kterém ho seznamujeme s celkovou situací a v jednotlivých sekcích mu podáváme informace o jeho aplikaci. Rozdělení sekcí je čistě ponecháno na testerovi. Tester si může zvolit tzv. metodiku testování (popis metodik si ukážeme později) a ta má své vlastní rozdělení sekcí. Každá oblast aplikace, která obsahuje tzv. vektor útoku, musí obsahovat stručný popis, jak by případný útočník mohl chybu využít, popsat potencionální následky zdařilého zneužití tohoto vektoru, dokázat přitomnost chyby (tzv. POC - Prove of Concept) a volitelně i nárys toho, jak by klient mohl tomuto zabránit. Report může mít libovolnou podobu (např. PDF, HTML, PPT, Word etc.). Je důležité klást důraz na přehlednost! Musíme také počítat s tím, že zadavatel testu pravěpodobně předá naší zprávu programatorům, kteří pomoci naší zpravý aplikaci postupně zabezpečí. Typy penetračních testů Penetrační testy se rozdělují na tři základní skupiny podle toho kolik informací klient poskytuje testerovi. Tímto můžeme simulovat jednotlivé scénáře. Black box Tester neví defakto nic jiného než adresu webového serveru a ke všemu ostatnímu se musí dostat sám. Nemá přístup ke kodu, nezná funkcionalitu jednotlivých kompenent a neví nic o prostředí běhu aplikace (webový server, HW, hosting etc.). Tento typ testů provádíme, jestliže klient chce aplikaci otestovat vůči útočníkovi, který nic z výše popsaných věcí nezná a takových útočníků bude pravěpodobně většina. Klient si tento typ testu může vyžádat, aby si ověřil, zda-li je jeho aplikace chráněna proti vnějším útočníkům. Grey box Tester je obeznámen s funkcionalitou komponent, ale neví, jaký je zdrojový kod. Tento typ testování se aplikuje, pokud chceme aplikaci otestovat proti útočníkům, kteří jsou obeznámeni funkcionalitou aplikace. Může jít o řadové zaměstnance firmy nebo také o útočníka, který se k informacím o aplikaci dostal přes chybu zaměstnance. White box Tester dostane informace o všem, o co si zažádá (hesla, zdrojové kody etc.). Tento typ testování se aplikuje, pokuď klient chce provést vnitřní audit aplikace a chce zamezit i takovým útokům, ke kterým by při black box testingu nemohlo logicky dojít a které vyžadují znalost zdrojového kodu. Tester prochází aplikaci soubor po souboru a hledá místa, které by se mohly stát vektorem útoku. Tester zároveň oveřuje vedlejší faktory, jako je dostatečná síla hesel, možnost přístupu zaměstnanců k údajům, které nepotřebují ke své činnosti etc. Metodiky testování Co to je metodika? Metodika testování je způsob přístupu k penetračnímu testování. Rozděluje ho do několika částí a říká nám, co bychom v jednotilvých částech měli dělat. Testování je pak systematičtejší a efektivnější. Metodika také často určuje samotnou filosofii PT tzn. jak by k němu měl tester přistupovat, co by mělo obsahovat etc. Níže ukážu jaké metodiky existují a popíšu jejich filosofii, popř. jejich klady a zapory. Nakonec vypracuji tabulku, kde jednotlivé metodiky ohodnotím. OSSTMM Open Source Security Testing Methodology Manual Metodika, která je určena pro testování firemní a vládní bezpečnosti. Je rozložena do šesti modulů. Určuje mezinárodní standart penetračního testování. Kategorizuje bezpečnosti do počitatelných kompenent. Rozděluje testy do šesti skupin: * Metodika se zabývá bezpečností obecně a jijí filosofií. Testování webových aplikací tedy nepopisuje tak detailně jako ostatní metodiky. http://osstmm.com OWASP Open Web Application Security Project Tato metodika vznikla na základě neziskové činnosti lidí, kteří se dlouhodobě snadží vylepšit bezpečnost na internetu. Dle mého názoru je jednoznačne nejobsáhlejší co se týče tématu webové bezpečnosti. OWASP Foundation pracuje na dvou typech projektů. Za prvé na vývojářských projektech, kde OWASP F figuruje jako vývojář a vyvíjí nástroje, které približují internet k jijich představě a za druhé projekty dokumentační, které se snaží dokumentovat bezpečnost (průvodce testováním webů, code snippets etc). Tato metodika má velkou výhodu v tom, že je jí možné vložit do jednotilivých fází SDLC. http://owasp.org ISSAF Information Systems Security Assessment Framework Metodika strukturovaná do freamworku. Testování rozděluji do 9 kroků. Zaměřuje se na webové aplikace. RSA Metodika založená na urovni nebezpečí jednotlivých vektorů. Rozděluje je do pěti úrovní: Critical, High, Medium, Low a Informational. Úrovně jsou rozděleny podle bodů, které rozděluje metodika. Z mého pohledu je to nejlehčí a nejpřehlednější metodika, problém je, že na bezpečnost nahlíží pouze a jen ze stránky webových aplikací, což například OWASP nedělá. Souhrn metodik Metodika penetračního testování Kroky při testování Výhody OSSTMM 6 kroků Mnoho různých testů OWASP 9 kroků Code snippets, Web Goat, DVWA, mnoho různých návodů ISSFS 9 kroků Jasný a pochopitelný postup při testování RSA 6 kroků Výhoda v bodování jednotlivých vektorů Všechny metodiky mají společné rysy, co se týče hlavního rozložení testu: Získávání informací V této části se metodiky zabývají získáváním informací o webovém serveru a aplikaci. Tato část zahrnuje průzkum Search enginů, průzkum DNS záznamů, identifikaci serveru a jeho infrastruktury etc. Průzkum funkcnionality Tato část zahrnuje bližší prozkoumání fungování aplikace, což zahrnuje průzkum startovacích bodů aplikace, vztahy mezi jednotlivými komponentami, rozdělení rolí, způsob přihlašování etc. Exploitace Nyní už tester má všechny potřebné informace a může začít testotovat jednotlivé komponenty jak po stránce technické tak po logické. Automatické nástroje Úvod Při penetračním testování často provádíme úlohy, které lze provádět automaticky pomocí automatických testerů a tím zvýšit efektivitu celého testu. Je nutné si ale také uvědomit limity těchto nástrojů. Největším omezením je nepřizpusobivost konkretní aplikaci, to znamená, že programy jsou psané obecně pro všechny typy aplikací a nejsou schopny se přizpůsobit testované aplikační logice. V čem jsou automatické skennery dobré? • mapováním struktury aplikace • vyhledávání vstupů • sběr a analýza dat (emaily, citlivé údaje) • detekování základních bezpečnostních rizik (XSS, CSRF, RFI,LFI etc.) • rozpoznaní použitých knihoven, freamworků etc. V čem nejsou automatické skennery dobré? • analýza logiky aplikace • detekce složitějších rizik • Obcházení Turingových testů Hodnocení jednotlivých skennerů Název skenneru Přehledno st Licence Úspěšnost Platformy Použitelné reporty Acunetix 9 Komerční 9 Win Ano Nikto 5 Open Source 5 Cross platform Burp Suite Pro 6 Komerční 7 Cross platform Ano Arachni 10 Open Source 10 Cross platform Ano w3af 7 Open Source 8 Cross platform Vega 7 Open Source 6 Cross platform Wapiti 7 Open Source 6 Cross platform OWASP Zap 5 Open Source 7 Cross platform Podle tabulky výše vychází jednoznačně nejlepé projekt Arachni. Popíši Vám blíže to, jak funguje. Program je napsán v ruby a je možné ho spouštět přes přikazový řádek, webové rozhraní nebo REST API. Proces testování jsem rozdělil do 3 částí. 1. Nastavování skennu: 1. každé testování má vlastní název a popis (skenny jsou ukládány do DB) 2. každé testování užívá tzn. Profil, kterému definujeme: 1. název a popis 2. parametry testování (počet vláken, priorita na síti, která určuje rychlost přenosu dat) 3. oblasti testování (XSS, CSRF etc.) 4. ostatní (jaké údaje sbírat, jaké HTTP hlavičky používat) 2. Když spustíme sken dostáváme průběžně informace (čas, počet HTTP požadavků a zjištěné problémy) 3. Na konci skenner generuje výstup v mnoha podobách (PDF, HTML, CSV, TXT etc) Injekce Úvod Injektace je jedna z nejzávažnějších bezpečnostních chyb. Základní princip injekcí je možnost provedení operace, která může poškodit aplikaci. Toto je provedeno pomoci vsunutí nebezpečného kodu do příkazu. Takto můžeme například získat nadvládu nad databází nebo spustit nebezpečný kod. SQL Injection (SQLi) Představme si webový blog, který obsahuje několik různých článků. Každý článek ma unikatní itentifikátor ID. Na hlavní stránce je seznam všech článků s odkazama ve tvaru: http://blog.cz/clanek.php?id=1' kde parametr ID určuje článek. Aplikace poté spustí SQL dotaz na databázi ve tvaru: SELECT nazev , obsah, autor FROM clanky WHERE ID = ‘1’ a místo ID doplní hodnotu parametru z URL. Nyní si představte, že do hodnoty parametru dosadíme apostrof, který ukončíme otevřené uvozovky v SQL příkazu a dosadíme za ním například tento příkaz: UNION ALL SELECT nick, pass FROM admin Konečný příkaz bude tedy vypadat takto: SELECT nazev , obsah, autor FROM clanky WHERE ID = ‘’1’ UNION ALL SELECT nick, pass FROM admin Úspěšně jsme injektovali SQL dotaz a budou nám neservírovány údaje o adminovi včetně hesla. Problém tedy spočívá v apostrofu, který vyznačuje meze hodnoty paremetru v dotazu. Náchylnost aplikaci vůči SQLi testujeme tedy dosazením apostrofu do hodnot parametrů a sledujeme výstup. Rozlišujeme 3 druhy SQLi: 1. Inejkce s jasným výstupem, kde jsme schopni vypsat data z DB (Error based) 2. Injekce, která vevypisuje žádné data. Tím ale nebezpečí nezaniká. Utočník je schopen inejktovat boolean dotaz do SQL dotazu a postupne získat co potřebuje. Útočník rozeznává dva druhy výstupu: zobrazeno / nezobrazeno. Dotaz se tedy po injektaci apostrofu skládá ze dvou částí. První část vyzvedává data z DB o článku s určitým ID a druhá se ptá například na to jestli první znak adminova hesla je `a`. Pokud se stranka zobrazí a je skutečně první znak adminova hesla. Kdyby se nezobrazilo nic, znamenalo by to, že admin nemá první znak hesla `a` a útočník tedy přechází na písmeno `b`. Takto je schopen vydedukovat obsah celé DB. 3. Injekce, u kterých uživatel nevidí hodnotu výstupu. Toto se děje například u registračních formulářů, kde se na základě vyplněných formulářu vloží data do tabulky hostů. Útočník přestože neví výstup příkazu může například poslad příkaz na vložení nového admina stránky do DB nebo smazání celé DB. Command Injection Tento vektor útoku můžeme vidět u aplikací, které spuští systémové programy. Např: aplikace, které pingují určitou adresu nebo aplikace, které konvertují DOC do PDF etc. Problematiku si vysvětlíme u následujícího příkladu: <?php $output = system("host $_GET[‘host']"); print($output); ?> Do místa kde vkládáme hodnotu parametru host dosadíme středník a za něj “cat /etc/ passwd” a sledujme co se stane. Aplikace nejenom že vypíše výsledek příkazu host, ale také vypíše zásadní systémový soubor passwd. Cross-site scripting (XSS) Úvod Jak už název napovídá, XSS jde o spouštění scriptů na straně uživatele. Nejčastěji jde o Javascript, ale existují také Flashové vektory. Cílem útočníka, který využívá xss chybu, je spustit nežádaný script na straně prohlížeče. Tuto chybu lze rozdělit na dvě různé podskupiny: Stored a Reflected XSS. Persistent XSS (stored) Představme si aplikaci, která nabízí návštěvníkům zanechat komentář pod článkem. Komentář se po odeslání serveru uloží do DB a vypisuje se jeho obsah všem návštěvníkům webu. Útočník může do komentáře, který je špatně filtrován aplikací vložit javascriptový script, který se později spustí všem návštěvníkům webu. Takto může například přečíst cookies a zjistit jejich SessionId, pomocí kterého je aplikace autentifikuje. Pro tento typ XSS je typické ukládání do DB (proto se také jmenuje Stored = uloženo). Ze všech XSS je toto jednoznačně nejnebezpečnější typ útoku. Non-persistent XSS (reflected / DOM) Pro tento vektor útoku je typická inejktace klientských scriptů pomocí patametrů v URL a částí za #hashtagem. Tyto parametry se využívají například pro odkazování na určitou část stránky. Klient přejde na stranáku blog.cz/#nadpis1 a po načtění stránky se automaticky spustí skript, který si převezme parametr a najde DIV s id nadpis1 a provede operaci pro scroll na daný DIV. Útočník, ale může do hashtagu vložit takovou hodnotu, že místo scrollu na DIV, se například ukáže alert box. Druhý scénář, který patří určitě mezi ty nejčastější, je načítání hodnot do formulářů. Představme si vyhledávácí aplikaci s URL: hledej.cz/vyraz=“nove auto”. Hodnota parametru vyraz se automaticky po nactení vlozi do Inputu pro vyhledání. Pro tento příklad uvedu názornou ukázku: PHP script na strane serveru: Útočník pošle oběti odkaz na URL ve tvaru: http://hledej.cz/vyraz='><script>alert(‘xss’)</script><!— Když toto obět otevře vypiše se input a dosadi se do něho hodnota z parametru vyraz: Následně se oběti spustí javascriptový kod a vyskočí alert box s nápisem XSS. Nyní si představte scénář, kde by útočník chtěl získat přístup do administrace a nějakým způsobem by admina přinutil kliknout na odkaz, který by ho přesměroval do administrace a do přihlašovacího formuláře by se načetla data z URL a krom toho by obět nic netušícně odeslala své Cookies na server útočníka. Ukázka takového kodu: Obrana Prevence XSS je jednoduchá. Všechny proměné, které by se mohli vypsat do browseru je nutdno filtrovat a to pomocí funkce filter_var v PHP. Tato funkce převede následující znaky na neškodné HTML entity: Autentifikace a šifrování Úvod Proces autentifikace je klíčový pro správný chod každé aplikace, která nějakým způsobem ověřuje identitu uživatele. Když je logika ověřování prolomena, utočník je schopný využít identitu někoho jiného. Útoky na autentifikaci • Přenášení dat přes nezašifrované spojení, může znamenat únik přihlašovacích údajů, proto je nutné využít HTTPS s validním certifikátem a nastavit striktní vyžadování šifrování (HSTS) • Politika hesel je na první pohled samozřejmností, ale bohužel tak často není. Snaha uhodnout heslo je nejbeženější způsob útoku a proto je nutné vybrat takové heslo, které není možné dedukovat a které obstojí proti slovníkovým útokům. Časté je také ponechání výchozích hesel, což je také velký problém. • Proti procesu automatického uhádnutí hesla tzn. brute-force je potřeba implementovat ochranu. Tato ochrana vyhodnocuje unikatnost uživatele na základě spousta faktorů (např. IP, OS, HTTP-Agent atd.). Existují také cloudové služby, které toto zajištují (např. CloudFlare). • Funkce, které umožňují obnovit heslo jsou často kritickým bodem a je nutné je důkladně promyslet. Toto obsahuje i spravné zvolení bezpečnostních otázek. Phishing Úvod Phishing je technika, kterou se útočník snaží dostat z oběti citlivé údaje pomocí manipulace. Cílem útoku je přinucení oběti provést akci, která je podvrhnuta útočníkem. Akcí může být odesílání formuláře, ale například i nakoupení položek ne e-shopu. Tato technika bývá často kombinováná s XSS, kdy útočník oběť přesměruje na falešnou stránku. Spear Phishing Specifický druh teté techniky, která je založená na personizaci útoku. Útočník nesbírá data o oběti (může být i celá firma) a vytvoří důvěryhodný útok, který nebude oběd podezírat. Detekce Pro odhalení tohoto typu útoku se používá hlavně ověřování důvěrzhodnosti pomocí vytvoření databazí serverů, kterým je možné důvěrovat. Tuto funkci přináší antiviry nebo doplňky do prohlížečů (např. Web of Trust). Prevence Aby vůbec nedošlo k navštívení podvodné stránky je nutné vnímát odkud kam se na internetu pohybujete. Vždy nahlížejte na cílovou adresu odkazu, před tím než na něj kliknete. K návštěvě zvláště citlivých serverů (např. internetové bankovnictví, firemní administrace) zadávejte adresu vždy manuálně do prohlížeče. Predejdete tak návštěvě podvodného webu. Když už je nutné přejít na stránku pomocí odkazu, důsledně si prohlídněte, z jakých domén a subdomén se adresa skládá. Postup popíši na příkladu: Podvodná adresa je vytvořena často subdoménou, kterou v tomto případě tvoří slovo paypal a hlavní doménou (com-renew.net), která je odlišná od pravé domény sužby. Vždy je nutné zkontrolovat hlavní doménu. Dalším způsobem jak ověřit pravost stránky je kontrola SSL certifikátu. Váš prohlížeč je natolik inteligentní, že dokáže rozeznat certifikáty, které byly podepsané veřejně uznávanou autoritou od certifikátů, které nejsou podepsané jednou z věrohodných firem. Když chce vlastník webu bezpečné přihlašování do aplikace, musí si nechat certifikovat svou aplikaci pomocí certifikátu, který mu vydá certifikační autorita. Vlastník je nucen autoritě předat základní info o stránce a autorita dalé podepíše certifikát pravosti a stránka se stane důvěryhodnou pro rohlížeče (tzn. trusted). Přítomnost certifikátu zajišťuje nejen šifrovaný přenost dat pomocí HTTPS, ale také zvýší pocit bezpečí zákazníků a navýší ochranu proti phishingu. Celý tento proces popíši v ktrátkém příkladu: Útočník pošle oběti podvodný email s odkazem (paypal.com-renew.net) na falešnou přihlašovací stránku paypal. Oběť, která je znalá pokročilých principů bezpečného chování na internetu odkaz ani neotevře, protože vidí že doména neodpovídá standartní doméně používané paypalem. Předpokládejme, že oběť si toto neuvědomí a odkaz otevře. Nyní ale zpozorní protože vidí, že v stránka není potvrzená HTTPS certifikátem (není trusted) a pro jistotu otevře paypal manuálně přes paypal.com. Utok tedy nebyl uspěšný a útočník jde o emailovou adresu dál. To jestli je stránka trusted nebo ne se pozná na první pohled pomocí zavřeného zámku v poli pro zadávání adresy. Níže najdete fotografie tohoto znaku: Safari Chrome Firefox