公司做系统集成,有搜集产品脆弱性需求,包括cisco,vmware,redhat,F5等厂家。
具体需求:
1.每天定时搜集十来个网络设备厂家网站新发布的脆弱性
2.根据产品和等级不同,邮件发给不同公司人员,内容包括:新脆弱性链接,脆弱性标题,CVE编号,发布时间等
2.不能发送重复脆弱性内容
难点:F5和ivanti网站遇到JWT问题,认证包含多次js的跳转(checkbox点选后),每次拿到的token有效期只有一天,思路是提前访问网站拿一下token,再带着有效token访问数据,这个看起来很困难,其实一点也不简单。
分析产品网站,通过xhr找到对应级别脆弱性的数据接口链接,response是一个大的json串
1.导入相关package,定义当天和昨天时间,因为大厂基本都是utc时间发布,仅检查当天即使是23:59检查也没用,中国时间看网站还没发布,utc时间发布后转换回来是中国的昨天时间###。
时间转换参考网站格式,用于比对判断。
import requests
import json
import datetime
today = datetime.date.today()
format_today=today.strftime("%Y-%m-%d")
yesterday = today - datetime.timedelta(days=1)
format_yesterday=yesterday.strftime("%Y-%m-%d")
url_cisco='xxx'
response=requests.get(url_cisco)
found_string=f"there WAS new vulnerability {format_today}"
nofound_string=f"No new vulnerability {format_today} "
filename=f"xxx.txt"
2. 判断脆弱性函数,并记录到文件,根据特征字段判断是否已经通知过,避免重复###
def getCiscoVulnerability(url_cisco):
sendmail.has_been_called = False
for item in response.json():
lastPublished=item["lastPublished"]
if (lastPublished==format_today and astPublished not in filename) or (lastPublished==format_yesterday and and lastPublished not in filename):
url_cisco = item["url"]
title_cisco = item["title"]
cve_cisco = item["cve"]
summary_cisco = item["summary"]
vul_date=lastPublished
list=["思科产品:",title_cisco,summary_cisco,cve_cisco,vul_date,url_cisco]
sendmail(url_cisco, title_cisco, summary_cisco, cve_cisco, vul_date)
with open(filename, 'a') as file:
file.write("\n")
file.writelines("\t".join(list))
else:
continue
#根据发邮件函数调用与否,判断是否有新增脆弱性并记录日志
if sendmail.has_been_called:
print(found_string)
else:
print(nofound_string)
3. 发邮件模块
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
def sendmail(url_cisco,title_cisco,summary_cisco,cve_cisco,vul_date):
sendmail.has_been_called = True
# 设置发件人,收件人,主题和内容
sender = 'xxx'
receivers = ['xxx']
subject = 'xxx'
body = f"xxx"
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = ', '.join(receivers)
msg['Subject'] = subject
msg.attach(MIMEText(body))
# 连接到SMTP服务器,发送邮件
smtp_server = 'xx'
smtp_port = 25 # 通常为587或465
smtp_username = 'xx' # 如果需要用户名和密码登录SMTP服务器,请提供用户名和密码。如果不需要,可以忽略此行。
smtp_password = 'xx' # 如果需要用户名和密码登录SMTP服务器,请提供用户名和密码。如果不需要,可以忽略此行。
try:
with smtplib.SMTP(smtp_server, smtp_port) as server:
# server.starttls() # 开始TLS加密会话,这通常在连接时进行。如果你使用的SMTP服务器不支持TLS加密,你可能需要联系你的邮件服务提供商。
if smtp_username and smtp_password:
server.login(smtp_username, smtp_password) # 如果SMTP服务器需要用户名和密码登录,请提供用户名和密码。如果不需要,可以忽略此行。
server.sendmail(sender, receivers, msg.as_string()) # 发送邮件
except Exception as e:
print(f"Error: {e}")
#主函数调用查找判断
def main():
getCiscoVulnerability(url_cisco)
main()
其他产品网站类似,有的用到xpath或bs4,有的要拿到二级链接再次查找后判断,思路大同小异。
JWT尝试了几下没搞定,等弄清楚后再更新。
###########纸上得来终觉浅,绝知此事要躬行###########
标签:cisco,收集,Python,smtp,脆弱性,url,import,today From: https://blog.csdn.net/Robert19831218/article/details/137148925