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()
所需目录
实验截图
未指定目录
指定目录
查看log文件
标签:包重,log,Python,os,path,pcap,目录,dir 来源: https://blog.csdn.net/beirry/article/details/121955551