Nessus报告汉化篇一(数据准备阶段)

前言

 就笔者目前在工作中使用过的众多扫描器来看,即使是使用免费版Nessus,无论是从扫描的准确度还是漏洞更新的及时性来看,都完虐国内大多数付费版的扫描器。
 虽然比较好用,但是Nessus并不提供中文的报告文档,这点就比较尴尬,所以我才有了做‘汉化’的这样一个想法。当然这个汉化肯定不是规规矩矩去进行翻译汉化。工作量那么大,当然得使用脚本去进行批量的操作呀!

准备

 在使用Nessus扫描完成之后,导出文档的时候,我们一共有以下几个选项

 在这些选项中,我们所需要的就是CSV这个格式的文档,因为想对比于其他文件格式,CSV无疑是最好处理的。具体格式如下:

 因为考虑到是利用脚本对进行文档进行处理,那么就必须得有一个独特的标识以便后期进行匹配,那么文档中只有CVE编号可以满足我们这个条件。因为每个CVE编号都是独立的,只要有CVE编号,我们就能准确定位到这个漏洞的详情。
 那么问题来了,我们应该怎么利用这个编号来进行工作呢,笔者之前在国内的安全厂商绿盟查看过一些漏洞描述的时候,发现绿盟有一个公开的CVE漏洞库。那么思路就来了,我可以爬取绿盟的漏洞,在本地做一个数据库用于存储漏洞信息。然后便可用于做对比了。
 爬虫的我选择的是Python编写脚本进行爬取,毕竟Python写起来方便嘛,在写脚本之前可以先分析一下该如何进行爬取,目标站点有哪些特征可以供我们使用。
 如图,我们需要控制的URL中只有一个变量,就是最后的数字,它其实是递增的。那么我们就可以遍历它所有的数据。

 在这里我也就不详细去分析爬虫如何爬取数据,这个比较简单,我直接贴代码吧,这代码写了挺久了,当时写这个代码就图了个方便,所以写的也比较渣!哈哈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- encoding= "utf-8" -*-

import pymysql
from threading import Thread
from queue import Queue
import time
import urllib.request
import urllib.parse
from urllib import error
from bs4 import BeautifulSoup
import re

class cvespider(Thread):
def __init__(self,url,q,list,sql):
super(cvespider,self).__init__()
self.url = url
#print (url)
self.q = q
self.list = list
self.sql = sql
self.values = {'name': 'voidking','language': 'cn'}
self.headers = { 'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
self.data = data = urllib.parse.urlencode(self.values).encode(encoding='utf-8',errors='ignore')

def run(self):
self.parse_page()
def send_request(self,url):
i = 0
while i <=3:
try:
print ("[* ] 请求url: " + self.url)
request = urllib.request.Request(url=url, data=self.data,headers=self.headers,method='GET')
response = urllib.request.urlopen(request)
except Exception as e:
print ("[*] 请求出错"+ str(e) + "[-]" + self.url)
i += 1
else:
return response
def parse_page(self):
response = self.send_request(self.url)
buff = response.read()
html = buff.decode("utf-8")
soup = BeautifulSoup(buff,'html.parser')
html1 = soup.select('.vulbar')

vulbar = BeautifulSoup(str(html1),'html.parser')
#获取标题
title = vulbar.select('div[align="center"] > b')[0].get_text()

#获取内容
xitong = str(vulbar.find_all('b')[3].get_text()) + str(vulbar.find_all('blockquote')[0].get_text())

#获取描述
miaoshu = str(vulbar.find_all('b')[4].string)

#re匹配详细描述
info = re.findall(".*描述.([\s\S]*)建议.",vulbar.get_text())

#匹配修复建议
xiufu = re.findall(".*建议.([\s\S*]*)浏览.*",vulbar.get_text())

time.sleep(0.1)
if 'CVE' in vulbar.get_text():
try:
cve = re.findall("ID: (C.*)",vulbar.get_text())[0]
except IndexError:
cve = ''
else:
cve = ' '
list_info = (str(title),str(cve),str(info[0]),str(xiufu[0]))
self.list.append (list_info)
#print ('[* Title:] '+ str(list_info[0]))
#转义
text = pymysql.escape_string(str(list_info[0]))
#print ('[* text:]' + str(text))
res = self.db_execute("select cve_name from cve_list where cve_name='%s'"%text)
#print ('[* res:]' + str(res[0]))
#print (type(res1))
if not res:
if text not in res:
sql = "insert into cve_list(cve_name,cve_number,cve_info,cve_suggest) values('%s','%s','%s','%s')" %(str(text),str(list_info[1]),str(list_info[2]),str(list_info[3]))
print ('[* ]无原始数据-插入数据中...')
try:
self.db_execute(sql)
except:
print('[* error log ]'+self.url)

else:
if str(list_info[0]) not in str(res[0]):
sql = "insert into cve_list(cve_name,cve_number,cve_info,cve_suggest) values('%s','%s','%s','%s')" %(str(text),str(list_info[1]),str(list_info[2]),str(list_info[3]))
print ('[- ]有原始数据-插入数据中...')
try:
self.db_execute(sql)
except:
print('[* error log ]'+self.url)

def db_execute(self,sql):
db = pymysql.connect("127.0.0.1", "root", "test007", "cve_data")
cursor = db.cursor()
cursor.execute(sql)
db.commit()
results = cursor.fetchall()
db.close()
return results


def main():
q = Queue()
base_url = 'http://www.nsfocus.net/vulndb/'
url_list = [base_url + str(num) for num in range(50,41949)]
Thread_list = []
list = []
sql = ''
for url in url_list:
p = cvespider(url,q,list,sql)
p.start()
Thread_list.append(p)
time.sleep(0.2)
for i in Thread_list:
i.join()
while not q.empty():
print ('[* ******************]'+ str(q.get()))

if __name__=="__main__":

start = time.time()
main()
print ('[info]耗时:%s'%(time.time()-start))

 效果如图所示

 到这里,咱们的前期工作算是准备完成了,下一篇,我将会把如何处理Nessus的文档思路写出来,今天就到这了!