1 工具简介
xray 是长亭科技开发的一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有:
- 跨平台:使用Go语言开发,支持Windows、Linux和Mac主流平台,包括arm架构。
- 检测速度快:发包速度快; 漏洞检测算法效率高。
- 支持范围广:大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均支持。
- 高级可定制:通过修改配置文件可以定制化功能。
目前支持的漏洞检测类型包括:
- XSS漏洞检测 (key: xss)
- SQL 注入检测 (key: sqldet)
- 命令/代码注入检测 (key: cmd-injection)
- 目录枚举 (key: dirscan)
- 路径穿越检测 (key: path-traversal)
- XML 实体注入检测 (key: xxe)
- 文件上传检测 (key: upload)
- 弱口令检测 (key: brute-force)
- jsonp 检测 (key: jsonp)
- ssrf 检测 (key: ssrf)
- 基线检查 (key: baseline)
- 任意跳转检测 (key: redirect)
- CRLF 注入 (key: crlf-injection)
- Struts2 系列漏洞检测 (高级版,key: struts)
- Thinkphp系列漏洞检测 (高级版,key: thinkphp)
- XStream 系列漏洞检测 (key: xstream)
- POC 框架 (key: phantasm)
其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。xray 不开源,社区版免费使用,高级版需要付费使用。
1.1 下载地址
1.2 版本对比
能力\版本 | 社区版 | 高级版 | 商业版(洞鉴) |
---|---|---|---|
SQL注入检测 | ✅ | ✅ | ✅ |
命令注入检测 | ✅ | ✅ | ✅ |
代码注入检测 | ✅ | ✅ | ✅ |
反射型XSS检测 | ✅ | ✅ | ✅ |
目录枚举 | ✅ | ✅ | ✅ |
文件上传检测 | ✅ | ✅ | ✅ |
XXE检测 | ✅ | ✅ | ✅ |
SSRF检测 | ✅ | ✅ | ✅ |
CSRF检测 | ✅ | ✅ | ✅ |
基线检查 | ✅ | ✅ | ✅ |
任意跳转检测 | ✅ | ✅ | ✅ |
jsonp检测 | ✅ | ✅ | ✅ |
CRLF注入检测 | ✅ | ✅ | ✅ |
XStream系列检测 | ✅ | ✅ | ✅ |
log4j2-rce的检测 | ✅ | ✅ | ✅ |
Web表单弱口令 | ✅ | ✅ | ✅ |
http基础认证弱口令 | ✅ | ✅ | ✅ |
主机扫描/主机指纹识别 | ✅ | ✅ | ✅ |
模拟浏览器爬虫扫描 | ✅ | ✅ | ✅ |
Web基础爬虫 | ✅ | ✅ | ✅ |
代理扫描 | ✅ | ✅ | ✅ |
自定义yaml插件 | ✅ | ✅ | ✅ |
反连平台 | ✅ | ✅ | ✅ |
四种报告输出 | ✅ | ✅ | ✅ |
子域名收集 | ❌ | ✅ | ✅ |
shiro反序列化漏洞检测 | ❌ | ✅ | ✅ |
ThinkPHP系列检测 | ❌ | ✅ | ✅ |
fastjson系列检测 | ❌ | ✅ | ✅ |
Struts2系列检测 | ❌ | ✅ | ✅ |
DOM型XSS检测 | ❌ | ❌ | ✅ |
weblogic系列检测 | ❌ | ❌ | ✅ |
主机服务弱口令 | ❌ | ❌ | ✅ |
指纹识别 | ❌ | ❌ | ✅ |
日志扫描 | ❌ | ❌ | ✅ |
word等渗透测试报告输出 | ❌ | ❌ | ✅ |
POC漏洞检测 | 使用社区poc或自行编写 | 使用社区poc或自行编写 | 官方维护编写 |
更新频率 | 不定期 | 不定期 | 日常+应急更新 |
产品形态 | 软件 | 软件 | 软件+硬件+云 |
2. 简易架构
扫描工具大致都是由三部分组成:目标输入、漏洞检测和结果输出。
2.1 目标输入
xray定义了5个入口(扫描方式),分别是:
- HTTP 被动代理
- 简易爬虫
- 单个 URL
- URL列表的文件
- 单个原始 HTTP 请求文件
2.2 结果输出
工具运行时的状态信息和漏洞扫描结果输出:
- Stdout (屏幕输出, 默认开启)
- JSON 文件输出
- HTML 报告输出
- Webhook 输出
3. 命令行参数说明
用法:
[全局选项] 命令 [命令选项] [参数]
命令:
webscan, ws 运行Web扫描任务
servicescan, ss 运行服务扫描任务
subdomain, sd 运行子域名枚举任务
poclint, pl, lint 检查poc格式
burp-gamma, btg 将burp历史代理记录的导出文件转换为POC格式
transform 转换v1版本poc为v2版本
reverse 以独立的反连平台服务运行
convert 将结果从json转换为html或从html转换为json
genca 生成CA证书和密钥文件
upgrade 检查更新并自动升级
version 显示版本
x 一个启用所有插件的命令。可以在配置文件中自定义新命令或修改由命令启用的插件。
help, h 显示命令列表或一个命令的帮助
全局选项:
--config FILE 加载配置文件(默认值:“config.yaml”)
--log-level value 日志级别,可选择调试、信息、警告、错误、致命
--help, -h 显示帮助信息
4. 使用方法
xray的扫描方式分为被动扫描、主动扫描和服务扫描。
4.1 被动扫描(Passive scanning)
扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都认为自己直接与对方对话,同时记录该流量,然后修改参数并重新发送请求进行扫描。
首次使用时运行:.\xray_windows_amd64.exe genca
生成证书,直接运行.\xray_windows_amd64.exe
同样也会生产证书。然后安装生成的ca.crt
证书即可扫描使用HTTPS协议的web服务。
常用命令有:
- 监听本地7777端口,按日期生成html报告:
xray_windows_amd64.exe ws --listen 127.0.0.1:7777 --ho __datetime__.html
- 开放7777端口,所有人均可使用:
xray_windows_amd64.exe ws --listen 0.0.0.0:7777 --ho __datetime__.html
4.2 主动扫描
主动扫描常用命令有:
- 扫描单个Url:
xray_windows_amd64.exe ws -u http://dvwa.com
- 扫描URL列表的文件:
xray_windows_amd64.exe ws --uf url.txt
- 简单爬虫扫描:
xray_windows_amd64.exe ws --basic http://dvwa.com --ho test.html
- 浏览器爬虫扫描(需要下载rad):
xray_windows_amd64.exe ws --browser http://dvwa.com
- 扫描单个原始HTTP请求文件:
xray_windows_amd64.exe ws --rr url.txt
- 扫描单个原始HTTPS请求文件:
xray_windows_amd64.exe ws --rr url.txt --fs
- 扫描Burp导出的HTTP请求文件:
xray_windows_amd64.exe ws --bf file
- 使用指定Poc扫描:
xray_windows_amd64.exe ws -p poc1.yml,poc2.yml -u http://dvwa.com
- 使用
x
命令:xray_windows_amd64.exe x -t 192.168.0.1/16
,x命令默认启用了所有的插件,包括存活探测、端口扫描、指纹识别等。
主动扫描通常做不登录扫描,如需做登录扫描需要使用原始HTTP请求文件或修改配置文件,并添加有效Cookie。
4.3 服务扫描
目前仅支持CVE-2020-1938和CVE-2023-21839/21931/21979
- 扫描单个目标:
xray_windows_amd64.exe ss -t 192.168.1.94:80
- 批量扫描:
xray_windows_amd64.exe ss --tf serv.txt
5. 配置文件
首次运行会自动生成配置文件和证书,配置文件内有详细的注释,包括一下部分:
- 全局HTTP发包配置
- 插件配置
- 反连平台配置
- 被动代理配置
- 基础爬虫配置
- 子域名扫描配置
6. 高级用法
6.1 Burp+Xray联动
将自动扫描和手工测试互补,弥补单一工具的不足。有两种方式:
- Burp做一级代理,Xray做二级代理。经过Burp Proxy组件的流量都会转发到Xray进行被动扫描
配置方法是在Burp的Proxy组件配置Upstream proxy servers
指向Xray: - Xray做一级代理,Burp做二级代理。流量先经过Xray,再经过Burp Proxy组件,可以拦截Xray的流量进行修改。
配置方法是修改Xray配置文件中全局HTTP发包proxy字段指向Burp Proxy监听地址:
第一种方式可以将Burp插件的流量也转发到Xray,第二种方式可以查看Xray的Payload并进行优化后手工测试,通常调试Xray Poc时可以使用第二种方式。
6.2 Awvs+Xray联动
AWVS的爬虫很强大,支持表单分析和单页应用的爬取,Xray 的扫描能力比较强,速度也更快,二者结合如虎添翼。
在AWVS创建扫描任务时,添加Xray代理地址即可:
6.3 其它工具联动
其它支持代理模式的工具同样可以和Xray被动扫描进行联动,比如dirsearch
、dirmap
、sqlmap
等工具,具体根据自己需求配置。
6.4 反连平台
默认配置未启用反连平台(DnsLog),因此无法扫描出依赖反连平台的漏洞:
- SSRF
- XXE盲注
- 无回显命令注入
- 一些反序列化漏洞,如fastjson、Log4j2等
Xray支持2种部署方式:
- 独立部署
- 非独立部署
6.4.1 独立部署
需要将xray放置于存在公网IP (或目标可访问的内网)的服务器上,选择此方式部署可供团队使用。
反连平台配置文件示例:
需要配置的项:
- 反连平台数据库文件位置
- 设置token,客户端交互和web端登录使用
- 启用http方法,也可同时启用dns方法
- 设置监听IP和端口等信息
反连平台启动命令:./ xray_linux_amd64 reverse
Web地址:http://8.130.41.223:8777/cland
扫描器配置文件示例:
需要配置的项:
- 设置token,需要和反连平台配置文件中的一致,扫描器获取反连结果时使用
- 启用反连平台客户端
- 设置http基本地址,启用dns方法时同样需要设置dns服务器地址
主动扫描命令:xray_windows_amd64.exe --config client_config.yaml ws -u http://xxx
其它命令类似
6.4.2 非独立部署
使用非独立部署需要被测目标可以访问Xray所在地址。
该方式已知bug:在添加了DNS后,被动代理模式会出现无法扫描的BUG。
配置文件示例:
需要配置的项:
- 反连平台数据库文件位置
- 启用http方法
- 设置监听IP和端口
扫描命令: xray_windows_amd64.exe ws --listen 127.0.0.1:7777
6.5 Webhook
Webhook是一种应用程序间进行实时通信的方法。Webhook允许一个系统向另一个系统发送信息,通常用来发送通知。如:
- 邮件通知
- 短信通知
- 企业微信群通知
- 钉钉群通知
官方提供了:https://github.com/chaitin/xray/tree/master/webhook仓库但是没有代码实现,需要自行编程实现。
使用命令:xray_windows_amd64.exe ws -u http://dvwa.com --wo http://127.0.0.1:5000
企业微信webhook示例代码:
from flask import Flask, request, jsonify
import requests
from datetime import datetime
app = Flask(__name__)
key = "" # 填写你的企业微信群webhook key
def wxwork_notify(message):
url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={key}"
headers = {'Content-Type': 'application/json'}
payload = {
"msgtype": "text",
"text": {
"content": message
}
}
response = requests.post(url, json=payload, headers=headers)
return response.text
@app.route('/', methods=['POST'])
def xray_webhook():
data = request.json
# 构造消息内容
try:
create_time = data['data']['create_time']
create_time = datetime.fromtimestamp(create_time/1000).strftime('%Y-%m-%d %H:%M:%S')
except:
return jsonify({"status": "failed", "message": "Not Vuln Data"}),400
try:
message = f"Xray 漏洞扫描通知\n" \
f"漏洞类型:{str(data['type'])}\n" \
f"漏洞地址:{str(data['data']['detail']['addr'])}\n" \
f"漏洞参数:{str(data['data']['detail']['extra']['param'])}\n" \
f"Payload:{str(data['data']['detail']['payload'])}\n" \
f"扫描插件:{str(data['data']['plugin'])}\n" \
f"发现时间:{create_time}"
except:
return jsonify({"status": "failed", "message": "Not Vuln Data"}),400
# 调用企业微信群通知webhook
res = wxwork_notify(message)
print(res)
return jsonify({"status": "success", "message": "Data received"})
if __name__ == '__main__':
app.run()
7. 自定义Poc
7.1 为什么编写Poc
Poc的内容主要影响的就是扫描的效果,其影响效果可以简单的看作:漏报、误报、危害。
- 减少漏报
- 降低误报
- 降低危害
7.2 Xray Poc的结构
Xray Poc分三个部分:Poc名称、Poc脚本、信息。
信息部分还有其它字段:
7.3 编写Poc
目前官方提供了大量漏洞类型模板,编写更方便。可参考一下资料编写:
- 官方文档:https://docs.xray.cool/tools/xray/QuickStart
- 常见问题:https://docs.xray.cool/tools/xray/QA
- YAML教程:https://docs.xray.cool/plugins/yaml/Format
- YAML插件的参数: https://docs.xray.cool/plugins/yaml/YAMLTypeFunc
- Poc编写模板:https://docs.xray.cool/plugins/practice/poc/Template
8. FAQ
对于异步HTTP请求类型的漏洞暂时无法通过Yaml Poc实现,如CVE-2024-23897。
x
x