一、帆软简介:
FineReport是由帆软自主研发的一款纯Java编写的报表软件产品,集数据展示(报表)和数据录入(表单)功能于一身,能够制作复杂的报表,操作简单易用。针对软件开发商和系统集成商,用于快速构建企业信息系统的中国式Web报表软件。
二、漏洞简介
1、前台备份文件泄露
2、插件上传导致的XXE
3、插件上传导致的get shell
三、环境搭建
本次搭建环境为:windows7+tomcat 8.5.56+jdkjdk1.8.0_131
首先,下载好帆软9.0的安装包。
http://down10.zol.com.cn/office/windowsx64_FineReport9.0.exe
运行该程序,默认安装下一步就可以,因为我们复现仅仅需要数字决策平台,也就是WEB端。其他的不需要去关注,点下一步就是了。
安装好之后会看到以下文件
下载tomcat8.5.56
这里建议直接下载压缩包版,而不是安装版,安装版有些参数需要调试,而压缩包版本在部署帆软WEB端的时候只需要复制粘贴就好了。
https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.56/bin/apache-tomcat-8.5.56.zip https://tomcat.apache.org/download-80.cgi
解压好后建议先不要直接部署,先启动一下看看能不能运行起来。
因为我这边编码有问题,但是不影响我们复现
TOMCAT起来之后,说明起步没什么问题。
部署帆软报表
官方文档给了两种TOMCAT的部署方式,一种是独立部署,一种是嵌入式部署。这里我推荐独立部署,一是因为方便,二是因为在复现的时候,路径的问题导致复现失败。这里我直接贴一下官网文档链接。
https://help.finereport.com/doc-view-772.html 这里我采用的是独立部署
方法很简单,只需要将FineReport_9.0中的WebReport复制到tomcat/webapps就可以了。
当你看到这个页面,说明部署成功了。
四、漏洞复现
1、前台备份文件泄露
帆软v9.0提供了备份文件功能
默认情况下(官方示例https://help.finebi.com/finebi4.1/doc-view-517.html)的备份文件路径是:
path="${WEB_REPORT}/bakup"
根据不通的模块,备份文件又分了以下几个
all_bakup
config_bakup jar_bakup log_bakup
plugins_bakup reportlets_bakup update_bakup
针对不同的备份方式,其备份目录也不同。
手动备份:autobackup 自动备份:manualbackup
内部备份路径为:
autobackup/YYYY.MM.DD<space>HH.MinMin.SS
manualbackup/<NAME(default is timestamp)>
例如:该环境的备份路径为:
http://IP/WebReportTest/bakup/config_bakup/manualbackup/2020.07.23 10.21.32/resources/
在privilege.xml文件中包含了后台的账号密码。
如果确认WEB根目录下存在备份目录,可以尝试猜解timestamp。如果是Windows下,还可结合短文件名。
可通过反编译fr-core-9.0.jar得知算法,来解密密文。
public class Main {
private static final int[] PASSWORD_MASK_ARRAY = {19, 78, 10, 15, 100, 213, 43, 23};
public static String passwordDecode(String paramString) {
if (paramString != null && paramString.startsWith("___")) {
paramString = paramString.substring(3);
StringBuilder stringBuilder = new StringBuilder();
byte b1 = 0;
for (byte b2 = 0; b2 <= paramString.length() - 4; b2 += 4) {
if (b1 == PASSWORD_MASK_ARRAY.length)
b1 = 0;
String str = paramString.substring(b2, b2 + 4);
int i = Integer.parseInt(str, 16) ^ PASSWORD_MASK_ARRAY[b1];
stringBuilder.append((char)i);
b1++;
}
paramString = stringBuilder.toString();
}
return paramString;
}
public static void main(String[] args) {
String pwd = "___0022...";
System.out.println(passwordDecode(pwd));
}
}
2、插件上传导致的XXE
在帆软插件市场下载的插件是标准.zip压缩包,压缩包里包含了插件jar包以及插件元信息的XML。
FineReport在解析plugin.xml时存在XXE
修改插件压缩包中的plugin.xml。将插件.zip包上传,点击你上传的插件信息可看到你的XXE回显。
但是插件信息中能返回的文件信息有限。
但既然是XXE,其他的奇技淫巧小伙伴们自行脑补。
3、插件上传导致的get shell
还是插件上传,插件长传后,一般会直接解压到下面这个目录
WEB-INF/plugins/plugin-EVIL-[VERSION]
但是这个路径没办法直接访问,所以需要结合备份功能将其备份到WEB目录下。
先把我们事先准备好的webshell文件添加到插件的压缩包中,然后通过插件上传上传到服务器中。
然后我们通过插件备份,备份到WEB目录下。这里为了防止备份路径不在WEB目录下,可自行更改到WEB下。
PS:在选择备份路径的时候,我们是可以进行遍历目录的。其数据包如下:
POST
/WebReport/ReportServer?op=fs_bakrestore&cmd=folder_tree
………
………
serverID=&optype=get_nodes&parentID=/root&layer=1
根据先前我们提到的关于被跟路径以及目录的名称,可以自行构造URL来实现访问。
五、总结
1、相对于8.0,9.0的漏洞利用条件相对苛刻,漏洞利用点集中在后台,利用备份读取后台账号密码,路径比较难猜解(Windows下尝可尝试一下段文件名)。一旦突破,并且启用了插件功能,结合列目录,getshell基本没什么问题。
2、搭建测试环境不建议用官方,官方软件在测试时,发现没有并没有插件上传功能,导致漏洞并无法复现。另外,在测试时,建议更改一下项目名称,例如截图的/WebReportTest,如果用非官方进行搭建时,发现也没有插件功能,建议先搭建一套官方的,再搭建一套非官方的。(同样的搭建方式,非官方项目建议更改一下项目名,别问我为啥,都是泪/(ㄒoㄒ)/
3.getshell的过程中,对于上传的shell是有要求的(建议直接大马)。例如,利用冰蝎的JSP马,发现并不能正确编译,导致不能连接失败。可能是环境的问题,尝试百度方法无解。具体为啥,我也不知道,不行就多试试其他的马/(ㄒoㄒ)/
请登录后查看回复内容