X-RAY POC编写

POC(Proof of Concept) - 利用证明

POC,Proof of Concept,意思是 利用证明。这个短语会在漏洞报告中使用,漏洞报告中的POC则是一段说明或者一个攻击的漏洞介绍,使得读者能够确认这个漏洞是真实存在的。

EXP(Exploit) - 漏洞利用

EXP,Exploit 中文意思是 漏洞利用。意思是一段对漏洞如何利用的详细说明或者一个演示的漏洞攻击代码,可以使得读者完全了解漏洞的机理以及利用的方法。

基础的poc构成如下

name: poc-yaml-example-com
# 脚本部分
transport: http
rules:r1:request:method: GETpath: "/"expression: |response.status==200 && response.body.bcontains(b'Example Domain')
expression:r1()
# 信息部分
detail:author: name(link)links:- http://example.com 作者:长亭科技 https://www.bilibili.com/read/cv17667816/?spm_id_from=333.999.0.0 出处:bilibili

整个 POC 大致可以分为 3 部分:

名称: 脚本名称, string 类型

脚本部分:主要逻辑控制部分,控制着脚本的运行过程

信息部分:主要是用来声明该脚本的一些信息,包括输出内容

poc主体的关键字的意义

rules:r0:request:cache: truemethod: POSTpath: "/"headers:Content-Type: application/jsonfollow_redirects: truebody: '{"username":"administrator","password":"1qazxsw23edcvfr4"}'expression: |response.status==200 && "welcome, administrator, xxxxxxxxxx".bmatches(response.body)r1:request:cache: truemethod: GETpath: "/fetchBody?id=1/../../../../../../../../etc/passwd"expression: |response.status == 200 && "root:[x*]:0:0:".bmatches(response.body)
expression: r0() && r1() 作者:长亭科技 https://www.bilibili.com/read/cv17667816/?spm_id_from=333.999.0.0 出处:bilibili

1.  rules以及单个rule的名称

  ○ rules代表着一个规则集,在这个规则集中,将存放着所有要发送的信息以及要判断的规则

  ○ rule则是一个请求的规则,代表你想要发送什么样的请求。如上述所举的例子中,r0,r1是规则的名称

2.  request

该关键词中存在着构建一个请求包所要填写的信息,包括请求使用的方法,请求路径,请求头,请求body,是否跟随302跳转。

  ○ cache: bool 是否使用缓存的请求,如果该选项为 true,那么如果在一次探测中其它脚本对相同目标发送过相同请求,那么便使用之前缓存的响应,而不发新的数据包

  ○ method: string 请求方法

  ○ path: string 请求的完整 Path,包括 querystring 等 (详情见: HTTP PATH 的使用)

    ⅰ. 如果 path 是以 / 开头的, 取 dir 路径拼接

    ⅱ. 如果 path 是以 ^ 开头的, uri 直接取该路径

  ○ headers: map[string]string 请求 HTTP 头,Rule 中指定的值会被覆盖到原始数据包的 HTTP 头中

  ○ body: string 请求的Body(转译问题见:头疼的转译)

  ○ follow_redirects: bool 是否允许跟随300跳转, 默认为true

3.  expression

在rule下的expression是用来对返回包(response)进行匹配的,你可以编写各种各样的限制来判断返回包中信息,从而确认返回的内容是否符合要求。

正如spring使用SpEL表达式,struts2使用OGNL表达式,xray使用了编译性语言Golang,所以为了实现动态执行一些规则,我们使用了Common Expression Language (CEL)表达式:

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

CEL表达式通熟易懂,非常类似于一个Python表达式。上述表达式的意思是:返回包的status等于200,且body中包含内容“Example Domain”。
expression表达式上下文还包含有一些常用的函数。比如上述 bcontains 用来匹配 bytes 是否包含,类似的,如果要匹配 string 的包含,可以使用 contains, 如:
值得注意的是,类似于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.bcontains(bytes(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) || r'<input value="(.+?)"'.bmatches(response.body)

返回包status code大于等于500且不等于502,或者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结果,然后在存在&&或||的时候,与其他的expression表达式做运算,最终出一个结果,最终结果如果为true,则代表这个规则命中。

set关键字的使用

该字段主要是用来定义一些在接下来的规则中会使用到的一些全局变量,比如随机数,反连平台等。 set: map[string]interface{}

set:a: 1num: randonInt(1000, 2000)      # 1543rstr: randomLowercase(10)       # asdbeuyekpreverse: newReverse()reverseURL: reverse.url 

payload关键词的使用

该字段用于定义多个 payload,来实现发送不同 payload 的效果。 该字段结构如下

payloads:continue: falsepayloads:ping:cmd: r"ping test.com"curl:cmd: r"curl test.com" 

注:

1.只支持罗列 payload, 目前不考虑支持文件或者复杂排列组合等情况,每个 payload 中的 key 必须严格一致

2.循环 payload 然后把当前 payload 加在 set 之后,组成新的 set 执行

set:a: 1
payloads:- b: a- b: b 

实际运行结果相当于,运行两遍

第一遍:

set:a: 1b: a 

第二遍:

set:a: 1b: b 

output与search的组合使用

1获取返回的token
2获取上传文件后返回的文件路径
3总结:获取所需要的参数

返回包

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8;{"pbx":"COMpact 4000","pbxType":20,"pbxId":0,"serial":"4107646840","date":"05.07.2022","macaddr":"00:01:01:01:01:01"} 

匹配

rules:r1:request:method: GETpath: "/about_state"expression: response.status == 200 && r'serial.*?\d+.,'.bmatches(response.body) && r'date.+?20[0-9][0-9].,'.bmatches(response.body)output:search: '"serial\":\"(?P<serial>.+?)\",\"date".bsubmatch(response.body)'serial: search["serial"]        // 4107646840search1: '"date\":\"(?P<date>.+?)\",\"macaddr".bsubmatch(response.body)'date: search1["date"]           // 05.07.2022HA: serial + "r2d2" + date      // 4107646840r2d205.07.2022password: substr(md5(HA),0,7)   // e3048ad 

detail的编写

该字段用于定义一些和脚本相关的信息。

detail:author: name(link)links:- http://example.com 

POC编写指南第三期 - 哔哩哔哩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/217751.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对象的内部结构

在HotSpot 虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头&#xff08; Header &#xff09;、实例数据&#xff08;Instance Data &#xff09;和对齐填充&#xff08; Padding &#xff09;。 对象头 Mark Word&#xff08;标记字段&a…

【Spring集成MyBatis】MyBatis注解开发

文章目录 1. MyBatis的常用注解2. 基于注解的MyBatis增删改查增删改查完整代码加载映射关系测试代码 3. MyBatis的注解实现复杂映射开发一对一操作的实现一对一操作实现的第二种方式一对多操作的实现多对多操作实现 1. MyBatis的常用注解 2. 基于注解的MyBatis增删改查 使用注…

张弛声音变现课,枪战电影高能量、快速节奏

在执行枪战片的声音配音任务时&#xff0c;配音员应该致力于传递出戏剧性的紧张氛围与动作场面的激烈感。枪战场景往往是高能量、快速节奏的&#xff0c;这就要求配音不仅要与视觉动作紧密结合&#xff0c;还要通过声音来增强动作的逼真度和观众的紧迫感。以下是针对枪战电影进…

科研/比赛必备工具及系列笔记集合

科研/比赛必备工具及系列笔记集合 零、前言一、常用工具系列1.1 笔记平台使用感受系列1.2 常用开发平台系列 二、论文系列2.1 检索工具系列2.2 投稿调研系列2.3 常见国际期刊/会议2.4 常见中文核心期刊/会议 三、文献系列3.1 画图工具系列3.2 翻译工具系列3.3 英文纠正系列3.4 …

【刷题宝典NO.5】

有效的括号 https://leetcode.cn/problems/valid-parentheses/ 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必…

pat实现基于邻接表表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(ALGraph G, int v) {visited[v] 1;printf("%c ", G.vertices[v].data);for (ArcNode* cur G.vertices[v].firstarc; cur ! nullptr; cur cur->nextarc){if (!visited[cur->adjvex])DFS(G, cur->adjvex);} }2.非…

【MATLAB】VMD分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 VMD&#xff08;Variational Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;基于HHT&#xff08;Hilbert-Huang Transform&#xff0c;希尔伯特-黄变换&#xff09;。HH…

探究Kafka原理-4.API使用

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

NX二次开发UF_CURVE_ask_int_parms 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_int_parms Defined in: uf_curve.h int UF_CURVE_ask_int_parms(tag_t int_curve_object, int * num_objects_set_1, tag_t * * object_set_1, int * num_objects_set_…

Qt 软件调试(二)使用dump捕获崩溃信息

Qt应用程序异常崩溃该怎么办&#xff0c;生成dump文件再回溯分析&#xff0c;可以快速且准确的帮助我们定位到崩溃的点。那么&#xff0c;本章我们分享下如何在Qt中生成dump文件。 一、使用minudump捕获崩溃信息 #include <QCoreApplication> #include <QDir> #i…

Mysql数据库 20.DCL数据控制语言

因这类SQL语言开发人员操作较少&#xff0c;主要是数据库管理员&#xff08;DBA&#xff09;使用&#xff0c;所以前文没有提及&#xff0c;这篇文章进行补充说明 DCL数据控制语言 用来管理数据库用户&#xff0c;控制数据库的访问权限 1.管理用户 1.1 查询用户 select * f…

AI和人工智能与机器学习全景报告

今天分享的是AI系列深度研究报告&#xff1a;《AI和人工智能与机器学习全景报告》。 &#xff08;报告出品方&#xff1a;appen&#xff09; 报告共计&#xff1a;30页 获取 数据获取仍是AI应用构建团队的主要瓶颈。 原因各不相同。例如&#xff0c;特定用例的数据可能不足…