作者的github资源:
之前的分析:
声明:我坚决反对利用教学法作案。一切罪行都将受到严惩。绿色网络需要我们共同维护。我建议大家了解它们背后的原理,更好地保护它们。样本不会分享给大家,分析工具会分享。 (参见下面的参考资料)
一.PE文件数字签名1.概念普及
(1)PE文件
PE文件的全称是Portable Executable,意思是可移植的可执行文件。常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接执行的,比如DLL)。后续文章会详细分析PE文件格式。
(2)为什么要对 PE 文件进行数字签名?
(3)PE文件数字签名及验证流程
签名:
身份验证:
(4)PE文件数字签名的整体结构
PE文件的数字签名信息存放在Certificate Table位置,PE文件可选文件头DataDirecotry第五项记录文件偏移量和大小。
下一篇作者会尝试详细讲解PE文件结构和签名解析。
使用PEView查看签名前后的对比图,可以看到Certificate Table存放了相关的签名信息。
(5)PE文件数字签名查看
以Zoomit.exe程序为例。我们可以看到,经过数字签名的PE文件会多了一个“数字签名”属性。点击详情可查看对应的证书。
对应的证书信息和证书路径如下图所示,包括签名算法、哈希算法、有效期、颁发者信息等。
(6)微软数字签名证书查看
接下来,我将向您展示 Windows 证书。运行时输入“certmgr.msc”,可以看到系统默认ECC签名的根证书有5个,如下图所示。
我们可以随意导出其中一张根证书,直接选择Base64编码的一张进行导出。
可以看到导出的ECC密钥证书如下图所示,包括证书有效期等信息。这是 Microsoft 实施椭圆曲线加密 (ECC) 算法的数字证书,位于 CryptoAPI.dll 文件中,这也是我们用来伪造可信来源的签名漏洞。
(7)数字签名算法及应用领域
数字签名的常用算法包括:
其应用领域包括:
2.Github网站证书验证流程
我们来看看Github网站上微软证书验证的流程。
在第 23 条中,我们将详细复现 Microsoft Certificate CVE-2020-0601 漏洞。
二.阮一峰老师告诉你什么是数字签名
参考文章:
什么是数字签名? ——阮一峰
什么是数字签名? - 原始网站
写到这里,您可能还在疑惑“什么是数字签名”?接下来,我将通过阮一峰先生的博客进行讲解。个人认为这是一篇原理比较清晰的文章,也包括了网络安全中的加解密、信息传输等知识。
(1)假设 Bob 有两个密钥,一个公钥和一个私钥。
(2) Bob 将公钥给了他的朋友——Patty、Doug、Susan——每人一个。
(3)Susan 想给 Bob 写一封保密信。写完之后,她用 Bob 的公钥对其进行加密以实现机密性。
(4) Bob收到信后,用自己的私钥解密,看到了信的内容。这里要强调的是,只要Bob的私钥不泄露,这封信就是安全的,即使掉到别人手里也无法解密。
(5) Bob 回信给 Susan,决定使用“数字签名”。写完之后,他使用 Hash 函数生成了信件的摘要。
(6) Bob 然后用他的私钥加密这个摘要来生成一个“签名”。
(7) Bob 将此签名附在信上并发送给 Susan。
(8)苏珊收到这封信后,摘下数字签名,用鲍勃的公钥解密,得到这封信的摘要。这就证明这封信确实是鲍勃发出的。
(9)Susan然后对字母本身使用Hash函数,将结果与上一步得到的总结进行对比,如果两者一致驱动没有经过数字签名,则证明该字母没有被修改过。
p>
(10) 出现了一个复杂的情况,Doug 想要欺骗 Susan,他偷偷使用 Susan 的电脑,用他的公钥交换 Bob 的公钥。此时,Susan 实际拥有的是 Doug 的公钥,但他认为这是 Bob 的公钥。所以 Doug 可以假装是 Bob,用他的私钥做一个“数字签名”,然后写信给 Susan,让 Susan 用伪造的 Bob 的公钥解密。
(11) 后来苏珊觉得不对劲,发现自己无法确定公钥是否真的属于鲍勃,她想了个办法让鲍勃去“证书颁发机构” ”(简称“证书颁发机构”。CA)对公钥进行认证。证书中心使用自己的私钥对 Bob 的公钥和一些相关信息进行加密,生成“数字证书”。
(12)Bob拿到数字证书后就可以放心了,以后如果给Susan写信,签名时只需要附上数字证书即可。
(13) Susan 收到信后,使用 CA 的公钥解锁数字证书,可以得到 Bob 的真实公钥,然后她可以证明“数字签名”是否真的由鲍勃签名。
(14) 下面我们来看一个应用“数字证书”的例子:https协议。该协议主要用于网页加密。首先,客户端向服务器发送加密请求。
(15)服务器用自己的私钥加密网页后,连同自己的数字证书一起发送给客户端。
(16) 客户端(浏览器)的“证书管理器”有一个“受信任的根证书颁发机构”列表。根据该列表,客户端将检查公共证书以解锁数字证书。键是否在列表中。
(17)如果数字证书中记录的URL与你正在浏览的URL不一致,则说明证书可能被冒用,浏览器会发出警告。
(18)如果数字证书不是由受信任的机构颁发的,浏览器会再次发出警告。如果数字证书可靠,客户端可以使用证书中的服务器公共证书。key,加密信息,然后与服务器交换加密信息。
数字签名用于确保数据完整性。可以用来判断数据是否被篡改,用私钥加密的数据可以被任何知道公钥的人解密,不安全。私钥加密的作用是确认身份,用对应的公钥解密摘要,然后证明摘要来自谁,起到签名的作用。
三.Signtool 签名的 PE 文件
test.exe程序的后续文章也会分享上传到Github。
第一步是通过makecert.exe生成需要的证书,生成两个文件test.cer和test.PVK。
cd SignTool
makecert -$ "individual" -r /sv "test.PVK" /n "CN=Windows,E=microsoft,O=微软" test.cer
创建过程中需要输入私钥密码,这里设置为“123456789”。
第二步,查看证书信息。如果不信任,则需要点击“安装证书”。
安装并信任证书。
第三步,使用signcode.exe工具对数据进行签名驱动没有经过数字签名,选择需要签名的“test.exe”程序。
第四步,自动选择自定义选项,然后点击从文件中选择test.cer文件,test.cer文件在你第一步生成的目录下,然后下一步。
第五步,点击浏览按钮,添加文件test.PVK,test.PVK文件也在第一步生成的目录下,点击下一步,哈希算法可以选择md5,或者sha1,点击下一步.
第六步,默认点击下一步,会出现数据描述框,可以自己填写,也可以留空。点击下一步。
第七步,填写时间戳服务器URL:,也可以选择不加时间戳,点击下一步,完成,会弹出签名成功框。
第八步,test.exe文件数字签名后,打开exe文件的属性,如下图,可以看到签名的信息。注意数字签名是OK的,发行者是Windows。
最后我们用PEView软件打开PE文件,可以看到签名前后的结构有“CERTIFICATE Table”的区别。