CAT 文件数字签名使用技巧
0x00 前言
Windows 系统中的重要文件常常会被添加数字签名,用来防止被篡改,部分白名单规则的判定也会基于数字签名。
本文作为数字签名研究系列文章的基础内容,介绍两种数字签名的添加方法,分析 CAT 文件数字签名的特点,并且纠正一名读者对我文章的回复,地址如下:《利用 xwizard.exe 加载 dll》
基于我的测试,个人认为: 移动位置后,CAT 文件数字签名不会失效
0x01 简介
本文将要介绍以下内容:
- 生成证书的方法
- 将数字签名添加在文件末尾的方法(Authenticode)
- 将数字签名保存在 CAT 文件中的方法(catalog)
- 使用 CAT 数字签名的文件特点
0x02 将数字签名添加在文件末尾的方法 (Authenticode)
曾在隐写技巧的系列文章中研究过在数字签名中隐藏 payload 的方法,地址如下:《隐写技巧——在 PE 文件的数字证书中隐藏 Payload》
文中介绍过证书格式,在此不再赘述
向文件尾部添加数字签名后,可通过文件属性查看
实例:
C:\Windows\System32\consent.exe
自带微软数字签名,如下图
可通过 powershell 验证数字签名:
Get-AuthenticodeSignature .\mimikatz.exe
也可以使用工具通过命令行查看数字签名
使用 signtool.exe 查看:
signtool.exe verify /v C:\Windows\System32\consent.exe
如下图
使用 sigcheck.exe 查看:
sigcheck.exe -q C:\Windows\System32\consent.exe /accepteula
如下图
注:signtool.exe:
可用于查看文件的数字签名
安装 Visual Studio 后包含 SDK,其中可找到 signtool.exe,位于 C:\Program Files\Microsoft SDKs\Windows\
进入开发人员工具的 cmd 可直接调用 signtool.exe
Windows 7 SDK 下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=8279
sigcheck.exe:
可用于查看文件的数字签名
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/sigcheck
本文相关文件已上传至 github,地址如下:https://github.com/3gstudent/signtools
生成测试证书的命令如下:
makecert -n "CN=Microsoft Windows Test" -r -sv Root.pvk Root.cer
cert2spc Root.cer Root.spc
pvk2pfx -pvk Root.pvk -pi 123456 -spc Root.spc -pfx Root.pfx -f
证书注册:
(管理员权限)
certmgr.exe -add -c Root.cer -s -r localmachine root
注:细节可参考之前的文章《A dirty way of tricking users to bypass UAC》
签名 mimikatz.exe:
signtool sign /f Root.pfx /p 123456 mimikatz.exe
显示数字签名正常,如下图
0x03 将数字签名保存在 CAT 文件中的方法(catalog)
Windows 系统中,有些文件通过文件属性无法获得其数字签名信息,但是这些文件也包含数字签名,这里的数字签名指的就是 CAT(安全编录) 文件数字签名(catalog signing)
资料可参考:https://docs.microsoft.com/en-us/windows-hardware/drivers/install/catalog-files
签名流程的直观理解:
- 将文件作 sha1 加密后得到的 hash 值保存在 CAT 文件中(一个 CAT 文件可保存多个文件 hash)
- 对该 CAT 文件添加数字签名
- 将 CAT 文件添加到系统的安全编录数据库
- 这些文件也就有了数字签名
实例:C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\ntph.cat
属性-安全目录-项目详细信息-File,可以找到 Hash 值对应的文件
如下图
通过文件属性无法查看 CAT 数字签名
.cat 文件保存格式为 ASN.1 标准,直接通过记事本无法查看,需要解密,在线网址如下:https://lapo.it/asn1js/
选择 cat 文件后即可解密显示完整格式
格式解析可参考:https://support.microsoft.com/en-us/help/287547/object-ids-associated-with-microsoft-cryptography
实例:C:\Windows\System32\xwizard.exe
自带 CAT 格式的数字签名,通过文件属性无法查看 CAT 数字签名
使用 powershell 无法获得 CAT 文件数字签名:
Get-AuthenticodeSignature C:\Windows\System32\xwizard.exe
如下图
注:Win10 系统能够获取 CAT 文件数字签名,Win7 不可以
但可以使用 signtool.exe 和 sigcheck.exe 查看数字签名
使用 signtool.exe 查看:
signtool.exe verify /pa /a /v C:\Windows\System32\xwizard.exe
如下图
使用 sigcheck.exe 查看:
sigcheck.exe -q C:\Windows\System32\xwizard.exe /accepteula
如下图
下面介绍如何使用 CAT 文件数字签名
1、生成 CAT 文件
新建文本文档 cat.txt,内容如下:
[CatalogHeader]
Name=makecat1.cat
[CatalogFiles]
<hash>ExeFile1=mimikatz.exe
注:txt 文件尾部需要一个空行,否则,在接下来的操作会报错,提示文件无法找到
如下图
使用 makecat.exe 生成 cat 文件:
makecat -v cat.txt
2、使用证书为 CAT 文件添加签名
signtool sign /f Root.pfx /p 123456 makecat1.cat
注:这里的证书使用的是 0x02 中生成的证书 Root.pfx
3、将 cat 文件添加到系统的安全编录数据库
(管理员权限)
signtool catdb -v makecat1.cat
注:删除使用 -r 参数: signtool catdb -r makecat1.cat
如果未添加到系统的安全编录数据库,签名状态为 unsigned,如下图
添加到系统的安全编录数据库相当于在目录 C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}
添加文件 makecat1.cat
删除等价于删除目录 C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}
下对应的 CAT 文件 makecat1.cat
使用 signtool.exe 获取数字签名:
signtool.exe verify /pa /a mimikatz.exe
使用 sigcheck.exe 获取数字签名:
sigcheck.exe -q mimikatz.exe /accepteula
移动位置后,签名仍然有效
如下图
验证结论: 移动位置后,CAT 文件数字签名不会失效
当然,利用带有 CAT 文件数字签名的 xwizard.exe 加载 dll,在某种程度上说,能够绕过应用程序白名单的拦截。
0x04 小结
本文介绍了两种数字签名的添加方法,分析 CAT 文件数字签名的特点,对于可执行文件,通过 Process Explorer 可验证两种不同的数字签名
如下图
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论