Autor: jech | 7.10.2013 |
Knihovna Jpcap je vlastně wrapperem (obálkou) ke knihovně WinPcap na Windows. Možná se ptáte, proč jsem tedy k implementaci nevyužil rovnou C++ a WinPcap. Odpověď je prostá. Chtěl jsem vyzkoušet co knihovna Jpcap vlastně umí. Nic víc tom nehledejte.
Knihovnu jsem stahoval již více než před rokem a jakou verzi v projektech využívám se mi nepovedlo zjistit. Vy si můžete Jpcap stáhnout ze sourceforge.net a nebo raději odtud https://dl.dropboxusercontent.com/u/47668828/soom/jpcap.jar, abyste měli stejnou verzi jako já. V nejnovějších verzích Jpcap je totiž mnoho věcí odlišných. Projekt byl na sourceforge.net aktualizován naposledy v lednu letošního roku, nicméně nejnovější verze byla mezi soubory umístěna v roce 2004. Jak je to s tímto projektem dál nevím, hlavní ale je, že Jpcap svou funkci plní.
Pokud budete chtít ukázky kódu spouštět, nezapomeňte si také nainstalovat WinPcap knihovnu. Teď už ale k samotnému útoku a jeho implementaci.
TCP SYN flood patří mezi DoS útoky a výsledkem takového útoku je zpravidla zablokování nějaké služby pro ostatní uživatele. Samotný princip je poměrně jednoduchý. Pro navazování TCP spojení se používá tzv. three-way handshake.
zdroj: http://cs.wikipedia.org/
Ten probíhá tak, že klient nejprve odešle paket s flagem SYN na server. Server odpoví paketem s flagy SYN a ACK (tj. potvrzuje požadavek na spojení) a klient následně potvrdí paketem s flagem ACK. Spojení je v danou chvíli navázáno.
Každý server má samozřejmě omezené prostředky a tím pádem omezený počet otevřených spojení. Pokud se útočníkovi povede navázat dostatečný počet spojení, nebudou moci ostatní uživatelé využívat služeb daného serveru.
Řada serverů navíc alokuje prostředky již ve chvíli, kdy obdrží SYN paket (tj. první paket z tree-way handshaku). Útočníkovi tak jednoduše stačí odeslat dostatečný počet SYN paketů, díky kterým server „napůl” otevře (ACK paketu ze strany klienta se již nedočká) velký počet spojení a vyčerpá všechny prostředky.
zdroj: http://cs.wikipedia.org/
Některé servery sice čekají s otevřením spojení na ACK paket od klienta, ale i to se samozřejmě dá implementovat. Jen by to bylo o něco složitější než tato ukázka.
Implementace je díky knihovně Jpcap opravdu jednoduchá. Je založena na odesílání velkého množství TCP paketů s nastaveným flagem SYN a rozdílným číslem zdrojového portu. Výsledkem je tedy mnoho otevřených spojení na různých portech.
K napsání útoku stačí jedna jediná třída, statická proměnná port (číslo portu, které se s přibývajícím počtem spojení zvyšuje) a pouhé 4 funkce – main, sendSYNPacket, macToBytes a generatePort.
Funkce main otevírá síťové zařízení a následně volá funkci sendSYNPacket pro odesílání SYN paketu. Vyjma zdrojového čísla portu, které se stále zvyšuje díky pomocné funkci, jsou jinak parametry odesílaného paketu vždy stejné. Číslo 80 v parametru udává port služby, na kterou se útočí. V našem případě tedy WWW.
Nejdůležitější funkcí je samozřejmě sendSYNPacket, která odesílá, jak již název napovídá, samotný SYN paket. SYN paket je vlastně obyčejným TCP paketem s nastaveným SYN flagem. Ten se nastavuje v konstruktoru a je jako jediný nastaven na TRUE.
Dále jsou nastaveny parametry IPv4 protokolu. Krom nastavení TCP nejsou tyto parametry v tomto případě nijak důležité. Paket je také naplněn prázdnými daty. Na závěr je vytvořen ještě ethernetový rámec, kterému je spojen s TCP paketem.
Poslední dvě funkce jsou pouze pomocné. MacToBytes převádí mac adresu dodanou ve stringu na pole bajtů a generatePort neustále zvyšuje statickou proměnou třídy s názvem port.
Pokud máte doma alespoň běžný SOHO router, můžete implementaci snadno otestovat. Posíláním paketů na port 80 odstavíte na routeru WWW server, když zvolíte port 21, odstavíte FTP. Po ukončení útoky se router většinou do pár vteřin opět vzpamatuje.