帆软报表V9.0 漏洞复现-小白-漏洞文库小世界-安全文库-NGC660 安全实验室

帆软报表V9.0 漏洞复现-小白

一、帆软简介:

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

1595487870712-7593a2ae-205b-44dd-b8aa-204405f1e02f

运行该程序,默认安装下一步就可以,因为我们复现仅仅需要数字决策平台,也就是WEB端。其他的不需要去关注,点下一步就是了。
安装好之后会看到以下文件

1595487927830-950328f1-371a-42b2-b7e7-c974fe85be71

下载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

1595487986237-b0b3cf1f-04bb-4752-880d-9033239cc906

解压好后建议先不要直接部署,先启动一下看看能不能运行起来。

1595487993848-c0eb78fb-5993-4465-87d2-79050a9df0a5

因为我这边编码有问题,但是不影响我们复现

1595488008059-d688e2c6-f95d-42de-be7a-540972be0639

TOMCAT起来之后,说明起步没什么问题。
部署帆软报表
官方文档给了两种TOMCAT的部署方式,一种是独立部署,一种是嵌入式部署。这里我推荐独立部署,一是因为方便,二是因为在复现的时候,路径的问题导致复现失败。这里我直接贴一下官网文档链接。
https://help.finereport.com/doc-view-772.html 这里我采用的是独立部署

1595488030290-5539d8aa-6461-4d32-808d-0785f2ed3749

方法很简单,只需要将FineReport_9.0中的WebReport复制到tomcat/webapps就可以了。

1595488047072-4a3b1ca4-5819-451a-82c3-59f1af84b5b4

当你看到这个页面,说明部署成功了。

四、漏洞复现

1、前台备份文件泄露

帆软v9.0提供了备份文件功能
默认情况下(官方示例https://help.finebi.com/finebi4.1/doc-view-517.html)的备份文件路径是:

path="${WEB_REPORT}/bakup"

根据不通的模块,备份文件又分了以下几个

1595488077271-036b0c0d-af18-474c-8a28-2eefbe7ef578

all_bakup  
config_bakup  jar_bakup  log_bakup
plugins_bakup  reportlets_bakup  update_bakup

1595488108694-5a70228b-4813-4bad-ba41-9918471f6009

针对不同的备份方式,其备份目录也不同。

手动备份:autobackup     自动备份:manualbackup

内部备份路径为:

autobackup/YYYY.MM.DD<space>HH.MinMin.SS
manualbackup/<NAME(default is timestamp)>

例如:该环境的备份路径为:

1595488114569-9e41818d-0c39-4dce-82e5-d5acbcfc3033

http://IP/WebReportTest/bakup/config_bakup/manualbackup/2020.07.23 10.21.32/resources/

1595488120545-42792aac-44ae-4441-92b8-badb582373d5

在privilege.xml文件中包含了后台的账号密码。
如果确认WEB根目录下存在备份目录,可以尝试猜解timestamp。如果是Windows下,还可结合短文件名。

1595488137399-a376f5e9-ee3e-4122-a39d-3404cf336dfe

可通过反编译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));
    }
}

1595488157686-60baaa9d-58b4-447d-b3a9-eee42e97e537

2、插件上传导致的XXE

在帆软插件市场下载的插件是标准.zip压缩包,压缩包里包含了插件jar包以及插件元信息的XML。

1595488238942-d72e7566-5d1c-40f9-8513-f77b173aef4d

1595488257671-5382a2b4-3768-44c5-8cca-7dd1bd4a8b98

FineReport在解析plugin.xml时存在XXE

1595488278233-02e6334d-3fc5-4914-a665-94a8e98e5219

修改插件压缩包中的plugin.xml。将插件.zip包上传,点击你上传的插件信息可看到你的XXE回显。

1595488294805-f2037f4b-21d2-4916-a09a-78562aa1202f

1595488305358-e0fb676c-483f-409b-b64c-9a3a10a0c1ed

但是插件信息中能返回的文件信息有限。
但既然是XXE,其他的奇技淫巧小伙伴们自行脑补。

3、插件上传导致的get shell

还是插件上传,插件长传后,一般会直接解压到下面这个目录

WEB-INF/plugins/plugin-EVIL-[VERSION]

但是这个路径没办法直接访问,所以需要结合备份功能将其备份到WEB目录下。
先把我们事先准备好的webshell文件添加到插件的压缩包中,然后通过插件上传上传到服务器中。

1595488325753-7f17ddbf-8017-4a9e-843f-9d2b1cbada7c

1595488340805-9bdd0b55-51fb-4ce5-a0f8-0676cb8a4750

1595488765521-05916210-3ea6-4ae0-be50-487975317247

然后我们通过插件备份,备份到WEB目录下。这里为了防止备份路径不在WEB目录下,可自行更改到WEB下。

PS:在选择备份路径的时候,我们是可以进行遍历目录的。其数据包如下:

POST
/WebReport/ReportServer?op=fs_bakrestore&cmd=folder_tree
………
………
serverID=&optype=get_nodes&parentID=/root&layer=1

1595488785321-6187a227-6d6f-4582-b1be-a906dd8d3740

1595488799535-2c0d2c77-9467-4242-9413-36feaedbe9d8

1595488806461-dfda63ac-a5bb-4a4a-97ee-86ce36573a67

根据先前我们提到的关于被跟路径以及目录的名称,可以自行构造URL来实现访问。

1595488820615-970527c0-de2f-40e9-8e20-ac45687e48f5

五、总结

1、相对于8.0,9.0的漏洞利用条件相对苛刻,漏洞利用点集中在后台,利用备份读取后台账号密码,路径比较难猜解(Windows下尝可尝试一下段文件名)。一旦突破,并且启用了插件功能,结合列目录,getshell基本没什么问题。
2、搭建测试环境不建议用官方,官方软件在测试时,发现没有并没有插件上传功能,导致漏洞并无法复现。另外,在测试时,建议更改一下项目名称,例如截图的/WebReportTest,如果用非官方进行搭建时,发现也没有插件功能,建议先搭建一套官方的,再搭建一套非官方的。(同样的搭建方式,非官方项目建议更改一下项目名,别问我为啥,都是泪/(ㄒoㄒ)/
3.getshell的过程中,对于上传的shell是有要求的(建议直接大马)。例如,利用冰蝎的JSP马,发现并不能正确编译,导致不能连接失败。可能是环境的问题,尝试百度方法无解。具体为啥,我也不知道,不行就多试试其他的马/(ㄒoㄒ)/

请登录后发表评论

    请登录后查看回复内容