我正在学习用 Python 编写 SYN 扫描器,而且我对 Python 语言还很陌生。我正在使用 Scapy 模块和 sr1 命令来发送数据包,但我已经使用 Python Socket 模块编写了这段代码,我也遇到了同样的问题。
该代码将发送数据包并将数据包标志设置为“S”。如果没有数据包响应,则什么也不做并继续“For”循环并从变量列表“common_ports”中的列表中获取下一个端口号以进行扫描。
如果收到数据包响应,我检查 TCP 标志是否设置为“SA”,如果是,则打印“端口已打开”,然后打开端口存储在“开放端口”列表中。
运行程序时我的问题
会找到第一个打开的端口 80 并显示它,但不会找到任何连续的打开端口。当我通过 Pycharm 调试器运行它时,它工作正常,发现端口 80 和端口 443。
在试图弄清楚这一点后,我添加了一个 time.sleep(7) 语句并且一切正常,但是如果我将这个 7 更改为较低的数字代码没有找到第二个端口号 443。
我的问题是为什么我必须在程序中添加延迟才能使其正常工作?(7 秒延迟过大)。我注意到其他一些网站我可以将延迟减少到 3 并且代码可以工作。
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 13 23:08:11 2020
@author: xyplex
"""
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
import time
host_address = "www.hackthissite.org"
open_ports = []
common_ports = [23, 80, 443]
print('Scanning '+host_address+' for open TCP ports')
start_time = time.time()
for x in common_ports:
packet = IP(dst=host_address)/TCP(dport=x, flags='S')
response = sr1(packet,timeout=0.5,verbose=0)
if response != None:
if TCP in response and response[TCP].flags == 'SA':
print('\nPort '+str(x)+' is open')
open_ports.append(x)
sr1(IP(dst=host_address)/TCP(dport=response.sport,flags='R'),timeout=0.5,verbose=0)
time.sleep(7)
print('\nScan is Complete !!!!!\n')
if open_ports:
print("\n\nOpen Ports Found: -----> ", sorted(open_ports))
else:
print("Sorry, No open ports found.!!!")
print('\nTotal Time to Execute = %s' % (time.time() - start_time) + ' Seconds')