转载https://www.sqlsec.com/2020/04/xray.html#toc-heading-2
简介
项目地址:https://github.com/chaitin/xray
长亭科技研发的一款完善的安全评估工具,支持常见Web安全问题扫描和自定义POC,虽然Github有项目,但是不开源,只提供社区版本供大家使用。
基本使用
代理模式
代理模式下的基本架构为,扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都认为自己直接与对方对话,同时记录该流量,然后修改参数并重新发送请求进行扫描。这种原理和Burpsuite的自带的漏扫原理是一样的。
生成ca证书
# 生成 ca 证书
➜ ./xray genca
# 在当前文件夹生成 ca.crt 和 ca.key 两个文件
➜ ls
ca.crt ca.key config.yaml xray
将生成的ca证书导入到需要代理的设备即可,这样就可以方便代理https的流量了
启用代理
第一次启动 xray 之后,当前目录会生成 config.yml
配置文件,选择文件编辑器打开,并按照下方说明修改。定位搜索到如下内容,将*
改为 testphp.vulnweb.com
,这是AWVS的官方靶场,方便检测漏扫能力。
# 配置解释见 https://chaitin.github.io/xray/#/configration/mitm
mitm:
...
restriction:
includes: # 允许扫描的域,此处无协议
- 'testphp.vulnweb.com' # 表示允许所有的域名和 path
...
监听本地的7777
端口,并设置漏洞报告的输出的文件名为:xray-testphp.html
➜ ./xray webscan --listen 127.0.0.1:7777 --html-output xray-testphp.html
配置代理
Chrome下的SwitchyOmega插件很方便添加各种代理,将xray的代理添加进来,然后浏览器开启xray代理即可:

开始扫描
使用刚刚设置过代理的Chrome浏览器访问:http://testphp.vulnweb.com
然后就可以看到 xray 界面开始输出漏洞信息,在用户和网站交互的时候,期间的链接xray都会进行安全检查,然后生成对应的漏洞报告:
下面是几个快速链接,可以点击用于体验更多的漏洞类型的扫描
- http://testphp.vulnweb.com/listproducts.php?cat=1
- http://testphp.vulnweb.com/artists.php?artist=2
- http://testphp.vulnweb.com/redir.php?r=http://www.w3.org
可以在上面设置的输出格式里面看到对应的漏洞检测结果报告:

爬虫模式
爬虫模式是模拟人工去点击网页的链接,然后去分析扫描,和代理模式不同的是,爬虫不需要人工的介入,访问速度要快很多,但是也有一些缺点需要注意。
- xray 的基础爬虫不能处理 js 渲染的页面
- 需要首先人工配置登录 cookie,必需的 http 头等,如果登录失败,也不容易发现问题
➜ ./xray webscan --basic-crawler http://testphp.vulnweb.com/ --html-output xray-crawler-testphp.html
在这个模式下,相当于主动扫描模式,自主分析页面的链接,然后自动探测是否有漏洞。
服务扫描
xray也支持服务扫描,目前的服务扫描的POC还不够多,目前只有一个 tomcat-cve-2020-1938 ajp 协议任意文件检测poc。
参数配置目前比较简单,支持单个扫描与批量扫描:
# 快速检测单个目标
➜ ./xray servicescan --target 127.0.0.1:8009
# 批量检查的 1.file 中的目标, 一行一个目标,带端口
➜ ./xray servicescan --target-file test.file
其中 test.file
的格式为一个行一个 service,如
10.3.0.203:8009
127.0.0.1:8009
也可以将结果输出到报告中,支持多种格式:
# 将检测结果输出到 html 报告中
➜ ./xray servicescan --target 127.0.0.1:8009 --html-output service.html
➜ ./xray servicescan --target-file test.file --html-output service.html
# 将检测结果输出到 json 文件中
➜ ./xray servicescan --target 127.0.0.1:8099 --json-output service.json
完整的servicescan用法可以使用下面命令查看:
➜ ./xray servicescan --help
NAME:
servicescan - Run a service scan task
USAGE:
servicescan [command options] [arguments…]
OPTIONS:
–target value specify the target, for example: host:8009
–target-file value load targets from a local file, one target a line
–json-output FILE output xray results to FILE in json format
–webhook-output value post xray result to url in json format
–html-output FILE output xray result to FILE in HTML format
Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)Vulhub环境链接
部署完成后,使用xray来检测看一下效果怎么样:

配置
命令详解
查看 -h
基本上我们搞安全的 基本上应该都很容易理解了:
➜ ./xray -h
USAGE:
[global options] command [command options] [arguments…]
COMMANDS:
webscan Run a webscan task
servicescan Run a service scan task
poclint lint yaml poc
reverse Run a standalone reverse server
genca Generate CA certificate and key
upgrade check new version and upgrade self if any updates found
version Show version info
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
–config FILE Load configuration from FILE
–log_level value Log level, choices are debug, info, warn, error, fatal
–help, -h show help
GLOBAL OPTIONS
全局配置 如果在这指定了,那么所有命令执行的时候都会生效
# 用于指定配置文件的位置,默认加载同目录的 config.yaml
--config FILE Load configuration from FILE
# 用于指定全局的日志配置,默认为info, 可以设置为debug查看更详细的信息
–log_level value Log level, choices are debug, info, warn, error, fatal
–help, -h show help
全局配置的使用时需要紧跟二进制程序,如:
# 正确的用法
➜ ./xray --log_level debug --config my.yaml webscan --url xxx
# 错误的用法 全局配置没有紧跟二进制程序
➜ ./xray webscan --log_level debug --config my.yaml --url xxx
COMMANDS
命令 | 说明 |
---|---|
webscan | xray核心功能,用来发现探测Web漏洞 |
servicescan | 服务扫描功能 用来探测服务漏洞 |
poclint | 检测poc是否符合规范 |
reverse | 启动单独的盲打平台服务 |
genca | 用于快速生成一个根证书,主要用于被动代理扫描HTTPS流量时用到 |
upgrade | 检查新版本并自动升级 |
version | 版本信息 |
help | 显示命令列表或一个命令的帮助 |
subdomain | 子域名扫描 高级本才有的命令 |
subdomain
扫描 example.com
,并将结果输出到 example.txt
➜ ./xray subdomain --target example.com --text-output example.txtCopyErrorCopied
扫描 example.com
,并使用 console ui 交互式界面,同时记录结果到 example.txt
➜ ./xray subdomain --target example.com --console-ui --text-output example.txt
webscan
运行 ./xray -h
,可以看到
➜ xray ./xray webscan -h
NAME:
webscan - Run a webscan task
USAGE:
webscan [command options] [arguments….]
OPTIONS:
–plugins value specify the plugins to run, separated by ‘,’
–poc value specify the poc to run, separated by ‘,’
–listen value use proxy resource collector, value is proxy addr
–basic-crawler value use a basic spider to crawl the target and scan the results
–url-file FILE read urls from a local file and scan these urls
–url value scan a single url
–data value data string to be sent through POST (e.g. ‘username=admin’)
–raw-request FILE load http raw request from a FILE
–json-output FILE output xray results to FILE in json format
–html-output FILE output xray result to FILE in HTML format
–webhook-output value post xray result to url in json format
扫描插件
--plugins
: 指定要运行的插件,使用,
分隔
--plugins xss
--plugins xss,sqldet,phantasm
--poc
:配置本次扫描启用哪些POC,使用,
分隔
# 只加载一个 POC, 精准匹配
--plugins phantasm --poc poc-yaml-thinkphp5-controller-rce
# 加载内置的所有带 thinkphp
的 POC
–plugins phantasm --poc “thinkphp”
# 加载本地 /home/test/pocs/
目录所有的 POC:
–plugins phantasm --poc “/home/test/pocs/*”
# 加载 /home/test/pocs/
下包含 thinkphp 的 POC
–plugins phantasm --poc “/home/test/pocs/thinkphp”
该参数支持Glob表达式批量加载,规则还是很灵活的。
输入来源
--listen
: 启动一个被动代理服务器作为输入,如--listen 127.0.0.1:7777
--basic-crawler
: 启用一个基础爬虫作为输入, 如--basic-crawler http://example.com
--url-file
: 批量从文件中读取URL--url
: 用于快速测试单个URL,不带爬虫,默认为GET请求--data
:指定 data,同时变为POST请求--raw-request
: 加载一个原始的 HTTP 请求并用于扫描,类似于sqlmap -r
输出格式
--json-output
: 将结果输出到一个 json 文件中,输出是JSON格式的结构化数据--html-output
: 将结果输出为 html 报告--webhook-output
: 将结果发送到一个地址,输出是JSON格式的结构化数据,需要自己搭建一个Web服务器,接收到xray发送的漏洞信息
在
--json-output
和--html-otput
参数中使用变量__timestamp__
和__datetime__
,这样文件名中对应位置会自动替换为时间戳或日期时间,避免输出到同一文件时报错。如--html-output report-__datetime__.html
将使用report-2019_11_01-10_03_26.html
作为报告文件名。
组合使用
将上面说的一些结合起来使用,就可以满足多种场景下的使用需求了:
# 使用xss模块 启用1111端口的代理服务器进行web漏洞扫描,输出漏洞报告到1.html中
➜ ./xray webscan --plugins xss --listen 127.0.0.1:1111 --html-output 1.html
# 将日志级别设置为debug 然后使用xss和命令执行插件 使用内置的爬虫来扫描,输出漏洞报告到1.json中
➜ ./xray --log_level debug webscan --plugins xss,cmd_injection --basic-crawler http://example.com --json-output 1.json
# 对目标资产进行POST方式漏洞检测,data为 x=y 并输出漏洞报告到1.json中
➜ ./xray webscan --url http://example.com --data “x=y” --html-output 2.html --json-output 1.json
# 对目标资产进行单个URL检测,路灯报告输出到指定的接受服务器中
➜ ./xray webscan --url http://example.com/ --webhook-output http://host:port/path
….
交互命令行
交互式的命令行就是新手福利了,提供命令自动补全提示,直接运行 xray 而不加任何参数即可启动交互式命令行。
配置文件
引擎初次运行时,会在当前目录内生成一个 config.yaml
文件。通过调整配置中的各种参数,可以满足不同场景下的需求。
在 xray 快速迭代时期,不保证配置文件向后兼容。如果出错,可以备份配置文件并重新生成。 实际上建议每次更新版本后都备份配置文件后删除并重新生成,以免错过新功能的配置。
插件配置
在具体插件配置之前,plugins 部分有个顶级配置项为 max_parallel
, 表示插件的并发度。举个例子,如果需要处理 3 个请求,此时启用了三个插件 sqldet, xss, cmd_injection, 当设置 max_parallel
为 1 时,处理过程为:
sqldet, xss, cmd_injection 同时处理 request1
sqldet, xss, cmd_injection 同时处理 request2
sqldet, xss, cmd_injection 同时处理 request3
当 max_parallel
设置为 3 时,处理过程为:
sql,xss,cmd_injection 同时并发(3并发)处理 request1, request2, request3
理论上时间会算缩短3倍,但这个值并非越大越好,高并发意味着同一时间发包数量大幅增加,这可能会影响远程 server 的运行和xray 对漏洞的判断,需要按需设置。
对于其他配置项,一个插件是一个配置单元,每个单元的基本格式为:
pluginName:
enabled: true/false
otherConfigrations: xxx
enabled
即为是否启用插件,所以这里只说明部分插件的特殊配置就可以了。
xss
ie_feature
如果此项为 true,则会将一些只能在IE环境下复现的漏洞爆出来,小白请不要开。include_cookie
如果此项为 true, 则会检查是否存在输入源在 cookie 中的 xss
baseline
detect_outdated_ssl_version
是否检测过期的 SSL 版本, 如果目标启用了 TLS1.1, TLS1.0, SSL3.0 都是会报一个漏洞detect_http_header_config
是否检查 header 的配置,主要检查一些安全相关的 http 头有没有确实或错误detect_cors_header_config
是否检查 cors 相关的问题detect_server_error_page
检查响应是不是一个错误页面, 支持主流框架的错误信息检测detect_china_id_card_number
检查响应中有没有身份证号信息detect_serialization_data_in_params
检查参数中是否存在序列化数据,支持 java,php,pythondetect_cookie_password_leak
检测cookie中是否存在密码泄漏detect_unsafe_scheme
检测不安全方案detect_cookie_httponly
检测cookie是否开启httponly
cmd_injection
detect_blind_injection
是否使用盲打来检查命令注入
dirscan
dictionary
配置目录字典, 需要是绝对路径dictionary
Web字典的路径
sqldet
error_based_detection
启用报错注入检测boolean_based_detection
启用布尔盲注检测time_based_detection
启用时间盲注检测
下面两个选项很危险,开启之后可以增加检测率,但是有破坏数据库数据的可能性,请务必了解工作原理之后再开启
dangerously_use_comment_in_sql
允许检查注入的时候使用注释dangerously_use_or_in_sql
允许检查注入的时候使用or
brute_force
detect_default_password
检测默认密码detect_unsafe_login_method
检测不安全的登录方法username_dictionary
弱口令用户名字典, 需要绝对路径password_dictionary
弱口令密码字典, 需要绝对路径
如果没有配置将使用内置字典,约 Top8 用户名和 Top80 密码。配置后将做字典合并,即用户字典的与内置的做合并并去重。
phantasm
depth
探测深度, 默认为1, 即只在URL深度为0, 和深度为1时运行该插件(前提是启用了该插件)poc
定义默认启用哪些POC。支持写内置POC名字和本地文件的绝对路径,如:
phantasm:
poc:
- poc-yaml-activemq-cve-2016-3088
- /Users/test/1.yml
这样方便自己添加自己的POC了
被动代理配置
这一部分主要介绍配置项中 mitm
部分相关的内容。
抓取HTTPS流量
对应于 ca_cert
和 ca_key
两项配置。
和 burp 类似,抓取 https 流量需要信任一个根证书,这个根证书可以自行生成,也可用下列自带的命令生成:
➜ ./xray genca
运行后将在当前目录生成 ca.key
和 ca.crt
, 用户手动导入证书即可,类似于BP导入证书那样。
Firefox需要单独在浏览器导入。移动端可以挂代理之后访问 http://xray/ 下载根证书
代理启用密码保护
对应于 auth
中的配置。
xray 支持给代理配置基础认证的密码,当设置好 auth
中的 username
和 password
后,使用代理时浏览器会弹框要求输出用户名密码,输入成功后代理才可正常使用。
限制漏洞扫描的范围
在 mitm 的配置中的 restrction
项指示本次漏洞的 URI 限制。
includes
表示只扫描哪些域和路径。比如*.example.com
只扫描example.com
的子域excludes
表示不扫描哪些域和路径。比如t.example.com
表示不扫描t.example.com
两个都配置的情况下会取交集,这两个配置常用于想要过滤代理中的某些域,或者只想扫描某个域的请求时。
两项配置都支持 path 过滤,如果输入的中有 /
, 那么 /
后面的表达式就是 path 的过滤。可以对照如下例子理解:
includes:
- 'example.com/test' # 表示允许 example.com/test 这一个路径
- "example.com/admin*" # 表示允许 example.com 下的 /admin 开头的所有 path
注意: 这里的 includes 和 excludes 均不支持端口号,如果加上将导致限制失效!
设置代理的IP白名单
配置中的 allow_ip_range
项可以限制哪些 IP 可以使用该代理。支持单个 IP 和 CIDR 格式的地址,如:
allow_ip_range: ["127.0.0.1","192.168.1.1/24"]CopyErrorCopied
留空则允许所有地址访问,如果来源 IP 没有在配置的地址内,使用者则会报Proxy Failed
的错误。
队列长度配置
queue:
max_length: 10000
经典的生产者消费者问题,如果生产消费速度不匹配,就需要一个中间的队列来临时存储,这个队列的大小就是 max_length
。如果 max_length
设置的过大,会造成 xray 内存占用过大,甚至可能会造成内存不足 OOM 进程崩溃。
代理请求头配置
proxy_header:
via: "" # 如果不为空,proxy 将添加类似 Via: 1.1 $some-value-$random 的 http 头
x_forwarded: false # 是否添加 X-Forwarded-{For,Host,Proto,Url} 四个 http 头
如果开启 proxy_header,代理会添加 via
头和 X-Forwarded-*
系列头。如果在请求中就已经存在了同名的 HTTP 头,那么将会追加在后面。
比如 curl http://127.0.0.1:1234 -H "Via: test" -H "X-Forwarded-For: 1.2.3.4" -v
,后端实际收到的请求将会是
GET / HTTP/1.1
Host: 127.0.0.1:1234
User-Agent: curl/7.54.0
Accept: */*
Via: test, 1.1 xray-1fe7f9e5241b2b150f32
X-Forwarded-For: 1.2.3.4, 127.0.0.1
X-Forwarded-Host: 127.0.0.1:1234
X-Forwarded-Proto: http
X-Forwarded-Url: http://127.0.0.1:1234/
Accept-Encoding: gzip
代理的代理
假如启动 xray 时配置的 listen 为 127.0.0.1:1111
,upstream_proxy
为 http://127.0.0.1:8080
, 那么浏览器设置代理为 http://127.0.0.1:1111
,整体数据流如下:

该配置仅影响代理本身,不会影响插件在漏洞探测时的发包行为
盲打平台配置
这里知识点比较多,反向盲打平台很多,如果大家对xray的这个功能感兴趣建议参考xray的官方文档,国光这里就不细写了。
HTTP配置
对于 web 扫描来说,http 协议的交互是整个过程检测过程的核心。因此这里的配置将影响到引擎进行 http 发包时的行为。
漏洞扫描用的代理 proxy
配置该项后漏洞扫描发送请求时将使用代理发送,支持 http
, https
和 socks5
三种格式,如:
http://127.0.0.1:1111
https://127.0.0.1:1111
socks5://127.0.0.1:1080
基础爬虫配置
基础爬虫的配置项对应于 basic-crawler
部分,默认的配置如下,用法参照文件中的注释
basic_crawler:
max_depth: 0 # 爬虫最大深度, 0 为无限制
max_count_of_links: 0 # 本次扫描总共爬取的最大连接数, 0 为无限制
allow_visit_parent_path: false # 是否允许访问父目录, 如果扫描目标为 example.com/a/, 如果该项为 false, 那么就不会爬取 example.com/ 这级目录的内容
restriction: # 和 mitm 中的写法一致, 有个点需要注意的是如果当前目标为 example.com 那么会自动添加 example.com 到 includes 中。
includes: []
excludes:
- '*google*'
子域名配置
注意,此功能只在高级版中提供
国光测试了这个子域名功能,可以用,但是不是很强大,不如自己采集多方面接口的域名要全,感兴趣可以参考官方文档。
检查更新配置
xray 内置了一个简单的更新检查机制,会在每次启动的时候检查有无新的版本发布,如果有更新将在界面上显示最新的 release notes。 如不需要该机制,可以通过下列方法禁用:
在 config.yaml
中添加如下配置即可禁用更新检查:
update:
check: false
xray 进阶
xray与Burpsuite联动
首先 xray 建立起 webscan 的监听
➜ ./xray webscan --listen 127.0.0.1:7777 --html-output bp.html
进入 Burp 后,打开 User options
标签页,然后找到 Upstream Proxy Servers
设置。
点击 Add
添加上游代理以及作用域,Destination host
处可以使用*
匹配多个任意字符串,?
匹配单一任意字符串,而上游代理的地址则填写 xray 的监听地址。

BP的socks代理与顶级代理服务器有冲突,不能同时勾选
接下来BP正常抓包,与此同时BP也会将我们截取到的一些流量包发到xray中进行漏洞检测。
xray与AWVS联动
首先 xray 建立起 webscan 的监听
如果你的AWVS不是安装在物理机上话,那么你的xray应该填写你AWVS可以访问的地址 国光测试填写127.0.0.1 无法与AWVS进行联动
➜ ./xray webscan --listen 192.168.31.53:7777 --html-output awvs.html
以 AWVS 13 为例,登入管理页后,点击 Targets
, 然后点击 Add Target
添加扫描目标:
这里演示的是扫描 awvs 的在线靶站 http://testphp.vulnweb.com/

下滑到HTTP
部分,填写Proxy Server
为对应的xray代理,因为国光的AWVS是在虚拟机运行的,所以我这里填写的是我物理机的ip地址(之前粗心写127.0.0.1了没有啥反应):

最后扫描类型选择 仅爬取:

此时AWVS的爬虫会把请求都转发给xray检测漏洞了,此时awvs.html
里面就躺好了漏洞:
Django调用xray
因为xray的新版本支持webhook这样很方便我们写代码调用,首先xray监听本地的7777端口,然后监听的流量进行漏洞检测,将漏洞信息同时通过webhook的方式传输到http://127.0.0.1:8000/scan/xray/
➜ ./xray webscan --listen 192.168.31.53:7777 --webhook-output http://127.0.0.1:8000/scan/xray/
http://127.0.0.1:8000/scan/xray/
这个是国光用Django写的接口,下面是这个接口简单的实现代码:
import json
from django.shortcuts import render
from django.views.generic.base import View
from django.views.decorators.csrf import csrf_exempt
class WebHook(View):
@csrf_exempt
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(self, request):
vul_data = json.loads(request.body)
if ‘detail’ in str(request.body):
print(‘漏洞插件:’, vul_data[‘plugin’])
print(‘漏洞位置:’, vul_data[‘target’][‘url’])
print(‘漏洞分类:’, vul_data[‘vuln_class’])
return render(request, ‘test.html’, {
})
因为Django安全机制问题,xray post提交请求到Django必须填写CSRF Token才可以,解决方法就是手动关掉这个类的CSRF检测@csrf_exempt