背景
最近Spring框架曝出的RCE 0day漏洞,大家来跟我一起思考下以下3个问题:
问题1:你是通过什么渠道了解到的?
是通过群消息了解到的,还是通过自己看新闻资讯了解到的,亦或是通过公司内部人员/邮件了解到的?
问题2:你是什么时候了解到的?
是漏洞爆出当天,还是n天后?
问题3:你可知0day,1day,nday的漏洞有什么区别吗?
0day:只有你知道的漏洞,通杀。
1day:刚公布后的漏洞,或者公布后没有poc exp的漏洞。或者指刚公布一天的漏洞,大部分通杀。
nday:公布很久,流传很广的漏洞,少数不更新的才能用。相对来说,通杀性不高
通过上面3个问题的反思,一方面能反映出我们发现漏洞不及时,另一方面能反映出我们的安全意识不够,很容易给公司造成很大的经济损失,那我们该怎么解决呢?我也调研了下,咱们来看看别人家的公司都是怎么做的。
大型公司:有专业的安全人员或安全部门,专门来处理漏洞发现,漏洞预警。
中型公司:使用漏洞扫描软件来发现的。
小型公司:干脆就没有这个安全意识。
目标
漏洞爆出后第一时间被通知到,由几个人来决定是否处理。处理的话,指定负责人来牵动推动直到完毕。
我们如何做的呢?
明确目标后,咱们就可以行动了,在行动之前我们需要解决这3个问题:
- 从哪里能发现漏洞呢?
华云安,斗象智能安全,漏洞盒子,freebuf
- 怎么进行漏洞预警?
企业微信,钉钉,邮件,短信等等
- 怎么实现呢?
java,python,shell脚本等等
我们最终方案是基于xxl-job+python2实现企业微信漏洞预警。
来跟大家唠唠为啥用python2不用python3吧?
一开始确实用python3写的,当配置到xxl-job上去的时候,发现服务器上python环境是python2的环境,很多人说升级下不就可以了吧。一方面考虑到还要让运维人员配合一下。另一方面当前服务器上还有别人写的python脚本,我们也知道python3和2差很多,就会导致别人脚本不能运行了,这是主要原因。
具体代码实现:
#-*- coding: UTF-8 -*-
import urllib2
import urllib
import json
import time
import datetime
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# 爬取华云安漏洞预警
def huayunan():
url = "https://vti.huaun.com/api/warning/queryList"
curTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
befor10Minutes = (datetime.datetime.now() + datetime.timedelta(minutes=-10)).strftime("%Y-%m-%d %H:%M:%S")
params = \
{
"dict": 10,
"total": 0,
"pageSize": 10,
"pageNumber": 1,
"showquery": [
],
"queryfield": [
{
"fieldname": "releaseTime",
"fieldvalue": "'" + befor10Minutes + "' and '" + curTime + "'",
"terms": "between"
}
],
"querytype": "and",
"sort": {
"prop": "releaseTime",
"order": "desc"
}
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE',
'Content-Type': 'application/json;utf-8'
}
respJson = httpPostJson(url, params, headers)
list = respJson["data"]["list"]
for i in range(len(list)):
item = list[i]
level = ""
if item["vulLevel"] == 4:
level = "超危"
elif item["vulLevel"] == 3:
level = "高危"
elif item["vulLevel"] == 2:
level = "中危"
else:
level = "低危"
data = {}
data["name"] = item["name"]
data["level"] = level
data["code"] = item["vulCode"]
data["source"] = item["source"]
data["releaseTime"] = item["releaseTime"]
data["url"] = "https://vti.huaun.com/watchVul?warnId=" + item["id"]
# 发送企微预警
sendBugWarn(data)
# 发送企微预警
def sendBugWarn(data):
params = {}
contentMap = {}
level = ["超危", "高危"]
levelColor = "comment"
if data["level"] in level:
levelColor = "warning"
params["msgtype"] = "markdown"
contentMap["content"] = "漏洞编号: " + data["code"] + "\n" \
+ "漏洞名称: " + data["name"] + "\n" \
+ "漏洞等级: " + data["level"] + "\n" \
+ "批量来源: " + data["source"] + "\n" \
+ "发布时间: " + data["releaseTime"] + "\n" \
+ "漏洞详细: [" + data["url"] + "]("+ data["url"] +")"
params["markdown"] = contentMap
url = "企业微信机器人地址"
headers = {
'Content-Type': 'Content-Type: application/json'
}
req = urllib2.Request(url=url, data=json.dumps(params), headers=headers)
res = urllib2.urlopen(req)
res = res.read().decode()
print("推送结果:" + res)
# http post请求
def httpPostJson(url, params, headers):
print("httpPostJson-请求url:" + url + "\n请求参数:" + json.dumps(params))
req = urllib2.Request(url=url, data=json.dumps(params), headers = headers)
res = urllib2.urlopen(req)
res = res.read().decode()
resJson = json.loads(res, encoding='utf-8')
return resJson
def httpGet(url):
print("httpGet-请求url:" + url)
req = urllib2.Request(url=url)
res = urllib2.urlopen(req)
res = res.read().decode()
print(res)
resJson = json.loads(res, encoding='utf-8')
return resJson
if __name__ == '__main__':
huayunan()
最终效果
漏洞编号: CVE-2022-1162,Huaun-2022-5468
漏洞名称: Gitlab 劫持漏洞
漏洞等级: 超危
批量来源: Gitlab 官方
发布时间: 2022-04-06 18:35:42
漏洞详细: https://vti.huaun.com/watchVul?warnId=81d28ae130a446c28caae299e46ef858