Kali Linux: proxychains a SQL Injection s utilitou sqlmap

28. 11. 2016
Doba čtení: 11 minut

Sdílet

Po delší době se vracím ke Kali Linuxu. Dnes se podíváme, jak přesměrovat síťovou komunikaci přes libovolné množství proxyserverů pomocí proxychains a jak provést sql injection útok pomocí utility sqlmap.

Dnešním článkem bych rád navázal na svůj seriál o linuxových BackTrack a Kali Linux, určených primárně k penetračnímu testování počítačových sítí, od nynějška však budou jednotlivé díly vycházet pouze pod hlavičkou Kali Linux. Proč? Již v době psaní prvního seriálu o zmiňovaných linuxových distribucích byl BackTrack jeho vývojáři nahrazen nástupcem, jenž dostal jméno Kali Linux, tvůrci vyzývali k upgradu a odkaz ke stažení původní, tedy poslední verze distribuce, BackTrack 5, byl z oficiálních stránek odstraněn (přesto byl stále k sehnání z neoficiálních zdrojů). Na druhu stranu, přestože Kali z BackTracku vychází, jeho rané verze bylo na některých starších strojích často problematické rozjet, kvůli potížím s některými ovladači a veškeré v jednotlivých dílech seriálu zmiňované utility a postupy byly s BackTrack 5 zpětně kompatibilní.

Kali se však od té doby značně vyvinul, aktuálně do stabilní verze 2016.2, která je ke stažení jak pro 32 bitovou i 64 bitovou architekturu, pro slabší počítače je připravena verze s označením Light, k dispozici je i několik dalších verzí s označením Kali Linux 64 bit e17, Kali Linux 64 bit Mate, Kali Linux 64 bit Xfce, Kali Linux 64 bit LXDE, Kali Linux armhf a Kali Linux armel. Každou neděli navíc vychází čerstvý „Week Build“ s označením [rok]-W[číslo_týdne]. Jako pomyslnou třešničkou na dortu jsou verze již připravené pro nasazení na virtuálních strojích VMware a VirtualBox a ARM build script. Všechny verze jsou k dispozici ke stažení z oficiálních stránek od vývojářů z Offensive Security, přes HTTP nebo Torrent.

Sekce Downloads na oficiálních stránkách Kali Linuxu

Dost bylo řečí o vývoji a přerodu BackTrack 5 v Kali Linux, přejděme k zábavnějším částem dnešního dílu, kdy se nejprve podíváme na vestavěnou utilitu proxychains, umožňující přesměrovat naši síťovou aktivitu přes několik proxy serverů, na automatizovaný sql injection pomocí utility sqlmap, pak si povíme, jak svoji databázi proti útokům typu sql injection ochránit a nakonec lehce načneme dekryptování hashovaného řetězce, zpravidla hesla, kterému bude věnován příští díl. Jistě vám tedy již došlo, že zmiňované části na sebe logicky navazují.

Než se pustíme do samotného testování, vás však musím upozornit, že uvedené informace slouží pouze ke studijním účelům a jsou publikované za účelem osvěty v oblasti bezpečnosti. Autor článku i provozovatel serveru Root.cz se distancují od jakéhokoliv zneužití zde získaných informací.

Proxychains, aneb okolo světa

Utilita proxychains, která je jednou ze základních utilit Kali Linuxu, umožňuje, jak jsem již nadhodil o několik řádků výše, přesměrovat vaší síťovou komunikaci přes různé, v seznamu, který je součástí konfiguračního souboru, nadefinované proxy servery a zajisti tak do značné míry vaší anonymitu. Její použití je velice prosté, jednoduše před síťový příkaz zadáte příkaz proxychains, váš výsledný příkaz by tedy mohl vypadat třeba následovně:

proxychains nmap -sS [IP nebo URL adresa]

Program nmap oskenuje porty zadaného cíle a proxychains celou aktivitu přesměruje přes libovolné množství proxy serverů. Protože však konfigurační soubor proxychains.conf neobsahuje defaultně žádné adresy proxy serverů, je třeba mu je nejprve poskytnout, případně provézt další nastavení, tak aby proxychains fungoval přesně dle našich představ. Konfigurační soubor naleznete ve složce /etc, pro jeho otevření v leafpadu (standardní textový editor Kali Linuxu) zadejte do Terminálu následující příkaz:

leafpad /etc/proxychains.conf

Seznam proxyserverů můžete získat na mnoha místech, např. zde:

Nebo použijte Google, seznamů anonymních proxy serverů naleznete na celém internetu nespočetné množství.

Nejnovější verze proxychains podporuje proxy servery typu SOCKS4, SOCKS5 a samozřejmě HTTP. Místo pro zadání jednotlivých adres proxy serverů najdete v konfiguračním souboru proxychains.conf úplně na konci. Než však začnete přidávat jednotlivé adresy, doporučuji pro naše účely zakomentovat (přidat na začátek řádku #) první záznam:

socks4 127.0.0.1 9050 → #socks4 127.0.0.1 9050

Pokud tak neučiníte, komunikace bude nejprve přesměrována přes localhost na portu 9050, což je standardní Tor konfigurace. Používáte-li Tor, nechte řádek tak, jak je, v opačném případě jej dle doporučení zakomentujte. Další adresy proxy serverů přidávejte vždy na nový řádek, dle této syntaxe:

[typ]   [ip adresa] [port]  [user]  [pass]

Většina proxy serverů, které naleznete, po vás nebude autentizaci vyžadovat, položky user a pass, tedy uživatelské jméno a heslo, vyplňovat nebudete. Seznam proxy serverů nakonec může vypadat třeba následovně:

http    60.11.10.173 longin passvaroti
http    46.218.85.101
http    164.132.28.157
socks5  114.25.223.238
socks4  45.115.226.226

Zde je jich uvedeno pět, přesto si do seznamu zadejte adres alespoň dvojnásobek a při dlouhodobějším užívání proxychains je pravidelně obměňujte.

V konfiguračním souboru si můžete zakomentováním a odkomentováním zvolit ze tří různých vzorců chování proxychains, tou první je dynamické řetězení ( dynamic_chain). Při nakonfigurování této možnosti prochází utilita seznam proxy serverů po záznam po záznamu odshora dolů a pokud některý z proxy serverů spojení odmítne (reject, timeout…), přejde na další řádek seznamu, bez vyhození chybového hlášení.

Opakem první možnosti je statické řetězení ( static_chain), program bude opět procházet seznam záznam po záznamu, narazí-li však na problematický proxy server, celý proces řetězení ukončí. Z toho vyplývá, že pokud chcete použít tuto možnost, musíte mít jistotu, že veškeré zadané adresy jsou adresy funkčních proxy serverů.

Poslední možnost, moje oblíbená, je náhodné řetězení ( random_chain). Proxychains sestaví řetěz proxy serverů dle ze seznamu náhodně vybraných adres. U této varianty je navíc možné zadat hodnotu chain_len (standardně je nastavena na hodnotu 2), nebo-li délka řetězu, jinými slovy počet proxy serverů, přes které je komunikace přesměrovávána.

Další možností nastavení je odkomentovat řádek #quiet_mode, proxychains pak běží v tichém režimu a nevypisuje adresy proxy serverů, přes které v tu a tu danou chvíli komunikaci přesměrovává. Já osobně, protože používám náhodné řetězení, nechávám tento řádek zakomentovaný. V případě statického či dynamického řetězení se však logicky nabízí možnost řádek odkomentovat a tichý mód vypnout jen v případě, že některý z proxy serverů nám řetěz „přetrhl“ a my nevíme, který.

Nakonec doporučuji zakomentovat řádek proxy_dns, přes řadu proxy serverů vám Domain Name System neprojde a vzhledem k tomu, že za malý okamžik budeme proxy chain využívat společně s utilitou sqlmap, budeme funkční DNS potřebovat.

Timeouty nechte na původních hodnotách (uvedeno v milisekundách).

tcp_read_time_out 15000
tcp_connect_time_out 8000

Máte-li odkomentovanou pouze jednu ze základních možností dynamic_chain, static_chain nebo random_chain, správně a dostatečně vyplněný seznam adres proxy serverů a zakomentované řádky s proxy_dns a quiet_mode (nezapomeňte konfigurační soubor uložit), můžete proxychains otestovat pomocí cURL, zádáním následujícího příkazu do Terminálu:

proxychains curl ipconfig.me/ip

Před provedením příkazu curl by se vám, za předpokladu, že nemáte proxychains v tichém módu (odkomentovaný řádek quiet_mode) měl zobrazit řetěz proxy serverů, přes které byla komunikace přesměrována, což může vypadat třeba následovně:

|R-chain|-<>46.218.85.101-<>-164.132.28.157-<>-45.115.226.226-<><>-OK

Před tímto řádkem se vypíše název aktuální verze proxychains a adresa proxychains.sf.net – zde se můžete o utilitě proxychains dozvědět další informace. Tento řádek se zobrazí při použití proxychains vždy, i když máte zapnutý tichý režim.

SQLmap – nástroj pro automatický sql injection

Pokud jste se již někdy setkali s SQL databázemi, a předpokládám, že vám tento pojem není, když čtete tento článek, cizí, jistě je řada z vás obeznámená i s pojmem sql injection, pro ty z vás, kteří nevědí, o co se jedná, jen ve stručnosti: sql injection je metoda útoku na databázový systém, která využívá špatně napsaného kódu přístupové aplikace, ve většině případů se jedná o aplikaci webovou, jako je např. redakční systém, nebo eshop, jenž je díky lenosti či neznalosti jejího tvůrce ochotná zadáním těch správných/nesprávných dotazů vydat jakýkoliv svůj obsah, např. tabulku s uživatelskými jmény, či hesly (ta jsou zpravidla zahashována, ale o tom později) registrovaných uživatelů.

Nejprve je třeba ověřit, zda je webová aplikace, stránka, napadnutelný tímto typem útoku. Nebo na to můžeme jít z druhého konce a vyhledat potenciálně napadnutelnou stránku pomocí velmi užitečné funkce Googlu hledání inurl (hledej v adrese). Hledat můžete např.: inurl:item_id=, inurl:users.php?id=, inurl:clanek.php?ID= atd., pokud nakouknete na konec článku, kde uvádím použité zdroje, najdete v jednom z nich celkem obsáhlý seznam podobných takovýchto frází.

Řekněme, že jste si našli stránku, jejíž adresa bude třeba:

http://www.nejakastranka.cz/clanek.php?id=42

Zda je stránka potenciálním cílem sql injection útoku zjistíte velmi snadno, na konec dosadíte apostrof ( ') a takto upravenou adresu necháte prohlížečem načíst.

http://www.nejakastranka.cz/clanek.php?id=42'

Pokud se vám zobrazí původní obsah (stejný jako pro id 42), stránka vás přesměruje na nějakou interní stránku s hlášením typu „Takový článek neexistuje“, nebo se prostě jen načte prázdný obsah, je stránka proti sql injection ošetřená a nelze jí pomocí utility sqlmap napadnout. V případě, že se vám zobrazí chybové hlášení SQL, které může vypadat kupříkladu následovně:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/nejakastranka.cz/clanek.php on line 12

Stránka ošetřená není a napadení je možné.

Předpokládejme tedy, že jste takovou stránku našli, nebo o nějaké takové víte. Útok pomocí utility sqlmap, která je také obsažena již v základní instalaci Kali Linuxu, budeme provádět následovně.

Otevřete Terminál a zadejte následující příkaz. Povšimněte si, že zde využíváme proxychains, fungovalo by to samozřejmě i bez něj a rychleji, správce serveru by však mohl vidět naší ip adresu, ze které je možné při následném vyšetřování najít reálné umístění vaší stanice, vyloučení použití proxychains přichází v úvahu, jen v případě, že útok provádíte pokud z veřejného místa, např. z kavárny, kde je otevřená wi-fi síť (a nemusí být ani otevřená, viz první díl seriálu, spíš než reaver byste však již dnes v Kali Linuxu použili utilitu s názvem wifite, pokud jí neznáte, určitě se na ní podívejte, její použití je velmi jednoduché, do terminálu stačí zadat příkaz wifite), kde se po útoku již nějakou dobu neukážete, nebo alespoň ne s notebookem.

proxychains sqlmap -u http://www.nejakastranka.cz/clanek.php?id=42 --dbs

Význam syntaxe je zřejmý, utilitě sqlmap určíme cíl pomocí -u a adresy špatně zabezpečené stránky (včetně té části url, která určuje skriptu, potažmo databázi, jaký obsah má vydat) a přikážeme, aby nám zjistila názvy databází ( --dbs). Až celý postup proběhne (doba po kterou bude sqlmap pracovat závisí na mnoha faktorech) zobrazí se nám v terminálu název databáze, či názvy, jednotlivých databází. Seznam může vypadat např. takhle:

information_schema
hlavni

Jakmile zjistíte názvy databází, chcete v dalším kroku samozřejmě zjistit názvy tabulek. Příkaz pro sqlmap tedy upravíme následovně.

proxychains sqlmap -u http://www.nejakastranka.cz/clanek.php?id=42 -D hlavni --tables

Jak vidíte, přidali jsme -D hlavni a místo --dbs jsme napsali --tables, sqlmap nám nyní zjistí názvy jednotlivých tabulek v databázi s názvem hlavni, výsledek může vypadat třeba následovně:

clanky
uzivatele
menu
rubriky
content
...

Zaujala nás samozřejmě tabulka uzivatele, předpokládáme totiž, že obsahuje uživatelská jména, hesla a další informace jako např. email použitý při registraci všech uživatelů. Řada lidí používá stejné heslo na všech svých účtech, pokud tedy budete mít tabulku s uživatelským jménem, heslem a emailem z nějakého webu a tabulka bude mít sto tisících řádků, buďte si jistí, že máte i zatraceně hodně hesel k uvedeným emailům, neboť jsou prostě stejná. K tomuto případu došlo letos v únoru, kdy „unikla“ tabulka users jednoho na českém a slovenském internetu velice známého, leč chabě zabezpečeného portálu, tabulka má přes 118 000 záznamů(!), ale zpět k sqlmap… v dalším kroku chceme názvy jednotlivých sloupců tabulky uživatele, příkaz upravíme takto:

proxychains sqlmap -u http://www.nejakastranka.cz/clanek.php?id=42 -D hlavni -T uzivatele --columns

Řekněme, že názvy jednotlivých sloupců jsou následující:

id
login
heslo
email

Teď již máme jednotlivé záznamy nadosah. Následující příkaz pro sqlmap bude vypadat takto:

proxychains sqlmap -u http://www.nejakastranka.cz/clanek.php?id=42 -D hlavni -T uzivatele -C login --dump

Tím získáme veškeré záznamy ze sloupce login, tabulky uzivatele v databázi hlavni nezabezpeceneho portalu www.nejakastranka.cz, obdobným způsobem se samozřejmě dostanete i k dalším sloupcům id, heslo a email, i k ostatním částem databáze.

Obrana proti sql injection je přitom vcelku jednoduchá (zde předpokládám určité znalosti PHP, které, pokud píšete skript využívající SQL databázi a je tedy tato informace určená právě pro vás, jistě máte, nebudu se tedy o kódu dopodrobna rozepisovat)

Zde je řešení které databázi učiní náchylnou k sql injection:

$login = $_GET['login'];
$query = "SELECT heslo FROM uzivatele WHERE login = '$login' ";
echo "Heslo pro uzivatele $login je $query";

Následující skript je o trochu delší, zároveň však mnohem bezpečnější:

$login = $_GET['login'];

if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) {

    //Sváže proměnnou s řetězcem
    $stmt->bind_param("s", $login);

    //Vykoná příkaz
    $stmt->execute();

    //Získá proměnnou z dotazu
    $stmt->bind_result($heslo);

    //Načte data
    $stmt->fetch();

    //Zobrazí data
    printf("Heslo pro uživatele %s je %s\n", $login, $heslo);

    //Uzavře celý proces
    $stmt->close();
}

Oba skripty jsou samozřejmě pouze ilustrační, v praxi asi nebudete chtít načíst heslo do proměnné a pak jej společně s uživatelským jménem vypsat na stránce. Srovnání obou skriptů má za úkol vás na jednoduchém příkladu nasměrovat na bezpečné psaní php skriptů pracujících s SQL databází. Příklady proti sql injection dobře ošetřených skriptů můžete vyhledat Googlem pod frází „prevent sql injection“.

bitcoin_skoleni

Hashuju, hashuješ, hashujeme

Poslední část dnešního dílu nemá nic společného s hašišem, vrátíme se k ní k naší sqlmapem napadnuté natabázi a k záznamům ze sloupečku hesla, tabulky uzivatele. Hesla jsou totiž v databázích většinou uložená v kryptovaném formátu, tzv. zahashovaná. Takto kryptované heslo může vypadat třeba následovně:

e99a18c428cb38d5f260853678922e03

A co s ním? K tomuto účelu je v Kali Linuxu připravena utilita hashcat, možností, jak ze zahashovaného hesla získat heslo použitelné, je však více, o tom si ale povíme v příštím díle.

Použité zdroje

Autor článku

Autor se o výpočetní techniku a vše co s ní souvisí zajímá již od dětství. Fascinován je především sítěmi a otázkami jejich bezpečnosti.