深入解讀:Windows HTTP.sys遠程代碼執行漏洞跟蹤進展

2020-12-14 51cto

此次微軟公告MS15-034 IIS7 http.sys漏洞,引來業界的關注,其震蕩性不亞於Windows領域的心臟出血事件。綠盟科技威脅響應中心啟動緊急響應機制,在4月15日、4月16日分別發布緊急通告及產品規則升級通告,受如下系統影響的用戶還請儘快升級廠商的補丁及綠盟科技產品規則包。

Microsoft Windows Server 2012 R2

Microsoft Windows Server 2012

Microsoft Windows Server 2008 SP1

Microsoft Windows 8.1

Microsoft Windows 8

Microsoft Windows 7 SP1

http.sys漏洞影響範圍

隨著各方的深入分析,各地域受Windows HTTP.sys漏洞影響的情況正在逐漸浮出水面。昨天的通告信息中提到Http.sys是Microsoft Windows處理HTTP請求的內核驅動程序,據綠盟科技網際網路廣譜平臺數據顯示,全球部署IIS的系統數量大概有444萬餘,從目前受影響的IIS各版本分布統計數據來看,其中IIS 7.5部署量最大,佔比42.3%,也是本次追蹤分析的重點。

在如下全球IIS7.5分布態勢圖中,可以看到美洲、歐洲、亞洲等國家受影響比較嚴重,其中美國、中國、英國及德國為受影響的稠密區域。

 

http.sys漏洞危害性分析

很多大型企業或組織在應對http.sys漏洞的時候,往往需要採取謹慎的態度,對於應對措施需要,並且結合自身的業務情況及網絡環境,定製行動計劃,以避免對業務系統造成損害,這就需要深入了解此次漏洞的原理,才能給出合適的方案。未知攻焉知防!下面對此漏洞的原理進行分析,以便大家更好的理解和防禦這一高危安全漏洞。

1、漏洞觸發

根據Pastebin上披露的PoC(http://pastebin.com/ypURDPc4),很容易構造出能觸發BSOD的PoC,比如以下請求:

GET /welcome.png HTTP/1.1

Host: PoC

Range: bytes=12345-18446744073709551615

可以使安裝有IIS 7.5的Windows 7 SP1系統BSOD。

2、漏洞原理

這裡以Windows 7 SP1 X64系統上安裝的IIS 7.5為例進行分析,其內核的版本為6.1.7601.18409,HTTP.sys的版本為6.1.7601.17514。

對BSOD崩潰的現場進行分析,發現是各種情況的內存錯誤,由此推測觸發漏洞後可能造成了內存破壞。對HTTP.sys的處理流程進行分析、逐步排查,可以確定內存破壞發生在函數HTTP!UlBuildFastRangeCacheMdlChain中,調用棧如下:

函數HTTP!UlBuildFastRangeCacheMdlChain用於生成響應報文的緩存MDL鏈,來描述HTTP響應的狀態行、頭部與消息體,鏈上的各MDL通過調用nt! IoBuildPartialMdl來生成。

MSDN中對nt! IoBuildPartialMdl的說明如下:

注意這裡明確要求了由VirtualAddress與Length確定的區間必須是SourceMdl描述的緩衝區的一個自區間,正是對此要求的違反導致了此漏洞中的內存破壞。

第3次調用nt! IoBuildPartialMdl來生成消息體MDL時的參數如下:

SourceMdl = 0xfffffa801a38cb60

SourceMdl.VirtualAddress = 0xfffffa801ac94000

SourceMdl.ByteCount = 0x2d315

SourceMdl.ByteOffset = 0x0

TargetMdl = 0xfffffa801a2ed580

TargetMdl.VirtualAddress = 0xfffffa801ac97000

TargetMdl.ByteCount = 0xffffcfc7

TargetMdl.ByteOffset = 0x39

VirtualAddress = 0xfffffa801ac97039

Length = 0xffffcfc7

這裡的Length是根據HTTP請求消息頭部中的Range欄位計算得到的,過程如下:

首先,在HTTP!UlpParseRange中對Range欄位進行解析,得到RangeBegin、RangeEnd;

然後,計算RangeLength = RangeEnd - RangeBegin + 1;

最後,將RangeLength截斷為32位得到Length。

以PoC中的Range: bytes=12345-18446744073709551615為例:

RangeBegin = 12345 = 0x3039

RangeEnd = 18446744073709551615 = 0xffffffffffffffff

RangeLength = 0xffffffffffffffff - 0x00003039 + 1 = 0xffffffffffffcfc7

Length = 0xffffcfc7

顯然由於Length超長而導致違反了nt! IoBuildPartialMdl的要求,進而造成內存破壞。

3、限制條件

HTTP.sys中的一些校驗措施可能在進入HTTP!UlBuildFastRangeCacheMdlChain函數前將RangeLength修改為合法值,從而不會觸發漏洞。

例如,在Windows 7 SP1 X64系統的IIS 7.5中,函數HTTP!UlAdjustRangesToContentSize會對RangeLength進行檢查,並在必要時進行調整,如下:

當RangeBegin >= ContentLength時,移除對應的數據;

當RangeLength== -1時,RangeLength= ContentLength – RangeBegin;

當RangeEnd + 1 >= ContentLength時,RangeLength= ContentLength – RangeBegin;

因此,要保持RangeLength不被修正而又能觸發漏洞,必須要同時滿足RangeEnd + 1 < ContentLength與RangeEnd > ContentLength,RangeEnd就只能為0xffffffffffffffff。

這樣,RangeBegin就必須小於ContentLength,同時還不能為1(否則將使RangeLength = 0xffffffffffffffff – 1 + 1 = -1而導致RangeLength被修正)。

在其他版本的系統中可能會有更多的限制。

4、代碼執行

從上述分析可以看出,觸發此漏洞可越界寫數據而造成內存破壞,理論上存在遠程執行代碼的可能性。但是越界所寫數據的長度下限由ContentLength決定,通常會是一個較大的值而立即使系統崩潰。即使目標伺服器上存在一些大的文件,可以用來越界寫少量數據,所寫數據內容與被覆蓋目標也很難控制。因此,在實際環境中想要穩定的利用此漏洞來執行代碼是非常困難的。

與http.sys漏洞攻擊賽跑

通過前面的分析可以看到,利用此漏洞的攻擊大致會有兩種形式:1種難度比較低,很容易導致伺服器系統藍屏;2如果攻擊者的水平比較高,就可以精確的控制內存,通過遠程執行代碼,進而獲得對系統的完全控制。尤其是面臨高價值回報的攻擊目標時,發生的機率就更高了,企業或組織的IT人員需要儘快考慮應對方案,避免在安全防禦措施上線之前遭受攻擊。這至少應該包含如下環節:

首先,應該第一時間獲取漏洞通告及相關信息,了解此次漏洞的影響範圍及深度。

再者,需要將通告和解讀與自身實際IT業務系統狀況相結合,全面判斷出影響範圍和程度(這包括對自身業務及對其客戶的影響程度),這個判斷過程,需要數據作為準確方案制定的事實依據,建議用戶使用安全可靠的漏洞掃描工具,升級最新發布的插件或規則庫,對全網進行安全掃描,拿到第一手數據後以便作為決策依據;

再次,IT人員需要從業務穩定性、危害程度和範圍及重要性等多個維度綜合考慮,制定整改時間計劃表,權重由高到低依次對局部網絡及主機設備或某業務系統設備展開整改和加固工作(建議邀請漏洞相關廠商及安全廠商一同參與)。

這個階段需要安全廠商提供專業技術協助,比如漏洞加固諮詢、驗證加固是否成功;同時需要了解安全廠商的哪些設備已經發布或即將發布防護規則,升級後即可進行防護;

如果還沒有採用任何一款安全設備,就需要採取臨時防護措施,包括採用漏洞相關廠商及安全廠商的相關方案,為整體加固爭取時間,避免在未加固整改成功之前這個窗口時間遭到攻擊並受到損失,這樣的情況在相當多的0day事件中屢見不鮮;

另外,還需要漏洞相關廠商與安全廠商通力協作,互相溝通漏洞原理和利用過程,進行較深層次的解讀,才能夠促進漏洞相關廠商的開發人員深入了解這個漏洞並根據其自身情況進行代碼層面的整改;

然後,在加固階段性或整體完成後,需要再次進行完整掃描和人工驗證整改加固結果,在技術投入允許的條件下,建議您再次進行各方面日誌分析,觀察整改加固期間有沒有成功的攻擊到其系統造成其他損失;

最後,在整體響應工作完成後,進行總結和備案記錄。 

IIS漏洞情況

前車之鑑後事之師,IIS由於使用量較大,出現的問題不少,總是給人以不踏實的感覺。其實在2014年,微軟IIS就出現了兩個高危漏洞,其中第2個且目前廠商還沒有提供補丁或者升級程序,我們建議使用這些IIS版本的用戶隨時關注廠商的主頁以獲取最新版本,並諮詢綠盟科技的服務人員!

1.2014-11-11,IIS安全功能繞過漏洞(MS14-076)(CVE-2014-4078)

描述:IIS 8.0/8.5版本的IP安全功能沒有根據"IP Address and Domain Restrictions"列表正確處理進站Web請求,這可使遠程攻擊者通過HTTP請求,利用此漏洞繞過目標規則。

2.2014-04-02,CGI CRLF注入漏洞(CVE-2011-5279)

描述:Windows NT及Windows 2000上IIS 4.x及5.x版本的CGI實現中存在CRLF注入漏洞,這可使遠程攻擊者通過CGI請求中的\n字符(新行)構造畸形請求修改環境變量,從而進一步執行任意代碼。

此外,IIS在其歷史上也出過幾次重大漏洞,綠盟科技研究院特別整理了這些信息,便於企業和組織的IT人員借鑑。以下加粗字體,為目前廠商還沒有提供補丁或者升級程序的漏洞,請予以特別關注:

1.2010-09-14 Microsoft IIS FastCGI請求頭遠程溢出漏洞(MS10-065)(CVE-2010-2730)

描述:對於啟用了FastCGI功能的IIS伺服器,遠程攻擊者可以通過提交特製的HTTP請求觸發緩衝區溢出,導致執行任意代碼。攻擊者可以遠程執行任意代碼。

2.2010-06-08 Microsoft IIS認證令牌處理遠程代碼執行漏洞(MS10-040)(CVE-2010-1256)

描述:IIS Web伺服器在解析從客戶端所接收到了認證信息時沒有正確地分配內存,遠程攻擊者可以通過發送特製的認證報文導致以工作進程標識(WPI)的上下文中執行代碼。必須啟用了Extended Protection for Authentication功能才可以利用這個漏洞(默認為禁用)。攻擊者可以遠程執行任意代碼。

3.2009-10-13 Microsoft IIS FTPd服務NLST命令遠程棧溢出漏洞(MS09-053)(CVE-2009-3023)

描述:攻擊者可以導致拒絕服務或遠程執行任意代碼。Microsoft IIS內嵌的FTP伺服器中存在棧溢出漏洞。如果遠程攻擊者對帶有特製名稱的目錄發布了包含有通配符的FTP NLST(NAME LIST)命令的話,就可以觸發這個溢出,導致拒絕服務或執行任意代碼。僅在攻擊者擁有寫訪問權限的情況下才可以創建帶有特殊名稱的目錄。攻擊者可以導致拒絕服務或遠程執行任意代碼。

4.2009-09-15 Microsoft IIS腳本文件名錯誤解析漏洞

描述:IIS在處理腳本文件名的解析時存在漏洞,當文件名為[YYY].asp;[ZZZ].jpg形式時,IIS會自動以asp格式來進行解析,而當文件名為[YYY].php;[ZZZ].jpg形式時,IIS會自動以php格式來進行解析(其中[YYY]與[ZZZ]為可變化字符串)。遠程攻擊者可以利用此漏洞突破Web應用對上傳文件類型的限制,在伺服器上執行任意腳本代碼從而獲取對伺服器的控制。攻擊者可以遠程執行任意代碼。

5.2009-06-09 Microsoft IIS 5.0 WebDAV繞過認證漏洞(MS09-020)(CVE-2009-1122)

描述:IIS的WebDAV擴展沒有正確解碼特製請求的URL,導致WebDAV在處理該請求時應用不正確的配置。如果應用的配置允許匿名訪問,則特製的請求可以繞過身份驗證。請注意IIS在配置的匿名用戶帳戶的安全上下文中仍會處理該請求,因此此漏洞不能用於繞過NTFS ACL,文件系統ACL對匿名用戶帳戶強加的限制將仍然執行。攻擊者可以繞過認證獲得非授權訪問。

6.2009-06-09 Microsoft IIS WebDAV Unicode請求繞過認證漏洞(MS09-020)(CVE-2009-1535)

描述:IIS的WebDAV功能在解析URI並發送回數據時沒有正確地處理Unicode令牌環,遠程攻擊者可以通過提交惡意HTTP GET請求繞過受口令保護的文件夾的認證,或在受口令保護的WebDAV目錄中列出、上傳或下載文件。攻擊者可以繞過認證執行非授權操作。

7.2008-02-12 Microsoft IIS ASP遠程代碼執行漏洞(MS08-006)(CVE-2008-0075)

描述:IIS處理ASP網頁輸入的方式存在遠程代碼執行漏洞,允許攻擊者向網站的ASP頁面傳送惡意輸入。成功利用這個漏洞的攻擊者可以在IIS伺服器上以WPI的權限(默認配置為網絡服務帳號權限)執行任意操作。攻擊者可以遠程執行任意代碼。

請持續關注相關漏洞信息

綠盟科技研究院會長年跟蹤分析這些漏洞,並將整理後的結果發送給您,便於您持續關注漏洞的發展態勢,為企業及組織的安全方案提供數據及信息支撐,如果您對我們提供的內容有任何疑問,或者需要了解更多的信息,可以隨時通過在微博、微信中搜索綠盟科技聯繫我們,歡迎您的垂詢!

【責任編輯:

王林

TEL:(010)68476606】

點讚 0

相關焦點

  • 高清還原漏洞——被微軟發布又秒刪的遠程預執行代碼漏洞CVE-2020...
    ◆2020年3月10日是微軟補丁日,安全社區注意到Microsoft發布並立即刪除了有關CVE-2020-0796的信息;  ◆2020年3月11日早上,Microsoft發布了可糾正SMBv3協議如何處理特製請求的修補程序;  ◆2020年03月12日微軟發布安全公告聲稱Microsoft 伺服器消息塊 3.1.1 (SMBv3) 協議處理某些請求的方式中存在遠程執行代碼漏洞
  • 「物聯網漏洞復現」TP-Link SR20 本地網絡遠程代碼執行漏洞
    TP-Link SR20 是一款支持 Zigbee 和 Z-Wave 物聯網協議可以用來當控制中樞 Hub 的觸屏 Wi-Fi 路由器,此遠程代碼執行漏洞允許用戶在設備上以 root 權限執行任意命令,該漏洞存在於 TP-Link 設備調試協議(TP-Link Device Debug Protocol 英文簡稱 TDDP) 中,TDDP 是 TP-Link 申請了專利的調試協議
  • fastjson 被曝存在遠程代碼執行漏洞,等級「高危」
    fastjson 當前版本為 1.2.68 發布於 3 月底,日前某安全運營中心監測到,fastjson <= 1.2.68 版本存在遠程代碼執行漏洞,漏洞被利用可直接獲取伺服器權限。360CERT 將漏洞等級定為「高危」。
  • Palo Alto Networks VPN漏洞曝光,允許黑客遠程執行任意代碼
    據外媒報導,研究人員發現Palo Alto Networks的GlobalProtect產品存在一個關鍵的RCE漏洞,允許未經身份驗證的黑客遠程執行任意代碼。因網關以未經抽樣和可利用的方式將特定參數值傳遞給snprintf,允許黑客利用該漏洞向易受攻擊的SSL VPN目標發送特製請求,遠程執行系統上的代碼。
  • Fastjson 1.2.47 遠程命令執行漏洞
    話不多說,今天帶大家復現一下Fastjson1.2.47遠程命令執行漏洞。漏洞實現流程準備環境本次漏洞復現需要有三臺設備(兩臺也可以)主機A:模擬Fastjson漏洞環境(centos7)TouchFile.java (紅色處為遠程命令執行的代碼)import java.lang.Runtime;import java.lang.Process;public class TouchFile {static {
  • PHP一些常見的漏洞梳理
    為了使代碼更靈活,將被包含的文件設置為變量用來進行動態調用。這就導致客戶端可以調用一個惡意文件,造成文件包含漏洞。文件包含漏洞在php中居多。>管理員一般不會修改配置文件原始碼)裡面插入文件包含代碼。如果目標allow_url_fopen和allow_url_include狀態都為on。既可以永久進行遠程包含,達到權限維持的目的。
  • 關於Palo Alto GlobalProtect存在遠程代碼執行高危漏洞預警通報
    近日,Palo Alto Networks官方發布關於 GlobalProtect Portal/Gateway接口存在遠程代碼執行高危漏洞的公告。現將漏洞詳情通報如下:一、漏洞情況Palo Alto Networks是一家從事網絡安全的企業,其主要產品有下一代防火牆、SSL VPN等其他網絡安全產品。
  • D-Link 850L&645路由漏洞分析
    由於逆向能力不足,很多東西還是不能深入,希望以後能夠彌補不足。二、D-Link 850L漏洞分析2.1 遠程敏感信息讀取2.1.1 漏洞分析該漏洞文件的位置為:htdocs/web/getcfg.php 具體代碼如下:
  • 思科修復嚴重等級為最高級10的遠程代碼執行漏洞
    雷鋒網消息,1月31日,據外媒報導,思科公司已經發布了軟體補丁,修復了影響運行自適應安全設備(ASA)軟體的思科設備主要漏洞。思科自適應安全設備軟體,是思科ASA家族系列設備的核心作業系統。根據此前發布的安全通報,較老版本的思科自適應安全設備軟體,會因為作業系統的安全套接層協議層(SSL)VPN功能漏洞而受到影響。漏洞將會影響啟用VPN功能的ASA設備雷鋒網(公眾號:雷鋒網)了解到,這一漏洞(CVE-2018-0101)將會導致以下思科ASA設備受到影響——不過,只有當「webvpn」功能啟動時,漏洞才會生效。
  • VLC遠程代碼執行漏洞不具有可再現性 Naver未實行內外網分離被罰
    本周安全資訊25 July 2019VLC開發人員聲明:此前曝光的遠程代碼執行漏洞不具有可再現性;韓國門戶網站Naver因未實行內外網分離被罰3千萬韓元;黑客疑似利用已被修復的ERP漏洞入侵62所大學的系統據外媒報導,相關部門發布公告稱,黑客利用ERP網絡應用程式中的安全漏洞入侵了62所大學的系統,並在幾天內創建了數千虛假帳戶用於惡意活動。相關部門表示,黑客利用的是此前已被修復的ERP身份驗證漏洞,專家建議應用該程序的1400多所高校和機構儘快安裝補丁。
  • 漏洞威脅周報(2018/8/25-2018/8/31)
    在github上發布的漏洞利用程序則會向printconfig.dll寫入提權代碼,並通過啟動列印服務spoolsv.exe來執行提權代碼,從而實現內核提權。使用2.5.4之前版本固件的Schneider Electric PowerLogic PM5560中存在跨站腳本漏洞。遠程攻擊者可通過操縱輸入利用該漏洞執行JavaScript代碼。
  • Windows 最新遠程桌面 RCE 漏洞公告 - OSCHINA - 中文開源技術...
    來自 IDC 機房的公告:5月14日 微軟發布了針對遠程桌面服務(以前稱為終端服務)的關鍵遠程執行代碼漏洞CVE-2019-0708的修復程序,該漏洞  影響了某些舊版本的Windows
  • DLINK DCS-5020L無線雲攝像機遠程代碼執行漏洞分析
    簡介本文主要是向大家演示,如何找到物聯網(IOT)設備中的漏洞。
  • PHP 文件包含漏洞姿勢總結
    php 中引發文件包含漏洞的通常是以下四個函數:1、include() 當使用該函數包含文件時,只有代碼執行到 include() 函數時才將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行。2、include_once() 功能和 include() 相同,區別在於當重複調用同一文件時,程序只調用一次。
  • 【乾貨】Thinkphp漏洞跟蹤
    根據參考連結中的關鍵代碼,追溯漏洞源文件/thinkphp/library/think/route/dispatch/Module.php,如下圖所示:觀察判斷語句,通過偽變量this對象引用到rule.php文件中,執行doAfter函數,獲取路由的後置操作。如下圖所示:
  • 使用Intel PT與IPTAnalyzer進行漏洞利用
    英特爾PT(處理器跟蹤)是一項最新的英特爾CPU的技術,Intel Skylake和更高版本的CPU型號都已經具有了此功能。你可以使用觸發和過濾功能在指令級別跟蹤代碼執行。要解碼Intel PT跟蹤,我們需要執行指令的image文件。如果在代碼執行的某些區域沒有匹配的image,則可能會丟失一些執行信息。在沒有靜態image文件可用的JIT代碼執行中,可能會發生這種情況,甚至shellcode都很難跟蹤,因為shellcode指令僅存在於內存中。  因為Intel PT不會保存指令字節或內存內容,所以你需要為每個IP(指令指針)提供指令字節。
  • PHP 5.2.17&5.3.29 遠程DOS漏洞UPUPW修復版
    近期PHP被爆出存在遠程DOS漏洞,漏洞編為CVE-2015-4024。若黑客利用該漏洞構造PoC發起連接,容易導致目標主機CPU被迅速消耗。 PHP解析multipart/form-datahttp請求的body part請求頭時,重複拷貝字符串導致DOS。遠程攻擊者通過發送惡意構造的multipart/form-data請求,導致伺服器CPU資源被耗盡,從而遠程DOS伺服器。
  • CVE-2018-11235:git爆遞歸clone嚴重漏洞致任意代碼執行
    該漏洞允許在運行'git clone --recurse-submodules'(或已棄用的'git clone --recursive')時可實現任意代碼的執行。惡意倉庫包含指向倉庫外部的.git modules子模塊配置文件。 當git clone這樣的倉庫時,它可以被誘騙到clone子模塊內(非.git目錄)的hook,從而實現任意代碼執行。
  • 主機漏洞利用原理及演示
    函數在遠程訪問其他主機時,會調用NetpwPathCanonicalize函數,對遠程訪問的路徑進行規範化,而在NetpwPathCanonicalize函數中存在的邏輯錯誤,造成棧緩衝區可被溢出,而獲得遠程代碼執行。
  • Windows Search Indexer 本地提權漏洞分析
    通常,在Windows Service中,整個過程都是使用NT AUTHORITY SYSTEM特權執行的。如果由於修改文件路徑而碰巧存在邏輯漏洞,則可能會觸發特權提升。我們可以通過MSDN 6提供的基於COM的命令行原始碼輕鬆地對其進行測試,並編寫了攻擊存在漏洞的函數的COM客戶端代碼,如下所示: int wmain(int argc, wchar_t *argv[])