xray使用教程
xray是P神还在长亭的时候开发的一款漏扫,分了社区版、高级版和企业版(洞监),虽然都不开源,但社区版能够免费使用,高级版只要贡献PoC就能获取授权。之前浅尝过同样是漏扫的AWVS,感觉体验还可以,这次来试一下xray怎样。
官方文档:xray 安全评估工具文档
安装
下载地址:https://github.com/chaitin/xray/releases
直接是二进制文件可以直接运行:
.\xray_windows_amd64.exe webscan -h
基本使用
代理模式
代理模式下的基本架构为,扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都认为自己直接与对方对话,同时记录该流量,然后修改参数并重新发送请求进行扫描。这种原理和 Burpsuite 的自带的漏扫原理是一样的。
生成 ca 证书
PS E:\Tool\Web\xray> .\xray_windows_amd64.exe genca
____ ___.________. ____. _____.___.
\ \/ /\_ __ \ / _ \ \__ | |
\ / | _ _/ / /_\ \ / | |
/ \ | | \/ | \ \____ |
\___/\ \ |____| /\____|_ / / _____/
\_/ \_/ \_/ \/
Version: 1.8.4/a47961e0/COMMUNITY
CA certificate ca.crt and key ca.key generated
PS E:\Tool\Web\xray> ls
目录: E:\Tool\Web\xray
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 2022/6/10 10:21 1513 ca.crt
-ar--- 2022/6/10 10:21 1679 ca.key
-a---- 2022/6/9 18:28 13735 config.yaml
-a---- 2022/1/30 15:47 47863296 xray_windows_amd64.exe
将生成的 ca 证书导入到需要代理的设备即可,这样就可以方便代理 https 的流量了。
这里以window下为例:
- 双击
ca.crt
,然后按照下图的步骤操作。
后面就一路确认即可。
启用代理
第一次启动 xray 之后,当前目录会生成 config.yml
文件,选择文件编辑器打开,并按照下方说明修改。定位搜索到如下内容,往里面添加 testphp.vulnweb.com
,这是AWVS的官方靶场,方便检测漏扫能力。
mitm:
...
restriction: # 代理能够访问的资源限制, 以下各项为空表示不限制
hostname_allowed: # 允许访问的 Hostname,支持格式如 t.com、*.t.com、1.1.1.1、1.1.1.1/24、1.1-4.1.1-8
- testphp.vulnweb.com
因为我们的测试目标站就是 http://testphp.vulnweb.com
,增加这个过滤之后,xray 将只会扫描该站的流量,避免扫描到非授权目标站点。
监听本地的7777
端口,并设置漏洞报告的输出的文件名为:xray-testphp.html
.\xray_windows_amd64.exe 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 头等,如果登录失败,也不容易发现问题。打开配置文件,修改
http
配置部分的Headers
项:
http:
headers:
Cookie: key=valueCopyErrorCopied
上述配置将为所有请求(包括爬虫和漏洞扫描)增加一条 Cookie key=value
在这个模式下,相当于主动扫描模式,自主分析页面的链接,然后自动探测是否有漏洞。
服务扫描
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
完整用法:
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
--html-output FILE output xray result to `FILE` in HTML format
尝试在本地部署Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)Vulhub环境链接来测试下:
.\xray_windows_amd64.exe servicescan --target 127.0.0.1:8009
配置
命令详解
查看 -h
基本上我们搞安全的 基本上应该都很容易理解了:
PS E:\Tool\Web\xray> .\xray_windows_amd64.exe -h
____ ___.________. ____. _____.___.
\ \/ /\_ __ \ / _ \ \__ | |
\ / | _ _/ / /_\ \ / | |
/ \ | | \/ | \ \____ |
\___/\ \ |____| /\____|_ / / _____/
\_/ \_/ \_/ \/
Version: 1.8.4/a47961e0/COMMUNITY
NAME:
xray - A powerful scanner engine [https://docs.xray.cool]
USAGE:
[global options] command [command options] [arguments...]
COMMANDS:
webscan, ws Run a webscan task
servicescan, ss Run a service scan task
subdomain, sd Run a subdomain task
poclint, pl lint yaml poc
transform transform other script to gamma
reverse Run a standalone reverse server
convert convert results from json to html or from html to json
genca GenerateToFile 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 (default: "config.yaml")
--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.txt
扫描 example.com
,并使用 console ui 交互式界面,同时记录结果到 example.txt
➜ ./xray subdomain --target example.com --console-ui --text-output example.txt
webscan
PS E:\Tool\Web\xray> .\xray_windows_amd64.exe webscan -h
____ ___.________. ____. _____.___.
\ \/ /\_ __ \ / _ \ \__ | |
\ / | _ _/ / /_\ \ / | |
/ \ | | \/ | \ \____ |
\___/\ \ |____| /\____|_ / / _____/
\_/ \_/ \_/ \/
Version: 1.8.4/a47961e0/COMMUNITY
NAME:
webscan - Run a webscan task
USAGE:
webscan [command options] [arguments...]
OPTIONS:
--list, -l list plugins
--plugins value, --plugin value, --plug value specify the plugins to run, separated by ','
--poc value, -p value specify the poc to run, separated by ','
--listen value use proxy resource collector, value is proxy addr, (example: 127.0.0.1:1111)
--basic-crawler value, --basic value use a basic spider to crawl the target and scan the requests
--browser-crawler value, --browser value use a browser spider to crawl the target and scan the requests
--url-file value, --uf value read urls from a local file and scan these urls, one url per line
--burp-file value, --bf value read requests from burpsuite exported file as targets
--url value, -u value scan a **single** url
--data value, -d value data string to be sent through POST (e.g. 'username=admin')
--raw-request FILE, --rr FILE load http raw request from a FILE
--force-ssl, --fs force usage of SSL/HTTPS for raw-request
--json-output FILE, --jo FILE output xray results to FILE in json format
--html-output FILE, --ho FILE output xray result to FILE in HTML format
--webhook-output value, --wo 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*"
输入来源
--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
配置文件
引擎初次运行时,会在当前目录内生成一个 config.yaml
文件。通过调整配置中的各种参数,可以满足不同场景下的需求。
在 xray 快速迭代时期,不保证配置文件向后兼容。如果出错,可以备份配置文件并重新生成。 实际上建议每次更新版本后都备份配置文件后删除并重新生成,以免错过新功能的配置。
并发配置
在配置文件中可以用下面的配置改变漏洞探测的 worker 数量:
parallel: 30 # 漏洞探测的 worker 数量,可以简单理解为同时有 30 个 POC 在运行
但这个值并非越大越好,高并发意味着同一时间发包数量大幅增加,这可能会影响远程 server 的运行和xray对漏洞的判断,需要按需设置。一般默认的30即可。
HTTP 配置
对于 web 扫描来说,http 协议的交互是整个过程检测过程的核心。因此这里的配置将影响到引擎进行 http 发包时的行为。
http:
proxy: "" # 漏洞扫描时使用的代理,如: http://127.0.0.1:8080。 如需设置多个代理,请使用 proxy_rule 或自行创建上层代理
proxy_rule: [] # 漏洞扫描使用多个代理的配置规则, 具体请参照文档
dial_timeout: 5 # 建立 tcp 连接的超时时间
read_timeout: 10 # 读取 http 响应的超时时间,不可太小,否则会影响到 sql 时间盲注的判断
max_conns_per_host: 50 # 同一 host 最大允许的连接数,可以根据目标主机性能适当增大
enable_http2: false # 是否启用 http2, 开启可以提升部分网站的速度,但目前不稳定有崩溃的风险
fail_retries: 0 # 请求失败的重试次数,0 则不重试
max_redirect: 5 # 单个请求最大允许的跳转数
max_resp_body_size: 2097152 # 最大允许的响应大小, 默认 2M
max_qps: 500 # 每秒最大请求数
allow_methods: # 允许的请求方法
- HEAD
- GET
- POST
- PUT
- PATCH
- DELETE
- OPTIONS
- CONNECT
- TRACE
- MOVE
- PROPFIND
headers:
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0
# Cookie: key=value
扫描所用的代理
配置该项后漏洞扫描发送请求时将使用代理发送(可用于扫内网?),支持 http
, https
和 socks5
三种格式,如:
http://127.0.0.1:1111
https://127.0.0.1:1111
socks5://127.0.0.1:1080
如果代理需要认证,可以使用下面的格式 http://user:password@127.0.0.1:1111
多代理设置
在漏洞扫描的时候,可能想不同的域名使用不同的代理,设置多个代理切换等,可以通过 proxy_rule
字段来配置。需要注意的是,proxy
配置将优先于本配置。
proxy_rule:
- match: "*host1"
servers:
- addr: "http://127.0.0.1:8001"
weight: 1
- addr: "http://127.0.0.1:8002"
weight: 2
- match: "*"
servers:
- addr: "http://127.0.0.1:8003"
weight: 1
- addr: "http://127.0.0.1:8004"
weight: 5
- match: 请求的 url 的主机名如果匹配,就使用本条规则。
- 如果是
*
,则代表可以匹配所有。所以一定要将*
放在最后面,上面没有匹配到的域名都将使用这个配置。 - 如果没有任何一条可以匹配,这个请求将不会使用代理。
- addr: 代理服务器的地址,同
proxy
的配置。 - weight: 代理服务器的权重,如果
servers
中配置了多个代理服务器,设置权重可以均衡负载,比如权重是3:7
,则代表每 10 个请求,有 3 个选择 server1,有 7 个选择 server2。要注意的是,这里是 round bin 算法,前 3 个一定发往 server1,后面 7 个一定发往 server2,然后继续循环,不是每个请求都是基于权重随机的。 - match: 请求的 url 的主机名如果匹配,就使用本条规则。
- 如果是
*
,则代表可以匹配所有。所以一定要将*
放在最后面,上面没有匹配到的域名都将使用这个配置。 - 如果没有任何一条可以匹配,这个请求将不会使用代理。
- addr: 代理服务器的地址,同
proxy
的配置。 - weight: 代理服务器的权重,如果
servers
中配置了多个代理服务器,设置权重可以均衡负载,比如权重是3:7
,则代表每 10 个请求,有 3 个选择 server1,有 7 个选择 server2。要注意的是,这里是 round bin 算法,前 3 个一定发往 server1,后面 7 个一定发往 server2,然后继续循环,不是每个请求都是基于权重随机的。
限制发包速度
默认值 500, 因为最大允许每秒发送 500 个请求。一般来说这个值够快了,通常是为了避免被ban,会把该值改的小一些,极限情况支持设置为 1, 表示每秒只能发送一个请求。
插件配置
这一部分的每个配置项的 key 是插件名称,value 是与该插件相关的配置。 每个部分的结构大致如下
pluginName:
enabled: true/false
otherConfigrations: xxxCopyErrorCopied
enabled
即为是否启用插件, 其它的配置如果有,则是当前插件的一些特殊配置。
dirscan
depth
深度限制dictionary
配置目录字典, 需要是绝对路径, 配置后将与内置字典合并
sqldet
error_based_detection
启用报错注入检测boolean_based_detection
启用布尔盲注检测time_based_detection
启用时间盲注检测
下面两个选项很危险,开启之后可以增加检测率,但是有破坏数据库数据的可能性,请务必了解工作原理之后再开启
dangerously_use_comment_in_sql
允许检查注入的时候使用注释dangerously_use_or_in_sql
允许检查注入的时候使用or
phantasm
phantasm 是 xray 的 poc 框架,在其下运行着许多 yaml 和 go 写的 poc,用户可以通过该模块编写自己的 poc 并让 xray 加载:
depth: 1 # 与 dirscan 一样,不再赘述
exclude_poc: [] # 排除哪些 poc, 支持 glob 语法, 如: /home/poc/*thinkphp* 或 poc-yaml-weblogic*
local_poc: [] # 加载本地的 poc, 支持 glob 语法, 如: /home/poc/*
exclude_poc
用于去除加载哪些 poc。一个常见的 case 是如果发现某些 poc 误报比较多,想暂时禁用掉(并反馈给 xray),那么就可以在这一个配置中加上 poc 的名字,比如:
plugins:
...
phantasm:
enabled: true
exclude_poc:
- poc-yaml-bad-poc
- *bad-poc*
local_poc
是用于加载本地的 poc 的配置,最好指定绝对路径,且同样支持 glob 语法。
一个稍微复杂的情况是将这两个搭配起来使用,比如:
plugins:
...
phantasm:
enabled: true
exclude_poc:
- /home/poc/poc-fake-good-poc
local_poc:
- /home/poc/*good-poc*
上述配置的意思是加载 /home/poc/
目录下所有符合 *good-poc*
这个pattern 的poc,同时去掉同样目录下的 poc-fake-good-poc
被动代理配置
这一部分主要介绍配置项中 mitm
部分相关的内容。
抓取HTTPS流量
对应于 ca_cert
和 ca_key
两项配置。
和 burp 类似,抓取 https 流量需要信任一个根证书,这个根证书可以自行生成,也可用下列自带的命令生成:
./xray genca
运行后将在当前目录生成 ca.key
和 ca.crt
, 用户手动导入证书即可,类似于BP导入证书那样。
Firefox需要单独在浏览器导入。移动端可以挂代理之后访问 http://xray/ 下载根证书
代理启用密码保护
对应于 auth
中的配置。
xray 支持给代理配置基础认证的密码,当设置好 auth
中的 username
和 password
后,使用代理时浏览器会弹框要求输出用户名密码,输入成功后代理才可正常使用。
设置代理的IP白名单
配置中的 allow_ip_range
项可以限制哪些 IP 可以使用该代理。支持单个 IP 和 CIDR 格式的地址,如:
allow_ip_range: ["127.0.0.1","192.168.1.1/24"]
留空则允许所有地址访问,如果来源 IP 没有在配置的地址内,使用者则会报Proxy Failed
的错误。
限制漏洞扫描的范围
配置中的 restriction
项可以限制哪些域名、端口、路径、请求参数等等参数可以使用该代理,以域名为例:
hostname_allowed
表示只扫描哪些域和路径。如*.example.com
表示只扫描example.com
的子域hostname_disallowed
表示不扫描哪些域和路径。比如t.example.com
表示不扫描t.example.com
队列长度配置
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
,整体数据流如下:
该配置仅影响代理本身,不会影响插件在漏洞探测时的发包行为
基础爬虫配置
基础爬虫的配置项对应于 basic-crawler
部分,默认的配置如下,用法参照文件中的注释
basic-crawler:
max_depth: 0 # 最大爬取深度, 0 为无限制
max_count_of_links: 0 # 本次爬取收集的最大链接数, 0 为无限制
allow_visit_parent_path: false # 是否允许爬取父目录, 如果扫描目标为 t.com/a/且该项为 false, 那么就不会爬取 t.com/ 这级的内容
restriction: # 爬虫的允许爬取的资源限制, 为空表示不限制。爬虫会自动添加扫描目标到 Hostname_allowed。
hostname_allowed: [] # 允许访问的 Hostname,支持格式如 t.com、*.t.com、1.1.1.1、1.1.1.1/24、1.1-4.1.1-8
hostname_disallowed: # 不允许访问的 Hostname,支持格式如 t.com、*.t.com、1.1.1.1、1.1.1.1/24、1.1-4.1.1-8
- '*google*'
子域名配置
高级版功能,看国光师傅的博客说并不好用
反连平台
反连平台常用于解决没有回显的漏洞探测的情况,最常见的应该属于 ssrf 和 存储型xss。渗透测试人员常用的 xss 平台就是反连平台。 这里的配置比较复杂,具体可翻阅官方文档的这部分:反连平台;如果以后用到了再作说明。
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与crawlergo联动
crawlergo是一个使用chrome headless
模式进行URL收集的浏览器爬虫。可以收集一个域名下的动态链接,并且有很快的速度,所以使用crawlergo进行爬虫+xray进行漏扫可以实现对网站漏洞全自动扫描的效果。