securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报

相关阅读

Excel表中sheet合并的快捷方法参考

杂谈

有很多Nessus或者是OpenVAS漏扫的深度玩家,对其中的漏洞信息非常感兴趣。

之前在网上公开的差不多有6万条左右汉化的扫描策略的规则

图片[1]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

但是,里面没有cvss评分,在安全项目中如果没有cvss评分,则很难确认安全风险等级,因此,我们需要去补充完善。

这个时候,通过Google搜索引擎,我们找到了securityspace这个网站,我们发现列表页里有风险等级

图片[2]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

详情页中有cvss评分

图片[3]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

我们想把它爬取下来,这个时候就需要用到强大的Python语言了!

爬取实践

在朋友的推荐下,使用了feapder框架,代码简直不能在舒服了!

相关文件

我们这里有3个文件

  • securityspace_orignal_combine.xlsx 读取oid
  • spidercvss.txt 输出结果
  • spider_cvss.py 相关爬虫代码

思路分享

我们完整的思路是要将securityspace_orignal_combine.xlsx excel文件中的第1列内容逐行读取

图片[4]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

将其置入URL链接中的

图片[5]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

然后访问这个页面,爬取其中CVSS Score的数据

图片[6]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

分解代码

如果你从来没有写过python的代码,也很好做,我们只需要把上述过程进行分解即可

  • 读取excel表的内容
  • 将内容循环填入到url,输出
  • 如何寻找网页中指定位置内容
  • 细节处理数据
  • 保存到excel/txt
  • 异常处理

读取excel表的内容

读取excel表中第1列的代码

  • securityspace_orignal_combine.xlsx文件中行数比较多,我们可以取少量样本,新建一个excel,test.xlsx用来测试
图片[7]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

我们尝试获取A2-A5内容

import pandas as pd


def excel_one_line_to_list():
    df = pd.read_excel("test.xlsx", usecols=[0],names=None)  # 读取项目名称列,不要列名
    df_li = df.values.tolist()
    result = []
    for s_li in df_li:
        result.append(s_li[0])
    print(result)


if __name__ == '__main__':
    excel_one_line_to_list()

这里输出到list中了

图片[8]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

稍微改一下代码,让他逐行输出

import pandas as pd


def excel_one_line_to_list():
    df = pd.read_excel("test.xlsx", usecols=[0],names=None)  # 读取项目名称列,不要列名
    df_li = df.values.tolist()
    result = []
    for s_li in df_li:
        result.append(s_li[0])
    #print(result)
    num = range(0, len(result))
    for i in num:
         print(result[i])


if __name__ == '__main__':
    excel_one_line_to_list()

这里按行输出了

图片[9]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

思考下,如果你想加到URL里,只需要调用的时候,在链接后面加入.format(result[i])即可

("http://www.securityspace.com/smysecure/catid.html?id={}".format(result[i])

完整的函数

    def start_requests(self):
        # 获取完整的oid
        df = pd.read_excel("securityspace_orignal_combine.xlsx", usecols=[0], names=None)  # 读取项目名称列,不要列名
        df_li = df.values.tolist()
        result = []
        for s_li in df_li:
            result.append(s_li[0])
        num = range(0, len(result))
        for i in num:
            #print(result[i])
            yield feapder.Request("http://www.securityspace.com/smysecure/catid.html?id={}".format(result[i]))

这里就相当于会逐行去请求了

如何寻找网页中指定位置内容

我们一般会通过Xpath或者re正则表达式来寻找内容,这里我们要匹配的是

图片[10]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

这里就这么写

cvss = response.re(r'CVSS Score:<br>(.*?)<br>')

细节处理数据

不过如果你仔细看,我们上面的代码会存成list形式

["6.8"]
["6.8"]
["2.6"]
图片[11]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

但我们只需要纯数字的部分

6.8
6.8
2.6

因此,我们还需要对之前的代码进行加工

        cvss = response.re(r'CVSS Score:<br>(.*?)<br>')
        cvss_ = "".join(cvss)

这样就只保留数字部分了!如果你不确定是否正确,可以打印出来看看

print(cvss_)

发现已经实现,显示纯数字的CVSS评分了!

图片[12]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

保存到txt中

如果想将上面的按行保存到txt中,我们需要将结果cvss_写入到spidercvss.txt中,这里只需要两行代码

        f = open("spidercvss.txt", "a")
        print(cvss_, file=f)

看下效果,我们发现效果还是不错的,如果网页中不存在CVSS评分字段,也会写入占位,这样的话就不会混乱了

图片[13]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

最后我们把这些再逐行写到数据库或者批量复制到excel就好了!

当然,上面的代码并不是很完善,还有很多可以做的

比方说,输出的时候应该有对应的oid,这样的话就不会出现如果数据多了写入失败发现对不上的情况

异常处理

最后我们再讲下异常处理,因为爬虫在很多时候访问不一定有结果,比方说被waf拦截了,IP被屏蔽了等等情况,那么这种情况下,我们将采集不到结果,通常的处理方式是我们先建立两个list,一个list用来存储爬到的数据,一个list用来存储异常的数据

        self.re_try_list = list()
        self.result = list()

然后如果碰到采不到的就存到异常里,继续采集下面的内容(注意要将下面的代码写到循环中)

            try:
                handle_result = self.handle_request(method="GET", url=cvss_url)
            except Exception as e:
                self.re_try_list.append(cvss_url)
                continue

当然,自己写轮子通常是需要花费大量时间的,而且不一定有框架的好,这也是为什么文章开头推荐大家用feapder框架,它自带了异常处理的机制,会在请求失败时,进行重试,直到采集到数据才会进行下一个。

    def validate(self, request, response):
        if response.status_code != 200:
            raise Exception("response code not 200") # 重试

当然,你还可以修改配置文件中的错误处理机制的细节

# 重新尝试失败的requests 当requests重试次数超过允许的最大重试次数算失败
RETRY_FAILED_REQUESTS = False
# request 超时时间,超过这个时间重新做(不是网络请求的超时时间)单位秒
REQUEST_LOST_TIMEOUT = 600  # 10分钟
# 保存失败的request
SAVE_FAILED_REQUEST = True

完整代码

spider_cvss.py文件如下

import feapder
import pandas as pd
import requests
import re

class SpiderTest(feapder.AirSpider):
    def start_callback(self):
        print("爬虫开始")

    def end_callback(self):
        print("爬虫结束")

    def start_requests(self):
        # 获取完整的oid
        df = pd.read_excel("securityspace_orignal_combine.xlsx", usecols=[0], names=None)  # 读取项目名称列,不要列名
        df_li = df.values.tolist()
        result = []
        for s_li in df_li:
            result.append(s_li[0])
        num = range(0, len(result))
        for i in num:
            #print(result[i])
            yield feapder.Request("http://www.securityspace.com/smysecure/catid.html?id={}".format(result[i]))

    def download_midware(self, request):
        request.headers = {'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
        # request.proxies = {"https":"https://12.12.12.12:6666"}
        # request.cookies = {}
        return request

    def validate(self, request, response):
        if response.status_code != 200:
            raise Exception("response code not 200") # 重试



    def parse(self, request, response):
        cvss = response.re(r'CVSS Score:<br>(.*?)<br>')
        cvss_ = "".join(cvss)
        print(cvss_)
        f = open("spidercvss.txt", "a")
        print(cvss_, file=f)


if __name__ == "__main__":
    SpiderTest().start()

采集方式

如果你嫌电脑采集比较难受,可以放到服务器上采集

图片[14]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog
nohup python -u spider_cvss.py > nohup.log 2>&1 &

然后就可以在nohup.log查看日志结果,如果你想实时监控,我们可以编辑index.php

然后自动读取最后的8行内容并显示

<?php
function getLastLines($file,$line=1){
	$file = escapeshellarg($file); // 对命令行参数进行安全转义
	$line = `tail -n $line $file`;
	return $line;
}
//测试
print_r(getLastLines("nohup.log",8));exit; 
?>
图片[15]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

总结

上面的46行代码属实简陋了,但是赶工的话,还是可以完成目标的。

从代码看,如果要健全还可以做很多,比方说

  • 服务中断保存,重启后继续
  • 数据处理异常存入队列,定期重新爬取之前失败的内容
  • 钉钉、企业微信异常通知
  • 监控采集状态web端显示

以上内容,你可以通过feapder进一步完善,做一个自己的爬虫工作台都没问题的!

图片[16]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog

漏洞扫描模板

  • AIX漏洞检测
  • Amazon Linux漏洞检测
  • CISCO漏洞检测
  • CentOS漏洞检测
  • Citrix Xenserver漏洞检测
  • Debian漏洞检测
  • F5漏洞检测
  • Fedora漏洞检测
  • FortiOS(飞塔OS)漏洞检测
  • FreeBSD漏洞检测
  • 通用安全策略
  • Linux通用安全策略
  • Gentoo Linux漏洞检测
  • HP-UX漏洞检测
  • JunOS漏洞检测
  • Mac OS X漏洞检测
  • Mageia Linux漏洞检测
  • Mandrake Linux漏洞检测
  • Oracle Linux漏洞检测
  • 端口扫描
  • Red Hat漏洞检测
  • Slackware Linux漏洞检测
  • Solaris漏洞检测
  • SuSE漏洞检测
  • Ubuntu漏洞检测
  • VMware漏洞检测
  • Windows漏洞检测
  • 大数据组件漏洞检测
  • 弱密码检测
  • office漏洞检测

© 版权声明
THE END
喜欢就支持一下吧
点赞25赞赏 分享
评论 共6条

请登录后发表评论