您现在的位置是:首页 > 编程 > 

PortDog端口扫描异常检测工具源码简析

2025-07-28 22:01:02
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组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1207569.html

相关标签:无
上传时间: 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)