Създайте SYN сканиране с Python и Scapy

Съдържание

В този урок ще ви науча изпълнете TCP SYN портове за сканиране, за това ще използвам Python с книжарницата Скапи.

За да инсталирате Python, можете да видите следния урок. И за да инсталирате библиотеката Scapy за Python, щракнете върху следния бутон:

ИЗТЕГЛЕТЕ БИБЛИОТЕКА ЗА СКЕПИ

Знаейки какво е SYN сканиранеSYN сканирането е техника за сканиране, известна още като сканиране с отворен край, която се използва от хакери за определяне на състоянието на портовете, без да се установява пълна връзка. Възможно е също да се използва тази техника за извършване на DDOS атаки (атаки за отказ на услуга).

ЗабележкаТя има за цел да научи как работи този тип програма и да можете да тествате своите портове, но не и да я използвате злонамерено.

Нека започнем със скенера за портове.

Етап 1
Първото нещо, което правим, е да импортираме необходимите ни библиотеки.

 импортиране на регистриране logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) от scapy.all импортиране *
Импортираме scapy в нашата програма, а също така импортирах регистрация, за да не ни показва досадно предупреждение, ако нямаме IPv6 адрес.

Стъпка 2
Стъпка, която служи за стартиране на нашите променливи.

 conf.verb = 0 portlist = list (range (20,130)) host = "192.168.0.1"
Първата инструкция на тази стъпка прави малка конфигурация, така че да не ни показва Scapy информацията на екрана. По -долу добавяме само портовете и хоста, където ще изпълним действието, би било по -добър вариант да го добавим като параметри при изпълнение на програмата, (ако се интересувате от добавянето към вашата програма, вижте тази връзка) , за да улесните програмата и да я съкратите е удобно.

Стъпка 3
Тази стъпка е ядрото на програмата.

 print ("Сканиране на IP портове:", хост) за порт в portList: sourceport = RandShort () пакет = IP (dst = хост) / TCP (спорт = източник, dport = порт, флагове = "Y") отговор = sr1 ( пакет, таймаут = 2) if ("NoneType" в str (тип (отговор))): преминаване elif (response.haslayer (TCP) и 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) с изключение на: service = "?" печат ("[ОТВОРЕНО"), порт, "->", услуга)
Тази част е къде стартира сканирането на портове, показваме съобщение, за да знаем, че работи, и през for минаваме през всяко пристанище. Използваме функцията RandShort () така че изпратеният пакет да произхожда от различен порт всеки път.

Конструирането на пакета се извършва с втората инструкция, намираща се в for. Конфигурираме данните, които ни интересуват, целевия IP за IP слоя, източника и целевите портове и флаговете за TCP, в този случай това е SYN скенер, така че има S, като промените този параметър, можете да направите друг тип на скенер, като например FIN сканиране или сканиране на прозорец (но имайте предвид, че ще трябва да промените условията по -долу).

Функцията sr1 отговаря за изпращането на пакета. Трябва да го предадем като аргумент на създадения пакет (този път той е създаден директно тук) и в този случай съм задал максимално изчакване от 2 секунди, можете да го промените, само ако не го посочите, вашата програма може да стане безкраен. Резултатът от изпращането на пакета се записва в променливата на отговора.

В условията, които се интересуваме да знаем дали имаме отговор и дали са активирани флаговете SYN и ACK (затова използваме 0x12), ако не използваме преди and response.haslayer (TCP), ако има няма слоя, ще бъде хвърлено изключение. Ако това условие е изпълнено, ще изпратим съобщение с активен RST флаг, за да прекъснем връзката. Частта от опитай да хванеш можете да го игнорирате, всичко, което прави, е да премахне услугата, която се използва в този порт, за да покаже повече информация на екрана (функцията socket.getservbyport (порт) ако това е известен порт, той ще върне информация, ако не, ще хвърли изключение и ако това се случи, избрах да поставя ¿? като "информация", като индикация за неизвестна.)

Е, приключихме, на следното изображение можете да видите резултата от изпълнението на скенера:

По -долу поставям пълния код:

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) # Не показвайте предупреждение от scapy.all import * conf.verb = 0 # Не показвайте данни на екрана listPorts = list (range (range ( 20,130)) # Списъкът с портове за сканиране хост = "192.168.0.1" # Тук IP адресът, който искате да сканирате, отпечатва ("Сканиране на IP портове:", хост) за порт в PortList: sourcePort = RandShort () пакет = IP ( dst = host) / TCP (sport = sourceport, dport = port, flags = "S") response = sr1 (пакет, timeout = 2) if ("NoneType" в str (type (response))): pass elif (response .haslayer (TCP) и response.getlayer (TCP) .flags == 0x12): p = IP (dst = хост) / TCP (спорт = източник, dport = порт, флагове = "R") rst = sr (p, timeout = 1) try: service = socket.getservbyport (port) с изключение на: service = "?" печат ("[ОТВОРЕНО"), порт, "->", услуга) 
[color = rgb (169,169,169)] Пълен код [/ color]

ЗабележкаТози скенер може бавно да проверява много портове, в тези случаи е добра идея да използвате „mulltithreading“ или „multiprocessing“. Можете също да сканирате по други начини, като използвате nmap в Python или използвате необработени сокети.

И ако искате да изтеглите кода, прикачвам цип:

Код SynScan.zip 644 байта 254 изтегляния

Хареса ли ви и помогнахте на този урок?Можете да възнаградите автора, като натиснете този бутон, за да му дадете положителна точка
wave wave wave wave wave