[Python] 爬绿盟官网漏洞列表并存储MySQL与邮件通知

2023-12-08 04:59

本文主要是介绍[Python] 爬绿盟官网漏洞列表并存储MySQL与邮件通知,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

现在公司安全问题抓的越来越紧,每天去下列网址去看有没有什么应用啊操作系统啊什么的爆漏洞。。。作为一个小运维来说,挺麻烦的。

这不,这段时间学了爬虫,想了下为什么不现学现用呢?看了下就先绿盟爬爬吧。

国家互联网应急中心http://www.cert.org.cn/publish/main/index.html

国家信息安全漏洞共享平台http://www.cnvd.org.cn/

国家信息安全漏洞库 http://www.cnnvd.org.cn/index.html

Seebughttps://www.seebug.org/

绿盟 http://www.nsfocus.net/index.php?act=sec_bug

 

China B.S.A 导航网址http://www.hackerdaohang.com/

 

好了不说了,开始了。

准备Linux 环境:MySQLScrapy

 

一、创建与分析 url

# scrapy startproject lmsafe

# cd lmsafe

scrapy genspider -t basic safe nsfocus.net

 

items.py

# -*- coding: utf-8 -*-

 

# Define here the models for your scraped items

#

# See documentation in:

# http://doc.scrapy.org/en/latest/topics/items.html

 

import scrapy

 

 

class LmsafeItem(scrapy.Item):

    # define the fields for your item here like:

    # name = scrapy.Field()

    date = scrapy.Field()

    title = scrapy.Field()

    link = scrapy.Field()

 

safe.py

# -*- coding: utf-8 -*-

import scrapy

from lmsafe.items import LmsafeItem

from scrapy.http import Request

import time,random

 

class SafeSpider(scrapy.Spider):

    name = 'safe'

    allowed_domains = ['nsfocus.net']

    #start_urls = ['http://nsfocus.net/']

  

    def start_requests(self):

      ua = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36','Connection':'keep-alive'}

      yield Request('http://www.nsfocus.net/index.php?act=sec_bug&type_id=&os=&keyword=&page=1',headers=ua)

    def parse(self, response):

      it =  LmsafeItem()

      it['date'] = response.xpath('//ul[@class="vul_list"]/li/span/text()').extract()

      it['title'] = response.xpath('//ul[@class="vul_list"]/li/a/text()').extract()

      it['link'] = response.xpath('//ul[@class="vul_list"]/li/a/@href').extract()

      yield it

      for i in range(2,16):

        url = "http://www.nsfocus.net/index.php?act=sec_bug&type_id=&os=&keyword=&page="+str(i)          # 这个 url的话看了下就是 page变化而已

        sj = random.randint(1,5)

        time.sleep(sj)   #设置时间间隔,避免造成服务器过多压力

        yield Request(url,callback=self.parse)   #回调函数

 

settings.py        #要用pipeline就要设置这个

ITEM_PIPELINES = {

    'lmsafe.pipelines.LmsafePipeline': 300,

}

 

MySQL端配置

create database mzh character set utf8 collate utf8_bin;

use mzh;

create table safe(sj date,title char(100) primary key,link char(200) unique) default character set utf8;

desc safe;

 

+-------+-----------+------+-----+---------+-------+

| Field | Type      | Null | Key | Default | Extra |

+-------+-----------+------+-----+---------+-------+

| sj    | date      | YES  |     | NULL    |       |

| title | char(200) | NO   | PRI |         |       |

| link  | char(200) | YES  | UNI | NULL    |       |

+-------+-----------+------+-----+---------+-------+

 

 

pipelines.py

# -*- coding: utf-8 -*-

 

# Define your item pipelines here

#

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

import pymysql

 

class LmsafePipeline(object):

    def process_item(self, item, spider):

      conn = pymysql.connect(host='127.0.0.1', user='root', passwd='redhat', db='mzh',port=3306,charset='utf8')

      for i in range(len(item['date'])):

        date = item['date'][i]

        title = item['title'][i]

        link = "http://www.nsfocus.net"+item['link'][i]

        sql='insert into safe(sj,title,link) values("%s","%s","%s");'%(date,title,link)

        try:

          conn.query(sql)

          conn.commit()

        except Exception as e:

          pass

      conn.close()

      return item

 

#cd /data/lmsafe/ && scrapy crawl safe --nolog     #测试咯,不行就把 --nolog去掉看看报错

# MySQL查看: 编码显示问题可以  set character_set_results=utf8;

mysql> use mzh;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> set character_set_results=utf8;

Query OK, 0 rows affected (0.20 sec)

 

mysql> select * from safe

    -> ;

+------------+------------------------------------------------------------------------------------------------+-------------------------------------+

| sj         | title                                                                                          | link                                |

+------------+------------------------------------------------------------------------------------------------+-------------------------------------+

| 2017-09-25 | Samba中间人攻击安全功能绕过漏洞(CVE-2017-12151                              | http://www.nsfocus.net/vulndb/37690 |

| 2017-09-25 | Samba中间人攻击安全功能绕过漏洞(CVE-2017-12150                              | http://www.nsfocus.net/vulndb/37689 |

| 2017-09-22 | Cisco UCS Central Software命令注入漏洞(CVE-2017-12255                               | http://www.nsfocus.net/vulndb/37688 |

| 2017-09-22 | Cisco Wide Area Application Services远程拒绝服务漏洞(CVE-2017-12250              |http://www.nsfocus.net/vulndb/37687 |

| 2017-09-22 | Cisco多个产品拒绝服务漏洞(CVE-2017-6720                                         | http://www.nsfocus.net/vulndb/37686 |

| 2017-09-22 | Cisco FindIT DLL预加载漏洞(CVE-2017-12252                                            | http://www.nsfocus.net/vulndb/37685 |

| 2017-09-22 | Cisco AsyncOS Software远程拒绝服务漏洞(CVE-2017-12215                             | http://www.nsfocus.net/vulndb/37684 |

| 2017-09-22 | Cisco Unified Customer Voice Portal远程权限提升漏洞(CVE-2017-12214                | http://www.nsfocus.net/vulndb/37683 |

| 2017-09-21 | Cisco Unified Intelligence Center跨站请求伪造漏洞(CVE-2017-12254                  | http://www.nsfocus.net/vulndb/37682 |

| 2017-09-21 | Cisco Unified Intelligence Center跨站请求伪造漏洞(CVE-2017-12253                  | http://www.nsfocus.net/vulndb/37681 |

| 2017-09-21 | GraphicsMagick拒绝服务漏洞(CVE-2017-14504                                          | http://www.nsfocus.net/vulndb/37680 |

| 2017-09-21 | Cisco Unified Intelligence Center跨站脚本漏洞(CVE-2017-12248                        | http://www.nsfocus.net/vulndb/37679 |

| 2017-09-21 | ImageMagick拒绝服务漏洞(CVE-2017-14532                                             | http://www.nsfocus.net/vulndb/37678 |

| 2017-09-21 | ImageMagick拒绝服务漏洞(CVE-2017-14528                                             | http://www.nsfocus.net/vulndb/37677 |

| 2017-09-21 | ImageMagick拒绝服务漏洞(CVE-2017-14505                                             | http://www.nsfocus.net/vulndb/37676 |

| 2017-09-21 | ImageMagick拒绝服务漏洞(CVE-2017-14531                                             | http://www.nsfocus.net/vulndb/37675 |

| 2017-09-21 | ImageMagick拒绝服务漏洞(CVE-2017-14533                                             | http://www.nsfocus.net/vulndb/37674 |

| 2017-09-21 | Apache Subversion远程代码执行漏洞(CVE-2017-9800                                  | http://www.nsfocus.net/vulndb/37673 |

| 2017-09-20 | Apache Tomcat远程信息泄露漏洞(CVE-2017-12616                                     | http://www.nsfocus.net/vulndb/37672 |

| 2017-09-20 | Apache Tomcat远程代码执行漏洞(CVE-2017-12615                                     | http://www.nsfocus.net/vulndb/37671 |

 

 

二、Excel生成发送邮件

MySQL中导出数据至Excel中并发送邮件,想了下写个脚本吧.

Loophole.py

#!/usr/bin/python3

# -*- coding: utf-8 -*-

from email.header import Header

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.base import MIMEBase

from email.mime.image import MIMEImage

from email.utils import formatdate

import os.path

import sys

import mimetypes

import pymysql,xlsxwriter,datetime

 

 

def Excel(today,tomonth):

  begin = 2

  colour = '#660099'

  title = [u'发布时间',u'漏洞名称',u'详细URL']

 

  workbook = xlsxwriter.Workbook(u'%s绿盟漏洞发布.xlsx'%(today))

  worksheet = workbook.add_worksheet(tomonth)

 

  worksheet.set_column('A:A', 20)

  worksheet.set_column('B:B', 90)

  worksheet.set_column('C:C', 50)

  format_title = workbook.add_format()

  format_title.set_bold(1)

  format_title.set_font_color('white')

  format_title.set_bg_color(colour)

 

  worksheet.write_row('A1',title,format_title)

 

  conn = pymysql.connect(host='127.0.0.1',db='mzh',port=3306,user='root',passwd='redhat',charset='utf8')

  cur = conn.cursor()

 

  if int(tomonth) < 10:

    tomonth = tomonth.strip('0')

  sql = 'select DATE_FORMAT(sj,"%Y-%m-%d"),title,link from safe where month(sj) = ' + tomonth + ' order by sj desc;'

  cur.execute(sql)

 

  try:

    for i in cur.fetchall():

      worksheet.write('A%s'%str(begin), i[0])

      worksheet.write('B%s'%str(begin), i[1])

      worksheet.write('C%s'%str(begin), i[2])

      begin+=1

  except Exception as e:

    return False

 

  conn.close()

  workbook.close()

  return True

 

def Mail(ReplyTo,To,file_name,tomonth):

  tday=datetime.date.today().strftime('%Y/%m/%d')

  #命令 mail.py <1:发送方(回复地址)10000@qq.com> <2:发送地址,多个以;隔开> <3:发送文件>

  From = "%s<1596179xxxx@139.com>" % Header("大帅比","utf-8")

  server = smtplib.SMTP("smtp.139.com",25)

  server.login("1596179xxxx@139.com","password") #smtp服务器需要验证时

 

  #构造MIMEMultipart对象做为根容器

  main_msg = MIMEMultipart()

 

  #构造MIMEText对象做为邮件显示内容并附加到根容器

  text_msg = MIMEText(u"绿盟 %s月最新安全漏洞报告"%(tomonth),_charset="utf-8")          

  main_msg.attach(text_msg)

 

  #构造MIMEBase对象做为文件附件内容并附加到根容器

  ctype,encoding = mimetypes.guess_type(file_name)

  if ctype is None or encoding is not None:

    ctype='application/octet-stream'

  maintype,subtype = ctype.split('/',1)

  file_msg=MIMEImage(open(file_name,'rb').read(),subtype)

  #file_msg1=MIMEImage(open(file_name1,'rb').read(),subtype)

 

  ## 设置附件头

  basename = os.path.basename(file_name)

  file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改邮件头

  main_msg.attach(file_msg)

 

  #basename1 = os.path.basename(file_name1)

  #file_msg1.add_header('Content-Disposition','attachment', filename = basename1)#修改邮件头

  #main_msg.attach(file_msg1)

 

  # 设置根容器属性

  main_msg['From'] = From

  main_msg['Reply-to'] = ReplyTo

  #main_msg['To'] = To

  main_msg['Subject'] = u"[每日更新] %s绿盟安全漏洞报告" %tday

  main_msg['Date'] = formatdate()

  #main_msg['Bcc'] = To 

  #得到格式化后的完整文本 

  fullText = main_msg.as_string( ) 

 

  #smtp发送邮件 

  try: 

    server.sendmail(From, To.split(';'), fullText)

  finally: 

    server.quit()

 

if __name__ == '__main__':

  today = datetime.date.today().strftime('%Y-%m-%d')

  tomonth = datetime.date.today().strftime('%m')

  ReplyTo = '1596179xxxx@139.com'

  To = "6025xxxxx@qq.com"

  file_name = u"/data/shell/%s绿盟漏洞发布.xlsx"%(today)

  if Excel(today,tomonth):

    Mail(ReplyTo,To,file_name,tomonth)

 

 

设置定时任务:

crontab-e

30 8 * * * cd /data/lmsafe/ && scrapy crawl safe --nolog

1 9 * * * /usr/bin/python3 /data/shell/Loophole.py

 

结果截图:



 


总结,感觉以前学的 Python基础都快忘光了,各种翻笔记。请各位看官帮忙提提意见。

最后,不知道在哪里看到的:在程序的世界里,一切重复性的,流程化的工作都可以交给自动化去完成。感觉挺带感的。

这篇关于[Python] 爬绿盟官网漏洞列表并存储MySQL与邮件通知的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/468602

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur