0x00前言
最近由于实验室有需求,要对漏洞进行及时监控并进行分析,于是就参考浮萍牛之前作品,并根据网上不同的源,进行漏洞监控脚本的书写,小试牛刀,涉及的过程有,先对漏洞源进行爬虫,然后进行关键词提取,进行数据库存储,并进行可视化,实现邮件定时推送等等。
0x01代码结构
- 首先对收集的源进行爬虫,这里暂时只提取了四个源(CVE,exploit_db,hacker_news,theat_book)
- 然后爬虫对获取到的数据进行关键字检索处理,将检索的数据存入数据库
- 爬虫同时生成部分csv文件在output文件夹中,方便后边进行数据分析进行简单可视化
- 然后利用echarts或者matplotlib对数据进行画图处理
- 最后邮件推送,将爬到数据和图片作为附件进行定时邮件推送
0x02效果如下
0x03实现过程
爬虫提取
首先是对几个源进行爬虫,这里只用了BeautifulSoup来进行html标签的提取等等
1 | def get_exploit_db_info(): |
数据库存储
其实脚本里对存储的数据并没有进行调用,不存储亦可,方便后期统计,起初用过mysql存储,但是对于每个源来说,爬取的字段数并不一致,用mysql存储的话就需要用不同的表,相对麻烦。于是参照一些大牛的套路,就用MongoDB进行存储,用了之后感觉挺好的,同时还搭配了一款MongoDB数据库查询软件,GUI棒棒哒
这里参考浮萍牛的MongoDB配置
1
2
3
4
5
mkdir /var/data/ #创建数据存储位置
#启动mongodb,指定端口和路径,且仅本机可连
mongod --port 65521 --dbpath /var/data/ --bind_ip 127.0.0.1
mongo 127.0.0.1:65521/mydb
db.createUser({user:'tass',pwd:'liehu',roles:[{role:'dbOwner',db:'mydb'}]}) #添加认证
另外MongoDB在存储时,可以用insert,也可以用update进行更新,不存在就会插入,存在就会更新
1
c.update({"description": data['description']}, {'$set': data}, True)
如果存在相同的描述,则会进行更新
数据读取可视化
这里呢本来是想回调参数进行绘图简单可视化,发现比较冗余,于是进行csv文件的保存,而且打算后期方便统计,然后利用这些数据进行月度绘图等等,可能以后会添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
df_anquanke = pd.read_csv('./output/An_quan_ke_data.csv',encoding="gb2312")
total_anquanke = df_anquanke.loc[0].iloc[1]
key_anquanke = df_anquanke.loc[0].iloc[2]
total_vulns = [total_CVE,total_exploit_db,total_hacker_news,total_threat_book,total_anquanke]
key_vulns = [key_CVE,key_exploit_db,key_hacker_news,key_threat_book,key_anquanke]
# print(total_vulns,key_vulns)
ind = np.arange(size)
total_width = 0.9
width = total_width / size
fig,ax = plt.subplots()
rects1 = ax.bar(ind, total_vulns, width, color='g')
rects2 = ax.bar(ind + width, key_vulns, width, color='r')
ax.set_ylabel('漏洞告警数')
ax.set_title('今日漏洞告警分析')
ax.set_xticks(ind + width)
ax.set_xticklabels(('CVE', 'Exploit_db','Hacker_news','Thread_book','Anquanke'))
ax.legend((rects1[0], rects2[0]), ('告警总数', '检索数'))
plt.savefig(os.path.join(config.output_path, 'inspect.png'))
# plt.show()
读取完数据之后,就打算绘图,起初考虑过用echart并且上面也绘制了,但是在邮件推送时,echart可交互式图表不能展示,不能插入js代码执行。但是有个idea是可以实现的,就是在公网vps上运行脚本,然后搭建web,生成文件在web目录下,然后邮件超链过去,如果钟爱echart可以这么做
在制图过程中,考虑过用堆叠柱状图,并列柱状图,包括饼图等等,最终还要用了简单的并列柱状图
echart的交互性非常好,如果在html页面展示 最佳选择
邮件推送
要进行邮件推送,就找到了python的库smtplib
可以满足既能发送html的爬虫数据,还能附件格式发送生成的可视化图表
1 | def send_email_with_pic(mail_msg): |
再尝试了这个库之后,我突然萌生了短信炸弹的念头,我怎么走哪都有重放漏洞的影子呢,着魔了
不信就看看我的邮箱,一天天把自己炸坏了,不断测试
定时发送
这里定时发送利用到了Linux的定时命令crontab来实现
通过在vps上可以定时让其在指定时刻运行脚本,不就能定时推送各种漏洞预警,然后进行及时分析,拿到第一手漏洞信息,岂不是美滋滋
看完这个图,应该对这个定时命令的参数就非常了解了,运行完就等着收邮件好了
0x04写在最后
在写脚本的时候也会遇到各种坑,各种成长,没有办法,谁还不经历点挫折,谁还不遇上几个渣男,不对跑题了,哈哈O(∩_∩)O,代码结构可能很糙,大牛勿喷,么么哒,后期还会更新源,优化结构,希望能做到更好,就这样,下次见咯。