xray Web 扫描器学习记录
2023-4-25 12:4:20 Author: 白帽子左一(查看原文) 阅读量:30 收藏

扫码领资料

获网安教程

免费&进群

长亭科技的 xray 扫描器的扫描效果还不错,在国内颇受好评,很有幸以前在长亭科技工作,技术氛围很好。扯得有点远了,话不多说,本文是是 xray 国光的学习记录,也可以当做新手的 xray 教程来用,不过我还是建议大家看看官方文档,只是国光我最近喜欢上了这种学习记录的感觉,学习效率很高。

项目地址:https://github.com/chaitin/xray

长亭科技研发的一款完善的安全评估工具,支持常见 Web 安全问题扫描和自定义 POC,虽然 Github 有项目,但是不开源,只提供社区版本供大家使用。

代理模式

代理模式下的基本架构为,扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都认为自己直接与对方对话,同时记录该流量,然后修改参数并重新发送请求进行扫描。这种原理和 Burpsuite 的自带的漏扫原理是一样的。

生成 ca 证书

BASH

#  生成 ca 证书
➜ ./xray genca

# 在当前文件夹生成 ca.crt 和 ca.key 两个文件
ls
ca.crt ca.key config.yaml xray

将生成的 ca 证书导入到需要代理的设备即可,这样就可以方便代理 https 的流量了

启用代理

第一次启动 xray 之后,当前目录会生成 config.yml 配置文件,选择文件编辑器打开,并按照下方说明修改。定位搜索到如下内容,将 * 改为 testphp.vulnweb.com,这是 AWVS 的官方靶场,方便检测漏扫能力。

YAML

# 配置解释见 https://chaitin.github.io/xray/#/configration/mitm
mitm:
...
restriction:
includes: # 允许扫描的域,此处无协议
- 'testphp.vulnweb.com' # 表示允许所有的域名和 path
...

监听本地的 7777 端口,并设置漏洞报告的输出的文件名为:xray-testphp.html

BASH

➜ ./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 头等,如果登录失败,也不容易发现问题

BASH

➜ ./xray webscan --basic-crawler http://testphp.vulnweb.com/ --html-output xray-crawler-testphp.html

在这个模式下,相当于主动扫描模式,自主分析页面的链接,然后自动探测是否有漏洞。

服务扫描

xray 也支持服务扫描,目前的服务扫描的 POC 还不够多,目前只有一个 tomcat-cve-2020-1938 ajp 协议任意文件检测 poc。

参数配置目前比较简单,支持单个扫描与批量扫描:

BASH

# 快速检测单个目标
➜ ./xray servicescan --target 127.0.0.1:8009

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

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

CODE

10.3.0.203:8009
127.0.0.1:8009

也可以将结果输出到报告中,支持多种格式:

BASH

# 将检测结果输出到 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 用法可以使用下面命令查看:

BASH

➜ ./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 基本上我们搞安全的 基本上应该都很容易理解了:

BASH

➜ ./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

全局配置 如果在这指定了,那么所有命令执行的时候都会生效

BASH

# 用于指定配置文件的位置,默认加载同目录的 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

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

BASH

# 正确的用法
➜ ./xray --log_level debug --config my.yaml webscan --url xxx

# 错误的用法 全局配置没有紧跟二进制程序
➜ ./xray webscan --log_level debug --config my.yaml --url xxx

COMMANDS

命令说明
webscanxray 核心功能,用来发现探测 Web 漏洞
servicescan服务扫描功能 用来探测服务漏洞
poclint检测 poc 是否符合规范
reverse启动单独的盲打平台服务
genca用于快速生成一个根证书,主要用于被动代理扫描 HTTPS 流量时用到
upgrade检查新版本并自动升级
version版本信息
help显示命令列表或一个命令的帮助
subdomain子域名扫描 高级本才有的命令

subdomain

扫描 example.com,并将结果输出到 example.txt

BASH

➜ ./xray  subdomain --target example.com --text-output example.txtCopyErrorCopied

扫描 example.com, 并使用 console ui 交互式界面,同时记录结果到 example.txt

BASH

➜ ./xray  subdomain --target example.com --console-ui --text-output example.txt

webscan

运行 ./xray -h,可以看到

BASH

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

BASH

--plugins xss
--plugins xss,sqldet,phantasm
  • --poc: 配置本次扫描启用哪些 POC,使用 , 分隔

BASH

# 只加载一个 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 作为报告文件名。

组合使用

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

BASH

# 使用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 时,处理过程为:

POWERSHELL

sqldet, xss, cmd_injection 同时处理 request1
sqldet, xss, cmd_injection 同时处理 request2
sqldet, xss, cmd_injection 同时处理 request3

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

BASH

sql,xss,cmd_injection 同时并发(3并发)处理 request1, request2, request3

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

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

YAML

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

  • detect_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 名字和本地文件的绝对路径,如:

YAML

phantasm:
poc:
- poc-yaml-activemq-cve-2016-3088
- /Users/test/1.yml

这样方便自己添加自己的 POC 了

被动代理配置

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

抓取 HTTPS 流量

对应于 ca_cert 和 ca_key 两项配置。

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

BASH

➜ ./xray genca

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

Firefox 需要单独在浏览器导入。移动端可以挂代理之后访问 http://xray/ 下载根证书

代理启用密码保护

对应于 auth 中的配置。

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

限制漏洞扫描的范围

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

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

  2. excludes 表示不扫描哪些域和路径。比如 t.example.com 表示不扫描 t.example.com

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

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

YAML

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

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

设置代理的 IP 白名单

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

YAML

allow_ip_range: ["127.0.0.1","192.168.1.1/24"]CopyErrorCopied

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

队列长度配置

YAML

queue:
max_length: 10000

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

代理请求头配置

YAML

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,后端实际收到的请求将会是

HTTP

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:1111upstream_proxy 为 http://127.0.0.1:8080, 那么浏览器设置代理为 http://127.0.0.1:1111,整体数据流如下:

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

盲打平台配置

这里知识点比较多,反向盲打平台很多,如果大家对 xray 的这个功能感兴趣建议参考 xray 的官方文档,国光这里就不细写了。

HTTP 配置

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

漏洞扫描用的代理 proxy

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

CODE

http://127.0.0.1:1111
https://127.0.0.1:1111
socks5://127.0.0.1:1080

基础爬虫配置

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

YAML

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 中添加如下配置即可禁用更新检查:

YAML

update:
check: false

xray 与 Burpsuite 联动

首先 xray 建立起 webscan 的监听

BASH

➜ ./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 进行联动

BASH

➜ ./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/

BASH

➜ ./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 写的接口,下面是这个接口简单的实现代码:

PYTHON

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

  • xray 安全评估工具文档

来源:https://www.sqlsec.com/2020/04/xray.html

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

@
学习更多渗透技能!体验靶场实战练习

hack视频资料及工具

(部分展示)

往期推荐

【精选】SRC快速入门+上分小秘籍+实战指南

爬取免费代理,拥有自己的代理池

漏洞挖掘|密码找回中的套路

渗透测试岗位面试题(重点:渗透思路)

漏洞挖掘 | 通用型漏洞挖掘思路技巧

干货|列了几种均能过安全狗的方法!

一名大学生的黑客成长史到入狱的自述

攻防演练|红队手段之将蓝队逼到关站!

巧用FOFA挖到你的第一个漏洞

看到这里了,点个“赞”、“再看”吧

文章来源: http://mp.weixin.qq.com/s?__biz=MzI4NTcxMjQ1MA==&mid=2247594192&idx=1&sn=5ecbe0d8553b4aab223471cade647935&chksm=ebeb39fddc9cb0ebad9a720fcdbe0d2c2c8f6310ca511cf0a546c7062a0ca8943bf7886c7d69#rd
如有侵权请联系:admin#unsafe.sh