漏洞分析 | kkFileView远程代码执行漏洞

2024-06-01 364 0

漏洞概述

kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览。

近期,网宿安全演武实验室监测到kkFileView存在远程代码执行漏洞(网宿评分:危急,CVSS3.1评分:9.8):远程攻击者无需身份认证,即可利用该漏洞覆盖任意⽂件,再调用被覆盖的文件实现远程代码执行。

目前该漏洞POC状态及EXP状态已在互联网公开,建议客户尽快做好自查及防护。

受影响版本

4.2.0 <= kkFileView <= 4.4.0-beta

受影响资产

该漏洞关联的web服务资产总数为10435个,独立IP数为8667个。

前置知识

kkFileView前台文件上传功能点出现的Zip Slip漏洞,其实早在2018年就已在多个系统中发现类似的问题,影响了数千个项目,更多信息详见https://github.com/snyk/zip-slip-vulnerability

我们编写了一个使用ZipFile 类来处理Zip文件的方法。

public static void normal() throws IOException {
 //解压zip的包
 String fileAddress = "C:\\Program Files\\Vuln\\FileAction\\normal.zip";//zip文件解击路径
 String unZipAddress = "C:\\Program Files\\Vuln\\FileAction\\";// 解压路径
 File file = new File(fileAddress);
 ZipFile zipFile = null;
 try {
 zipFile = new ZipFile(file);//设置编码格式
 } catch (IOException exception) {
 exception.printStackTrace();
 System.out.println("解压文件不存在");
    }

 Enumeration e = zipFile.entries();
 while (e.hasMoreElements()) {
 ZipEntry zipEntry = (ZipEntry) e.nextElement();
 File f = new File(unZipAddress + zipEntry.getName());
 f.getParentFile().mkdirs();
 f.createNewFile();
 InputStream is = zipFile.getInputStream(zipEntry);
 FileOutputStream fos = new FileOutputStream(f);
 int length = 0;
 byte[] b = new byte[1024];
 while ((length = is.read(b, 0, 1024)) != -1) {
 fos.write(b, 0, length);
        }
 is.close();
 fos.close();
    }
}

并提供了一个正常压缩包。

漏洞分析 | kkFileView远程代码执行漏洞插图

和另一个恶意压缩包。

漏洞分析 | kkFileView远程代码执行漏洞插图1

运行以后发现,normal.zip正常解压至指定目录。

漏洞分析 | kkFileView远程代码执行漏洞插图2

而poc.zip利用../构造的恶意路径解压至根目录。

漏洞分析 | kkFileView远程代码执行漏洞插图3

漏洞分析

该漏洞的根本原因是cn.keking.service.CompressFileReader#unRar⽅法在处理压缩文件时,未对文件名路径进行充分的验证,从而使得攻击者可以通过解压缩操作,将文件写入到非预期的目录。

首先通过漏洞情报定位至onlinePreviewController,接口为/onlinePreview,它的功能就是根据给定的url在线预览文件,并调用相应的handler进行文件预览处理。

漏洞分析 | kkFileView远程代码执行漏洞插图4

filePreviewHandle()先是检查了文件名是否存在缓存,如果是首次上传,则调用DownloadUtils.downLoad()下载,接着解压文件,如果文件名已存在,则直接从缓存中获取fileTree。

漏洞分析 | kkFileView远程代码执行漏洞插图5

显然,攻击者直接上传一个新的恶意压缩包即可进入漏洞触发点。

漏洞分析 | kkFileView远程代码执行漏洞插图6

不难发现,这里在做解压处理的时候,输出文件的路径是通过字符串拼接的方式构建的,因此借助../就可以实现覆盖任意文件。

接着思考如何去调用被覆盖的文件,我们发现kkFileView支持的文件类型包括odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档。

漏洞分析 | kkFileView远程代码执行漏洞插图7

而为了与 LibreOffice 的 UNO(Universal Network Objects)接口进行交互,uno.py通常是和LibreOffice一起安装的,默认位于 LibreOffice 安装目录下的 program 子目录中。

漏洞分析 | kkFileView远程代码执行漏洞插图8

也就是说,当我们上传.odt文件并预览时,系统将调用LibreOffice中的uno.py文件,那么结合上文的Zip Slip漏洞将恶意代码写入该文件,即可实现远程代码执行。

漏洞复现

首先上传恶意压缩包并预览。

漏洞分析 | kkFileView远程代码执行漏洞插图9

漏洞分析 | kkFileView远程代码执行漏洞插图10

可以发现恶意代码已写入uno.py。

漏洞分析 | kkFileView远程代码执行漏洞插图11

接着上传.odt文件并预览,即可触发该漏洞。

漏洞分析 | kkFileView远程代码执行漏洞插图12

漏洞分析 | kkFileView远程代码执行漏洞插图13

修复方案

1、目前厂商已重构解压缩逻辑以修复漏洞,用户可以通过

https://github.com/kekingcn/kkFileView下载master分支的最新代码,临时解决该问题;

2、限制写入uno.py⽂件。


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

苹果试图保护你的隐私,OpenAI可能做不到
Shuffle:一款完全自动化的安全栈增强平台
如何使用CODASM编码Payload并降低熵值
SessionExec:一款针对会话安全的安全命令测试工具
Arkime:一款大规模数据包捕获和索引数据库系统
从蓝队流量角度分析Shiro-550反序列化漏洞

发布评论