相关阅读
Excel表中sheet合并的快捷方法参考
杂谈
有很多Nessus或者是OpenVAS漏扫的深度玩家,对其中的漏洞信息非常感兴趣。
之前在网上公开的差不多有6万条左右汉化的扫描策略的规则
![图片[1]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126082932387-1024x777.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
但是,里面没有cvss评分,在安全项目中如果没有cvss评分,则很难确认安全风险等级,因此,我们需要去补充完善。
这个时候,通过Google搜索引擎,我们找到了securityspace这个网站,我们发现列表页里有风险等级
![图片[2]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126083158105-1024x524.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
详情页中有cvss评分
![图片[3]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126083523316-1024x703.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
我们想把它爬取下来,这个时候就需要用到强大的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](https://static.iculture.cc/wp-content/uploads/2022/01/20220126084125137.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
将其置入URL链接中的
![图片[5]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126084201456.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
然后访问这个页面,爬取其中CVSS Score的数据
![图片[6]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126084535384.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
分解代码
如果你从来没有写过python的代码,也很好做,我们只需要把上述过程进行分解即可
- 读取excel表的内容
- 将内容循环填入到url,输出
- 如何寻找网页中指定位置内容
- 细节处理数据
- 保存到excel/txt
- 异常处理
读取excel表的内容
读取excel表中第1列的代码
securityspace_orignal_combine.xlsx
文件中行数比较多,我们可以取少量样本,新建一个excel,test.xlsx
用来测试
![图片[7]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126085350440-1024x252.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
我们尝试获取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](https://static.iculture.cc/wp-content/uploads/2022/01/20220126085743700-1024x50.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
稍微改一下代码,让他逐行输出
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](https://static.iculture.cc/wp-content/uploads/2022/01/20220126085425211.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
思考下,如果你想加到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](https://static.iculture.cc/wp-content/uploads/2022/01/20220126090929322-1024x387.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
这里就这么写
cvss = response.re(r'CVSS Score:<br>(.*?)<br>')
细节处理数据
不过如果你仔细看,我们上面的代码会存成list形式
["6.8"]
["6.8"]
["2.6"]
![图片[11]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126091331787-1024x274.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
但我们只需要纯数字的部分
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](https://static.iculture.cc/wp-content/uploads/2022/01/20220126091459102-1024x264.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
保存到txt中
如果想将上面的按行保存到txt中,我们需要将结果cvss_
写入到spidercvss.txt
中,这里只需要两行代码
f = open("spidercvss.txt", "a")
print(cvss_, file=f)
看下效果,我们发现效果还是不错的,如果网页中不存在CVSS评分字段,也会写入占位,这样的话就不会混乱了
![图片[13]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126091640910.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
最后我们把这些再逐行写到数据库或者批量复制到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](https://static.iculture.cc/wp-content/uploads/2022/01/20220126094059413-1024x290.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
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](https://static.iculture.cc/wp-content/uploads/2022/01/20220126094407701-1024x140.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
总结
上面的46行代码属实简陋了,但是赶工的话,还是可以完成目标的。
从代码看,如果要健全还可以做很多,比方说
- 服务中断保存,重启后继续
- 数据处理异常存入队列,定期重新爬取之前失败的内容
- 钉钉、企业微信异常通知
- 监控采集状态web端显示
以上内容,你可以通过feapder进一步完善,做一个自己的爬虫工作台都没问题的!
![图片[16]-securityspace漏洞库Python爬虫分享 可以爬取约10万条漏洞情报-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/01/20220126093414810-1024x576.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
漏洞扫描模板
- 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漏洞检测
- 最新
- 最热
只看作者