总览
首先获取要捕获的网卡的流量(其实这个不太好,因为我们要检测的网卡不一定排在第一啊,这个可以根据自己的实际情况修改)
1 | LANip = commands.getoutput("/sbin/ifconfig").split("\n")[1].split()[1][5:] |
作者捕获用的是socket,因为是AF_PACKET在windows用不了,所以这种方式就只能在linux用了
1 | s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003)) |
捕获数据后接下来就是去解析ip,tcp协议的一些字段
下一步就是检测是不是三次握手的包,是3次握手才会将信息插入到threewayhandshake数组
1 | testdata = s_addr+":"+str(source_port)+"->"+d_addr+":"+str(dest_port) |
接下来核心的就是scancheck函数
1 | scancheck(s_addr,d_addr,source_port,dest_port,seq_numb,dest_numb,tcp_flags) |
具体实现如下:
1 | def scancheck(sip,dip,sport,dport,seqnum,acknum,flags): |
那么其实就是依次判断每种端口扫描技术
对于每种扫描,通用的就是将扫描的目标端口记录下来
1 | if(scannedports.has_key(dip)): |
下面依次看每种扫描技术判断,只要发现了,就加到黑名单
halfconnectscan(半连接扫描)
就是发SYN包,之后发了个含RST,ACK的包,那就是半连接扫描了
1 | if("SYN" in flags and seqnum>0 and acknum==0 and len(flags)==1): |
fullconnectscan
这个分了两种
第一种:有三次握手,但是之后就发了ACK RST
1 | if(dataforthreewaycheck in threewayhandshake): |
第二种情况
这是连续3次在SYN后发了”RST” and “ACK”,这个我感觉还是半连接的感觉啊
1 | else: |
xmasscan
只含下面3个flag的
“FIN” ,”URG” , “PSH”
finscan
这个没三次握手的前提下就只有一个FIN
1 | if(dataforthreewaycheck not in threewayhandshake): |
nullscan
没有一个flag置位
1 | if(len(flags)==0): |
ackscan
只有ack
1 | if("ACK" in flags and len(flags)==1): |