跳到主要内容

JNDI 注入

支持六种利用姿势,外加一个便于一键测试常见链的 ShowHand 链

Payload 名称说明适用版本支持协议
JNDIBasicPayload最基础漏洞利用姿势,可远程加载,推荐使用LDAP,可利用的JDK版本覆盖比RMI的广JDK < 8u191LDAP、RMI
JNDILDAPDeserializePayloadLDAP 反序列化低版本JDKLDAP
JNDIResourceRefPayload基于ObjectFactory的利用,通过 Tomcat BeanFactory 类实现漏洞利用大部分Tomcat版本: tomcat8 < 8.5.79 tomcat9 < 9.0.63 tomcat10 < 10.0.21 tomcat10.1 < 10.1.0-M14LDAP、RMI
JNDIReferencePayload基于ObjectFactory的利用,通过其他姿势实现漏洞利用,条件相对苛刻低版本JDKLDAP、RMI
JNDIRefBypassPayload在高版本 JDK 中限制 LDAP 反序列化,该姿势使用 javaReferenceAddress 属性绕过高版本 JDK 的限制低版本JDKLDAP、RMI
JNDIRMIDeserializePayloadRMI 反序列化全JDK版本RMI

使用该模块时,必须保证开启相关端口,若使用 JNDIBasicPayload 远程类加载,需要进一步配置好 Reverse IP 选项

Java Chains 自从 1.4.0 版本加入了自动启动服务功能,点击生成时会自动判断并启动对应服务

JNDIBasicPayload

LDAP 远程加载字节码

注意

注意:在使用该姿势时,必须在 JNDI 控制面板中设置 Reverse IP,保证目标服务器通过此 IP 反连到 Java Chains 的 HTTP 端口(默认情况下为 58080 端口)

这里是一个远程类加载方式,所以这里可以根据恶意字节码来生成 JNDI Payload

这里选择的 Gadget 是 Exec,用于执行命令,点击可展开查看 Gadget 详情,可以在 cmd 参数框内输入要执行的命令,这里默认是执行 calc 命令

将生成的 LDAP/RMI Payload 放到存在 JNDI 注入的地方即可

以下功能操作基本上都是相通的,不多赘述

JNDILDAPDeserializePayload

基于 LDAP 中 javaSerializedData 字段实现的反序列化

这里的控制面板是选择反序列化利用链

JNDIResourceRefPayload

LDAP 基于 BeanFactory 的 Tomcat EL、Groovy 等利用

classdescriptionremark
javax.el.ELProcessor#evalel表达式执行tomcat自带,最常见的利用
groovy.lang.GroovyShell#evaluateGroovy表达式执行
org.mvel2.sh.ShellSession#execmvel表达式执行
bsh.Interpreter#evalBeanshell表达式执行
org.yaml.snakeyaml.Yaml#loadsnakeyaml反序列化springboot环境下测试成功
com.thoughtworks.xstream.XStream#fromXMLxstream反序列化xstream依赖需要在漏洞版本内
com.sun.glass.utils.NativeLibLoader本地加载动态链接库jdk自带类

JNDIReferencePayload

LDAP 基于其他 ObjectFactory 的Reference利用,例如各种DataSource JDBC利用

以下类适用于 BeanFactory 无法使用的场景,可用于替代的ObjectFactory的一些数据源工厂,可以实现加载本地jdbc url,转为jdbc相关利用:

DataSource classNamedescriptionremark
org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory加载本地jdbc url
org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory加载本地jdbc url
org.apache.commons.dbcp.BasicDataSourceFactory加载本地jdbc url
org.apache.commons.dbcp2.BasicDataSourceFactory加载本地jdbc url
org.apache.tomcat.jdbc.pool.DataSourceFactory加载本地jdbc url
com.alibaba.druid.pool.DruidDataSourceFactory加载本地jdbc url与 BasicDataSourceFactory
格式稍微不同;本地测试发现无限执行Payload
com.zaxxer.hikari.HikariJNDIFactory加载本地jdbc url与 BasicDataSourceFactory 格式稍微不同

JNDIRMIDeserializePayload

RMI 反序列化,适用于所有 JDK 版本

JNDIRefBypassPayload

LDAP 高版本 JDK 绕过之 ReferenceBypass,相当于 JNDIReferencePayload 的绕过版本

JNDIShowHandPayload

JNDI 梭哈链,一键测试常规利用链,提高测试效率

通过 DNSLog 探测链

该 Payload 适用于目标环境已配置 DNS 服务器,且 DNS 协议出网。

使用梭哈链,批量生成几十种 LDAP Payload URL,可以进行批量尝试

选择 JNDIShowHandPayload -> DNSLogAndHttp,并配置好 DNSLog 地址

点击【Run】按钮,稍等片刻即可批量生成LDAP URL Payload地址

以Log4j漏洞为例,通过 Burpsuite 的 Intruder 模块批量发包

配置 Payload,以及根据实际情况取消URL编码

推荐使用单线程,并设置发包间隔至少为 3 秒

点击【Start attack】开始爆破

分析 DNSLog 结果

查看 DNSLog 平台,如果存在 DNSLog,说明一定存在字节码执行;如果没有任何DNSLog,存在以下可能性,需要自行排查:

  1. 发送的 Payload 被 WAF/RASP 拦截 a. 解决办法:绕 WAF/RASP
  2. 目标服务器没有配置 DNS,或 DNS 协议不出网 a. 解决办法:使用 Sleep 字节码,通过延迟判断利用链是否存在,或换用 HTTPReq gadget 进行判断,不使用 DNS 解析IP,直接通过IP发起请求,看 HTTP 协议是否出网
  3. 目标不存在常用链,或环境较为极端 a. 解决办法:可根据 FindClass 等手段综合判断JDK版本、依赖,进行针对性利用或绕过。

如果进展顺利,会有很多 DNSLog 请求(只要出现一个 DNSLog 就可以直接R了):

如果存在 WebLog 说明 HTTP 出网

DNSLog 结果形如:

basic.dnslogandhttp.macos.xxx.eyes.sh
deser.jackson.templatesimpl.macos.xxx.eyes.sh
resourceref.tomcatelref.elconvert.macos.xxx.eyes.sh
reference.tomcatdbcp2jdbcattack.pgsql-jdbc-jndi.bean-xml.macos.xxx.eyes.sh

第一个字段含义对应如下

DNSLog 记录对应可用利用方式
basic.dnslogandhttp.macos.xxx.eyes.shJNDIBasicPayload
deser.jackson.templatesimpl.macos.xxx.eyes.shJNDILDAPDeserializePayload
resourceref.tomcatelref.elconvert.macos.xxx.eyes.shJNDIResourceRefPayload
reference.tomcatdbcp2jdbcattack.pgsql.sbxcl.macos.xxx.eyes.shJNDIReferencePayload
rmi.jackson.templatesimpl.macos.xxx.eyes.shJNDIRMIDeserializePayload

DNSLog 别名映射

由于部分 gadget 名称过长,可能在某些 dnslog 平台上无法回显,部分gadget做了alias别名操作,别名会在dnslog中出现,gadget与alias的对应列表如下:

Gadget 名称别名
JNDIBasicPayloadbasic
JNDILDAPDeserializePayloadldap_deser 或 deser
JNDIReferencePayloadreference
JNDIResourceRefPayloadresourceref
JNDIRefBypassPayloadrefbypass
JNDIRMIDeserializePayloadrmi
CommonsBeanutils1cb1
CommonsBeanutils2cb2
CommonsBeanutils3cb3
CommonsBeanutils4cb4
CommonsCollectionsK1K1
CommonsCollectionsK2K2
CommonsCollectionsK3K3
CommonsCollectionsK4K4
PostgreSqlJdbc4Jndipgsql 或 pgsql-jdbc-jndi
SnakeyamlJarConvertsjc 或 snake_convert
SnakeyamlJarSpi4JNDIsjsj 或 snake_jar_jndi
SpringBeanXmlClassLoadersbxcl 或 bean-xml