Python对接 xray 和微信实现自动告警


Posted in Python onSeptember 17, 2019

Python对接 xray 和微信实现自动告警 

xray 是什么

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

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

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

还有很多公司自建了漏洞管理系统、工单系统等等,如果扫描器发现了漏洞可以自动同步这些系统也将会大大解放安全人员。针对这些场景 xray 有一种漏洞输出模式叫 webhook-output ,在发现漏洞的时候,将会向指定的 url post 漏洞数据,demo 的代码就是

import requests
requests.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, request
import requests

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def xray_webhook():
  print(request.json)
  return 'ok'

if __name__ == '__main__':
  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=root%27and%274w%27%3D%274w 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=root%27and%27lW%27%3D%27lql 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/2019 00:17:36] "POST /webhook HTTP/1.1" 200 -

接下来就是解析 xray 的漏洞信息,然后生成对应的页面模板就好了。需要参考  https://chaitin.github.io/xray/#/guide/vuln   的文档。因为推送不适合发送太大的数据量,所以就选择了基础的一些字段。

from flask import Flask, request
import requests
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def xray_webhook():
  vuln = request.json
  content = """## xray 发现了新漏洞
url: {url}
插件: {plugin}
漏洞类型: {vuln_class}
发现时间: {create_time}
请及时查看和处理
""".format(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__ == '__main__':
  app.run()

Server 酱

Server酱是一款程序员和服务器之间的通信软件,也就是从服务器推报警和日志到手机的工具。

开通并使用上它还是很简单的

  • 登入:用 GitHub 账号登录 http://sc.ftqq.com/3.version ,就能获得一个 SECKEY
  • 绑定:扫码关注完成绑定
  • 发消息:往 http://sc.ftqq.com/{SECKEY}.send 发请求,就可以在微信里收到消息啦

我们先用 Python 写一个简单的 demo,以下所有的 SECKEY 的实际值我都使用 {SECKEY} 代替,大家需要修改为自己的值。

import requests
requests.post("https://sc.ftqq.com/{SECKEY}.send", 
       data={"text": "xray vuln alarm", "desp": "test content"})

很简单就收到了消息,将上面 xray 的漏洞信息结合在一起,就是

from flask import Flask, request
import requests
import datetime
import logging
app = Flask(__name__)
def push_ftqq(content):
  resp = requests.post("https://sc.ftqq.com/SCU645T57f2913b7c0fc69372e997031f7cc4e0561b7f85f2b3d.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}
请及时查看和处理
""".format(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__ == '__main__':
  app.run()

展示效果如图

Python对接 xray 和微信实现自动告警

企业微信群机器人

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

开通和使用方法

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

Python对接 xray 和微信实现自动告警

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

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

展示效果如图

Python对接 xray 和微信实现自动告警

总结

以上所述是小编给大家介绍的Python对接 xray 和微信实现自动告警,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python条件和循环的使用方法
Nov 01 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
python与C互相调用的方法详解
Jul 14 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
python实现图像高斯金字塔的示例代码
Dec 11 Python
python读取excel数据并且画图的实现示例
Feb 08 Python
Python计算两个矩形重合面积代码实例
Sep 16 #Python
详解Python3 pickle模块用法
Sep 16 #Python
python scipy卷积运算的实现方法
Sep 16 #Python
python 三元运算符使用解析
Sep 16 #Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 #Python
Python循环实现n的全排列功能
Sep 16 #Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 #Python
You might like
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
php中stdClass的用法分析
2015/02/27 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python3使用QQ邮箱发送邮件
2020/05/20 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
单位消防安全制度
2014/01/12 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
个人贷款承诺书
2014/03/28 职场文书
中介业务员岗位职责
2014/04/09 职场文书
医学生求职自荐书
2014/06/12 职场文书
学习十八大宣传标语
2014/10/09 职场文书
2014年环保工作总结
2014/11/26 职场文书
施工现场安全管理制度
2015/08/05 职场文书
导游词之上饶龟峰
2019/10/25 职场文书