前言看着这题目jar包有接近40Mb的时候就直接决定先去学下tabby的简单使用,由于学业影响和自己配置过程中遭遇了许多莫名其妙的报错导致花了三天才结束
开始做题,解题过程中发现其实不需要tabby,心有点痛(虽说这工具早晚都要学。。。)
题解先自己本地根据jar包搭了个环境以便进行调试
大概过了一下比较重要的文件,首先就是backdoor.class文件,里面重要的点是给了我们一个/read路由
12345678910111213141516171819202122@RequestMapping({"/read"}) public String read(@RequestBody String body) { if (body != null) { try { byte[] data = Base64.getDecoder().decode(body); String temp = new String( ...
前言原本没想着这么早就开学tabby,但由于学长发了个java题目来锻炼锻炼我的能力,一开压缩包我了个豆40MB,自己审计不知道要审到猴年马月,做ctf讲究一个效率,所以毅然决然来开tabby
(没想到开了三天才结束。。。)
环境搭建tabby配置(截至到2025.3.24,tabby最新版本为v2.0.0)
tabby需要的java版本为17,所以请先把自己电脑里面系统环境变量中的java版本改为17
在项目地址:https://github.com/wh1t3p1g/tabby的release下载下最新的tabby,如果出问题了可以pull一份源码自己本地用gradle编译一下(注意gradle使用的jdk环境也得是至少17)
一个编译打包好的tabby目录结构应该如下:
1234567891011121314151617181920$ tree.├── cases # 用于放置待分析的项目,可以是单个文件,也可以是目录│ └── commons-collections-3.2.1.jar├── config # 用于放置配置文件│ ├── db.properties ...
java反序列化
未读引用Java安全学习——ROME反序列化
Java反序列化之Rome
什么是ROMEROME 是一个可以兼容多种格式的 feeds 解析器,可以从一种格式转换成另一种格式,也可返回指定格式或 Java 对象。ROME 兼容了 RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0, 2.0), Atom 0.3 以及 Atom 1.0 feeds 格式。
Rome 提供了 ToStringBean 这个类,提供深入的 toString 方法对JavaBean进行操作
依赖1234567<dependencies> <dependency> <groupId>rome</groupId> <artifactId>rome</artifactId> <version>1.0</version> </dependency></dependencies>
典型gadget我们看yso中链子是怎么写的 ...
java反序列化
未读java反序列化
未读hibernate1hibernate>=5导入依赖12345<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version></dependency>
分析先看一手yso中的gadget
12345678910/** * org.hibernate.property.access.spi.GetterMethodImpl.get() * org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue() * org.hibernate.type.ComponentType.getPropertyValue(C) * org.hibernate.type.ComponentType.getHashCode() ...
java反序列化
未读引用深入浅出解析Jackson反序列化
前言jackson相关基础知识这里就不赘述了,可参看引用
逻辑跟fastjson差不多
jackson简单使用依赖
1234567891011121314151617<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</ ...
java反序列化
未读引用fastjson
FastJson<=1.2.68RCE原理详细分析
fastjson 1.2.80 漏洞浅析及利用payload
FastJson与原生反序列化
FastJson与原生反序列化(二)
前言maven依赖:https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.24
12345<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.24</version></dependency>
FastJSON 在序列化时,利用 Java 的反射机制,通过调用 JavaBean 的 getter 方法获取属性值。
在反序列化时,FastJSON 通过无参构造方法创建对象,并利用 setter 方法设置属性值
基础流程分析JSONObject是一个Map类
12 ...
java反序列化
未读引用Java安全学习——JNDI注入
JNDI概述JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口。JNDI提供统一的客户端API,并由管理者将JNDI API映射为特定的命名服务和目录服务,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。简单来说,开发人员通过合理的使用JNDI,能够让用户通过统一的方式访问获取网络上的各种资源和服务。如下图所示
命名服务(Naming Server)命名服务,简单来说,就是一种通过名称来查找实际对象的服务。比如我们的RMI协议,可以通过名称来查找并调用具体的远程对象。再比如我们的DNS协议,通过域名来查找具体的IP地址。这些都可以叫做命名服务。
例子:DNS(域名系统)
场景:当你在浏览器中输入 www.google.com 时,浏览器需要知道这个域名对应的 IP 地址才能访问网站。
命名服务的作用:
DNS 将域名(名称)映射到 IP 地址(对象)。
例如:
名称:www.google. ...
java反序列化
未读引用Java安全之RMI反序列化
攻击注册中心客户端与注册中心进行交互可以使用以下几种方式:
list
bind
rebind
unbind
lookup
这几种方法位于RegistryImpl_Skel.class文件中的dispatch方法中,如果存在readObject则可以进行反序列化攻击,具体方法内容可以自己去看一下
dispatch里面对应关系如下
0->bind
1->list
2->lookup
3->rebind
4->unbind
case1相关代码中没有readObject方法,所以无法利用
当调用bind时,会用readObject读出参数名以及远程对象,此时则可以利用
当调用rebind时,会用readObject读出参数名和远程对象,这里和bind是一样的,所以都可以利用
如果服务端存在cc1相关组件漏洞,那么就可以使用反序列化攻击(有cc依赖的话相关poc都可以使用)
注册中心上调用的是RegistryImpl_Skel.class文件中的dispatch方法里面的bind(),而在客户端上调用的是RegistryIm ...
java反序列化
未读引用教程:RMI - Java™教程
基于Java反序列化RCE - 搞懂RMI、JRMP、JNDI
如何创建java rmi环境
JAVA安全基础(四)– RMI机制
RMI概述以下是wiki的描述:
123Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。
根据wiki所说RMI全称为Remote Method Invocation,也就是远程方法调用,通俗点解释,就是跨越jvm,调用一个远程方法。众所周知,一般情况下java方法调用指的是同一个jvm内方法的调用,而RMI与 ...