高清還原漏洞——被微軟發布又秒刪的遠程預執行代碼漏洞CVE-2020...

2020-12-09 IT168

  概述

  ◆2020年3月10日是微軟補丁日,安全社區注意到Microsoft發布並立即刪除了有關CVE-2020-0796的信息;

  ◆2020年3月11日早上,Microsoft發布了可糾正SMBv3協議如何處理特製請求的修補程序;

  ◆2020年03月12日微軟發布安全公告聲稱Microsoft 伺服器消息塊 3.1.1 (SMBv3) 協議處理某些請求的方式中存在遠程執行代碼漏洞。成功利用此漏洞的攻擊者可以獲取在目標伺服器或客戶端上執行代碼的能力。要利用針對伺服器的漏洞,未經身份驗證的攻擊者可以將特製數據包發送到目標 SMBv3 伺服器。要利用針對客戶端的漏洞,未經身份驗證的攻擊者將需要配置惡意的 SMBv3 伺服器,並說服用戶連接到該伺服器。此安全更新通過更正 SMBv3 協議處理這些特製請求的方式來修復此漏洞。

  ◆此缺陷可影響SMB協商中的客戶端和服務端。服務端漏洞位於srv2.sys中,客戶端漏洞位於mrxsmb.sys中,這兩個漏洞最終都在SmbCompressDecompress中調用了相同的代碼。

  本文試以CVE-2020-0796為例,為讀者 「高清」還原漏洞分析工作視角。

  受影響的系統

  Windows 10 Version 1903 for 32-bit Systems

  Windows 10 Version 1903 for ARM64-based Systems

  Windows 10 Version 1903 for x64-based Systems

  Windows 10 Version 1909 for 32-bit Systems

  Windows 10 Version 1909 for ARM64-based Systems

  Windows 10 Version 1909 for x64-based Systems

  Windows Server, version 1903 (Server Core installation)

  Windows Server, version 1909 (Server Core installation)

  分析

  首先我們來執行CVE-2020-0796的PoC

  如果目標系統未處於調試狀態,我們將觀察到目標設備進入藍屏狀態。待Windows系統重啟後,我們會使用WinDBG打開C:\Windows\System32\MEMORY.DMP文件,通過分析內存轉儲文件嘗試找到觸發藍屏的原因。

  如果目標系統處於調試狀態,將會在WinDBG中觀測到如下圖所示的中斷:

  釋放內存的錯誤

  無論是任何一種情況,大多時候在WinDBG中首選執行!analyze -v,嘗試由WinDBG自動分析導致問題的模塊。

  或者查看棧回溯

  如上文0x0C號棧幀所示,srvnet模塊中的SmbCompressionDecompress函數在調用ExFreePool時是觸發藍屏的直接因素。

  同時,我們注意到上文0x0D號棧幀所示的返回函數是模塊名+偏移量的形式,這是因為WinDBG沒有加載srv2模塊的的符號文件。加載srv2模塊的符號之後,棧回溯更有可讀性:

  根據函數名稱字面理解或參考DDK文檔ExFreePool是釋放內存的函數,一般不會有什麼問題。這個涉及Windows內核的Pool內存管理機制及結構。過往經驗告訴我們,ExFreePool需要操作的內存結構被破壞掉了,即這可能是個Windows內核中的內存破壞漏洞(Memory Corruption)。

  人生終極三問:你是誰?從哪裡來?到哪裡去?在漏洞分析領域同樣適用。

  為#FormatImgID_6#搞明白ExFreePool要釋放的內存,來自哪裡,又是被誰搞壞的。我們需要在IDA Pro中看看srvnet模塊中的SmbCompressionDecompress函數。

  當然如果你那邊IDA Pro顯示的和上圖所示不同,沒有這些可讀性較好的變量名,而是像下圖這樣

  也不必驚訝,後續我們會解釋,如何通過公開的文檔、符號文件或者數據流,註解IDA Pro函數名或者變量名,使得顯示更加友好,以便開展分析工作。這個過程有點像Windows系統自帶的掃雷遊戲。

  IDA Pro顯示srvnet模塊中的SmbCompressionDecompress函數主要流程十分清晰:申請內存(ExAllocatePoolWithTag)、解壓處理(RtlDecompressBufferEx2)、釋放內存(ExFreePoolWithTag)。

  我們現在已知藍屏的直接原因是釋放內存的操作引起的,那麼問題就顯然出現在成功申請內存之後,到釋放內存之間的這個過程中。我們看到這個過程中只有一個處理函數,即RtlDecompressBufferEx2。

  現在所有的疑點都集中在了RtlDecompressBufferEx2函數上,

  我們來看看這個ntoskrnl模塊中的RtlDecompressBufferEx2函數。

  IDA Pro顯示RtlDecompressBufferEx2函數是根據參數CompressionFormat的一個跳轉函數。

  RtlDecompressBufferProcs數組前2個QWORD元素為0。即當CompressionFormat取值為3時,函數最終轉向RtlDecompressBufferXpressLz函數中。

  IDA Pro顯示RtlDecompressBufferXpressLz函數是一個300多行偽代碼的複雜函數。

  靜態分析有點吃力,為了快速定位問題,讓我們來試試用WinDBG動態調試一下。

  還是執行PoC,windbg中斷時執行kn或者!analyze -v。這次我們試試!analyze -v。

  太棒了,我們和WinDBG達成了共識。它直接提示可能是nt!RtlDecompressBufferXpressLz+2d0處出了問題。


  現在我們了解到nt!RtlDecompressBufferXpressLz+2d0處是一個內存複製函數qmemcpy。這符合往常的漏洞構成的元素。

  我們需要再了解一下qmemcpy裡面的這3個參數。

  我們設置一個這樣的斷點:

  可得我們感興趣的qmemcpy的3個參數:

  查看一下目的內存的pool信息:

  這是一個0x1280大小的非分頁池內存。qmemcpy函數準備向其中寫入0x8483ffff大小的數據。很顯然會溢出。

  對於Pool內存的大小不超過一個頁面長度(PAGE_SIZE,即4K字節)時,可以通過使用POOL_HEADER結構體來查看pool塊信息。

  我們注意到0xffffe402ec9f4000之後在ffffe402ec9f5280 處是一個0x700大小的空閒塊,再之後ffffe402ec9f5990 處是一個0x290 大小的已被分配使用的塊。

  在qmemcpy函數執行後,我們發現ffffe402ec9f5280處的_POOL_HEADER確實被寫入了數據。

  複製數據的大小

  現在我們需要搞明白,複製數據大小和目的地址的來源。

  經過類似的斷點和調試,我們在nt!RtlDecompressBufferXpressLz+0x2AA處,觀察到qmemcpy中的count數據來自於RtlDecompressBufferXpressLz收到的參數CompressedBuffer的最後4個字節與3的和。因此操作壓縮數據末尾的4個字節,可以控制複製數據的大小。

  複製數據大小的來源已經清楚了,就剩下最後一個謎團--目的地址的來源。

  目的地址的來源

  我們根據設置的WinDBG斷點日誌,整理了上圖所示的函數調用及數據傳遞過程。也順便介紹了前文所述的如何通過公開的文檔、符號文件或者數據流,註解IDA Pro函數名或者變量名,使得顯示更加友好,以便開展分析工作。入手點是https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtldecompressbufferex2查閱到的關於RtlDecompressBufferEx2的定義或NT之前洩露的源碼中的相關函數定義。

  從日誌上來看,qmemcpy的目的地址正是UncompressedBuffer偏移1的地方。

  Srv2DecompressData+0x85處的ExAllocatePoolWithTag() 返回值是0xffffa28f92503000,位於UncompressedBuffer之後0x370CBC8的位置。

  即qmemcpy寫入數據大小範圍內有其他的Pool塊時,將會導致ExFreePoolWithTag()時出錯。

  任意地址寫入

  如果size大小合適或者其範圍內沒有在用的Pool塊,如0x1100+0n24大小時,則會有下述情況:

  我們根據相關函數調用,繪製了上圖所示的內存布局圖。

  當srv2!Srv2DecompressData+0x79處 SrvNetAllocateBuffer((unsigned int)(hdr.OriginalCompressedSegmentSize + offset)申請內存時,返回值設定AllocateBuf,簡稱A點。B點至U點正是SMB協議頭中的offset值0x03e8(0n1000)。

  OriginalCompressedSegmentSize值(Wireshark中所示的OriginalSize)過大,與offset相加導致整數溢出。最終申請了一個較小的內存。即B點至A點的內存。內存的起始地址被寫在AllocateBuf+0n24的P點。

  當解壓函數把超量數據寫入U點時,如果超過了之前申請的內存(B點至A點的內存),也會覆蓋原本存放在P處的指針。

  srv2!Srv2DecompressData+0x108處的memmove會讀取P點的指針作為目的地址,寫入原始數據中offset之前的數據,從而完成預定的解壓邏輯。當P處的指針可以被改寫後,攻擊者就獲得了一次任意地址寫入任意數據的能力。

  至此漏洞分析視角下的工作基本完成,撰寫分析報告時,我們會用倒敘的方法,就是大家經常看到的文章形式。後續文章我們再談談漏洞補丁分析和漏洞利用。

  解決方案

  儘快安裝微軟官方補丁或在網絡出入口上阻止TCP埠445,以防止SMB流量進出網際網路。此外,我們建議您進行內部網絡分段,並禁止終端之間的SMB連接,以防止橫向移動。

  禁用SMBv3壓縮將防止利用易受攻擊的SMB伺服器。要禁用SMBv3壓縮,可以在PowerShell中運行以下命令:

  綜述

  藍屏(BSOD)一般是遠程代碼執行的前兆,從其進化到遠程代碼執行會更具挑戰性,因為需要藉助其他漏洞以便繞過Windows最新的緩解技術(KASLR、KARL)。此漏洞對攻擊者具有很高的價值,可使得攻擊者很容易觸及分配內存的函數,並且可以控制觸發溢出的數據大小。另一方面,攻擊者輸入的對象的內存被很快釋放,使漏洞利用更加困難。

  參考 &引用

  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/1d435f21-9a21-4f4c-828e-624a176cf2a0

  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/5606ad47-5ee0-437a-817e-70c366052962

  http://yiiyee.cn/blog/2013/12/11/large-pool-1/

  https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlgetcompressionworkspacesize

  https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtldecompressbufferex2

  命令&斷點

相關焦點

  • 漏洞預警 | 微軟 CVE-2019-0708 高危漏洞
    一、安全公告2019年5月14日,微軟發布了本月安全更新補丁,其中包含一個RDP(遠程桌面服務)遠程代碼執行漏洞的補丁更新,對應CVE編號:CVE-2019-0708,相關信息連結:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory
  • SMB遠程代碼執行漏洞(CVE-2020-0796)分析
    2020年3月10日,微軟發布安全公告,其中包括一個Windows SMBv3 遠程代碼執行漏洞(CVE-2020-0796)。該漏洞源於SMBv3協議在處理惡意壓縮數據包時,進入了錯誤流程。遠程未經身份驗證的攻擊者可利用該漏洞在應用程式中執行任意代碼。
  • SMB遠程代碼執行漏洞CVE-2020-0796安全通告
    【漏洞名稱】SMB遠程代碼執行漏洞(CVE-2020-0796),有安全研究者取名「SMBGhost」。【漏洞描述】微軟3月11日發布3月例行更新,其中並未公布編號為CVE-2020-0796的高危漏洞資料,但該漏洞卻最為引人注目。次日晚(2020年3月12日)微軟正式發布CVE-2020-0796高危漏洞補丁。
  • 微軟Exchange伺服器遠程代碼執行漏洞復現分析[CVE-2020-0688]
    在本周二的最新補丁程序中,微軟公司發布了重要級補丁程序,以解決中的遠程執行代碼錯誤。該漏洞由一位匿名研究人員報告,漏洞影響範圍一直影響到Microsoft Exchange Server的所有受支持版本。最初,微軟公司表示這個漏洞是由於內存損壞漏洞引起的,該漏洞可以通過發送一封特製的郵件到微軟的有漏洞的Exchage伺服器上。在此後發布的write up中表明該漏洞是由Exchange Server在安裝時未能正確創建唯一的加密密鑰導致的。
  • HVV 2020 | Microsoft Exchange Server遠程代碼執行漏洞
    1、Microsoft Exchange Server概述Microsoft Exchange Server是微軟公司推出的一套商業電子郵件系統由於對cmdlet參數的驗證不正確,攻擊者可能會通過向受影響的 Exchange 伺服器發送包含特殊 cmdlet 參數的郵件來觸發此漏洞,成功利用此漏洞的攻擊者能夠在受影響的系統上以 system 權限執行任意代碼。
  • MyBatis遠程代碼執行漏洞CVE-2020-26945
    1520201014漏洞概述MyBatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集。2020年10月6日,MyBatis官方發布了MyBatis 3.5.6版本,修復了一個遠程代碼執行漏洞,該漏洞編號為CVE-2020-26945。
  • CVE-2020-0688:微軟EXCHANGE服務的遠程代碼執行漏洞
    工具 https://github.com/incredibleindishell/ysoserial.net-complied本周二,微軟發布了一個
  • Windows遠程桌面服務漏洞(CVE-2019-0708)復現測試
    1漏洞概述2019年5月14日,微軟發布了針對遠程桌面服務的關鍵遠程執行代碼漏洞CVE-2019-0708的補丁,該漏洞影響某些舊版本的Windows。攻擊者一旦成功觸發該漏洞,便可以在目標系統上執行任意代碼,該漏洞的觸發無需任何用戶交互操作。這就意味著,存在漏洞的計算機只要聯網,無需任何操作,就可能遭遇黑客遠程攻擊,運行惡意代碼。
  • CVE-2020-1206:SMBleed漏洞影響SMB
    漏洞位於SMB的解壓縮函數中,與SMBGhost和EternalDarkness漏洞(CVE-2020-0796)位於同一函數中,攻擊者利用該漏洞可以遠程從竊取kernel 內存信息,與之前爆出的蠕蟲漏洞結合之後,就可以實現遠程代碼執行攻擊。漏洞分析SMB協議運行在TCP 445埠,是文件分享、網絡瀏覽、列印服務和網絡上進程間通信的基礎。
  • 「最新漏洞簡訊」Windows域名系統伺服器漏洞(CVE-2020-1350)
    情報編號:H1020200715漏洞概述CVE-2020-1350是Windows DNS伺服器中的嚴重遠程執行代碼(RCE)漏洞,官方分類為「可蠕蟲級」高危漏洞,CVSS基本得分為 10.0。此問題是由Microsoft的DNS伺服器角色實現中的缺陷引起的,並影響所有Windows Server版本。
  • CVE-2020-0796:SMBv3的RCE漏洞,下一個EternalBlue?
    轉載:nosec 作者:iso60001近日,微軟公布了在Server Message Block 3.0(SMBv3)中發現的「蠕蟲型」預授權遠程代碼執行漏洞。目前該漏洞已在本月的安全補丁中被修復。該漏洞是由於SMBv3協議在處理惡意的壓縮數據包時出錯所造成的,它可讓遠程且未經身份驗證的攻擊者在目標系統上執行任意代碼。儘管微軟並沒有發布更加詳細的漏洞建議,但一些早先得知了漏洞信息處於微軟主動保護計劃中的安全供應商發布了有關CVE-2020-0796安全漏洞的詳細信息。
  • 微軟發布兩個緊急安全更新:修復遠程代碼執行漏洞
    今天微軟發布了兩個不定期的例外(Out-of-Band)安全更新,重點修復了 Windows Codecs 庫和Visual Studio Code 應用中的安全問題。這兩個例外安全更新是本月補丁星期二活動日之後再發布的,主要修復了兩款產品中的「遠程代碼執行」漏洞,能夠讓攻擊者在受影響的設備上遠程執行代碼。
  • 「高危漏洞預警」CVE-2019-1367遠程代碼執行漏洞
    一、事件報告當地時間 9月 23 日,微軟官方發布了「網際網路瀏覽器累積安全更新」修復了Internet Explorer中的一個遠程代碼執行漏洞(CVE-2019-1367)。漏洞存在於IE 腳本引擎處理內存中對象的方式中。該漏洞可以破壞內存,使攻擊者可以在當前用戶的上下文中執行任意代碼。
  • 微軟TCP/IP遠程執行代碼漏洞風險通告
    10月14日,微軟宣布了Windows IPv6堆棧中的一個極為關鍵的漏洞(CVE-2020-16898,又稱「Bad Neighbor」),這意味攻擊者可以利用該漏洞發送惡意製作的數據包,從而獲取在目標伺服器或客戶端上執行代碼的能力。該漏洞評級為「 Critical」(高危),鑑於漏洞有被利用的可能,我們建議用戶儘快更新相關補丁。
  • [圖]微軟發布兩個緊急安全更新:修復遠程代碼執行漏洞
    今天微軟發布了兩個不定期的例外(Out-of-Band)安全更新,重點修復了 Windows Codecs 庫和Visual Studio Code 應用中的安全問題。這兩個例外安全更新是本月補丁星期二活動日之後再發布的,主要修復了兩款產品中的「遠程代碼執行」漏洞,能夠讓攻擊者在受影響的設備上遠程執行代碼。
  • 「網絡安全」關於微軟DNSServer遠程代碼執行高危漏洞 的預警通報
    近日,微軟發布補丁修復了一個標註為遠程代碼執行的DNSServer漏洞,攻擊者成功利用該漏洞可執行遠程代碼,無需用戶幹預的情況下實現「蠕蟲式」攻擊。該漏洞編號:CVE-2020-1350,安全級別為「高危」。
  • 「網絡安全」關於MicrosoftSMBv3遠程代碼執行高危漏洞的預警通報
    該漏洞在2020年3月12日發布的Windows SMBv3 客戶端/伺服器遠程代碼執行漏洞的現實威脅上進一步升級,因該漏洞無需用戶驗證的特性,可能導致類似WannaCry攻擊蠕蟲式的傳播。漏洞編號:CVE-2020-0796,安全級別為:「高危」。
  • 漏洞預警!微軟曝光震網三代漏洞,隔離網面臨重大危機
    中新網6月14日電  北京時間6月14日,本月的微軟補丁今天發布,經過360安全專家研判確認以下兩個漏洞需要引起高度重視,採取緊急處置: LNK文件遠程代碼執行漏洞(CVE-2017-8464)和Windows搜索遠程命令執行漏洞(CVE-2017-8543)。
  • 蘋果watchOS 7.1以下發現任意代碼執行漏洞 需要儘快升級
    最近,Apple watchOS發現了一些需要儘快升級的重要漏洞。以下是漏洞的詳細信息:資料來源:https://Support.apple.com/zh-cn/HT2119281.cve-2020-27910,cve 2020-27916,cve 2020-10017,cve 2020-27909(官方尚未說明嚴重程度,如下所示)處理惡意製作的音頻文件可能導致任意代碼執行2.2020年-10003
  • ...桌面服務重磅漏洞CVE-2019-0708可被利用,深信服支招企業如何應對
    2019年9月7日凌晨,深信服安全團隊監測到關於Windows遠程桌面服務代碼執行漏洞CVE-2019-0708相關情報,情報披露CVE-2019-0708漏洞利用代碼,該EXP(漏洞利用)可以通過RDP協議進行遠程代碼執行攻擊。