数字签名劫持
字数 1111 2025-08-06 08:35:27
数字签名劫持技术详解
声明
本文仅用于技术交流目的,严禁将所述技术用于非法途径,否则一切后果与作者无关。
技术背景回顾
数字签名是开发人员用来验证软件真实性和完整性的重要机制。通过使用数字证书对代码进行签名,可以向用户保证软件来自可信来源且未被恶意篡改。安全团队通常通过检查二进制文件的数字签名来进行初步可信度评估。
Microsoft的防御技术如AppLocker和Device Guard都依赖数字签名验证,只允许来自受信任发布者并经过数字签名的可执行文件和PowerShell脚本在系统上执行。
传统签名伪造的局限性
传统的签名伪造方法存在根本性缺陷:
- 即使使用窃取的合法证书签名恶意二进制文件,由于Authenticode哈希不匹配,签名仍会显示为无效
- PowerShell的
Get-AuthenticodeSignature命令会显示HashMismatch错误 - Sysinternals的SigCheck工具也能检测到这种不匹配
数字签名劫持技术原理
关键发现
通过研究发现,Windows系统中数字签名的哈希验证由CryptSIPDllVerifyIndirectData组件处理,该组件位于以下注册表路径:
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}
技术实现步骤
-
使用SigThief工具伪造签名:
python3 sigthief.py -i C:\Windows\System32\consent.exe -t nc.exe -o ladon.exe这条命令将consent.exe的签名复制到nc.exe上,生成ladon.exe
-
修改注册表削弱验证机制:
- 将上述两个注册表项中的DLL路径修改为:
DLL - C:\Windows\System32\ntdll.dll FuncName - DbgUiContinue - 修改时杀毒软件(如火绒)不会拦截
- 将上述两个注册表项中的DLL路径修改为:
-
验证签名状态:
- 修改后,使用
Get-AuthenticodeSignature验证会显示签名状态为"Valid" - 系统将认可伪造的签名
- 修改后,使用
实战应用场景
-
绕过安全软件检测:
- 许多安全产品会检测程序是否有有效签名
- 带有有效签名的恶意程序可能直接绕过检测
- 测试表明360杀毒和火绒都会对无签名程序更敏感
-
组合攻击:
- 该技术可与其他攻击方法结合使用
- 例如配合合法的签名工具使用效果更佳
注意事项
- 部分环境中可能需要重启系统使注册表修改生效
- 某些情况下虽然PowerShell显示签名有效,但其他工具可能仍会检测到异常
- 建议在虚拟机环境中测试,便于还原配置
防御建议
- 不要仅依赖数字签名作为唯一的安全验证手段
- 监控对关键注册表项的修改
- 使用多层防御策略,结合行为分析等其他检测方法
- 定期审计系统中有数字签名的应用程序
技术总结
数字签名劫持技术通过修改Windows系统的签名验证机制,使得伪造的数字签名能够被系统认可为有效。这种方法比传统的自签名证书更具隐蔽性,因为它利用了系统自身的验证机制缺陷。安全团队应当了解这种技术以更好地防御相关攻击。