最近比较忙,大概半个月前,有一名粉丝私信我说,他们的客户给了她一份长达数万条的防火墙log日志,里面记载了防火墙的规则、源ip、目的ip、防火墙行为、协议等信息,并要求她将这个log文件形成Excel表格,按照规则名字、规则下的行为、源ip、目的ip、协议给写出来,要是手动处理的话,不但容易出现披露,而且确实是一件很累人的事儿。
说实话,那天我也挺忙的,但是出于LSP本能粉丝的事儿就是我的事儿的原则,我还是挑战了一下自己的软肋,因为我写的都是一些不算难的漏洞检测脚本,像这种纯功能性的东西我没写过。
也不知道我写出来她会不会打我,啊哈哈哈,log里面的内容大致是这个格式
可以很清晰的看出来,是有一定的规律性的,第一列基本就是策略名字,起的很是随意哈,然后就是address 信息、防火墙的动作和对应的协议类型了
一开始的想法就是,先将这些日志读取,然后把我需要用的东西提取到另一个文件里方便我去做list,或者是数组,结果我万万没想到啊,他的策略名称真的就很随意,而且上千条策略名称,我还是年轻了,因为我一开始居然真的想通过手写来去掉重复的策略名称,只保留唯一的,但是几千条我咋写???giao,给大家看一下我设想的第一步,拿到我想要的数据
import os
import xlwt
a = 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 xlwt
os.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
with open('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+1
book.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
with open('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年后注册的公众号都取消了这个功能,所以很遗憾没有办法让大家及时互动,另现在我们也有一个小网安圈子,大家若是想进来探讨的可以私信我,我拉大家进群,平时互相吹捧相互进步啥的
最后还是那句话,本人一直以来以公益性分享为主,不会在任何平台向大家索要任何东西,谨防诈骗哦