无状态扫描器简单实现
本文参考Python的无状态SYN快速扫描一文:https://www.freebuf.com/sectool/125491.html
参考文章中讲解了原理,并对收发模块分别进行了实现,我们这里使用Python的threading模块将收发包整合。
无状态扫描是向目标主机发送SYN数据包后直接发送RST数据包取消连接,收发异步,收包程序只需要过滤出有SYN+ACK和RST的数据包即可。而此时问题也出现了,在一个活跃的主机中,各个程序一直在收发数据,收包程序过滤出的数据包无法判断究竟是目标主机返回的数据包还是本机其他程序通信的数据包,此时则需要一个校验机制。
由于我们可以自己构造TCP的数据包,所以可以将SEQ序列号填充含有特定验证信息的cookie。
Masscan是将源ip、源端口和目标ip、目标端口以及一个随机值经由散列函数生成cookie,作为TCP的SEQ发送,在接收时,先解析出源、目标的ip地址和端口号,还有flags、SEQ和ACK,用解析出的信息生成cookie。校验顺序为:是否源ip->是否源端口->是否SYN+ACK/RST->cookie是否正确(注意由于TCP,此时要验证的是ACK-1)->是否校验重复。
而ZMap是将对方的ip地址进行hash,将其处理保存到了sender port和seq number两个字段中,当SYN-ACK回来的时候,就可以根据sender ip、receiver port、ack number这些字段进行校验。
这里简单的将校验的序列号设置为0x1111111111,利用python的threading模块将收包与发包整合到同一程序内,发包模块作为主线程,收包模块作为守护线程,与此同时设置超时机制避免空等。
#-*- coding:UTF-8 -*-
from scapy.all import *
from netaddr import *
import threading
import time
import sys
class Dispacher(threading.Thread):
def __init__(self,fun): #初始化线程函数
threading.Thread.__init__(self)