【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”)

        #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

        if len(sys.argv)>1:

                ListFiles(sys.argv[1],save_route)

        else:

                print u’请输入主机报表路径!!!\r\n如:D:\\script.py D:\\scan_report\\hosts’

最后还添加了个进度条显示,呵呵。。。

    原文作者:terrying
    原文地址: https://blog.51cto.com/terrying/1151125
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞