CVE-2020-0601分析

    渗透测试 lz520520 2年前 (2021-01-14) 474次浏览

    漏洞介绍

    该漏洞位于Windows CryptoAPI(Crypt32.dll)验证椭圆曲线加密算法证书的方式,可能影响信任的一些实例包括(不限于):HTTPS连接、文件签名和电子邮件签名、以用户模式启动的签名可执行程序。

    此外,该漏洞可以让攻击者伪造代码签名证书对恶意可执行文件进行签名,使文件看似来自可信的来源。例如,可以让勒索软件或其他间谍软件拥有看似有效的证书,从而促使用户安装。中间人攻击并解密用户连接到受影响软件的机密信息也是主要的攻击场景之一。

     

    影响范围

    目前,支持使用带有指定参数的ECC密钥的证书的Microsoft Windows版本会受到影响,包括了Windows 10、Windows Server 2016/2019以及依赖于Windows CryptoAPI的应用程序
    而Windows 10 之前的版本,如Windows 7、Windows Server 2008 R2 等均不受该漏洞的影响。

    总而言之,该漏洞可进行签名伪造绕过检测,但仅支持win10等高版本,win7不受影响。

     

    漏洞理解

    问题出在ECC椭圆曲线加密算法,他是非对称算法
    曲线方程示例如下

    y2=x3+ax+b
    CVE-2020-0601分析曲线上任意两点A、B做直线,会交于曲线另一个C',C'做X轴的垂直线,会交于C点,此时有个矢量等式成立,即C=A+B,如果A=B,那么两点的直线就是A的切线,得C=2A,如上图所示
    此时C与A做直线交于D',在做X轴垂线得D,D=A+C=3A

    在实际应用中,一般会设定一个起点G,通过k(私钥)次变换,可得到公钥K,矢量计算公式为K=kG,具体算法理解可参考最后的链接

    漏洞出在Crypt32.dll再进行ECC根证书CA校验的时候,仅仅对公钥进行合法校验,而ECC算法其他参数(如起点G)没进行校验,这导致一个结果:
    首先我获取一个系统合法的ECC证书,可获得他的公钥,而它的公钥是通过K=kG生成的,当k'=1,G'=K时,可得K'=k'G'=K,也就是说令起点G等于合法ECC证书的公钥,私钥为1,签发伪造的ECC证书的公钥和系统合法ECC证书公钥是一样的,这就可以触发上述的漏洞,让windows校验伪造签发的证书是合法的。

    正常来讲,在标准椭圆曲线算法中,基点G并不是随意指定的,而是有固定的值,例如在secp256r1版本的算法中是有标准规定的固定值,如果对参数不加验证,是的用户可以自定义传入的基点G值(作为函数的参数),上面的私钥k=1的特殊解即可成立。

    漏洞利用

    使用powershell可获取系统存在哪些ECC证书

    通过certmgr.msc打开证书管理界面,选择受"信任的根证书颁发机构-证书",导出其中一个base64编码的ECC证书,我选的是Microsoft ECC TS Root Certificate Authority 2018

    然后用以下ruby脚本生成新的私钥

    生成crt证书的机构信息推荐使用原本证书的,可使用以下命令查看。

    完整命令

    其中的openssl_cs.conf文件

     

    给恶意文件签名后可直接绕过杀软检测,但目前来说杀软也慢慢开始支持检测该畸形证书。CVE-2020-0601分析

     

    其实生成了cert.p12的用户证书后,其他文件的签名直接使用最后一条命令即可。

    补丁
    KB4528760
    https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0601

     

    参考

    https://blog.csdn.net/eastmount/article/details/104335673#t7
    https://www.freebuf.com/vuls/225879.html
    https://mp.weixin.qq.com/s/wca5osB5R16bWvtx2LnPPg


    Security , 版权所有丨如未注明 , 均为原创丨
    转载请注明原文链接:CVE-2020-0601分析
    喜欢 (1)