天天看點

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

本文講的是<b>Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析</b>,

漏洞概要

在2016年12月,FortiGuard Labs發現并報告了Microsoft Windows Server中的WINS Server遠端記憶體損壞漏洞。在2017年6月,微軟向FortiGuard實驗室答複說:“要修複程式漏洞需要對代碼進行全面徹底的檢查,WINS所提供的功能會被DNS所取代,微軟已經建議客戶将其遷移出去。也就是說,由于修複漏洞所需要的工作量,Microsoft不會修補此漏洞。相反,Microsoft是建議使用者使用DNS來替換WINS。

此漏洞影響的版本涉及到Windows Server 2008,2012和2016。之是以存在此漏洞是因為在處理格式錯誤的WINS資料包時會觸發遠端記憶體損壞。

在本文中,我想分享一下這個漏洞的一些細節。

漏洞複現

要複現此漏洞,請按照以下步驟操作。

1. 在受影響的Windows Server版本中的“伺服器管理器”中安裝“WINS伺服器”。本文中,我們正在使用的是Windows Server 2016.按照“伺服器管理器”的安裝向導,然後選中“WINS伺服器”選項。請參見圖1中的操作。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

圖1.安裝WINS Server服務

2. 打開“控制台” – &gt;“管理工具” – &gt;“WINS”。然後導航到“WINS” – &gt;“複制夥伴”,右鍵單擊“複制夥伴”,然後選擇“建立複制夥伴”。見下圖中的操作。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

圖2.建立WINS複制夥伴

3. 在彈出的對話框中,輸入WINS伺服器IP位址,然後單擊确定。請注意,WINS伺服器的IP位址必須是攻擊者的主機的IP位址。在我的測試中,IP位址為10.0.0.1。請參見圖3中的操作。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

圖3.輸入WINS伺服器IP位址

4. 在另一台機器上,如Windows 7 x64(這台主機的IP位址必須是你在步驟3中輸入的WINS伺服器的IP位址),然後在CLI中運作PoC,如“trigger_poc.py”。發送資料包後,你就可以看到Windows Server 2016上的WINS Server服務會停止工作,或者會使用新的pid自動重新啟動程序。你可以繼續運作PoC,直到由于遠端記憶體的損壞而導緻WINS Server服務完全停止工作。捕獲的攻擊封包如圖4所示。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

圖4.捕獲的攻擊封包

漏洞分析

存在此漏洞的根本原因在于Windows Server未正确處理多個挂起的WINS-Replication會話。是以讓我們先來看看捕獲的資料包。參見圖5。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

圖5.攻擊資料包中的資料

當使用複制指令WREPL_REPL_UPDATE2(0x00000005)處理多個(大于 3個)待處理的WINS-Replication會話時,就會觸發此漏洞。它導緻了“int 29h”,錯誤代碼為0xC0000409。參見圖6。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

圖6.“int 29h”,錯誤代碼為0xC0000409

“int 29h”是在Windows 8或更新版本中發現的新的安全聲明。它有許多斷言。在這裡,斷言在僞代碼中檢查了以下條件:損壞的清單指針。

當我們建立了多個挂起的WINS-Replication會話時,清單指針将被破壞。根本原因是将同一個緩沖區多次釋放到了清單池。請參閱以下代碼:

在上面的清單中,Flink指針指向清單中的下一個複習,Blink指針指向清單中的上一個對象。

在PoC中,在會話1,2,3之後發送兩個資料包并保持處于挂起狀态(用過發送TCP重置資料包這兩個會話不會被終止),首先使用B指針調用釋放配置設定函數,例如0x1f11306ff70 。A(ListHead)指針始終等于全局變量sAssocQueHd。配置設定是在父函數中完成的。是以在B被釋放之後,C将不存在于第一個釋放清單中。關系如下表所示。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

之後用B指針第二次調用釋放配置設定函數,它仍然等于0x1f11306ff70。A(ListHead)等于全局變量sAssocQueHd。是以在B被釋放之後,沒有添加新的條目。條目關系如下圖所示。

Windows Server中的 WINS 伺服器遠端記憶體損壞漏洞分析

你可以清楚地看到, 釋放配置設定函數被調用了兩次,B中的清單元素Flink和Blink指向了它們自己。這會導緻清單錯誤。

那麼這個deallocate函數将被第三次調用。是以“int 29h”由于清單指針檢查被破壞而觸發。

在以下函數中處理帶有Assoc_Ctx的WREPL_REPL_UPDATE2資料包時,對象指針将會設定為相同的指針:

從上面的代碼段可以看出,一旦獲得了對象指針poi(poi(7FF7F8804D28)+0x3e*8 

,最終的目标指針(之前傳遞給條目B的指針)在第一次調用釋放配置設定函數時是确定的,它被配置設定了B指針。在第二次和第三次調用釋放函數時,最終的目标指針(入口B指針)保持不變。在我的測試中,它是1306 1306 ff70 f1。這将導緻記憶體損壞。

注意:poi是擷取位址的值的函數。

總而言之,該漏洞是由于複制指令WREPL_REPL_UPDATE2(這是觸發此漏洞的關鍵)處理多個(&gt; 3)挂起的WINS複制會話所導緻的。其結果是相同的清單條目被多次釋放,這就導緻了遠端記憶體損壞。

漏洞緩解措施

我們鼓勵那些易受攻擊的Microsoft Windows Server的所有使用者立即從WINS伺服器進行遷移。另外,針對此漏洞,已經部署了Fortinet IPS解決方案的企業組織已經通過MS.Windows.WINS.Server.Remote.Memory.Corruption簽名得到保護。

原文釋出時間為:2017年6月21日

本文作者:絲綢之路 

本文來自雲栖社群合作夥伴嘶吼,了解相關資訊可以關注嘶吼網站。

<a href="http://www.4hou.com/vulnerable/5635.html" target="_blank">原文連結</a>

繼續閱讀