您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Windows DNS Server 遠程代碼執行漏洞 CVE-2021-24078的原理分析是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Windows DNS Server 是 Windows Server 服務器上的一項重要功能組件, 負責調度和處理域內主機的所有DNS相關服務。
奇安信代碼安全實驗室的研究員在Windows DNS Server中發現一個嚴重的遠程代碼執行漏洞 (CVE-2021-24078)。它是首個由國內安全研究員發現并提交的蠕蟲級漏洞,危害巨大,CVSS 評分為9.8分,堪比微軟去年修復的另外一個 Windows DNS Server RCE漏洞 (CVE-2020-1350)。測試者僅需向目標DNS服務器發送特制數據包,即可利用該漏洞在目標系統上以本地系統賬戶權限執行任意代碼,且觸發無需交互、無需身份認證且在 Windows DNS 默認配置下即可執行。
測試場景如下:
(1) 測試者向目標DNS服務器發起特殊查詢”XXXXXXXXXXXX.com”。
(2) 目標DNS服務器無法解析"XXXXXXXXXXXX.com",向上一級 DNS服務器(如8.8.8.8)發起遞歸查詢。
(3) 得到的記錄是一個測試者提前申請的ns記錄。此記錄的地址指向測試機器,含義是目標DNS服務器必須去這個ip地址查詢相關域名信息。
(4) 目標DNS服務器向測試機發起第二次查詢,直接向測試機的ip地址發起查詢。
(5) 此時測試機向目標DNS服務器發送畸形響應報文,觸發類型混淆漏洞。
漏洞點在于供處理報文的rr記錄生成請求函數dns.exe!Wire_CreateRecordFromWire。該函數所調用的類型解析函數dns.exe!RR_DispatchFunctionForType在解析時出現錯誤:在判斷rr類型是否合法時出現錯誤,將本應該作為有符號的比較錯誤地當成無符號比較,導致生成的rr記錄被標記成任意type值。換句話說,在此函數中生成的rrcord的type值幾乎可被標記為任意值(0-0xffff范圍內的大部分值),從而觸發類型混淆漏洞,最終可能導致RCE。漏洞分析流程如圖1所示。
圖1 漏洞的分析流程圖
偽代碼如下:
_int64 __fastcall RR_DispatchFunctionForType(__int64 *a1, unsigned __int16 a2){unsigned __int16 v2; // r8__int64 result; // raxv2 = a2;if ( a2 ){if ( a2 > 52u ){if ( (unsigned __int16)(a2 + 0xFF) <= 1u )v2 = a2 + 0x134;elsev2 = 0;}if ( !v2 || (result = a1[v2]) == 0 )result = *a1;}else{if ( WPP_GLOBAL_Control != (CDnsClientSubnetRecordsTrie *)&WPP_GLOBAL_Control&& *((_BYTE *)WPP_GLOBAL_Control + 28) & 1&& *((_BYTE *)WPP_GLOBAL_Control + 25) >= 4u ){WPP_SF_(*((_QWORD *)WPP_GLOBAL_Control + 2), 10i64, &WPP_78f9f773bfac3ce873e2989308e70330_Traceguids);}result = 0i64;}return result;}
該解析函數使傳入任意非零的rr type值都能找到相關rr的構造函數的CopyWireRead地址,造成類型混淆,進一步轉換類型混淆會導致任意地址讀或任意地址寫后果,最終可能導致任意代碼執行。而且,部分非默認的DNS server甚至支持版本查詢,從而使該漏洞更加具有利用價值。
通常,在Windows DNS的域名信息緩存記錄過程中,信息會被寫入一個個rrecord中。rrcord的類型一般有20多種,包括:
A: 主機地址信息
AAAA: ipv6主機地址
SOA: 標記權威區域地址
……
每一種rrecord的結構都各不相同。在測試包中,筆者將Copyrrcord混淆為type值為0xf0f0類型、Windows自定義的特殊rrcord類型。在此類型中,rrcord偏移的0x20、0x28、0x30、0x38處都是一個指針指向另外一個record,而在Copyrrcord類型中,偏移0x20、0x28、0x30處的值為0,偏移0x38處為一個長度可控的buf的起始位置。0xf0f0類型和copyrrecord類型的rrecord結構如圖2和圖3所示。
圖2 0xf0f0類型的rrecord結構
圖3 Copyrrecord類型(type值為0或者其它)rrecord結構
在測試包中實現的是可寫部分用于觸發崩潰,通過調用RR_Free函數清理現場(當報文處理函數發現報文畸形時,將會拒絕繼續處理報文并清理現場)。這樣即可控制free函數,free任意一個地址。
實際上,到了這一步已經可以開始嘗試進行利用漏洞。當向 DNS server緩存大量rrecord記錄時,可等同于堆噴效果。嘗試向0x0c0c0c0c0c0c0c0c或其它地址進行free,造成釋放后使用 (UAF),再轉為可讀或可寫,最終完成任意代碼執行。相關代碼如下:
void __fastcall RR_Free(__int64 a1){……if ( *(_WORD *)(v1 + 12) == 0xF0F0u || *(_BYTE *)(v1 + 10) < 0 ){if ( WPP_GLOBAL_Control != (CDnsClientSubnetRecordsTrie *)&WPP_GLOBAL_Control&& *((_DWORD *)WPP_GLOBAL_Control + 17) & 0x100&& *((_BYTE *)WPP_GLOBAL_Control + 65) >= 5u ){v9 = *(unsigned __int16 *)(v1 + 12);WPP_SF_qd(*((_QWORD *)WPP_GLOBAL_Control + 7), 10i64, &WPP_103a918d359034d16f977c36c11204c8_Traceguids, v1);}RR_ListFree(*(_QWORD **)(v1 + 56));……
在后續函數Wire_AddResourceRecordToMessage (為響應報文中寫入rrcord中記錄的信息)中,我們還可以嘗試進行反向混淆操作,如即將其它類型的rrcord混淆為Copyrrcord,造成信息泄漏等。
以上就是Windows DNS Server 遠程代碼執行漏洞 CVE-2021-24078的原理分析是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。