扫码领资料
获网安教程
免费&进群
长亭科技的 xray 扫描器的扫描效果还不错,在国内颇受好评,很有幸以前在长亭科技工作,技术氛围很好。扯得有点远了,话不多说,本文是是 xray 国光的学习记录,也可以当做新手的 xray 教程来用,不过我还是建议大家看看官方文档,只是国光我最近喜欢上了这种学习记录的感觉,学习效率很高。
项目地址:https://github.com/chaitin/xray
长亭科技研发的一款完善的安全评估工具,支持常见 Web 安全问题扫描和自定义 POC,虽然 Github 有项目,但是不开源,只提供社区版本供大家使用。
代理模式下的基本架构为,扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都认为自己直接与对方对话,同时记录该流量,然后修改参数并重新发送请求进行扫描。这种原理和 Burpsuite 的自带的漏扫原理是一样的。
将生成的 ca 证书导入到需要代理的设备即可,这样就可以方便代理 https 的流量了
第一次启动 xray 之后,当前目录会生成 config.yml
配置文件,选择文件编辑器打开,并按照下方说明修改。定位搜索到如下内容,将 *
改为 testphp.vulnweb.com
,这是 AWVS 的官方靶场,方便检测漏扫能力。
监听本地的 7777
端口,并设置漏洞报告的输出的文件名为: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 也支持服务扫描,目前的服务扫描的 POC 还不够多,目前只有一个 tomcat-cve-2020-1938 ajp 协议任意文件检测 poc。
参数配置目前比较简单,支持单个扫描与批量扫描:
其中 test.file
的格式为一个行一个 service,如
也可以将结果输出到报告中,支持多种格式:
完整的 servicescan 用法可以使用下面命令查看:
Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)Vulhub 环境链接
部署完成后,使用 xray 来检测看一下效果怎么样:
查看 -h
基本上我们搞安全的 基本上应该都很容易理解了:
全局配置 如果在这指定了,那么所有命令执行的时候都会生效
全局配置的使用时需要紧跟二进制程序,如:
命令 | 说明 |
---|---|
webscan | xray 核心功能,用来发现探测 Web 漏洞 |
servicescan | 服务扫描功能 用来探测服务漏洞 |
poclint | 检测 poc 是否符合规范 |
reverse | 启动单独的盲打平台服务 |
genca | 用于快速生成一个根证书,主要用于被动代理扫描 HTTPS 流量时用到 |
upgrade | 检查新版本并自动升级 |
version | 版本信息 |
help | 显示命令列表或一个命令的帮助 |
subdomain | 子域名扫描 高级本才有的命令 |
扫描 example.com
,并将结果输出到 example.txt
扫描 example.com
, 并使用 console ui 交互式界面,同时记录结果到 example.txt
运行 ./xray -h
,可以看到
--plugins
: 指定要运行的插件,使用 ,
分隔
--poc
: 配置本次扫描启用哪些 POC,使用 ,
分隔
该参数支持 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
作为报告文件名。
将上面说的一些结合起来使用,就可以满足多种场景下的使用需求了:
交互式的命令行就是新手福利了,提供命令自动补全提示,直接运行 xray 而不加任何参数即可启动交互式命令行。
引擎初次运行时,会在当前目录内生成一个 config.yaml
文件。通过调整配置中的各种参数,可以满足不同场景下的需求。
在 xray 快速迭代时期,不保证配置文件向后兼容。如果出错,可以备份配置文件并重新生成。 实际上建议每次更新版本后都备份配置文件后删除并重新生成,以免错过新功能的配置。
在具体插件配置之前,plugins 部分有个顶级配置项为 max_parallel
, 表示插件的并发度。举个例子,如果需要处理 3 个请求,此时启用了三个插件 sqldet, xss, cmd_injection, 当设置 max_parallel
为 1 时,处理过程为:
当 max_parallel
设置为 3 时,处理过程为:
理论上时间会算缩短 3 倍,但这个值并非越大越好,高并发意味着同一时间发包数量大幅增加,这可能会影响远程 server 的运行和 xray 对漏洞的判断,需要按需设置。
对于其他配置项,一个插件是一个配置单元,每个单元的基本格式为:
enabled
即为是否启用插件,所以这里只说明部分插件的特殊配置就可以了。
ie_feature
如果此项为 true,则会将一些只能在 IE 环境下复现的漏洞爆出来,小白请不要开。
include_cookie
如果此项为 true, 则会检查是否存在输入源在 cookie 中的 xss
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
detect_blind_injection
是否使用盲打来检查命令注入
dictionary
配置目录字典,需要是绝对路径
dictionary
Web 字典的路径
error_based_detection
启用报错注入检测
boolean_based_detection
启用布尔盲注检测
time_based_detection
启用时间盲注检测
下面两个选项很危险,开启之后可以增加检测率,但是有破坏数据库数据的可能性,请务必了解工作原理之后再开启
dangerously_use_comment_in_sql
允许检查注入的时候使用注释
dangerously_use_or_in_sql
允许检查注入的时候使用 or
detect_default_password
检测默认密码
detect_unsafe_login_method
检测不安全的登录方法
username_dictionary
弱口令用户名字典,需要绝对路径
password_dictionary
弱口令密码字典,需要绝对路径
如果没有配置将使用内置字典,约 Top8 用户名和 Top80 密码。配置后将做字典合并,即用户字典的与内置的做合并并去重。
depth
探测深度,默认为 1, 即只在 URL 深度为 0, 和深度为 1 时运行该插件(前提是启用了该插件)
poc
定义默认启用哪些 POC。支持写内置 POC 名字和本地文件的绝对路径,如:
这样方便自己添加自己的 POC 了
这一部分主要介绍配置项中 mitm
部分相关的内容。
对应于 ca_cert
和 ca_key
两项配置。
和 burp 类似,抓取 https 流量需要信任一个根证书,这个根证书可以自行生成,也可用下列自带的命令生成:
运行后将在当前目录生成 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 和 excludes 均不支持端口号,如果加上将导致限制失效!
配置中的 allow_ip_range
项可以限制哪些 IP 可以使用该代理。支持单个 IP 和 CIDR 格式的地址,如:
留空则允许所有地址访问,如果来源 IP 没有在配置的地址内,使用者则会报 Proxy Failed
的错误。
经典的生产者消费者问题,如果生产消费速度不匹配,就需要一个中间的队列来临时存储,这个队列的大小就是 max_length
。如果 max_length
设置的过大,会造成 xray 内存占用过大,甚至可能会造成内存不足 OOM 进程崩溃。
如果开启 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
,后端实际收到的请求将会是
假如启动 xray 时配置的 listen 为 127.0.0.1:1111
,upstream_proxy
为 http://127.0.0.1:8080
, 那么浏览器设置代理为 http://127.0.0.1:1111
,整体数据流如下:
该配置仅影响代理本身,不会影响插件在漏洞探测时的发包行为
这里知识点比较多,反向盲打平台很多,如果大家对 xray 的这个功能感兴趣建议参考 xray 的官方文档,国光这里就不细写了。
对于 web 扫描来说,http 协议的交互是整个过程检测过程的核心。因此这里的配置将影响到引擎进行 http 发包时的行为。
proxy
配置该项后漏洞扫描发送请求时将使用代理发送,支持 http
, https
和 socks5
三种格式,如:
基础爬虫的配置项对应于 basic-crawler
部分,默认的配置如下,用法参照文件中的注释
注意,此功能只在高级版中提供
国光测试了这个子域名功能,可以用,但是不是很强大,不如自己采集多方面接口的域名要全,感兴趣可以参考官方文档。
xray 内置了一个简单的更新检查机制,会在每次启动的时候检查有无新的版本发布,如果有更新将在界面上显示最新的 release notes。 如不需要该机制,可以通过下列方法禁用:
在 config.yaml
中添加如下配置即可禁用更新检查:
首先 xray 建立起 webscan 的监听
进入 Burp 后,打开 User options
标签页,然后找到 Upstream Proxy Servers
设置。
点击 Add
添加上游代理以及作用域,Destination host
处可以使用 *
匹配多个任意字符串,?
匹配单一任意字符串,而上游代理的地址则填写 xray 的监听地址。
BP 的 socks 代理与顶级代理服务器有冲突,不能同时勾选
接下来 BP 正常抓包,与此同时 BP 也会将我们截取到的一些流量包发到 xray 中进行漏洞检测。
首先 xray 建立起 webscan 的监听
如果你的 AWVS 不是安装在物理机上话,那么你的 xray 应该填写你 AWVS 可以访问的地址 国光测试填写 127.0.0.1 无法与 AWVS 进行联动
以 AWVS 13 为例,登入管理页后,点击 Targets
, 然后点击 Add Target
添加扫描目标:
这里演示的是扫描 awvs 的在线靶站 http://testphp.vulnweb.com/
下滑到 HTTP
部分,填写 Proxy Server
为对应的 xray 代理,因为国光的 AWVS 是在虚拟机运行的,所以我这里填写的是我物理机的 ip 地址(之前粗心写 127.0.0.1 了没有啥反应):
最后扫描类型选择 仅爬取:
此时 AWVS 的爬虫会把请求都转发给 xray 检测漏洞了,此时 awvs.html
里面就躺好了漏洞:
因为 xray 的新版本支持 webhook 这样很方便我们写代码调用,首先 xray 监听本地的 7777 端口,然后监听的流量进行漏洞检测,将漏洞信息同时通过 webhook 的方式传输到 http://127.0.0.1:8000/scan/xray/
http://127.0.0.1:8000/scan/xray/
这个是国光用 Django 写的接口,下面是这个接口简单的实现代码:
因为 Django 安全机制问题,xray post 提交请求到 Django 必须填写 CSRF Token 才可以,解决方法就是手动关掉这个类的 CSRF 检测
@csrf_exempt
xray 安全评估工具文档
来源:https://www.sqlsec.com/2020/04/xray.html
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
(hack视频资料及工具)
(部分展示)
往期推荐
【精选】SRC快速入门+上分小秘籍+实战指南
爬取免费代理,拥有自己的代理池
漏洞挖掘|密码找回中的套路
渗透测试岗位面试题(重点:渗透思路)
漏洞挖掘 | 通用型漏洞挖掘思路技巧
干货|列了几种均能过安全狗的方法!
一名大学生的黑客成长史到入狱的自述
攻防演练|红队手段之将蓝队逼到关站!
巧用FOFA挖到你的第一个漏洞