好久没记笔记了,上次记笔记还是在上次
当时还是个菜鸡,现在也是
没事闲搞想 xray使用webhook发送结果到钉钉
因为xray的输出格式是固定的,所以需要一个中间的服务接受再按钉钉/企微格式发送下,这就用到方便的flask了。
先上代码
from flask import Flask, request
import requests
import datetime
import json
app = Flask(__name__)
#钉钉webhook接口
def DingWebhook(message):
url='https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxx'
#need with keyword
program={
"markdown": {
"title":"xray通知",
"text": message+"xx关键字xx"
},
"msgtype": "markdown"
}
headers={'Content-Type': 'application/json'}
f=requests.post(url,data=json.dumps(program),headers=headers)
print(f.text)
@app.route('/webhook', methods=['POST'])
def xray_webhook():
data = request.json
#print("****************************")
#print(data)
#print("****************************")
data_type = data['type']
vuln = data["data"]
# 因为还会收到 https://chaitin.github.io/xray/#/webhook/statistic 的数据
if data_type != "web_vuln":
return "ok"
content = """ ## xray 发现了新漏洞\n
url: {url}
插件: {plugin}
payload: {payload}
发现时间: {create_time}
请及时查看和处理
""".format(url=vuln["target"]["url"], payload=vuln['detail']['payload'],plugin=vuln["plugin"],
create_time=str(datetime.datetime.fromtimestamp(vuln["create_time"] / 1000)))
print(content)
DingWebhook(content)
return 'ok'
if __name__ == '__main__':
app.run(host='0.0.0.0',port='6655')
python3运行脚本,扫描时候后边加上一句 --wo http://127.0.0.1:6655/webhook 就ok了
有几个地方需要注意
- 钉钉的md标题是不显示在聊天内容里边的,只显示在聊天窗口,app的状态栏提示等
- 代码里边的 `xx关键字xx`是钉钉里边设置的,防止被攻击滥用,内容必须包含指定关键字
- 企微和钉钉的发送大同小异,格式稍微有点区别
- markdown格式比text清晰、明了