数字签名劫持

声明

本文只是用来交流技术,切勿使用该技术运用到非法途径中,否则一切与作者无关!

回顾

开发人员通常会签名他们的代码,以便向用户保证他们的软件是受信任的,并且尚未以恶意方式对其进行修改。这是通过使用数字签名来完成的。因此,签名代码是一种验证文件真实性和完整性的方法。

威胁猎手和蓝队通常检查二进制文件的数字签名,以便进行初始检查并确定是否应将其视为可疑文件。Microsoft防御性技术(例如AppLocker和Device Guard)支持使用规则,这些规则仅允许来自受信任的发布者并经过数字签名的可执行文件和PowerShell脚本在系统上执行。通过使用证书执行此验证。

可以通过PowerShell调用Get-AuthenticodeSignature并使用Sysinternals的SigCheck实用程序来执行数字签名的验证

在之前我有写过一篇签名伪造的文章,但由于hash不同,最后签名是失效的,只能通过自写证书来绕过,但与该方法有本质上的区别。

绕过签名验证

即使受信任的证书已被窃取并应用于恶意二进制文件,由于Authenticode哈希将不匹配,因此数字签名仍将无效。无效的authenticode哈希值强烈表明该二进制文件不合法。从PowerShell控制台对具有受信任证书的二进制文件执行Get-AuthenticodeSignature会产生HashMismatch错误。

这里我演示下通过sigthief来给nc.exe赋予

python3 sigthief.py -i C:\Windows\System32\consent.exe -t nc.exe -o ladon.exe

使用 Get-AuthenticodeSignature对比下两个程序的hash和状态。

可执行代码由数字证书的私钥签名。公钥嵌入在证书本身中。由于不知道私钥,由于哈希将有所不同,它将始终使哈希验证过程失败。

因此,需要通过注册表修改来削弱数字签名验证机制。发现了在哈希表的哪个位置执行验证以及如何执行哈希验证。该 CryptSIPDllVerifyIndirectData组件处理的PowerShell脚本和可执行文件的便携式数字签名验证。

这些注册表项位于以下注册表位置:

HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{603BCC1F-4B59-4E08-B724-D2C6297EF351}
HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData\{C689AAB8-8E78-11D0-8C47-00C04FC295EE}

需要把这两个注册表中图中红箭头处修改为(修改注册表时全程开着火绒,能正常修改)

DLL - C:\Windows\System32\ntdll.dll
FuncName - DbgUiContinue

实战运用

不能运用到实战中的技术都是瞎研究,那么这项技术能让我们来干什么?

1

从图中可以看出签名已经被识别为正常,可用了

2

有些杀软检测程序是否有正常的签名,如果有则直接bypass

测试杀软:360杀毒、火绒

这是有签名的杀软结果

这是没有签名的查杀

我也不知道为什么K8大佬的ladon工具会被查杀,滑稽。

结语

运用场景不止上面这些,大家可以自己多摸索摸索,最关键是如何打出组合拳。

点击收藏 | 0 关注 | 1
登录 后跟帖