Skapa en SYN -skanning med Python och Scapy

Innehållsförteckning

I den här handledningen ska jag lära dig utföra en TCP SYN -skanningsport, för detta kommer jag att använda Pytonorm med bokhandeln Scapy.

För att installera Python kan du se följande handledning. Och för att installera Scapy -biblioteket för Python, klicka på följande knapp:

LADDA NER SCAPY BIBLIOTEK

Att veta vad en SYN -skanning ärSYN-skanning är en skanningsteknik, även känd som öppen skanning, som används av hackare för att bestämma status för portar utan att upprätta en fullständig anslutning. Det är också möjligt att använda denna teknik för att utföra DDOS -attacker (denial of service -attacker).

NoteraDet syftar till att lära ut hur den här typen av program fungerar och att du kan testa dina portar, men inte att använda det skadligt.

Låt oss börja med portskannern.

Steg 1
Det första vi gör är att importera de bibliotek vi behöver.

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) från scapy.all import *
Vi importerar scapy till vårt program, och jag har också importerat loggning för att det inte ska visa en irriterande varning om vi inte har en IPv6 -adress.

Steg 2
Ett steg som tjänar till att starta våra variabler.

 conf.verb = 0 portlist = list (intervall (20,130)) host = "192.168.0.1"
Den första instruktionen i detta steg gör en liten konfiguration så att den inte visar oss Scapy -informationen på skärmen. Följande lägger vi bara till portarna och värden, där vi kommer att utföra åtgärden, skulle det vara ett bättre alternativ att lägga till det som parametrar när programmet körs, (om du är intresserad av att lägga till det för ditt program, se den här länken) , för att underlätta programmet och göra det kortare här är praktiskt.

Steg 3
Detta steg är programmets kärna.

 print ("Skanna IP -portar:", värd) för port i portList: sourceport = RandShort () packet = IP (dst = host) / TCP (sport = sourceport, dport = port, flaggor = "Y") svar = sr1 ( paket, timeout = 2) if ("NoneType" i str (type (response))): pass elif (response.haslayer (TCP) och response.getlayer (TCP). flags == 0x12): p = IP (dst = host) / TCP (sport = sourceport, dport = port, flaggor = "R") rst = sr (p, timeout = 1) försök: service = socket.getservbyport (port) utom: service = "?" print ("[OPEN]", port, "->", service)
Denna del är var portskanning startar, vi visar ett meddelande så att vi vet att det fungerar, och för vi går igenom varje hamn. Vi använder funktionen RandShort () så att paketet som skickas kommer från en annan port varje gång.

Konstruktionen av paketet görs med den andra instruktionen som finns i för. Vi konfigurerar data som intresserar oss, destinations -IP för IP -lagret, käll- och destinationsportarna och flaggorna för TCP, i det här fallet är det en SYN -skanner, så det finns S, genom att ändra denna parameter kan du göra en annan typ av skannern, som en FIN -skanning eller en fönsterskanning (men observera att du måste ändra villkoren nedan).

Funktionen sr1 står för att skicka paketet. Vi måste skicka det som ett argument paketet skapat (den här gången skapas det direkt här), och i det här fallet har jag satt en maximal väntetid på 2 sekunder, du kan ändra det, bara om du inte anger det, ditt program kan bli oändligt. Resultatet av att paketet skickas sparas i svarsvariabeln.

Under förutsättningarna är vi intresserade av att veta om vi har ett svar och om det har SYN- och ACK -flaggorna aktiverade (det är därför vi använder 0x12), om vi inte använder det före och response.haslayer (TCP), om det gör det inte har lagret ett undantag kommer att kastas. Om detta villkor är uppfyllt skickar vi ett meddelande med RST -flaggan aktiv för att bryta anslutningen. Delen av försök fånga du kan ignorera det, allt det gör är att ta bort tjänsten som används i den porten för att visa mer information på skärmen (funktionen socket.getservbyport (port) om det är en känd port kommer det att returnera information, om inte det kommer att kasta ett undantag och om detta händer har jag valt att sätta ¿? som "information", som en indikation på att det inte är känt.)

Tja, vi är klara, i följande bild kan du se resultatet av skannerkörningen:

Nedan lägger jag hela koden:

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) # Visa inte varning från scapy.all import * conf.verb = 0 # Visa inte data på skärmen listPorts = list (intervall ( 20,130)) # Listan över portar för att skanna värd = "192.168.0.1" # Här skrivs ut den IP -adress du vill skanna ("Skanna IP -portar:", värd) för port i PortList: sourcePort = RandShort () packet = IP ( dst = värd) / TCP (sport = sourceport, dport = port, flagg = "S") svar = sr1 (paket, timeout = 2) if ("NoneType" i str (typ (svar))): pass elif (svar .haslayer (TCP) och response.getlayer (TCP) .flags == 0x12): p = IP (dst = host) / TCP (sport = sourceport, dport = port, flaggor = "R") rst = sr (p, timeout = 1) försök: service = socket.getservbyport (port) utom: service = "?" print ("[OPEN]", port, "->", service) 
[color = rgb (169 169 169)] Full kod [/ color]

NoteraDenna skanner kan vara långsam för att kontrollera många portar, i sådana fall är det en bra idé att använda "mulltithreading" eller "multiprocessing". Du kan också skanna på andra sätt med hjälp av nmap i Python eller med råa uttag.

Och om du vill ladda ner koden bifogar jag en zip:

Koda SynScan.zip 644 byte 254 Nedladdningar

Gillade du och hjälpte denna handledning?Du kan belöna författaren genom att trycka på den här knappen för att ge honom en positiv poäng
wave wave wave wave wave