0x00 前言
前边一篇学习分析了XmlDecoder
反序列化漏洞细节,XMLDecoder反序列化漏洞分析。Weblogic中因为默认包含的wls-wast
、wls9_async_response war
、_async
等包中采用xmldecoder处理XML数据,出现了多次具有严重影响的反序列化漏洞:CVE-2017-3506 -> CVE-2017-10271(10352) -> CVE-2019-2725 -> CVE-2019-2729,此篇将对weblogic xml反序列化漏洞进行分析。
本篇学习分析了wls-wast包中出现的CVE-2017-3506
、CVE-2017-10271
两个漏洞。
0x01 IDEA远程调试WebLogic(Docker)
使用vulhub快速搭建weblogic,这里需要开启远程调试,所以修改一下docker-compose.yml
开启8453远程调试端口。
1 | version: '2' |
然后docker-compose up -d
启动容器,使用docker exec -it containerName /bin/bash
进入容器修改/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh
以开启debug模式
添加如下内容
1 | debugFlag="true" |
然后重启容器 docker restart containerName
使用nestat -anp
查看8453端口已开启
然后将weblogic依赖包从容器中拷贝出来一份,以供IDEA远程调试
1 | docker cp containerName:/root/Oracle/Middleware/wlserver_10.3 . |
使用IDEA
打开 上面拷出来的wlserver_10.3
,然后将./server/lib
右键 Add as library
然后将刚才拷出来的modules
文件夹也加入到Libraries
然后再选择jdk
最后配置远程服务器,添加ip和端口
点击debug,出现下面内容即是配置成功。
0x02 CVE-2017-3506
漏洞触发位置
1 | /wls-wsat/CoordinatorPortType |
使用poc
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
参照诸位前辈的分析记录,漏洞调用链为
1 | weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest |
因此在wlserver_10.3\server\lib\weblogic.jar!\weblogic\wsee\jaxws\workcontext\WorkContextServerTube.class
类的processRequest
方法处下断点,post发送poc。
断点成功,并且var1变量内容即为发送的xml内容
继续向下跟踪,v3获取到xml数据中<work:WorkContext> </work:WorkContext>
获取到的内容后进入readHeaderOld
方法
传进来的v1只获取了workContext
头部内容,然后使用ByteArrayOutputStream
读取缓存区的其余xml数据保存在var4,然后创建WorkContextXmlInputAdapter对象,进入receive
方法。
继续跟进,创建WorkContextMapInterceptor
对象,然后调用receiveRequest
方法。
然后又调用WorkContextLocalMap
的receiveRequest
方法
继续进入readEntry
方法
然后进入readUTF
方法
而最终readUTF
返回的是xmlDecoder.readOnject
,反序列化后成功执行命令。xmldecoder反序列化漏洞细节参考XMLDecoder反序列化漏洞分析
0x03 CVE-2017-10271
针对cve-2017-3506,官网发布下面的补丁,在validate
方法中针对object
标签采用黑名单的方式进行拦截,在XMLDecoder反序列化漏洞分析一文中曾讲过void
标签可代替object
。因此此处可使用void
标签绕过cve-2017-3506
的补丁。
1 | //cve-2017-3506补丁 |
随后,官网立即发布cve-2017-10271
补丁
1 | //cve-2017-10271 |
可以看到,在该补丁中,依旧采用黑名单方式
1、 禁用 object、new、method 标签
2、 当使用 void 标签,限制只能有 index 属性
3、 当使用 array 标签且使用 class 属性,则它的值只能是 byte
随后又爆出cve-2019-2725
针对此补丁的绕过方式,后续有时间再做分析。详情可参见https://www.freebuf.com/vuls/206374.html
0x04 参考链接
https://www.cnblogs.com/ph4nt0mer/archive/2019/10/31/11772709.html
http://whip1ash.cn/2018/10/21/weblogic-deserialization/
https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2017-10271