首页 > 安全 > 企业安全 >

企业安全怎么建设?企业安全漏洞通告引擎

2017-04-03

企业安全怎么建设?企业安全漏洞通告引擎。如今大多数企业都在用漏洞扫描+漏洞通告,存在如下两个问题:1 漏扫存在“扫描周期长、扫描库更新不及时”等情况,同时扫描报告中有无数干扰项,导致了漏扫报告约等于“漏洞信息堆砌”,真正有用的可能没几个。

企业安全怎么建设?企业安全漏洞通告引擎。如今大多数企业都在用漏洞扫描+漏洞通告,存在如下两个问题:

1. 漏扫存在“扫描周期长、扫描库更新不及时”等情况,同时扫描报告中有无数干扰项,导致了漏扫报告约等于“漏洞信息堆砌”,真正有用的可能没几个,而让甲方运维人员从中找到有用的信息,真是异常耗时耗力。

2. 安全厂商的漏洞通告是“只通知,具体影响那台服务器,运维自己找去吧。”

由以上两个痛点,我们想出来一个二者结合的用法:通过各种方法收集到所有服务器当前的中间件、数据库等版本,再通过资产列表匹配到相应服务器的运维人员邮箱,最后再到靠谱的安全厂商漏洞公告网站抓到最新的漏洞资讯以及影响范围,一旦“当前版本”处于“影响版本”范围内,则立即进行邮件告警。

0×01 整体框架

整体分为输入、主引擎以及输出三个部分。

\

1. 输入部分:

a) 版本探测:针对服务器各应用的版本探测扫描、不便于扫描的区域进行手工检查版本并录入

b) 爬虫:选出多家安全厂商,通过其安全漏洞公告的网站进行每日(或更高频次)漏洞信息抓取

2. 主引擎部分:

a) Python:真心好用

b) 数据库:制定“应用-IP-版本-管理员”表

c) 版本比较:通过比较漏洞影响范围&当前应用版本,来判断是否存在安全问题

d) 最新漏洞告警:定时任务运行(每日一次或更高频次),以自动发现最新的安全漏洞

3. 输出部分:

根据“应用-IP-版本-管理员”的对应关系,自动将相应的应用漏洞发送给相应的运维管理员,实现较为精准的自动化漏洞通告&新漏洞预警。

0×02 输入部分

这里有多种方式来实现版本的自动扫描,如Nessus、各厂家的漏扫等等,由于应用版本更新频率低,漏洞更新频率高,故而通过每个月一次的扫描可以较为准确地获得当前可探测到的服务器中所运行的应用版本。另外需要制作出“应用-IP-版本-管理员”的对应关系,以便发现最新漏洞后通知给相应应用的负责人。

2.1 制作“应用- IP-版本”对应关系表(表名为apps)

首先需要定位“版本信息”所在位置,通过漏扫导出的excel主机报表可以发现,仅在“扫描报告-漏洞信息sheet-返回信息列”可能会包含版本信息(如下图),故想办法定位到指定sheet+指定列,从而使用正则获取到形如[Microsoft-IIS/8.5]中的信息

\

这里会用到pyexcel_xls,该模块可以读取excel表中信息,如下。

#从excel中读出漏洞信息这个sheet

vulList = xls_data[u'漏洞信息']

#设置一个去重的集合,存放当前IP的app和version

currentIPApps = set()

#从第二行开始读

for i in range(1,len(vulList),1):

#取excel表中第4列的漏洞描述和第14列的版本信息

#print vulList[i]

name = vulList[i][3]

try:

version = vulList[i][13]

if "/" in version:

if ("[" in version) and ("]" in version):

version_tmp = re.findall("\[(\w+.*/\d+.*)]",version)

之后再通过细粒度的正则和各种奇葩内容的排除后,得到当前版本信息,如nginx 1.8.1,存到数据库待用。

每次扫描都会有大量的主机报表产生(如下图)

\

此时需要逐个遍历目录中的所有文件:

def GetFileList(dir, fileList):

newDir = dir

if os.path.isfile(dir):

fileList.append(dir.decode('gbk'))

elif os.path.isdir(dir):

for s in os.listdir(dir):

# 如果需要忽略某些文件夹,使用以下代码

# if s == "xxx":

# continue

newDir = os.path.join(dir, s)

GetFileList(newDir, fileList)

return fileList

于是通过目录遍历+excel遍历后,应用- IP-版本的对应关系就搞定了。

\

2.2 完善“应用-IP-版本-管理员关系对应表”

有了上面的表还不够,即使有漏洞通告,无法自动落实到人,也是空谈。于是要将IP-管理员的对应关系加入进来。

此时我们需要先要有信息系统资产表,其中至少应包括“IP-管理员”(如下图)

\

再根据每次遍历扫描结果输出目录中的报表IP作为查询条件,进行资产表查询,将获取到的管理员名称添加到“apps”表中的对应位置,制作完毕后如下图所示,资产输入部分完毕。

\

2.3 漏洞公告网站爬虫

爬虫的目的:抓到所有应用名称的漏洞信息&影响范围。

\

爬虫示例:绿盟漏洞公告爬虫

http://www.nsfocus.net/index.php?os=&type_id=&keyword=nginx&act=sec_bug&submit=+

\

思路:

a. 在keyword的参数值处提交当前系统环境中所具备的应用名称

b. 利用urllib(或urllib2)抓到所有页面的应用漏洞信息

c. 可能存在多页记录,每一页都遍历全

d. 把所有抓到的标题做汇总,得到“漏洞标题+漏洞超链接”的list

e. 遍历list,将同时存在“应用名称”和“远程命令执行”(或者远程拒绝服务)这一类高危漏洞筛选出来。(有同学可能会问在步骤a已经搜索了应用名称了啊,在步骤e为何还要再次筛选,大家可以看上图,明明搜的nginx,然而搜索结果出来好多OpenSSL的,竟无语凝噎。)

f. 如果“xxx漏洞”符合步骤e中的筛选条件,则进一步用爬虫抓取“xxx漏洞”中的漏洞详情信息(标题、受影响版本、描述、建议等),如“nginx文件路径处理远程命令执行漏洞”,相应页面URL为http://www.nsfocus.net/vulndb/15077

g. 使用正则获取“受影响系统”中的版本信息(如下图),备用来比较。

\

h. 使用正则获取“受影响系统”中版本信息前面的符号,(如‘

\
\
\

至此,受影响版本的获取已经搞定,绿盟的爬虫也制作完毕。

0×03 引擎部分

引擎主体包括版本比较与最新漏洞通告两个部分。

3.1 版本比较

在上一步中我们已经用爬虫获取到了“指定应用、指定危害描述”的漏洞信息以及受影响版本,在主引擎中我们要做版本比对:如果“当前应用版本”小于或等于“受影响范围”中的版本,则可能存在该漏洞。

在版本比较中遇到的问题是1.1和1.2这两个float可以比较,但是1.1.1和1.1.2怎么比较呢?逛了各种论坛找到了distutils.version模块,可以轻松进行版本比对,实现起来非常简单。

示例:

from distutils.version import LooseVersion

a="1.1.1"

b="1.1.2"

a = LooseVersion(a)

b = LooseVersion(b)

print cmp(a,b)

如果ab返回1。以此方法比较后,对于返回0和-1的漏洞就可以准备着手进行通告处理了。

3.2 最新漏洞通告

既然为最新漏洞通告,则旧的漏洞不应再次提示,至少对于该模块下来说不应再次提示。同时新建一个表格存放当前已经通告过“某某IP存在xx漏洞”,此后再跑程序的时候先判断这个表里的time次数,如果为1,就不会再重复通告。

\

一旦某天出现了重大信息安全漏洞(比如Struts2),漏洞检索引擎会爬取到厂商的公开信息并及时发送告警。

0×04 输出部分

输出这部分目前只有邮件告警,在有符合条件的漏洞出现后,直接将漏洞邮件发送给步骤2.2中已经制定的对应表中的管理员,邮件内容如下所示。

\

0×05 Bug

在处理遗留漏洞方面,该引擎只能通过版本比较来发现漏洞,而通过打补丁、改配置文件等方式修复的漏洞可能还会重新被通告。比如当前环境中有IIS 7.0,公开漏洞信息中提示的影响范围是IIS 7.0,但是管理员打了补丁,此时依旧会通告该漏洞。

0×06 总结

对于新增漏洞来说,该引擎较为好用,然而对于旧的漏洞来说,效果一般。希望安全厂商能够在研发扫描器上多一些可定制的灵活性,避免出现“漏洞堆砌”类的无用消息,更好地提供安全扫描工具。

相关文章
最新文章
热点推荐