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实现数通设备端口监控示例
Apr 02 Python
Python实现多线程下载文件的代码实例
Jun 01 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
Python中url标签使用知识点总结
Jan 16 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
Python数据正态性检验实现过程
Apr 18 Python
idea2020手动安装python插件的实现方法
Jul 17 Python
Python urllib3软件包的使用说明
Nov 18 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 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
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
js opener的使用详解
2014/01/11 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
vue实现分页组件
2020/06/16 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
pytorch 修改预训练model实例
2020/01/18 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
浅析python实现动态规划背包问题
2020/12/31 Python
python爬取抖音视频的实例分析
2021/01/19 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
大韩航空官方网站:Korean Air
2017/10/25 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
what is the difference between ext2 and ext3
2013/11/03 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
文体活动实施方案
2014/03/27 职场文书
信仰心得体会
2014/09/05 职场文书