泰半年没发东西了,本着分享的原则,这次就把我博客的一篇文章分享下,也是一个陈年老洞了,这个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:
Hash(message)=digest;然后将摘要利用私钥举行加密,得到密文ciphertext:
F(d,digest)=ciphertext;末了将ciphertext附加在消息message反面发送给Alice:
send(message.append(ciphertext));Alice接受到Bob发送过来的内容后首先利用公钥对附加的ciphertext解密出digest,只要能解密成功(当然Bob的私钥没有泄露),就能确保发送的内容确实来自Bob:
G(e,ciphertext)=digest;完整性
Alice解密出digest后,与发送的内容中的消息部分message利用单向散列函数得到摘要举行对比,相称的话就可以证明message没有被改动过,也就确保了消息的完整性:
if(Hash(message) == digest) return TRUE;else 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规定了公钥证书的结构:
Certificate ::= SEQUENCE{ //证书全部内容开始,结构化不定长编码 tbsCertificate TBSCertificate, //证书主体 signatureAlgorithm AlgorithmIdentifier, //证书署名算法标识 signatureValue BIT STRING //证书署名值,利用signatureAlgorithmv部分指定的署名算法对tbsCertificate证书主题部分署名后的值}证书主体结构:
TBSCertificate ::= SEQUENCE{ version [0] EXPLICIT Version DEFAULT v1, //证书版本号 sericalNumber AlgorithmIdentifier, //证书序列号,对同一CA所颁发的证书,序列号唯一标识证书 signature AlgorithmIdentifier, //证书署名算法标识 issuer Name, //证书发行者名称 validity Validity, //证书有效期 subject Name, //证书主体名称 subjectPublicKeyinfo SubjectPublicKeyInfo //证书公钥 issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL //证书发行者ID(可选),只在证书版本2,3中才有 subjectUnique [2] IMPLICIT UniqueIdentifier OPTIONAL //证书主题ID(可选),只在证书版本2,3中才有 extensions [3] EXPLICIT Extentions OPTIONAL //证书扩展段(可选),只在证书版本2,3中才有}比较关键的SubjectPublicKeyInfo结构:
SubjectPublicKeyInfo ::= SEQUENCE{ algorithm AlgorithmIdentifier, //公钥算法信息 subjectPublicKey BIT STRING //公钥}AlgorithmIdentifier(公钥算法信息)结构如下:
AlgorithmIdentifier ::= SEQUENCE{ algorithm OBJECT IDENTIFIER, //对象标识符 parameters ANY DEFINED BY algorithm OPTIONAL //可选参数}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定义):
EcpkParameters ::= CHOICE{ ecParameters ECParameter, //用于显示指定曲线参数 namedCurve OBJECT IDENTIFIER, //用于隐式指定曲线参数 implicitlyCA NULL }攻击者可以通过利用设置ecParameters参数的证书来伪造合法证书来举行漏洞利用:
ECParameter ::= SEQUENCE{ version ECPver, //版本号常设为1 field FieldID, //定义椭圆曲线定义地点的有限域 curve Curve, //定义椭圆曲线的参数a和b base ECPoint, //设置椭圆曲线的基点P order INTEGER, //阶数n coofactor INTEGER OPTIONAL //可选参数,h = #E(Fq)/n}ECC
椭圆曲线定义方程:
y^2 = x^3 + ax + b(4a^3 + 27b^2 mod p != 0)
该方程的解(x,y)由给定的大素数所决定的素数域GF(p)决定,取x(0 |