对接 xray 和微信/企业微信实现自动告警

xray 是什么

xray 是从长亭洞鉴核心引擎中提取的社区版漏洞扫描神器。它支持各种主动和被动的扫描方法。它有自己的盲打平台,可以灵活定义 POC,功能丰富,调用简单,支持 Windows / ** cOS / Linux 各种操作系统能满足广大安全从业者的自动化 Web 漏洞探测需求。

如何第一时间知道如何扫出漏洞?

对于安全工程师来说,由于安全工程师使用 xray 的基础爬虫模式,爬虫一直在爬也不会一直人工刷新和查看漏洞报告,也有可能是使用的被动代理模式,让测试人员挂扫描器代理然后访问各个业务页面,但是不知道什么时间测试人员才开始和完成测试,也有可能是日志扫描模式,导入日志使用脚本进行 url 扫描,不知道什么时候重放。

许多公司已经建立了自己的漏洞管理系统、工单系统等。如果扫描仪发现漏洞,这些系统将大大解放安全人员。对于这些场景xray 有一种漏洞输出模式叫 webhook-output,当发现漏洞时,指定 url post 漏洞数据,demo 代码是

import requestsrequests.post(webhook,json=vuln_info)

如果我们写一个中间的转换和转发层,我们可以很容易地实现以下功能

发邮件、短信警告、微信、企业微信、钉钉slack报警漏洞信息同步到自己的数据库,为漏洞创建工单,使用其他工具验证漏洞是否存在…… 使用 webhook 自动推送

本文借助 Server酱 和企业微信机器人,来演示如何实时通知 xray 发现了漏洞。

xray 的 webhook 是什么

对于 xray,webhook 应该是 url 地址,也就是说,我们需要自己建一个 web 服务器,接收 xray 借助 发送的漏洞信息,然后转发Python 的 flask 框架,我们很快就写了webhook url 的 demo 出来。

from flask import Flask,requestimport requestsapp = Flask(__name__)@app.route('/webhook',methods=['POST'])def xray_webhook(): print(request.json) return 'ok'if __name__ == '__ ** in__': app.run()

使用 xray webscan --url http://pentester-web.vulnet/sqli/example1.php?name=root --plugins sqldet --webhook-output http://127.0.0.1:5000/webhook 测试,然后发现漏洞信息打印成功。

   * Serving Flask app "app.py" * Environment: development * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL C to quit){'create_time': 1566836256580,'detail': {'host': 'pentester-web.vulnet','param': {'key': 'name','position': 'query','value': "root'and'lW'='lql"},'payload': "root'and'lW'='lql",'port': 80,'request': '','request1': 'GET /sqli/example1.php?name=rootand4w=4w HTTP/1.1rnHost: pentester-web.vulnetrnUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/74.0.3729.169rnCookie: key=valuernAccept-Encoding: gziprnrn','request2': 'GET /sqli/example1.php?name=rootandlW=lql HTTP/1.1rnHost: pentester-web.vulnetrnUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/74.0.3729.169rnCookie: key=valuernAccept-Encoding: gziprnrn','response': '','response1': 'HTTP/1.1 200 OKrn...','response2': 'HTTP/1.1 200 OKrn...','title': "Generic Boolean based case ['string']",'type': 'boolean_based','url': 'http://pentester-web.vulnet/sqli/example1.php?name=root'},'plugin': 'sqldet','target': {'url': 'http://pentester-web.vulnet/sqli/example1.php','params': [{'position': 'query','path': ['name']}]},'vuln_class': ''}127.0.0.1 - - [27/Aug "POST /webhook HTTP/1.1" 200 -

下一步是分析 xray 漏洞信息,然后生成相应的页面模板。请参考 https://chaitin.github.io/xray/#/guide/vuln 文档。由于推送不适合发送太多的数据,因此选择了一些基本字段。

from flask import Flask,requestimport requestsapp = Flask(__name__)@app.route('/webhook',methods=['POST'])def xray_webhook(): vuln = request.json content = """## xray 发现新漏洞 url: {url}插件: {plugin}漏洞类型: {vuln_class}发现时间: {create_time}请及时检查处理""".for ** t(url=vuln["target"]["url"],plugin=vuln["plugin"], vuln_class=vuln["vuln_class"] or "Default", create_time=str(datetime.datetime.fromtimestamp(vuln["create_time"] / 1000))) print(content) return 'ok'if __name__ == '__ ** in__': app.run()Server 酱

Server酱汁是程序员和服务器之间的通信软件,从服务器报警和日志到手机。

打开和使用它仍然很简单

登入:用 GitHub 帐户登录 http://sc.ftqq.com/3.version,能得到一个 SECKEY 绑定:扫码关注绑定消息的完成:向 http://sc.ftqq.com/{SECKEY}.send 发请求,就可以在微信里收到消息啦我们先用 Python 写一个简单的 demo,以下所有 SECKEY我用 的实际值{SECKEY} 替换,每个人都需要修改自己的价值。import requestsrequests.post("https://sc.ftqq.com/{SECKEY}.send", data={"text": "xray vuln alarm","desp": "test content"})

收到消息很简单,上面 xray 漏洞信息结合在一起,即

from flask import Flask,requestimport requestsimport datetimeimport loggingapp = Flask(__name__)def push_ftqq(content): resp = requests.post("https://sc.ftqq.com/SCU ** 5T57f2913b7c0fc69372e997031f7cc4e0561b7f85f2b3d.send", data={"text": "xray vuln alarm","desp": content}) if resp.json()["errno"] != 0: raise ValueError("push ftqq failed,%s" % resp.text)@app.route('/webhook',methods=['POST'])def xray_webhook(): vuln = request.json content = """## xray 发现新漏洞 url: {url}插件: {plugin}漏洞类型: {vuln_class}发现时间: {create_time}请及时检查处理""".for ** t(url=vuln["target"]["url"],plugin=vuln["plugin"], vuln_class=vuln["vuln_class"] or "Default", create_time=str(datetime.datetime.fromtimestamp(vuln["create_time"] / 1000))) try: push_ftqq(content) except Exception as e: logging.exception(e) return 'ok'if __name__ == '__ ** in__': app.run()

展示效果如图

企业微信群机器人

企业微信群机器人就像一个普通成员一样,可以发言,可以 @ 人,如果我们接入企业微信群做 xray 的漏洞告警,也会大大方便漏洞的第一时间发现。

开通和使用方法

点击群聊右上角,然后找到 ‘群机器人’,然后点击’添加’ ** Webhook 的地址,保存备用

调用的代码也非常简单,我们只需要展示主要的部分就可以了

def push_wechat_group(content): resp = requests.post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=9651234b-f90e-40 ** -80fd-0a69d6c1d867", json={"msgtype": " ** rkdown", " ** rkdown": {"content": content}}) if resp.json()["errno"] != 0: raise ValueError("push wechat group failed, %s" % resp.text)

展示效果如图

扫码免费用

源码支持二开

申请免费使用

在线咨询