Utwórz skan SYN za pomocą Pythona i Scapy

Spisie treści

W tym samouczku mam zamiar Cię nauczyć wykonać skanowanie portów TCP SYN, do tego użyję Pyton z księgarnią Scapy.

Aby zainstalować Pythona, możesz zapoznać się z poniższym samouczkiem. Aby zainstalować bibliotekę Scapy dla Pythona, kliknij następujący przycisk:

POBIERZ BIBLIOTEKĘ SCAPY

Wiedząc, czym jest skanowanie SYNSkanowanie SYN to technika skanowania znana również jako skanowanie otwarte, która jest używana przez hakerów do określania stanu portów bez nawiązywania pełnego połączenia. Możliwe jest również wykorzystanie tej techniki do przeprowadzania ataków DDOS (ataki typu „odmowa usługi”).

NotatkaMa na celu nauczenie, jak działa ten typ programu i że możesz testować swoje porty, ale nie używać go złośliwie.

Zacznijmy od skanera portów.

Krok 1
Pierwszą rzeczą, którą robimy, jest zaimportowanie potrzebnych nam bibliotek.

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) z scapy.all import *
Importujemy scapy do naszego programu, a także zaimportowałem logowanie, aby nie wyświetlało nam irytującego ostrzeżenia, jeśli nie mamy adresu IPv6.

Krok 2
Krok, który służy do uruchomienia naszych zmiennych.

 conf.verb = 0 portlist = lista (zakres (20 130)) host = "192.168.0.1"
Pierwsza instrukcja tego kroku tworzy małą konfigurację, aby nie wyświetlała nam informacji Scapy na ekranie. Poniżej dodajemy tylko porty i host, na którym wykonamy akcję, lepszą opcją byłoby dodanie go jako parametrów podczas wykonywania programu (jeśli jesteś zainteresowany dodaniem go do swojego programu, zapoznaj się z tym linkiem) , aby ułatwić program i skrócić go tutaj, jest to przydatne.

Krok 3
Ten krok jest sednem programu.

 print ("Scanning IP ports:", host) for port in portList: sourceport = RandShort() package = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "Y") response = sr1 ( package, timeout = 2) if ("NoneType" in str (type (response))): pass elif (response.haslayer (TCP) i response.getlayer (TCP). flags == 0x12): p = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "R") rst = sr (p, timeout = 1) try: service = socket.getservbyport (port) z wyjątkiem: service = "?" drukuj ("[OPEN]", port, "->", usługa)
Ta część jest gdzie Rozpoczyna się skanowanie portów, pokazujemy komunikat, abyśmy wiedzieli, że działa, i przez bo przechodzimy przez każdy port. Korzystamy z funkcji RandKrótki () aby wysyłany pakiet za każdym razem pochodził z innego portu.

Konstrukcja pakietu odbywa się za pomocą drugiej instrukcji znajdującej się w for. Konfigurujemy dane, które nas interesują, IP docelowe dla warstwy IP, porty źródłowy i docelowy oraz flagi dla TCP, w tym przypadku jest to skaner SYN, więc jest S, zmieniając ten parametr można zrobić inny typ skanera, jak skanowanie FIN lub skanowanie okna (ale zauważ, że będziesz musiał zmienić poniższe warunki).

Funkcja sr1 odpowiada za wysłanie paczki. Musimy go przekazać jako argument tworzonego pakietu (tym razem jest on tworzony bezpośrednio tutaj), a w tym przypadku ustawiłem maksymalny czas oczekiwania na 2 sekundy, możesz to zmienić, tylko jeśli tego nie wskażesz, twój program może stać się nieskończona. Wynik wysłania pakietu jest zapisywany w zmiennej odpowiedzi.

W warunkach interesuje nas, czy mamy odpowiedź i czy ma włączone flagi SYN i ACK (dlatego używamy 0x12), jeśli nie używamy przed i response.haslayer (TCP), jeśli tak nie mieć warstwy, zostanie zgłoszony wyjątek. Jeśli ten warunek zostanie spełniony, wyślemy wiadomość z aktywną flagą RST, aby zerwać połączenie. Część próbuj złapać możesz go zignorować, wystarczy usunąć usługę, która jest używana w tym porcie, aby wyświetlić więcej informacji na ekranie (funkcja socket.getservbyport (port) jeśli jest to znany port, zwróci informacje, jeśli nie, zrzuci wyjątek, a jeśli tak się stanie, wybrałem umieszczenie ¿? jako „informacja”, jako wskazanie nie wiadomo.)

Cóż, skończyliśmy, na poniższym obrazku możesz zobaczyć wynik wykonania skanera:

Poniżej zamieszczam kompletny kod:

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) # Nie pokazuj ostrzeżenia ze scapy.all import * conf.verb = 0 # Nie pokazuj danych na ekranie listPorts = lista (zakres ( 20 130)) ) #Lista portów do skanowania host = "192.168.0.1" # Tutaj adres IP, który chcesz przeskanować, wydrukuj ("Scanning IP ports:", host) dla portu w PortList: sourcePort = RandShort () pakiet = IP ( dst = host) / TCP (sport = sourceport, dport = port, flags = "S") response = sr1 (pakiet, timeout = 2) if ("NoneType" in str (typ (odpowiedź))): pass elif (odpowiedź) .haslayer (TCP) i response.getlayer (TCP) .flags == 0x12): p = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "R") rst = sr (p, timeout = 1) try: service = socket.getservbyport (port) z wyjątkiem: service = "?" drukuj ("[OPEN]", port, "->", usługa) 
[kolor = rgb (169,169,169)] Pełny kod [/ kolor]

NotatkaTen skaner może być powolny w sprawdzaniu wielu portów, w takich przypadkach dobrym pomysłem jest użycie „wielowątkowości” lub „wieloprocesowego”. Możesz także skanować na inne sposoby, używając nmap w Pythonie lub używając surowych gniazd.

A jeśli chcesz pobrać kod, dołączam zip:

Kod SynScan.zip 644 bajty 254 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