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

2020-12-20 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

  命令&斷點

相關焦點

  • 微軟於2020年3月補丁日針對115個漏洞發布補丁
    Adobe在2月發布了多個版本,而三月份未發布任何補丁。在漏洞補丁發布時,尚未發現被積極利用的證據。2020年第一季度是微軟補丁程序更新繁忙的一個季度,第一季度共發布265個補丁程序。一起看看幾個有代表性的漏洞,更多細節請訪問微軟官方,獲取漏洞信息及補丁程序。
  • 深入解讀:Windows HTTP.sys遠程代碼執行漏洞跟蹤進展
    2010-09-14 Microsoft IIS FastCGI請求頭遠程溢出漏洞(MS10-065)(CVE-2010-2730)描述:對於啟用了FastCGI功能的IIS伺服器,遠程攻擊者可以通過提交特製的HTTP請求觸發緩衝區溢出,導致執行任意代碼。攻擊者可以遠程執行任意代碼。2.
  • fastjson 被曝存在遠程代碼執行漏洞,等級「高危」
    fastjson 當前版本為 1.2.68 發布於 3 月底,日前某安全運營中心監測到,fastjson <= 1.2.68 版本存在遠程代碼執行漏洞,漏洞被利用可直接獲取伺服器權限。360CERT 將漏洞等級定為「高危」。
  • POC已公開,CVE-2021-31166 HTTP 協議棧遠程代碼執行漏洞研究
    漏洞簡介2021年5月,奇安信 CERT 監測到了一枚影響廣泛的高危漏洞(CVE-2021-31166),此漏洞被微軟官方標記為 Wormable 和 Exploitation
  • 微軟於2020年4月補丁日針對113個漏洞發布補丁
    在CVE中這113個漏洞,17個超危,96高危。與2019年同期相比,微軟在2020年1月至4月間修補的CVE數量增加了44%。尋找漏洞的研究人員數量增加以及受支持產品組合的增加都有可能導致這一增長。>-       CVE-2020-1020- Adobe字體管理器庫遠程代碼執行漏洞針對Windows 7系統。
  • VLC遠程代碼執行漏洞不具有可再現性 Naver未實行內外網分離被罰
    本周安全資訊25 July 2019VLC開發人員聲明:此前曝光的遠程代碼執行漏洞不具有可再現性;韓國門戶網站Naver因未實行內外網分離被罰3千萬韓元;截至目前,微軟已發布聲明承認該消息。對此,研究人員建議改進Windows作業系統以保護用戶隱私,微軟尚未回應。二、網絡攻擊1.
  • Palo Alto Networks VPN漏洞曝光,允許黑客遠程執行任意代碼
    據外媒報導,研究人員發現Palo Alto Networks的GlobalProtect產品存在一個關鍵的RCE漏洞,允許未經身份驗證的黑客遠程執行任意代碼。因網關以未經抽樣和可利用的方式將特定參數值傳遞給snprintf,允許黑客利用該漏洞向易受攻擊的SSL VPN目標發送特製請求,遠程執行系統上的代碼。
  • Windows 最新遠程桌面 RCE 漏洞公告 - OSCHINA - 中文開源技術...
    來自 IDC 機房的公告:5月14日 微軟發布了針對遠程桌面服務(以前稱為終端服務)的關鍵遠程執行代碼漏洞CVE-2019-0708的修復程序,該漏洞  影響了某些舊版本的Windows
  • SUMAP網絡空間測繪|2021年CVE漏洞趨勢安全分析報告
    ,並且在10年中最明顯的變化2020年的cve數量已經超過2010年數量的5倍多。 我們以網際網路中2020年10月至11月監測到的全網資產數量(不包含歷史數據和重複數據)對比監測到的漏洞數量計算整體網際網路的漏洞比例為15%。
  • CVE-2020-2555:WebLogic RCE漏洞分析
    轉載:nosec 作者:iso600010x00 前言不安全的反序列化漏洞已經逐漸成為攻擊者/研究人員在面對Java Web應用時尋找的目標。這些漏洞通常能得到可靠的遠程代碼執行(RCE)效果,並且修復起來比較困難。
  • 【雲演情報】四葉草安全-Apache Guacamole RDP 遠程代碼執行漏洞;新照片隱私技術能擊敗人臉識別AI算法
    Lzcms_v1.1.5後臺存在文件上傳getshell漏洞,攻擊者可利用此漏洞任意代碼執行,從而控制伺服器修復建議:服務端白名單限制上傳格式; 對上傳內容進行過濾。ClipperCMS,一個基於php+mysql的內容管理系統。ClipperCMS v1.3.0存在命令執行漏洞。攻擊者可以利用此漏洞執行任意命令,從而導致伺服器可能被控制。
  • 微軟發布 8 月安全公告:修 22 個漏洞,影響 Win7
    微軟發布8月安全公告,其中含13個安全補丁,修補IE、Windows、Visio和Visual Studio等軟體中的22個安全漏洞。在Windows7 Service Pack 1基礎上運行IE 9或IE 8的用戶將會收到一個非常重要的安全公告。
  • 微軟發布9月安全補丁:修復IE高危漏洞-微軟,9月,安全補丁,修復,IE...
    微軟今天推送了9月安全補丁,本月共發布4個補丁,修復了42個影響Windows、IE、.NET Framework和Lync Server的漏洞。建議大家儘快安裝這些補丁。本月補丁中著重要強調是的MS14-052,這是IE累積性安全更新(KB2977629),級別為嚴重,修復了一個公開披露的漏洞和36個秘密報告的漏洞,可導致遠程代碼執行,目前已經有利用這些漏洞發起的攻擊。
  • 關於Palo Alto GlobalProtect存在遠程代碼執行高危漏洞預警通報
    近日,Palo Alto Networks官方發布關於 GlobalProtect Portal/Gateway接口存在遠程代碼執行高危漏洞的公告。現將漏洞詳情通報如下:一、漏洞情況Palo Alto Networks是一家從事網絡安全的企業,其主要產品有下一代防火牆、SSL VPN等其他網絡安全產品。
  • 微軟Win10爆出史詩級漏洞 危險程度堪比永恆之藍
    之前有報導稱微軟Windows 10(簡稱Win10)系統漏洞數量少於Linux、Mac OS等系統,結果這兩天Win10就爆出了一個史詩級漏洞,危險程度堪比前幾年肆虐全球的永恆之藍。這個漏洞編號CVE-2020-0796,與微軟Server Message Block 3.1.1 (SMBv3)協議有關,在處理壓縮消息時,如果其中的數據沒有經過安全檢查,直接使用會引發內存破壞漏洞,可能被攻擊者利用遠程執行任意代碼。
  • 思科修復嚴重等級為最高級10的遠程代碼執行漏洞
    雷鋒網消息,1月31日,據外媒報導,思科公司已經發布了軟體補丁,修復了影響運行自適應安全設備(ASA)軟體的思科設備主要漏洞。思科自適應安全設備軟體,是思科ASA家族系列設備的核心作業系統。根據此前發布的安全通報,較老版本的思科自適應安全設備軟體,會因為作業系統的安全套接層協議層(SSL)VPN功能漏洞而受到影響。漏洞將會影響啟用VPN功能的ASA設備雷鋒網(公眾號:雷鋒網)了解到,這一漏洞(CVE-2018-0101)將會導致以下思科ASA設備受到影響——不過,只有當「webvpn」功能啟動時,漏洞才會生效。
  • Ubuntu 系統內核發現拒絕服務或執行任意代碼漏洞,需儘快升級
    12 月 2 日,Ubuntu 發布了安全更新 , 修復了系統內核拒絕服務、執行任意代碼等重要漏洞。本地攻擊者可利用此漏洞造成拒絕服務(系統崩潰)或可能執行任意代碼。2.CVE-2020-25645 CVSS 評分:7.5 高Linux 內核中的 GENEVE 隧道實現與 IPSec 結合時,在某些情況下沒有正確選擇 IP 路由。攻擊者可以利用此漏洞暴露敏感信息(未加密的網絡流量)。
  • Win10漏洞又來了 可繞過Chromium瀏覽器沙盒執行任意代碼
    谷歌安全團隊近年來挖出不少嚴重漏洞,最近他們曝出了Windows 10 May 2019,也就是1903版本中的一個BUG,該BUG能夠破壞所有基於Chromium瀏覽器的沙盒,並且繞過沙盒執行任意代碼,雖然谷歌安全團隊表示想要利用這個BUG發起攻擊比較複雜,但從BUG本身來看,又是一個比較嚴重的系統
  • 微軟全面推送10月安全補丁 修復23個漏洞-微軟,10月,安全補丁,修復...
    微軟今天面向廣大Windows用戶推送了10月份的安全補丁,本月安全補丁共8個,修復23個漏洞。在微軟今日發布的8個安全補丁中,有2個屬於最高級別的「嚴重」級,涉及Windows作業系統和IE、Silverlight、.NET Framework等組件,惡意攻擊者可利用此漏洞進行遠程攻擊。
  • 關於CVE-2020-17087漏洞的研究之旅
    2020年10月22日,谷歌的安全研究人員在bug.chromium.org上發布了一個有趣的安全報告,標題為「Issue 2104: Windows Kernel cng.sys pool-based buffer overflow」,大致意思是在CNG.sys中發現了一個安全漏洞,而CNG.sys是一個Windows驅動程序,其IOCTL 0x390400導致一個函數容易受到