0

我正在学习用 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')


4

0 回答 0