X-RAY POC编写

news2024/11/17 1:46:43

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: GET
            path: "/"
        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: true
            method: POST
            path: "/"
            headers:
                Content-Type: application/json
            follow_redirects: true
            body: '{"username":"administrator","password":"1qazxsw23edcvfr4"}'
        expression: |
            response.status==200 && "welcome, administrator, xxxxxxxxxx".bmatches(response.body)
    r1:
        request:
            cache: true
            method: GET
            path: "/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: 1
    num: randonInt(1000, 2000)      # 1543
    rstr: randomLowercase(10)       # asdbeuyekp
    reverse: newReverse()
    reverseURL: reverse.url 

payload关键词的使用

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

payloads:
  continue: false
  payloads:
    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: 1
    b: a 

第二遍:

set:
    a: 1
    b: 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: GET
            path: "/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"]        // 4107646840
            search1: '"date\":\"(?P<date>.+?)\",\"macaddr".bsubmatch(response.body)'
            date: search1["date"]           // 05.07.2022
            HA: serial + "r2d2" + date      // 4107646840r2d205.07.2022
            password: substr(md5(HA),0,7)   // e3048ad 

detail的编写

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GDPU 数据结构 天码行空11

文章目录 数据结构实验十一 图的创建与存储一、实验目的二、实验内容三、【实验源代码】&#x1f37b; CPP版&#x1f37b; c 语言版&#x1f37b; java版 四、【实验结果】五、【实验总结】 数据结构实验十一 图的创建与存储 一、实验目的 1、 理解图的存储结构与基本操作&a…

【STM32】新建工程

学习来源&#xff1a;[2-2] 新建工程_哔哩哔哩_bilibili 目前STM32的开发主要有基于寄存器的开发方式、基于标准库也就是库函数的方式和基于HAL库的方式。本学习是基于库函数的方式。&#xff08;各种资料去百度云下载&#xff09; 1 建立工程文件夹 Keil中新建工程&#xf…

高性能Mysql第三版学习(一)

学习目标&#xff1a; 高性能Mysql第3版 学习内容&#xff1a; MySQL架构与历史Mysql基座测试服务器性能Schema与数据类型优化创建高性能的索引查询性能优化Mysql高级特性Explain 学习时间&#xff1a; 周一至周五晚上 9点—晚上10点周六晚上9点-10点周日晚上9 点-10点 学习…

公众号留言功能还有可能开放吗?

为什么公众号没有留言功能&#xff1f;2018年2月12日&#xff0c;TX新规出台&#xff1a;根据相关规定和平台规则要求&#xff0c;我们暂时调整留言功能开放规则&#xff0c;后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…

初出茅庐的小李博客之C语言必备知识共用体

C语言必备知识共用体 共用体是一种构造数据类型&#xff0c;有时候也称之为联合体。 它的用途&#xff1a; 使几个不同类型的变量共占一段内存。 共用体举例 union 共用体名 { 类型标识符 成员名;类型标识符 成员名; };union data //共用体名字是data{ int i; …

面试题:什么是自旋锁?自旋的好处和后果是什么呢?

文章目录 什么是自旋自旋和非自旋的获取锁的流程 自旋锁的好处AtomicLong 的实现实现一个可重入的自旋锁示例自旋的缺点适用场景 什么是自旋 “自旋”可以理解为“自我旋转”&#xff0c;这里的“旋转”指“循环”&#xff0c;比如 while 循环或者 for 循环。“自旋”就是自己…

初学剪辑者找视频素材就上这6个网站

视频剪辑必备的6个素材网站&#xff0c;高清无水印&#xff0c;还可以免费下载&#xff0c;无版权限制&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要以设计类素材为主&#…

宝塔 Linux 面板安装一个高大上的论坛程序 —— Flarum

这个是很早搭建的版本,基于宝塔面板,比较复杂,如果想要简单的搭建方法,可以参看咕咕新写的这篇: 【好玩的 Docker 项目】10 分钟搭建一个高大上的论坛程序 购买腾讯云轻量应用服务器 待补充 登录服务器 待补充 BBR 加速脚本 BBR 加速脚本: BASH cd /usr/src &…

XML映射文件

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"org.mybatis.example.BlogMapper&q…

Chatbot开发三剑客:LLAMA、LangChain和Python

聊天机器人&#xff08;Chatbot&#xff09;开发是一项充满挑战的复杂任务&#xff0c;需要综合运用多种技术和工具。在这一领域中&#xff0c;LLAMA、LangChain和Python的联合形成了一个强大的组合&#xff0c;为Chatbot的设计和实现提供了卓越支持。 首先&#xff0c;LLAMA是…

蓝牙运动耳机哪个好?蓝牙运动耳机排行榜前十名

​在运动中&#xff0c;音乐可以激发你的热情和动力&#xff0c;而一款好的运动耳机则可以让你更好地享受音乐。然而&#xff0c;市面上的运动耳机品牌和型号众多&#xff0c;质量参差不齐。所以&#xff0c;今天精选了5款市面上比较优秀的运动耳机给大家参考&#xff0c;是你运…

【开源】基于JAVA的车险自助理赔系统

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

Vatee万腾的科技冒险:Vatee独特探索力量的数字化征程

在数字化时代的激流中&#xff0c;Vatee万腾以其独特的科技冒险精神&#xff0c;引领着一场前所未有的数字化征程。这不仅仅是一次冒险&#xff0c;更是对未知的深度探索&#xff0c;将科技的力量推向新的高度。 Vatee万腾在科技领域敢于挑战传统&#xff0c;积极探索未知的可能…

ThreeJs实现简单的动画

上一节实现可用鼠标控制相机的方式实现动态效果&#xff0c;但很多时候是需要场景自己产恒动态效果&#xff0c;而不是通过鼠标拖动&#xff0c;此时引入一个requestAnimationFrame方法&#xff0c;它实际上是通过定时任务的方式&#xff0c;每隔一点时间改变场景中内容后重新渲…

详解:什么是“智能合同管理”

未来已来&#xff0c;行业数字化进行的如火如荼&#xff0c;并逐步驶入深水区。合同是企业开展经营活动的重要文件&#xff0c;也是风险管控的核心地带&#xff0c;做好合同管理对企业运营效率的提升至关重要。近年来&#xff0c;合同管理已经跟随企业数字化的浪潮进入转型时期…

MySQL 及 SQL 注入

文章目录 前言什么是sql注入防止SQL注入Like语句中的注入后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现…

计算机体系结构概念总结

CH1 基本概念 课件补充 概念汇总 CH2 指令系统 课件补充 能够改变控制流的指令&#xff1a;分支、跳转、过程调用、过程返回 概念汇总 课后习题 CH3 流水线 课件补充 概念汇总 指令发射&#xff1a;指令从流水线的译码段进入执行段的过程称为指令发射。 向量处理机&#xf…

hdlbits系列verilog解答(exams/m2014_q4f)-47

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路&#xff1a; 二、verilog源码 module top_module (input in1,input in2,output out);assign out in1 & (~in2);endmodule三、仿真结果 转载请注明出处&#xff01;

AI赋能数据表设计

数据表设计软件用过多种&#xff0c;用Ai 设计表几年Ai大模型爆发之后提升了新的高度 用navicat 设计表就是在跟团队的人介绍这次功能的表结构时&#xff0c;没办法看备注&#xff0c;只能看英文字段&#xff0c;导致在比较复杂的表中&#xff0c;总是在表结构和图形结构中来回…

【计网 可靠数据传输RDT】 中科大笔记 (十 一)

目录 0 引言1 RDT的原理RDT的原理&#xff1a; 2 RDT的机制与作用2.1 重要协议停等协议&#xff08;Stop-and-Wait&#xff09;:连续ARQ协议: 2.2 机制与作用实现机制&#xff1a;RDT的作用&#xff1a; &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#x…