PortDog端口扫描异常检测工具源码简析
PortDog端口扫描异常检测工具源码简析
总览首先获取要捕获的网卡的流量(其实这个不太好,因为我们要检测的网卡不一定排在第一啊,这个可以根据自己的实际情况修改)代码语言:javascript代码运行次数:0运行复制LAip = commands.getoutput("/sbin/ifconfig").split("\n")[1].split()[1][5
PortDog端口扫描异常检测工具源码简析
总览
首先获取要捕获的网卡的流量(其实这个不太好,因为我们要检测的网卡不一定排在第一啊,这个可以根据自己的实际情况修改)
代码语言:javascript代码运行次数:0运行复制LAip = commands.getoutput("/sbin/ifconfig").split("\n")[1].split()[1][5:]
作者捕获用的是socket,因为是AF_PACKET在windows用不了,所以这种方式就只能在linux用了
代码语言:javascript代码运行次数:0运行复制s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , (0x000))
packet = s.recvfrom(65565)
packet = packet[0]
捕获数据后接下来就是去解析ip,tcp协议的一些字段
下一步就是检测是不是三次握手的包,是次握手才会将信息插入到threewayhandshake数组
代码语言:javascript代码运行次数:0运行复制testdata = s_addr+":"+str(source_port)+"->"+d_addr+":"+str(dest_port)
if(testdata not in threewayhandshake):
threewaycheck(s_addr,d_addr,source_port,dest_port,seq_numb,dest_numb,tcp_flags)
接下来核心的就是scancheck函数
代码语言:javascript代码运行次数:0运行复制scancheck(s_addr,d_addr,source_port,dest_port,seq_numb,dest_numb,tcp_flags)
具体实现如下:
代码语言:javascript代码运行次数:0运行复制def scancheck(sip,dip,sport,dport,seqnum,acknum,flags):
global data,dataforthreewaycheck,dbdata,reverse
data = sip+":"+str(sport)+"->"+dip+":"+str(dport)+"_"+str(seqnum)+"_"+str(acknum)+"_"+"/".join(flags)
dataforthreewaycheck = sip+":"+str(sport)+"->"+dip+":"+str(dport)
revthreeway = dip+":"+str(dport)+"->"+sip+":"+str(sport)
dbdata = sip+"->"+dip
reverse = dip+"->"+sip
if(halfconnectscan(sip,dip,sport,dport,seqnum,acknum,flags)):
returned = halfconnectscan(sip,dip,sport,dport,seqnum,acknum,flags)
if(isinstance(returned,(str))):
print returned
else:
print bgcolors.BOLD+bgcolors.OKBLUE+revthreeway+bgcolors.EDC+bgcolors.WARIG+bgcolors.BOLD+" Port Scanning Detected: [Style not Defined]:Attempt to connect closed port!"+bgcolors.EDC
elif(fullconnectscan(sip,dip,sport,dport,seqnum,acknum,flags)):
returned = fullconnectscan(sip,dip,sport,dport,seqnum,acknum,flags)
if(isinstance(returned,(str))):
print returned
else:
print bgcolors.BOLD+bgcolors.OKBLUE+revthreeway+bgcolors.EDC+bgcolors.WARIG+bgcolors.BOLD+" Port Scanning Detected: [Style not Defined]:Attempt to connect closed port!"+bgcolors.EDC
elif(xmasscan(sip,dip,sport,dport,seqnum,acknum,flags)):
print bgcolors.BOLD+bgcolors.OKBLUE+dataforthreewaycheck+bgcolors.EDC +bgcolors.BOLD+bgcolors.FAIL+ " => [Runtime Detection:] XMAS scan detected!"+bgcolors.EDC
elif(finscan(sip,dip,sport,dport,seqnum,acknum,flags)):
print bgcolors.BOLD+bgcolors.OKBLUE+ dataforthreewaycheck+bgcolors.EDC+ bgcolors.BOLD+bgcolors.FAIL+" => [Runtime Detection:] FI scan detected!"+bgcolors.EDC
elif(nullscan(sip,dip,sport,dport,seqnum,acknum,flags)):
print bgcolors.BOLD+bgcolors.OKBLUE+dataforthreewaycheck +bgcolors.EDC+bgcolors.BOLD+bgcolors.FAIL+ " => [Runtime Detection:] ULL scan detected!"+bgcolors.EDC
那么其实就是依次判断每种端口扫描技术
对于每种扫描,通用的就是将扫描的目标端口记录下来
代码语言:javascript代码运行次数:0运行复制if(scannedports.has_key(dip)):
scannedports[dip].append(str(sport))
else:
scannedports[dip] = []
scannedports[dip].append(str(sport))
下面依次看每种扫描技术判断,只要发现了,就加到黑名单
halfconnectscan(半连接扫描)
就是发SY包,之后发了个含RST,ACK的包,那就是半连接扫描了
代码语言:javascript代码运行次数:0运行复制if("SY" in flags and seqnum>0 and acknum==0 and len(flags)==1):
halfscandb[dbdata+"_"+str(seqnum)] = dbdata+"_SY_ACK_"+str(seqnum)+"_"+str(acknum)
elif("RST" in flags and "ACK" in flags and len(flags)==2):
if(halfscandb.has_key(reverse+"_"+str(acknum-1))):
del halfscandb[reverse+"_"+str(acknum-1)]
if(str(dip) not in blacklist):
blacklist.append(str(dip))
return True
elif("SY" in flags and "ACK" in flags and len(flags)==2):
if(halfscandb.has_key(reverse+"_"+str(acknum-1))):
del halfscandb[reverse+"_"+str(acknum-1)]
halfscandb[reverse+"_"+str(acknum)] = dbdata+"_RST_"+str(seqnum)+"_"+str(acknum)
elif("RST" in flags and len(flags)==1):
if(halfscandb.has_key(dbdata+"_"+str(seqnum))):
if(str(dip) not in blacklist):
blacklist.append(str(dip))
return bgcolors.BOLD+bgcolors.OKBLUE+sip+":"+str(sport)+"->"+dip+":"+str(dport) +bgcolors.EDC+ bgcolors.BOLD+bgcolors.FAIL+" => [Runtime Detection:] Half connect(SY scan) scan detected!"+bgcolors.EDC
return False
fullconnectscan
这个分了两种
第一种:有三次握手,但是之后就发了ACK RST
代码语言:javascript代码运行次数:0运行复制if(dataforthreewaycheck in threewayhandshake):
if("ACK" in flags and "RST" in flags and len(flags)==2):
if(fullscandb.has_key(dbdata)):
counter = int(fullscandb[dbdata])
if(counter>=):
if(str(dip) not in blacklist):
blacklist.append(str(dip))
return bgcolors.BOLD+bgcolors.OKBLUE+ dip+":"+str(dport)+"->"+sip+":"+str(sport)+bgcolors.EDC+ bgcolors.BOLD+bgcolors.FAIL+" => [Runtime Detection:] Full connect scan detected!"+bgcolors.EDC
else:
counter = counter + 1
fullscandb[dbdata] = str(counter)
else:
counter = 0
fullscandb[dbdata] = str(counter)
第二种情况
这是连续次在SY后发了”RST” and “ACK”,这个我感觉还是半连接的感觉啊
代码语言:javascript代码运行次数:0运行复制else:
if("SY" in flags and len(flags)==1):
if(seqnum>0 and acknum==0):
fullscandb[dbdata+"_SY"] = str(seqnum)+"_"+str(acknum)+"_"+str(sport)+"_"+str(dport)
elif("RST" in flags and "ACK" in flags and len(flags)==2):
if(fullscandb.has_key(dip+"->"+sip+"_SY")):
manage = fullscandb[dip+"->"+sip+"_SY"]
pieces = manage.split("_")
old_acknum = int(pieces[1])
old_seqnum = int(pieces[0])
if(seqnum==0 and acknum==old_seqnum+1):
if(fullscandb.has_key(dbdata)):
counter = int(fullscandb[dbdata])
if(counter>=):
if(str(dip) not in blacklist):
blacklist.append(str(dip))
return True
else:
counter = counter + 1
fullscandb[dbdata] = str(counter)
else:
counter = 0
fullscandb[dbdata] = str(counter)
xmasscan
只含下面个flag的
“FI” ,”URG” , “PSH”
finscan
这个没三次握手的前提下就只有一个FI
代码语言:javascript代码运行次数:0运行复制if(dataforthreewaycheck not in threewayhandshake):
if("FI" in flags and len(flags)==1):
nullscan
没有一个flag置位
代码语言:javascript代码运行次数:0运行复制if(len(flags)==0):
ackscan
只有ack
代码语言:javascript代码运行次数:0运行复制if("ACK" in flags and len(flags)==1):
reference
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2018-0-11,如有侵权请联系 cloudcommunity@tencent 删除flags连接异常源码检测工具#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-24 14:14:30
推荐阅读
留言与评论(共有 12 条评论) |
本站网友 射频除皱医院 | 21分钟前 发表 |
dip | |
本站网友 青海房产 | 7分钟前 发表 |
dip | |
本站网友 云帆搜索 | 2分钟前 发表 |
"+str(dest_port) if(testdata not in threewayhandshake) | |
本站网友 个人体检结果查询 | 27分钟前 发表 |
(str))) | |
本站网友 生态养殖 | 18分钟前 发表 |
dport | |
本站网友 海贼王web | 13分钟前 发表 |
flags)) | |
本站网友 沙发图 | 22分钟前 发表 |
reverse data = sip+" | |
本站网友 找性伴 | 13分钟前 发表 |
flags)) | |
本站网友 东风本田xrv | 9分钟前 发表 |
(0x000)) packet = s.recvfrom(65565) packet = packet[0]捕获数据后接下来就是去解析ip | |
本站网友 51buy | 24分钟前 发表 |
(str))) | |
本站网友 graves病 | 2分钟前 发表 |
“PSH”finscan这个没三次握手的前提下就只有一个FI代码语言:javascript代码运行次数:0运行复制if(dataforthreewaycheck not in threewayhandshake) |