Python安全工具编写-pcap流量包重放

最近因为log4j漏洞,工作量急剧增加,卑微小乙没日没夜地进行应急处理,为了能测试是否能检测到log4j攻击,我专门写了一个脚本,当然这个脚本也不只是检测log4j,只要是pcap包放在指定目录下则可以重放。

我写脚本的时候总喜欢先确认功能点,毕竟这是我们写代码的前提了。
功能点:将指定目录中所有pcap文件全部找出重放
1,找到指定目录(pcaps)中所有pcap文件

def find_pcap(dir,filelist):
	for i in os.listdir(dir):#将目录下所有内容拉出来判断
		path = os.path.join(dir,i)#拼接单个内容和路径
		if os.path.isfile(path):#判断path是否是文件
			if os.path.splitext(path)[1] == '.pcap':#判断是否是pcap文件
				filelist.append(path)#将pcap文件添加到filelist表中
		elif os.path.isdir(path):#判断是否是目录
			newdir = path#拼接成新的目录路径
			find_pcap(newdir,filelist)#递归再次寻找pcap文件
    return filelist#返回最终获取到的pcap表

2,将pcap文件全部重放

#这里直接调用了系统自带的tcpreplay工具
def run_pcap(pcap,net_card):
	tmp_pcap = os.path.splitext(os.path.basename(pcap))[0]#提取出文件名
	print("[+] 正在重放%s" % tmp_pcap)#提示正在重放文件名
	os.system('tcpreplay -i %s -x 3.0 -K %s ' % (net_card,pcap))#拼接命令net_card是网卡,pcap是文件

主要功能点已经写出来了,那么剩下的就是一些优化代码:
1,加入重放日志,以便排查
2,利用多线程的方式,可以同时重放pcap包
3,判断目录是否存在pcap文件
4,将输出的字体以颜色来显示高亮
5,指定重放pcaps目录中的某个或多个目录中的pcap

代码

import sys
import os
import os.path
import threading
#导入sys(获取输入的值),os(运行系统命令).os.path(运行系统文件操作),threading(多线程)模块

def find_pcap(dir,filelist):
	for i in os.listdir(dir):#将目录下所有内容拉出来判断
		path = os.path.join(dir,i)#拼接单个内容和路径
		if os.path.isfile(path):#判断path是否是文件
			if os.path.splitext(path)[1] == '.pcap':#判断是否是pcap文件
				filelist.append(path)#将pcap文件添加到filelist表中
		elif os.path.isdir(path):#判断是否是目录
			newdir = path#拼接成新的目录路径
			find_pcap(newdir,filelist)#递归再次寻找pcap文件
    return filelist#返回最终获取到的pcap表

def run_pcap(pcap,net_card):
	tmp_pcap = os.path.splitext(os.path.basename(pcap))[0]#提取出文件名
	print("\033[1;32;40m[+] 正在重放%s\033[0m" % tmp_pcap)#提示正在重放文件名
	os.system('touch %s%s.log' % (log_dir,tmp_pcap))#创建log文件
	file_log = log_dir + tmp_pcap#拼接log路径
	os.system('tcpreplay -i %s -x 3.0 -K %s > %s.log 2>&1' % (net_card,pcap,file_log))#拼接命令net_card是网卡,pcap是文件

def main():
	global current_dir,file_dir,log_dir,filelist#将目录以及pcap列表都设置为全局变量
	current_dir = os.getcwd()#获取当前目录
	file_dir = os.path.join(current_dir,'pcaps/')#获取pcaps目录
	log_dir = os.path.join(os.getcwd(),'log/')#获取日志目录
	
	filelist = []#初始化pcap表
	choice_file = []#初始化选择pcap表
if len(sys.argv) >= 2:#判断用户是否输入目录名称
	for i in range(1,len(sys.argv)):#将输入的目录依次执行以下操作
		path = sys.argv[i]#获取目录名称
		choice_file_dir = os.path.join(file_dir,path)#拼接目录
		try:
			choice_file = _read_dir_pcap(choice_file_dir, filelist)#尝试获取指定目录下的pcap文件
		except:
			print("\033[1;31;40m[-] 运行失败,请检查是否将目录放在pcaps目录中!\033[0m")#如果出现报错,则检查是否是输入有问题或目录是否不存在
			exit()#退出程序
	else:
		print("\033[1;34m[*] 未选择目录,默认重放pcaps目录下所有pcap包\033[0m")#如果没有输入指令,则将pcaps目录下所有pcap文件重放
		choice_file = _read_dir_pcap(file_dir,filelist)#获取所有pcap文件
		if len(filelist) == 0:#如果pcaps中没有pcap文件则退出程序
			print("\033[1;31;40m[-] 运行失败,请检查是否将文件或目录放在pcaps目录中!\033[0m")
			exit()
		
		else:
			if len(choice_file) == 0:
				print("\033[1;31;40m[-] 运行失败,请确认目录是否有pcap文件!\033[0m")
				#如果选择目录中没有pcap文件,则退出程序
				exit()
			
		net_card = input("请输入重放数据包的网卡名称:")#输入从哪个网卡发送流量包
		#设置多线程重放
		for i in choice_file:
			t = threading.Thread(target=pcap_poc, args=(i,log_dir,net_card))
			t.setDaemon(True)
			t.start()
		
		print("\033[1;34m[*]如有pcap未重放,可以在log/xxx.log查看重放信息\033[0m")

if __name__ == "__main__":
	main()

所需目录
Python安全工具编写-pcap流量包重放

实验截图

未指定目录
Python安全工具编写-pcap流量包重放

指定目录
Python安全工具编写-pcap流量包重放
查看log文件
Python安全工具编写-pcap流量包重放

上一篇:webpack学习---优化--js懒加载/预加载


下一篇:[CSP-S2020] 函数调用 题解