tabby辅助下的TongWeb ejb接口反序列化漏洞分析与复现

type
status
date
slug
summary
tags
category
icon
password
第一时间在le1a大哥的带领下复现了这个漏洞,但在最终利用的过程中遇到很多问题,yinsel师傅的博客里面记录并解决了很多问题

漏洞描述

TongWeb在处理EJB协议数据的时候,没有对请求的数据进行校验,导致攻击者可以通过构造恶意的反序列化数据在服务器上执行任意代码。

影响版本

7.0.0.0<=TongWeb<=7.0.4.9_M9
6.1.7.0<=TongWeb<=6.1.8.13

环境搭建

先安装jdk然后./Install_TW7.0.4.x_Enterprise_Linux.bin,一直回车即可,然后将license.dat文件放在安装的TongWeb7.0 目录下
如果license.dat 文件过期,需要修改时间为下面的标准:
 
http://IP:9060/console/
默认账号:thanos 默认密码:thanos123.com

代码分析

从官方下载补丁:
notion image
 
通过反编译补丁包和查看加固文档找到漏洞接口,也就是入口点:
com.tongweb.tongejb.server.httpd.ServerServlet.class
notion image
notion image
拿到漏洞接口后尝试,在/applications/heimdall/WEB-INF/web.xml里面找到了url映射
notion image
然后找到ServerServlet对应的类为:com.tongweb.tongejb.server.httpd.ServerServlet
notion image

Source→Sink

进入到ServerServlet类后,重点看处理请求的方法 com.tongweb.tongejb.server.httpd.ServerServlet#service
跟进com.tongweb.tongejb.server.ejbd.EjbServer#service,这个里面的service调用了
this.server.service(inputStream, outputStream);
notion image
继续跟入com.tongweb.tongejb.server.ejbd.EjbDaemon#service
这是一个服务器端通信服务方法,专门用于处理来自 EJB 客户端的请求:
notion image
跟进 com.tongweb.tongejb.client.ProtocolMetaData 这个类主要初始化以及配置客户端的协议头
notion image
notion image
只有协议头格式为 OEJP/x.x ,客户端的输入流才能被服务端反序列化,否则,会在服务端反序列化前异常退出
需要注意的是新老版本协议头不一样
在7.0.4.9中writeExternalreadExternal 内容被置空,所以可以不需要这8个字节的协议头了
notion image
看完客户端如何配置协议头后,继续往下看服务端是如何进行对 EJB 客户端传入的输入流进行反序列化操作的
跟进 com.tongweb.tongejb.client.ServerMetaData 这个类
notion image
继续看这个类实现的接口方法,this.locations = (URI[])in.readObject(); 这个sink点就是 360 发的漏洞公告截图没有回显的sink点
notion image
所以此 sink点要被触发,需要满足如下的条件(懒得画图,直接用现成的,yinsel师傅画的图)
notion image
后续就直接打反序列化链了
 
通过网盘分享的文件:tabby-tongweb7.0.4.2+jdk1.8.0_431.zip 链接: https://pan.baidu.com/s/1zeJ3jJqKjve8V2ciTMAwxw?pwd=t6a2 提取码: t6a2 --来自百度网盘超级会员v4的分享
使用tabby跑路径,上面这个source→sink的路径如图所示:
notion image
看到上面这个图,发现从入口到反序列化点总共有八条路径,除了刚才这个最简单的路径以外,还有下面这一条可达路径,这就是为什么长亭的漏洞公告数据包截图有回显的原因
这条可达路径如下图所示:
notion image
com.tongweb.tongejb.server.ejbd.EjbDaemon#service 方法的下面还有一段处理requestType的代码
notion image
EJB_REQUEST对应的是(byte)0
跟进this.processEjbRequest
notion image
继续跟进this.ejbHandler.processRequest(in, metaData);
发现RequestHandler抽象类实现了一个抽象方法,用于请求处理,我们看一下实现方法,找到处理 EJB 请求的EjbRequestHandler类,这个类继承了这个抽象类
notion image
跟进EjbRequestHandler这个处理 EJB 请求的类
notion image
初始化阶段获取了 EJB 请求和版本号,继续跟进req.readExternal(in); 就找到了第二个sink点
notion image
如下code为有效的code
不过还需要注意的是,第二个sink点在第一个sink点后面,所以需要先走过第一个反序列化方法也就是那个成员变量locations,也就是URI[]类型的数组
所以最终需要构造如下序列化数据
notion image
 

gadget

知道了反序列化漏洞,现在只需要找到反序列化链,就能执行任意代码了
7.0.4.9的黑名单在这个类:com.tongweb.serializer.kryo.io.BlacklistClassResolver
所以能用的链有如下这些,在java-chains都能找到(java-chains还是太权威了):
 
下面这两条链是看到公众号有师傅跑了一下,于是也用tabby跑了一下,跑的tongweb7.0.4.2和jdk1.8.0_431
notion image
 
notion image
 
notion image
notion image
 
7.0.4.9能打的链在这个文章有说明:
notion image
待补充:

漏洞复现

使用java-chains生成字节码
notion image
这里的自定义字节码,要去memshellparty选择TongWeb 7,如果使用jmg的TongWeb字节码会有问题,猜测可能是jmg的TongWeb字节码是没有对TongWeb版本细分进行适配
notion image
notion image
 

武器化

java-chains插件(yinsel✅)
woodpecker插件()

后渗透

notion image

总结

对于链的,还需要深入调试一下,不然有时候还是

参考资料

  • YinselのBlogYinselのBlogTongWeb EJB 反序列化漏洞 | YinselのBlog
 
Loading...

© thestar 2021-2025