详解MagicDot漏洞及其利用手段
漏洞背景与原理
- DOS 路径:
C:\example\example - NT 路径:
\??\C:\example\example
DOS 路径为了兼容性被保留下来,而 Windows 系统内核使用 NT 路径进行处理
当应用程序使用 DOS 路径调用 Win32 API 时,内核会将 DOS 路径规范化为 NT 路径
问题就出在规范化过程中:路径解析函数会静默删除
- 任意路径段末尾的任意数量的点
- 最后一个路径段末尾的任意数量的空格
| DOS 路径 | 规范化后的 NT 路径 | 说明 |
|---|---|---|
| C:\example\example**.** | \??\C:\example\example | - |
| C:\example\example**…** | \??\C:\example\example | - |
| C:\example**.**\example | \??\C:\example\example | 任意路径段末尾的任意数量的点被删除 |
| C:\example\example**<space>** | \??\C:\example\example | - |
| C:\example\example**<space><space>** | \??\C:\example\example | 最后一个路径段末尾的任意数量的空格被删除 |
| C:\example**<space>**\example | \??\C:\example**<space>**\example | 如果不是最后一个路径段,则末尾空格不会被删除 |
| 看出端倪了吗? |
- 病毒程序
malware.exe把自己重命名为svchost.exe然后放在C:\Windows.\System32\路径下 - 某杀毒软件使用 DOS 路径进行杀毒,尝试打开文件
C:\Windows.\System32\svchost.exe时路径被规范化为\??\C:\Windows\System32\svchost.exe,导致读取到的是真的svchost.exe,假的病毒程序美美逃逸!
原理就是这么简单
利用
文件保护(防删除)
首先,使用API创建一个末尾带点的文件,测试一下有什么基本特性

详细信息为空

记事本无法打开

无法正常删除

火绒也无法粉碎

无法正常被删除,而使用API搭配NT路径就可以正常读写,至此,完成了第一个利用手段:文件防删除
文件隐藏
一个文本文件不够炸裂,为了详细说明这个漏洞有多么“核弹级”,这里用永恒之蓝做样本

编写程序,创建一个末尾带点的文件夹,把永恒之蓝移动进去

文件资源管理器无法正常访问点文件夹

使用DiskGenius可以看到移动成功了

火绒杀毒:未发现风险(注意这里的扫描对象是0个)

同目录下创建同名但没点的文件夹,内部放几个文件

再次用火绒杀毒,这次扫描对象就不为0个了

由此可见,火绒一定有 MagicDot 漏洞(访问 dot. 时被规范化为 dot)
无法正常访问,杀毒软件也无法扫描(同样的,使用API搭配NT路径就可以正常访问),至此,完成了第二个利用手段:文件隐藏
进程伪装

好吧,现在的ARK工具都不吃这一套了,system informer能正常解析NT路径

免杀
火绒能查杀到木马进程

但是无法检测和删除木马源文件

进程杀几千次都没用,只要源文件还在,触发器还在,有的是机会重新运行重新上线,相当于实现了一种另类的免杀(你能杀掉本,但是杀不掉根)
参考
https://github.com/SafeBreach-Labs/MagicDot
https://www.safebreach.com/blog/magicdot-a-hackers-magic-show-of-disappearing-dots-and-spaces/
这个漏洞都公布一年了,没见过在野利用,很多 APT 组织花大价钱搞黑签名驱动进入0环也不愿意零成本在3环搞点小奇技淫巧吗?