当前位置:编程学习 > 网站相关 >>

Python统计漏洞扫描html报表

前段时间在做项目时需要处理个漏洞扫描html报表,该报表是包含900+个IP的高、中、低风险的漏洞扫描报告,目标是将每个IP所有的高、中风险统计出来。而该报表是按漏洞为主键的,即显示某漏洞受影响的IP有X.X.X.X;Y.Y.Y.Y……如果是纯手工去整的话恐怕会疯掉,于是写了个Python脚本。
 该脚本思路就是根据报表生成规则,应用正则表达式将需要的信息提取出来保存到.csv文件,用Excel打开即可得到统计结果。时间仓促,只用了半天时间写出来,有个遗留问题是写进.csv文件是用Unicode编码,直接用Excel打开的则会变乱码(Win8+Office2013),后面也懒得去修补了,临时解决方法是在Excel建个空表,“数据->自文本”来导入即可。
#!/usr/bin/env python
# -*- coding: gbk -*-
'''
使用方法:在命令行中传递主机报表所在的文件夹即可,会在脚本当前目录生成结果。
By:Terry
'''

import codecs
import re
import os
import sys

def progress(width,precent):
        #显示百分比与进度表
        print "%d%% [%s]\r" % (precent,('%%-%ds' % width) % (width * precent / 100 * '=')),
        if precent >= 100:
                print
        sys.stdout.flush()
       
def flaw_high(html):
        #从html中匹配出高风险的漏洞名称
        pattern = re.compile(r'<a href="#[\S]*" class="vul-vh">([\w\W]*?)</a>')
        match = pattern.findall(html)
        return match

def flaw_middle(html):
        #从html中匹配出中风险的漏洞名称
        pattern = re.compile(r'<a href="#[\S]*" class="vul-vm">([\w\W]*?)</a>')
        match = pattern.findall(html)
        return match

def EachHost(file_route,save_route):           
        '''
        读取主机报表file_route文件,并保存到save_route文件
        '''
        #file_route = "1.html"
        file = codecs.open(file_route,"r","utf-8")
        contents = file.read()
        #print contents
        pattern = re.compile(r'</td><td>([\d]+.[\d]+.[\d]+.[\d]+)</td></tr>')
        ip = pattern.findall(contents)            #从主机报表中获取主机IP,并写进文件
        #print ip[0]
        f_high = flaw_high(contents)

        file_forwrite = codecs.open(save_route,"a","utf-8")
        file_forwrite.write(ip[0])
        for i_ in f_high:
                file_forwrite.write(u',高风险,'+i_+'\r\n')
        f_middle = flaw_middle(contents)
        for i_ in f_middle:
                file_forwrite.write(u',中风险,'+i_+'\r\n')
       
        if len(f_high)==0 and len(f_middle)==0:
                file_forwrite.write('\r\n')
        file_forwrite.close()
        file.close()
       
def ListFiles(dir_route,save_route):
        '''
        从主机报表路径dir_route中遍历主机报表,并保存到save_route
        '''
        total = 0
        for i in os.listdir(dir_route):         #遍历html文件,即所有主机报表
                if i.endswith("html"):
                        total += 1
        i = 0
        for i_file in os.listdir(dir_route):#将所有主机报表逐一处理,并计算百分比
                if i_file.endswith("html"):
                        i += 1
                        rate_num = int((float(i)/float(total))*100)
                        progress(50,rate_num)
                        EachHost(dir_route + "\\" + i_file,save_route)

if __name__ == '__main__':
        '''
        主函数,简单判断输入是否正确
        '''
        #EachHost("1.html") www.zzzyk.com
        #print sys.path[0]
        save_route = ""
        while len(save_route)==0 and len(sys.argv)>1:
                print u"请输入生成文件名:"
                save_route = raw_input()
                save_route = sys.path[0]+"\\"+save_route+".csv"
                if os.path.exists(save_route):
                        print u"该文件名已存在,请重新输入!!!"
                        save_route = ""
        print save_route
     

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,