您好,登錄后才能下訂單哦!
因要每天去查找漏洞信息,來(lái)判斷架構(gòu)和應(yīng)用服務(wù)有沒(méi)有新漏洞被發(fā)現(xiàn),若有 則需修復(fù)升級(jí)。所以寫(xiě)了一個(gè)去漏洞庫(kù)平臺(tái)通過(guò)關(guān)鍵字爬取數(shù)據(jù)生成日志文件,這三個(gè)平臺(tái),就美國(guó)國(guó)家信息安全漏洞庫(kù)地址會(huì)時(shí)不時(shí)出現(xiàn)超時(shí)情況。若出現(xiàn)超時(shí),可多試兩次,三個(gè)平臺(tái)檢索出的漏洞差不多,寫(xiě)的不好,僅供參考
python版本3.7
pip安裝requests即可
#coding=utf-8
import requests as r
import re
import time
import datetime
#爬取國(guó)家信息安全漏洞平臺(tái)
class gjxxaqpt:
def get_404(self,url,keyword):
#定義提交數(shù)據(jù) qcvCname 檢索的詞,pageno 頁(yè)數(shù) 一般是抓取第一頁(yè)
data = {"qcvCname":keyword,"pageno":1}
#post數(shù)據(jù)
result = r.post(url,data=data).text
#正則匹配信息
filter_result = re.findall('<li a_title2" >\r\n \t\t (.*?)</a>.*?<p><a href="(.*?)" target="_blank">(.*?)</a>.*?<img title="(.*?)" src=".*?<br/ >(.*?)\r\n\t\t\t\t\t\t </div>.*?</li>',result,re.S)
return filter_result
def get_404_mes(self,url):
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
try:
result = r.get(url,headers=header).text
filter_result = re.findall('<div class="d_ldjj">.*?</p><p >\n(.*?)\r\n\t\t\t</p>',result,re.S)
if filter_result is not None:
return filter_result[0]
else:
return ""
except:
print("連接超時(shí)"+url)
def write_file(self,keyword,date_time):
#定義post的url
url = "http://www.cnnvd.org.cn/web/vulnerability/queryLds.tag"
#定義后面組合信息需要的域名
url_domain = "http://www.cnnvd.org.cn"
#存放最后結(jié)果數(shù)據(jù)的數(shù)組
mes_list = []
#循環(huán)檢索關(guān)鍵詞
for keyword in keylist:
try:
#調(diào)用方法獲取檢索的結(jié)果
get_404_re = self.get_404(url,keyword)
#循環(huán)結(jié)果,拼接成字符串,寫(xiě)入log文件
for res in get_404_re:
#判斷包含本年日期的漏洞
if date_time in res[4]:
mes_url = url_domain + res[1]
try:
message = self.get_404_mes(mes_url)
mes = res[0] + " | " "漏洞編號(hào):" + res[2] + " | " + "等級(jí):" + res[3] + " | " + "時(shí)間:" + res[4] + " | " + "詳情地址:" + mes_url + " | " + "漏洞簡(jiǎn)介:" + message
mes_list.append(mes)
except:
print("timeout: "+mes_url)
except:
print("timeout:"+url+","+"keyword")
return mes_list
#cve中文漏洞信息庫(kù) - scap中文社區(qū)
class cve_scap:
#獲取所有漏洞集合
def get_cve_404(self,url,keyword):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
#定義提交數(shù)據(jù) qcvCname 檢索的詞,pageno 頁(yè)數(shù) 一般是抓取第一頁(yè)
data = {"search_type":"t_keyword","keyword":keyword}
#post數(shù)據(jù)
result = r.get(url,params=data).text
filter_result = re.findall("<td class='hidden-xs'>.*?<a href=(.*?)>\n (.*?)\n </a>.*?<td class='hidden-xs hidden-sm'>(.*?)</td>.*?title='(.*?)' class='grade",result,re.S)
return filter_result
#對(duì)單個(gè)漏洞信息獲取
def get_cve_404_mes(self,url):
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
try:
result = r.get(url,headers=header).text
filter_result = re.findall("pad30T pad30B mrg0B' style='word-wrap: break-word;'>\n (.*?)</p>",result,re.S)
if filter_result is not None:
return filter_result[0]
else:
return ""
except:
print("timeout: " + url)
#信息獲取
def write_file(self,keylist,date_time):
#定義post的url
url = "http://cve.scap.org.cn/vulns/1"
#定義數(shù)組,存放信息
mes_list = []
for keyword in keylist:
#爬取網(wǎng)站
html_filter = self.get_cve_404(url,keyword)
#定義后面組合信息需要的域名
url_domain = "http://cve.scap.org.cn"
for res in html_filter:
if date_time in res[2]:
try:
mes_url = url_domain + res[0].strip('"')
message = self.get_cve_404_mes(mes_url)
mes = "漏洞編號(hào):" + res[1] + " | " + "等級(jí):" + res[3] + " | " + "時(shí)間:" + res[2] + " | " + "詳情地址:" + mes_url + " | " + "漏洞簡(jiǎn)介:" + message.replace("\n","")
mes_list.append(mes)
except:
print("timeout: "+mes_url)
return mes_list
#美國(guó)國(guó)家信息安全漏洞庫(kù)
class nvd_nist:
#獲取所有漏洞集合
def get_nvd_404(self,url,keyword):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
#定義提交數(shù)據(jù) qcvCname 檢索的詞,pageno 頁(yè)數(shù) 一般是抓取第一頁(yè)
data = {"form_type":"Basic","results_type":"overview","query":keyword,"search_type":"all"}
#關(guān)閉ssl告警提示
r.packages.urllib3.disable_warnings()
#post數(shù)據(jù)
result = r.get(url,params=data,verify=False).text
filter_result = re.findall("<tr data-testid=\"vuln-row.*?<a href=\"(.*?)\" id=\".*?data-testid=\"vuln-detail-link-[0-9]{1,2}\">(.*?)</a></strong><br/>.*?<p data-testid='vuln-summary-[0-9]{1,2}'>(.*?)</p>.*?<span data-testid='vuln-published-on-[0-9]{1,2}'>(.*?)</span>",result,re.S)
return filter_result
def write_file(self,keylist,date_time):
#查找漏洞的url地址
url = "https://nvd.nist.gov/vuln/search/results"
#拼接url的地址
url_dom = "https://nvd.nist.gov"
#存儲(chǔ)最后結(jié)果的數(shù)組
mes_list = []
#循環(huán)獲取關(guān)鍵字的漏洞信息
for keyword in keylist:
try:
filter_html = self.get_nvd_404(url,"nginx")
for res in filter_html:
url_domain = url_dom + res[0]
#對(duì)英文的時(shí)間格式進(jìn)行轉(zhuǎn)換
eng_time = res[3]
if "AM" in eng_time:
up_time = eng_time.split("AM")[0]
elif "PM" in eng_time:
up_time = eng_time.split("PM")[0]
else:
print("時(shí)間判斷有誤")
#我獲取到的時(shí)間是英文的時(shí)間格式,需要轉(zhuǎn)換為數(shù)字時(shí)間格式,這里時(shí)間字符串和里面的時(shí)間格式要保持一次,差一個(gè)空格,也不行
time_format=str(datetime.datetime.strptime(up_time,'%B %d, %Y; %H:%M:%S '))
if date_time in time_format:
mes = "漏洞編號(hào):" + res[1] + " | " + "時(shí)間:" + time_format + " | " + "詳情地址:" + url_domain + " | " + "漏洞簡(jiǎn)介:" + res[2]
mes_list.append(mes)
except:
print("timeout:" + url + "," + keyword)
return mes_list
if __name__ == "__main__":
#需要查找的關(guān)鍵字?jǐn)?shù)組
keylist=['nginx','openssl','openssh']
#獲取本年的日期
date_time = time.strftime("%Y",time.localtime())
#打開(kāi)寫(xiě)入log文件
files = open("404_message.log","w+",encoding='utf-8')
#獲取國(guó)家信息漏洞庫(kù)
guojia = gjxxaqpt()
files.write("#國(guó)家信息漏洞庫(kù):\n")
for i in guojia.write_file(keylist,date_time):
files.write(i+"\n")
files.write("\n")
#cve中文漏洞信息庫(kù) - scap中文社區(qū) 查找
cve = cve_scap()
files.write("#cve中文漏洞信息庫(kù):\n")
for i in cve.write_file(keylist,date_time):
files.write(i+"\n")
files.write("\n")
#美國(guó)國(guó)家信息安全漏洞庫(kù) 查找
nvd = nvd_nist()
files.write("#美國(guó)國(guó)家信息安全漏洞庫(kù):\n")
for i in nvd.write_file(keylist,date_time):
files.write(i+"\n")
files.write("\n")
files.close()
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。