XRAY 扫描器

2022-11-02 14:07:30 浏览数 (1)

前言

XRAY扫描器之前是一位朋友介绍给我用的,说是对挖掘漏洞有很大的帮助,后来我也认真深入做了一番了解,在网上搜集了一些学习的文章资料,主要参考学习了XRAY官方文档以及国光-xray Web扫描器学习记录 ,发现这XRAY扫描器确实不错,功能很多,扩展性也非常强大,尤其是可以配合第三方扫描器联动,对漏洞检测真是如虎添翼。

0x001 XRAY 扫描器

xray 是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动、被动多种扫描方式,自备盲打平台、可以灵活定义 POC,功能丰富,调用简单,支持 Windows / macOS / Linux 多种操作系统,可以满足广大安全从业者的自动化 Web 漏洞探测需求。

  • GitHub地址:https://github.com/chaitin/xray
  • 官方文档:https://xray.cool/xray/#/tutorial/introduce

0x002 代理模式

1. 生成CA证书

代码语言:javascript复制
.xray.exe genca

运行命令之后,将在当前文件夹生成 ca.crtca.key 两个文件。

注意:本命令只需要第一次使用的时候运行即可,如果文件已经存在再次运行会报错,需要先删除本地的 ca.crtca.key 文件。

2. 安装CA证书

打开 火狐浏览器 > 选项设置 > 隐私与安全 > 查看证书(在页面底部) > 证书颁发机构 > 导入证书 > ca.crt

详细操作:https://jingyan.baidu.com/article/ca2d939d62d7eaeb6c31ced0.html

3. 开启代理

火狐浏览器安装插件 FoxyProxy Standard,监听本地7777端口,添加配置如下

然后点击右上角的插件图标,选择 xray 代理

4. 开始扫描

在扫描之前,我们还需要做一些必要的设置

第一次启动 xray 之后,当前目录会生成 config.yml 文件,选择文件编辑器打开,并按照下方说明修改。

定位到如下内容,在 includes: 下添加测试目标的站点域名,这里以AWVS官方的靶场为例 testphp.vulnweb.com,可以根据你实际测试目标替换。

代码语言:javascript复制
mitm:
  ...
  restriction:
    includes:
    - "testphp.vulnweb.com"
    ...

监听本地的7777端口,并设置漏洞报告的输出的文件,支持多种格式

代码语言:javascript复制
输出html格式文件报告
.xray.exe webscan --listen 127.0.0.1:7777 --html-output xray-testphp.html

输出json格式文件报告
.xray.exe webscan --listen 127.0.0.1:7777 --json-output xray-testphp.json

运行完该命令后,在火狐浏览器中访问 http://testphp.vulnweb.com 网站,然后在浏览器访问本地生成的 xray-testphp.html ,查看漏洞报告

注意:输出的漏洞报告文件是根据你实际手动浏览的页面而生成的,所以尽量多点击访问测试目标域名下的各个页面

下面是几个快速链接,可以点击用于体验更多的漏洞类型的扫描

  • 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

在命令行可以使用 ctrl c 按键,退出xray扫描

0x003 快速使用

1. 爬虫模式

爬虫模式是模拟人工去点击网页的链接,然后去分析扫描,和代理模式不同的是,爬虫不需要人工的介入,访问速度要快很多,但是也有一些缺点需要注意:

  • xray 的基础爬虫不能处理 js 渲染的页面,如果需要此功能,请参考 版本对比
  • 需要首先人工配置登录 cookie,必需的 http 头等,如果登录失败,也不容易发现问题
代码语言:javascript复制
.xray.exe webscan --basic-crawler http://testphp.vulnweb.com/ --html-output xray-crawler-testphp.html

2. 服务扫描

xray 支持服务扫描,但目前只有一个 tomcat-cve-2020-1938 AJP 协议(端口8009) 任意文件检测 POC。

代码语言:javascript复制
快速检测单个目标
./xray.exe servicescan --target 127.0.0.1:8009

批量检查的 1.file 中的目标, 一行一个目标,带端口
./xray.exe servicescan --target-file 1.file

其中 1.file 的格式为一个行一个 service,如

代码语言:javascript复制
10.3.0.203:8009
127.0.0.1:8009

3. 插件扫描

默认情况下,将会启用所有内置插件,可以使用下列命令指定本次扫描启用的插件。

代码语言:javascript复制
.xray.exe webscan --plugins cmd_injection,sqldet --url http://example.com
.xray.exe webscan --plugins cmd_injection,sqldet --listen 127.0.0.1:7777

指定插件输出,可以指定将本次扫描的漏洞信息输出到某个格式文件中:

代码语言:javascript复制
xray webscan --url http://example.com/?a=b --text-output result.txt
xray webscan --url http://example.com/?a=b --json-output result.json
xray webscan --url http://example.com/?a=b --html-output report.html

0x004 XRAY 配置

1. 命令详解

使用 -h 参数可以查看命令帮助

代码语言:javascript复制
.xray.exe -h

 __   __  _____              __     __
   / / |  __       /         / /
   V /  | |__) |    /        _/ /
   > <   |  _  /    / /         /
  / .   | |     / ____      | |
 /_/ _ |_|  _ /_/    _    |_|


Version: 0.21.8/92b968e0/COMMUNITY

NAME:
   xray - A powerful scanner engine [https://xray.cool]

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
   --help, -h     show help
GLOBAL OPTIONS

全局配置:所有命令执行的时候都会生效

代码语言:javascript复制
--config 用于指定配置文件的位置,默认加载同目录的config.yaml。
--log_level 用于指定全局的日志配置,默认为info,可以通过设置为debug来查看更详细的信息。

全局配置的使用时需要紧跟二进制程序,如:

代码语言:javascript复制
正确用法
.xray.exe --log_level debug --config 1.yaml webscan --url xxx
.xray.exe --log_level debug reverse

错误用法
.xray.exe webscan --log_level debug
COMMANDS

命令

说明

webscan

xray核心功能,用来发现探测Web漏洞

servicescan

服务扫描功能 用来探测服务漏洞

poclint

检测poc是否符合规范

reverse

启动单独的盲打平台服务

genca

用于快速生成一个根证书,主要用于被动代理扫描HTTPS流量时用到

upgrade

检查新版本并自动升级

version

版本信息

help

显示命令列表或一个命令的帮助

webscan

webscan 是 xray 核心功能,用来发现探测Web漏洞。重点介绍下命令使用

查看帮助命令

代码语言:javascript复制
.xray.exe webscan -h

 __   __  _____              __     __
   / / |  __       /         / /
   V /  | |__) |    /        _/ /
   > <   |  _  /    / /         /
  / .   | |     / ____      | |
 /_/ _ |_|  _ /_/    _    |_|


Version: 0.21.8/92b968e0/COMMUNITY

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 value        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: 指定要运行的插件,使用,分隔

代码语言:javascript复制
--plugins xss
--plugins xss,sqldet,phantasm

--poc: 配置本次扫描启用哪些POC,使用,分隔

代码语言:javascript复制
只加载一个 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*"

...
配置输入来源
代码语言:javascript复制
--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
配置输出格式
代码语言:javascript复制
--txt-output:  将结果输出为 txt 报告
--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作为报告文件名。

联合使用

将上面说的一些结合起来使用,就可以满足多种场景下的使用需求了

代码语言:javascript复制
使用xss模块 启用1111端口的代理服务器进行web漏洞扫描,输出漏洞报告到1.html中
.xray.exe webscan --plugins xss --listen 127.0.0.1:1111 --html-output 1.html

将日志级别设置为debug 然后使用xss和命令执行插件 使用内置的爬虫来扫描,输出漏洞报告到1.json中
.xray.exe --log_level debug webscan --plugins xss,cmd_injection --basic-crawler http://example.com --json-output 1.json

对目标资产进行POST方式漏洞检测,data为 x=y 并输出漏洞报告到1.json中
.xray.exe webscan --url http://example.com --data "x=y" --html-output 2.html --json-output 1.json

对目标资产进行单个URL检测,路灯报告输出到指定的接受服务器中
.xray.exe webscan --url http://example.com/ --webhook-output http://host:port/path

2. 配置文件

插件配置

在具体插件配置之前,plugins 部分有个顶级配置项为 max_parallel, 表示插件的并发度。举个例子,如果需要处理 3 个请求,此时启用了三个插件 sqldet, xss, cmd_injection, 当设置 max_parallel 为 1 时,处理过程为:

代码语言:javascript复制
sqldet, xss, cmd_injection 同时处理 request1
sqldet, xss, cmd_injection 同时处理 request2
sqldet, xss, cmd_injection 同时处理 request3

max_parallel 设置为 3 时,处理过程为:

代码语言:javascript复制
sql,xss,cmd_injection 同时并发(3并发)处理 request1, request2, request3

理论上时间会算缩短3倍,但这个值并非越大越好,高并发意味着同一时间发包数量大幅增加,这可能会影响远程 server 的运行和 xray 对漏洞的判断,需要按需设置。

对于其他配置项,一个插件是一个配置单元,每个单元的基本格式为:

代码语言:javascript复制
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,python
cmd_injection
  • detect_blind_injection 是否使用盲打来检查命令注入
dirscan
  • dictionary 配置目录字典, 需要是绝对路径
sqldet
  • error_based_detection 启用报错注入检测
  • boolean_based_detection 启用布尔盲注检测
  • time_based_detection 启用时间盲注检测

下面两个选项很危险,开启之后可以增加检测率,但是有破坏数据库数据的可能性,请务必了解工作原理之后再开启

  • dangerously_use_comment_in_sql 允许检查注入的时候使用注释
  • dangerously_use_or_in_sql 允许检查注入的时候使用 or
brute_force
  • username_dictionary 弱口令用户名字典, 需要绝对路径
  • password_dictionary 弱口令密码字典, 需要绝对路径

如果没有配置将使用内置字典,约 Top8 用户名和 Top80 密码。配置后将做字典合并,即用户字典的与内置的做合并并去重。

phantasm
  • depth 探测深度, 默认为 1, 即只在 URL 深度为 0, 和深度为 1 时运行该插件(前提是启用了该插件)
  • poc 定义默认启用哪些 POC。支持写内置 poc 名字和本地文件的绝对路径,如:
代码语言:javascript复制
phantasm:
    poc:
    - poc-yaml-activemq-cve-2016-3088
    - /Users/test/1.yml
被动代理配置

这一部分主要介绍配置项中 mitm 部分相关的内容。

代码语言:javascript复制
mitm:
  ca_cert: ./ca.crt # ca 根证书
  ca_key: ./ca.key # ca 根秘钥
  auth:
    username: ""
    password: ""
  restriction:
    includes: # 允许扫描的域
    - '*' # 表示允许所有的域名和 path
    - "example.com/admin*" # 表示允许 example.com 下的 /admin 开头的 path
    excludes:
    - '*google*'
    - '*github*'
    - '*.gov.cn'
    - '*.edu.cn'
  queue:
    max_length: 10000
  proxy_header:
    via: "" # 如果不为空,proxy 将添加类似 Via: 1.1 $some-value-$random 的 http 头
    x_forwarded: false # 是否添加 X-Forwarded-{For,Host,Proto,Url} 四个 http 头
  upstream_proxy: "" # mitm 的全部流量继续使用 proxy
抓取HTTPS流量

对应于 ca_certca_key 两项配置。

和 burp 类似,抓取 https 流量需要信任一个根证书,这个根证书可以自行生成,也可用下列自带的命令生成:

代码语言:javascript复制
.xray.exe genca

运行后将在当前目录生成 ca.keyca.crt, 用户手动导入证书即可,类似于 Burp 导入证书那样。

如何配置浏览器代理,点击查看 官方文档:配置代理

代理启用密码保护

对应于 auth 中的配置。

xray 支持给代理配置基础认证的密码,当设置好 auth 中的 usernamepassword 后,使用代理时浏览器会弹框要求输出用户名密码,输入成功后代理才可正常使用。

限制漏洞扫描的范围

在 mitm 的配置中的 restrction 项指示本次漏洞的 URI 限制。

  1. includes表示只扫描哪些域和路径。比如 *.example.com 只扫描 example.com 的子域
  2. excludes 表示不扫描哪些域和路径。比如 t.example.com 表示不扫描 t.example.com

两个都配置的情况下会取交集,这两个配置常用于想要过滤代理中的某些域,或者只想扫描某个域的请求时。

两项配置都支持 path 过滤,如果输入的中有 /, 那么 / 后面的表达式就是 path 的过滤。可以对照如下例子理解:

代码语言:javascript复制
includes:
  - 'example.com/test' # 表示允许 example.com/test 这一个路径
  - "example.com/admin*" # 表示允许 example.com 下的 /admin 开头的所有 path

注意: 这里的 includesexcludes 均不支持端口号,如果加上将导致限制失效!

限制允许使用代理的 IP

配置中的 allow_ip_range 项可以限制哪些 IP 可以使用该代理。支持单个 IP 和 CIDR 格式的地址,如:

代码语言:javascript复制
allow_ip_range: ["127.0.0.1","192.168.1.1/24"]

留空则允许所有地址访问,如果来源 IP 没有在配置的地址内,使用者则会报Proxy Failed的错误。

队列长度配置

经典的生产者消费者问题,如果生产消费速度不匹配,就需要一个中间的队列来临时存储,这个队列的大小就是 max_length。如果 max_length 设置的过大,会造成 xray 内存占用过大,甚至可能会造成内存不足 OOM 进程崩溃。

代码语言:javascript复制
queue:
    max_length: 10000
代理请求头配置
代码语言:javascript复制
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,后端实际收到的请求将会是

代码语言:javascript复制
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 时配置的 listen127.0.0.1:1111upstream_proxyhttp://127.0.0.1:8080, 那么浏览器设置代理为 http://127.0.0.1:1111,整体数据流如下:

该配置仅影响代理本身,不会影响插件在漏洞探测时的发包行为

HTTP配置

对于 web 扫描来说,http 协议的交互是整个过程检测过程的核心。因此这里的配置将影响到引擎进行 http 发包时的行为。

代码语言:javascript复制
http:
  proxy: "" # 漏洞探测使用的代理, 如 http://127.0.0.1:8080
  dial_timeout: 5 # 建立 tcp 连接的超时时间
  read_timeout: 30 # 读取 http 响应的超时时间,不可太小,否则会影响到 sql 时间盲注的判断
  fail_retries: 1 # 请求失败的重试次数,0 则不重试
  max_qps: 500 # 每秒最大请求数
  max_redirect: 5 # 单个请求最大允许的跳转数
  max_conns_per_host: 50 # 同一 host 最大允许的连接数,可以根据目标主机性能适当增大。
  max_resp_body_size: 8388608 # 8M,单个请求最大允许的响应体大小,超过该值 body 就会被截断
  headers: # 每个请求预置的 http 头
    UserAgent:
      - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169
  cookies: # 每个请求预置的 cookie 值,效果上相当于添加了一个 Header: Cookie: key=value
    key: value
  allow_methods: # 允许使用 http 方法
    - HEAD
    - GET
    - POST
    - PUT
    - DELETE
    - OPTIONS
    - CONNECT
  tls_skip_verify: true # 是否验证目标网站的 https 证书。
盲打平台配置

这里参考xray的官方文档:https://xray.cool/xray/#/configration/reverse

漏洞扫描用的代理

配置该项后漏洞扫描发送请求时将使用代理发送,支持 http, https 和 socks5 三种格式,如:

代码语言:javascript复制
http://127.0.0.1:1111
https://127.0.0.1:1111
socks5://127.0.0.1:1080
基础爬虫配置

基础爬虫的配置项对应于 basic-crawler 部分,默认的配置如下,用法参照文件中的注释

代码语言:javascript复制
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 中添加如下配置即可禁用更新检查:

代码语言:javascript复制
update:
  check: false

0x005 XRAY联动

1. XRAY与Burp联动

在实际测试过程中,除了被动扫描,也时常需要手工测试。这里使用 Burp 的原生功能与 xray 建立起一个多层代理,让流量从 Burp 转发到 xray 中。

首先 xray 建立起 webscan 的监听

代码语言:javascript复制
.xray.exe webscan --listen 0.0.0.0:1111 --html-output Burp.html

进入 Burp 后,打开 User options 标签页,然后找到 Upstream Proxy Servers 设置。

点击 Add 添加上游代理以及作用域,Destination host处可以使用*匹配多个任意字符串,?匹配单一任意字符串,而上游代理的地址则填写 xray 的监听地址。

此时浏览器端需要使用 Burp 的端口8080代理,与前文xray的配置方法一样,只是端口不同

接下来使用Burp正常抓包,截取流量

放包时,Burp会将我们截取到的流量包转发到xray中进行漏洞检测

至此,xray与Burp联动成功。

2. XRAY与AppScan联动

注意:在联动之前,确保在配置文件_config.yaml文件中,定位到如下内容,在 includes: 中改为 * 或者你想要扫描的域名地址,否则会收不到数据

代码语言:javascript复制
mitm:
  ...
  restriction:
    includes: # 允许扫描的域
    - "*" # 表示允许所有的域名和 path
    ...

首先 xray 建立起 webscan 的监听,0.0.0.0:1111 表示监听本地所有网卡的1111端口

代码语言:javascript复制
.xray.exe webscan --listen 0.0.0.0:1111 --html-output appscan.html

打开AppScan,新建一个站点扫描,注意勾选配置代理

代理设置为 127.0.0.1:1111

之后根据默认配置直接开始扫描

xray接收到了AppScan转发的数据并分析检测漏洞

至此,xray与AppScan联动成功。

3. XRAY与AWVS联动

这里测试的是 AWVS 10.5 版本的,之前测试了 AWVS 13 web 版的代理一直不成功,可能是我使用破解版无法使用代理的缘故,一直找不到方法解决,所以放弃了。但是用10.5版本的成功了,方法都是一样的,改AWVS的代理配置即可完成联动。

每次联动前,确保你的 _config.yaml 配置的允许扫描域名正确

代码语言:javascript复制
mitm:
  ...
  restriction:
    includes: # 允许扫描的域
    - "*" # 表示允许所有的域名和 path
    ...

首先 xray 建立起 webscan 的监听,0.0.0.0:1111 表示监听本地所有网卡的1111端口

代码语言:javascript复制
.xray.exe webscan --listen 0.0.0.0:1111 --html-output awvs.html

打开AWVS,新建一个站点扫描,测试目标:http://testphp.vulnweb.com/

进入扫描配置

代理设置为 127.0.0.1:1111

之后根据默认配置直接开始扫描

xray接收到了AWVS转发的数据并分析检测漏洞

至此,xray与AWVS联动成功。

参考文章

  • https://www.sqlsec.com/2020/04/xray.html
  • https://xray.cool/xray/#/tutorial/introduce

0 人点赞