【web安全评估|分享一个批量处理防火墙规则的脚本】最近比较忙,大概半个月前,有一名粉丝私信我说,他们的客户给了她一份长达数万条的防火墙log日志,里面记载了防火墙的规则、源ip、目的ip、防火墙行为、协议等信息,并要求她将这个log文件形成Excel表格,按照规则名字、规则下的行为、源ip、目的ip、协议给写出来,要是手动处理的话,不但容易出现披露,而且确实是一件很累人的事儿。
?说实话,那天我也挺忙的,但是出于LSP本能粉丝的事儿就是我的事儿的原则,我还是挑战了一下自己的软肋,因为我写的都是一些不算难的漏洞检测脚本,像这种纯功能性的东西我没写过。
首先看一下事件经过
文章图片
文章图片
也不知道我写出来她会不会打我,啊哈哈哈,log里面的内容大致是这个格式
文章图片
可以很清晰的看出来,是有一定的规律性的,第一列基本就是策略名字,起的很是随意哈,然后就是address 信息、防火墙的动作和对应的协议类型了
理想化输出的表格应该是介个样子的
文章图片
一开始的想法就是,先将这些日志读取,然后把我需要用的东西提取到另一个文件里方便我去做list,或者是数组,结果我万万没想到啊,他的策略名称真的就很随意,而且上千条策略名称,我还是年轻了,因为我一开始居然真的想通过手写来去掉重复的策略名称,只保留唯一的,但是几千条我咋写???giao,给大家看一下我设想的第一步,拿到我想要的数据
import os
import xlwta = os.getcwd() #获取当前目录
os.chdir('E:/PyCharm 2020.1/new') #定位到新的目录,请根据你自己文件的位置做相应的修改with open('test.txt','r',encoding = 'utf-8') as fr, open('output.txt','a+',encoding= 'utf-8') as fd:
for text in fr.readlines():
str = (text.split()[8:12])if "source-address" in str :
trust_ip= (str[3])
celue = (str[0])
#print(celue+"\t"+"trust_ip"+"\t"+trust_ip)
fd.write(celue+"\t"+"trust_ip"+"\t"+trust_ip+"\n")
elif "destination-address" in str :
untrust_ip = (str[3])
celue = (str[0])
#print(celue+"\t"+"untrust_ip"+"\t"+untrust_ip)
fd.write(celue+"\t"+"untrust_ip"+"\t"+untrust_ip+"\n")if "application" in text.split() :
xieyi = text.split()[-1:]
#print("协议: " ,xieyi)
fd.write("协议: %s" % (xieyi) + "\n" )
elif "then" in text.split() :
xingwei = text.split()[-1:]
#print("行为:", xingwei)
fd.write("行为: %s" % (xingwei) + "\n")book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('Output', cell_overwrite_ok=True)# 向表中添加数据标题
sheet.write(0, 0, '策略名称')# 其中的'0-行, 0-列'指定表中的单元,
sheet.write(0, 1, 'trust_ip')
sheet.write(0, 2, 'utrust_ip')
sheet.write(0, 3, '协议类型')
sheet.write(0, 4, '行为')
运行的结果就是,会生output.txt文件
文章图片
是吧,完全没的说?,当然了,因为时间紧,任务重,我根本没有去考虑他的优化,能实现我能看懂就行了
然而当我知道后面的东西,我就知道这个方案得pass了,导致我写了四个不同的脚本,全部报废,白写了,错误的案例就不展示了,直接展示最终的结果
import os
import xlwtos.chdir('E:/PyCharm 2020.1/new') #定位到新的目录,请根据你自己文件的位置做相应的修改book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('Output', cell_overwrite_ok=True)# 向表中添加数据标题
sheet.write(0, 0, '策略名称')# 其中的'0-行, 0-列'指定表中的单元,
sheet.write(0, 1, 'trust_ip')
sheet.write(0, 2, 'utrust_ip')
sheet.write(0, 3, '协议类型')
sheet.write(0, 4, '行为')n=1#自循环anquansaomiao-per-trust_ip
withopen('test.txt','r',encoding= 'utf-8') as fd:
for text in fd.readlines():
celue=(text.split()[8:9])#定位策略的名称
#print(text.split()[8:12])#输出[policy anquansaomiao-per match source-address 10.10.2.66/32]
ip_name=(text.split()[10:11])#定位ip来源名称、目的地名称、协议名称
ip = (text.split()[11:12])#定位ip地址、协议名称
then=(text.split()[9:10])#定位方法
if "source-address" in ip_name :
#print(ip)
sheet.write(n, 0, celue)
sheet.write(n,1,ip)
elif "destination-address" in ip_name:
#print(ip)
sheet.write(n, 0, celue)
sheet.write(n,2,ip)
elif "application" in ip_name:
#print(ip)
sheet.write(n, 0, celue)
sheet.write(n, 3, ip)
elif "then" in then:
#print(ip_name)
sheet.write(n, 0, celue)
sheet.write(n,4,ip_name)
n=n+1book.save('Output.xls')
首先先形成一个空的xls表格,在表格里也是有坐标的
文章图片
?如上图所示,以此类推
book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('Output', cell_overwrite_ok=True)
?
# 向表中添加数据标题
sheet.write(0, 0, '策略名称')# 其中的'0-行, 0-列'指定表中的单元,
sheet.write(0, 1, 'trust_ip')
sheet.write(0, 2, 'utrust_ip')
sheet.write(0, 3, '协议类型')
sheet.write(0, 4, '行为')
运行结束后,会生成一个表格,表格的第一行就是我需要的数据标题
文章图片
而后进入我的下一步骤,建立一个完整的循环体,直接读取我想要的三要素,由于他的(trust_ip)source-address?、(utrust_ip)destination-address、协议都是在一个下标,这就导致数据必然会重复,当然了,这里指的是获取的时候会需要我自己去识别,可能会多出几个语句
n=1#自循环anquansaomiao-per-trust_ip
withopen('test.txt','r',encoding= 'utf-8') as fd:
for text in fd.readlines():
celue=(text.split()[8:9])#定位策略的名称
#print(text.split()[8:12])#输出[policy anquansaomiao-per match source-address ]
ip_name=(text.split()[10:11])#定位ip来源名称、目的地名称、协议名称
ip = (text.split()[11:12])#定位ip地址、协议名称
then=(text.split()[9:10])#定位方法
if "source-address" in ip_name :
#print(ip)
sheet.write(n, 0, celue)
sheet.write(n,1,ip)
elif "destination-address" in ip_name:
#print(ip)
sheet.write(n, 0, celue)
sheet.write(n,2,ip)
elif "application" in ip_name:
#print(ip)
sheet.write(n, 0, celue)
sheet.write(n, 3, ip)
elif "then" in then:
#print(ip_name)
sheet.write(n, 0, celue)
sheet.write(n,4,ip_name)
n=n+1
?
?
book.save('Output.xls')
首先需要将log文件移动到E:/PyCharm 2020.1/new目录下,这个目录你可以按照自己的来,只需要将脚本里的地址同步一下就可以,而后重命名为test.txt;
text.split()[8:9]定位下标第八位开始第9为截止,下标从0开始计算,这是一个切片
for循环的目的是,能一行一行的读取test.txt文件,直至把他读完,并且每读一次就会在xls表格插入相应的内容。需要注意的是,Output.xls若是存在会报错,所以用过一次需要将生成的内容重命名或者拿走;
sheet.write(n, 0, celue)将celue插入倒表格中第n行第0列d?
位置
生成效果如下:
文章图片
虽然不是理想状态,但是也算是能看哈?,记录这个东西没别的意思,就是告诉我的广大粉丝朋友们,有什么问题,放心大胆的留言,我看到能解决的会一一答复,毕竟我也不是万能的,你弄个我不会的我也是没招,还有些粉丝朋友在底下骂人的哈,虽然只有那么一个,还是上上上上个月骂得我,但是这个仇我记着呢,天天嘀咕你。最近网安圈风气不太正,希望大家保护好自己,别一时冲动给人当枪使
目前已解决部分粉丝的要求,例如有些粉丝朋友私信我要基线,我也都一一回复并分享了,还有一些报告模板,一些不太难的渗透测试相关的问题,漏洞的复现脚本,复现过程之类的,大家有什么问题和对这个公众号的建议可以在公众号留言哈,留言功能开不起来是因为留言功能在2015年后注册的公众号都取消了这个功能,所以很遗憾没有办法让大家及时互动,另现在我们也有一个小网安圈子,大家若是想进来探讨的可以私信我,我拉大家进群,平时互相吹捧相互进步啥的
最后还是那句话,本人一直以来以公益性分享为主,不会在任何平台向大家索要任何东西,谨防诈骗哦?
推荐阅读
- 安全|一份人人都能看懂的 Authing 介绍
- java|SpringBoot从入门到入门学习笔记
- 性能测试|主流性能测试工具
- 服务器部署|服务器部署(保姆级教程)
- Java基础与算法|Linux学习(二)---实操篇1远程登录
- Linux|Linux【实操篇】—— 远程登录、远程文件传输、vi和vim工具的使用方法
- 写给小白的保姆级教程|保姆级教程从零搭建云服务器(小彩蛋,请大家看烟花秀)
- 网络安全|【Kali】中密码暴力破解工具hydra的使用
- 信息安全|[0CTF 2016]piapiapia 1