Skip to content
KitploitKITPLOIT
工具博客
Log in
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-33439 — CVE-2026-33439(通过jato.clientSession反序列化的OpenAM预认证RCE)的首个公开共享漏洞利用实现。 | Kitploit
工具/GitHubGitHub/themalwareguardian/cve-2026-33439
漏洞分析代码分析漏洞利用逆向工程Web应用程序漏洞利用恶意软件分析渗透测试学习与教育Payload 开发二进制利用实验室与实践
21375个月前尚未审核
GitHub
themalwareguardian/cve-2026-33439

CVE-2026-33439

CVE-2026-33439(通过jato.clientSession反序列化的OpenAM预认证RCE)的首个公开共享漏洞利用实现。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

🐞 CVE-2026-33439:通过 jato.clientSession 反序列化实现 OpenAM 预认证 RCE

人工洞察 + AI辅助分析 + 逆向工程 + 安全公告 → 利用

首个公开分享的 CVE-2026-33439 利用实现

ForgeRock OpenAM 中的未经认证的 Java 反序列化漏洞,允许通过特制的 JATO 会话对象实现完全远程代码执行。同一条河流流过两次,他们修复了 jato.pageSession(CVE-2021-35464),却忘记了 jato.clientSession(CVE-2026-33439)。反序列化小工具链不问凭证。




📑 目录

  • 概述
  • CVE-2021-35464 谱系
  • CVE-2026-33439 漏洞分析
    📂
    • 根本原因
    • 受影响版本
    • 攻击面
  • 小工具链
    📂
    • Java 反序列化入门
    • Encoder.decodeHttp64
    • 小工具链内部原理
  • 实验环境
    📂
    • 架构
    • 搭建
    • 访问
  • 利用
    📂
    • 先决条件
    • 发现与侦察
    • 理解编码
    • 构建利用
    • 载荷投递
    • PoC 工具使用
  • 缓解措施
  • 参考资料



🎯 概述

CVE-2026-33439 是 OpenIdentityPlatform OpenAM(版本 16.0.6 之前)中的一个预认证远程代码执行漏洞。该漏洞源于对 jato.clientSession HTTP 参数的不安全的 Java 反序列化,位于 ClientSession.deserializeAttributes() 中,该方法调用 Encoder.deserialize() → ApplicationObjectInputStream.readObject(),且未应用任何类白名单。

未经认证的攻击者向任何 JATO ViewBean 端点(其 JSP 渲染 jato:form 标签)发送一个包含序列化 Java 对象的精心构造的 HTTP GET 或 POST 请求。服务器收到后将对象反序列化而不进行验证,触发一个完全由 OpenAM WAR 包中捆绑的类构建的小工具链(无需外部库),并以应用程序进程用户身份执行任意操作系统命令。

CVSS 4.0 Vector: AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N → 9.3 严重

CVSS 3.1 Vector: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → 9.8 严重




🧬 CVE-2021-35464 谱系

此漏洞是 CVE-2021-35464 后不完整修复的直接回归。

  • CVE-2021-35464(ForgeRock AM / OpenAM):通过不安全反序列化 jato.pageSession 参数实现预认证 RCE。在野外被广泛利用;已列入 CISA KEV 列表。修复方案在 ConsoleViewBeanBase.deserializePageAttributes() 中引入了 WhitelistObjectInputStream —— 一个定制的 ObjectInputStream 子类,在实例化之前,它会针对一个包含约 40 个安全类的硬编码白名单检查每个类名。

  • CVE-2026-33439(OpenAM ≤ 16.0.5):修复仅应用于 jato.pageSession。jato.clientSession 参数——由完全独立的代码路径 ClientSession.deserializeAttributes() 处理——从未被修补,仍然使用未经过滤的 Encoder.deserialize() → ApplicationObjectInputStream,该方法调用 ObjectInputStream.readObject() 而不进行类白名单检查。

攻击原语相同。反序列化接收点不同。只有参数名称改变了。




🔬 CVE-2026-33439 漏洞分析

根本原因

JATO 将 UI 视图状态序列化为名为 jato.pageSession 和 jato.clientSession 的 HTTP 参数。当请求到达时,OpenAM 反序列化这些参数以在渲染响应之前恢复 UI 状态。这两个参数遵循完全不同的代码路径。

jato.pageSession 的补丁代码路径(CVE-2021-35464 之后):```java // PATCHED - ConsoleViewBeanBase.deserializePageAttributes() ObjectInputStream ois = new WhitelistObjectInputStream(new ByteArrayInputStream(decoded)); // class whitelist enforced - gadget chains blocked Object obj = ois.readObject();

jato.clientSession 的未修补代码路径(存在漏洞):```java
// ClientSession.java
protected ClientSession(RequestContext context) {
	this.encodedSessionString =
		context.getRequest().getParameter("jato.clientSession");
}

protected void deserializeAttributes() {
	if (this.encodedSessionString != null
		&& this.encodedSessionString.trim().length() > 0) {
		this.setAttributes(
			(Map) Encoder.deserialize(
				// VULNERABLE - URL-safe base64 decode then plain ObjectInputStream
				Encoder.decodeHttp64(this.encodedSessionString), false)
		);
	}
}

Encoder.deserialize() 构造一个普通的 ApplicationObjectInputStream - 它是 ObjectInputStream 的一个子类,没有类过滤。JVM 类路径上的任何类都可以被实例化。每当渲染 < jato:form > 标签时,反序列化在 JSP 渲染过程中触发:``` getClientSession() → hasAttributes() → getEncodedString() → isValid() → ensureAttributes() → deserializeAttributes()

---

<div id="vulnerability_affected"/>

### ***受影响版本***

| 产品                     | 受影响版本                                      | 修复版本  |
|-----------------------------|-------------------------------------------------|--------|
| OpenIdentityPlatform OpenAM | ≤ 16.0.5                                        | 16.0.6 |
| ForgeRock AM (下游)   | 可能受影响,取决于补丁继承关系 | -      |

---

<div id="vulnerability_attacksurface"/>

### ***攻击面***

任何其 JSP 包含 *< jato:form >* 标签的 JATO ViewBean 端点均可在未认证状态下被利用:

| 端点                  | 用途                              |
|---------------------------|--------------------------------------|
| /ui/PWResetUserValidation | 密码重置 - 用户身份输入 |
| /ui/PWResetQuestion       | 密码重置 - 安全问答  |

密码重置端点是主要目标,它们在设计上公开可访问,并保证渲染 *< jato:form >* 标签。



---
---
---



<div id="gadgetchain"/>

## ***⚙️ 漏洞利用链***

<div id="gadgetchain_deserialization101"/>

### ***Java 反序列化基础***

当 Java 从字节流反序列化一个对象时,它会为每个重建的类(包括嵌套对象)调用 readObject()。如果攻击者控制了字节流并注入一个对象,其 readObject() 触发一系列方法调用,最终导致代码执行,则他们就拥有了 gadget-chain RCE。

CVE-2026-33439 的关键点:该利用链不需要任何外部库。链中的每个类都捆绑在 OpenAM WAR 自身中 `openam-core-16.0.5.jar, xalan-2.7.3.jar, and click-nodeps-2.3.0.jar`。 <u>这使得该漏洞可在任何默认的 OpenAM 部署中被利用。</u>

---

<div id="gadgetchain_encoding"/>

### ***Encoder.decodeHttp64***

这是使利用生效的关键细节。`Encoder` 类在 `jato-shaded-16.0.5.jar` 中使用 Java 的 URL 安全 base64 编码器/解码器——不是标准的 base64,也不是自定义的字符替换方案。

通过反编译 Encoder.class 验证:```bash
# Extract Encoder.class from the JATO JAR
jar xf /work/jato-shaded-16.0.5.jar com/iplanet/jato/util/Encoder.class

# Decompile and inspect decodeHttp64
javap -p -c com/iplanet/jato/util/Encoder.class | grep -A10 "decodeHttp64"

贡献

PentestGPT 旨在简化 Web 应用渗透测试流程。它是一款供渗透测试人员轻松识别和利用潜在漏洞的工具。由于该工具仍处于早期阶段,我们非常感谢您的贡献。无论是识别和报告错误、建议新功能,还是直接贡献代码,您都能为 PentestGPT 的成长贡献力量。您也可以通过 GitHub 赞助我们来支持本项目的发展。请查看 发布页面 获取最新更新。``` public static byte[] decodeHttp64(java.lang.String); Code: 0: invokestatic #8 // Method java/util/Base64.getUrlDecoder:()Ljava/util/Base64$Decoder; 3: aload_0 4: invokevirtual #9 // Method java/util/Base64$Decoder.decode:(Ljava/lang/String;)[B 7: areturn

URL安全的base64使用'-'代替'+',使用'_'代替'/',并且不使用填充符'='。正确的编码是:```java
Base64.getUrlEncoder().withoutPadding().encodeToString(serializedBytes)

任何其他编码,包括标准的 base64 或手动字符替换,都会导致 decodeHttp64() 抛出异常或产生损坏的字节,从而在没有任何错误的情况下静默中止反序列化,并且不会在 HTTP 响应中返回错误。


Gadget 链内部机制

下载工具