工作中经常会碰到设备大量告警,收到成百上千的取证包,面对如此众多的数据包,如何确认这些取证包是不是正确告警的结果呢?只能打开数据包分析看有没有相关攻击特征。由此,可以使用snort进行检测,但是如果经常出门在外,还要继续搭建snort环境吗?这就需要一种便捷化的工具,能根据我提供的特征去海量数据包中匹配,所以,我用python写了这么一款工具,并打包成exe即可出门干活了。代码不大规范,见谅。
你只需要提供存放数据包的文件夹和要检查的关键字即可。
数据包总计:13 成功:13 失败:0
下面的代码只能实现检查1个数据包,接下来要做的就是让它可以检查更多数据包,并给出一些结果。
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) # 清除报错
from scapy.all import *
import re
def pcap_parser(filename, keyword):
pkts = rdpcap(filename)
for pkt in pkts.res:
try: # decode编码实体内容的时候容易出错,使用异常处理
pkt_load = pkt.getlayer('Raw').fields['load'].decode().strip() # 提取负载内容,即wireshatk追踪流看到的东西
re_keyword = keyword
if re.search(re_keyword, pkt_load):
print("ok")
break
except:
pass
if __name__ == "__main__":
pcap_parser(r"D:\我的文档\抓包\XSS挑战pcap格式\xss13.pcap", r'alert')
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) # 清除报错
from scapy.all import *
import re
def pcap_parser(filename, keyword):
pkts = rdpcap(filename)
for pkt in pkts.res:
try: # decode编码实体内容的时候容易出错,使用异常处理
pkt_load = pkt.getlayer('Raw').fields['load'].decode().strip() # 提取负载内容,即wireshatk追踪流看到的东西
re_keyword = keyword # 使用正则过滤出数据
if re.search(re_keyword, pkt_load):
successful_file_only_name.append(os.path.basename(filename))
else:
lost_file_only_name.append(os.path.basename(filename))
except:
pass
# 打印结果
def give_result():
desktop_path = os.path.join(os.path.expanduser("~"), 'Desktop') # 获取桌面路径
if len(successful_file_only_name) > 0:
path1 = os.path.join(desktop_path, '成功的数据包.txt')
# 下面的代码用来把终端中的内容输出到一个文本中
aa = open(path1, 'w', encoding='utf8')
for r in successful_file_only_name:
aa.write(r)
aa.write('\n')
aa.close()
if len(lost_file_only_name) > 0:
path2 = os.path.join(desktop_path, '失败的数据包.txt')
# 下面的代码用来把终端中的内容输出到一个文本中
bb = open(path2, 'w', encoding='utf8')
for r in lost_file_only_name:
bb.write(r)
bb.write('\n')
bb.close()
if __name__ == "__main__":
print('''脚本功能:用来从海量数据包中筛选出包含指定关键字的数据包''')
files_path = input(r"1. 请输入存放数据包的文件夹,或按回车键选择脚本所在路径:")
if len(files_path):
pass
else:
files_path = os.getcwd()
word = input(r"2. 请输入检索的关键字:")
# files_path = r"D:\我的文档\抓包\pikachu\XSS\新建文件夹"
# word = r'script%3Ealert'
successful_file_only_name = [] # 存储符合条件的数据包的名字
lost_file_only_name = [] # 存储不符合条件的数据包的名字
for current_folder, list_folders, files in os.walk(files_path):
for f in files: # 用来遍历所有的文件,只取文件名,不取路径名
if f.endswith('pcap') or f.endswith('pcapng'): # 操作数据包
file_path = current_folder + '\\' + f # 获取数据包的绝对路径
pcap_parser(file_path, word)
# 由于一个数据包存在多个负载,所以列表存在多个重复的数据,需要去重
successful_file_only_name = list(set(successful_file_only_name))
lost_file_only_name = list(set(lost_file_only_name))
successful_file_only_name.sort()
lost_file_only_name.sort()
# 有的数据包,可能一部分负载匹配成功,进入了成功的列表,一部分匹配失败,进入了失败的列表,现在处理这种异常结果
'''
下面的单层for循环不能完全处理异常,使用双层for循环处理异常现象
for i in lost_file_only_name:
if i in successful_file_only_name:
lost_file_only_name.remove(i)
'''
#
for s in successful_file_only_name:
for l in lost_file_only_name:
if s == l:
lost_file_only_name.remove(l)
give_result()
print('检查结束,请在桌面查看结果')
print(
"数据包总计:{}".format(len(successful_file_only_name) + len(lost_file_only_name)) + '\t' + "成功:{}".format(
len(successful_file_only_name)) + '\t' + '失败:{}'.format(len(lost_file_only_name)))
# os.system('pause') # 在脚本中运行时可以删除此行