创建 1 个快捷方式 + 1 个包含恶意 payload 的 .DLL => 放入 USB 发送给受害者 => 受害者打开 USB => Payload 自动触发!
首先我们需要弄清楚这个漏洞究竟出在哪里!它源于名为 Plug-and-Play(即插即用) 的功能,操作系统会自动检测设备、分配资源并加载合适的驱动程序,使其无需重启电脑即可立即工作。当你插入 USB 并用 Windows Explorer explorer.exe 打开文件夹时,操作系统会扫描文件,以便向用户显示相应的图标图像!
从旧版 Windows 开始,Microsoft 希望指向控制面板功能(本质上是 .cpl 或 .dll 文件)的快捷方式(.lnk)能够灵活地显示动态图标。因此,Windows 的核心界面管理库 shell32.dll 设计了一个名为 CPL_LoadCPLModule 的函数。
盲目使用 LoadLibrary:为了从 Control Panel Applet(控制面板小程序)文件中获取图标,操作系统并非简单地读取一个静态图像文件,而是使用 LoadLibraryW 函数将该动态链接库直接加载到 explorer.exe 进程的内存空间中。加载完成后,它才会调用标准导出函数 CPlApplet 来获取图标并绘制到屏幕上。
为了证明 LoadLibraryW 确实与上述利用链相关:
1/ 启动
x64dbg với quyền admin2/ 附加到
explorer.exe3/ 输入命令
bp LoadLibraryW4/ 按 F9 让
explorer.exe继续运行5/ 插入 USB 将立即
hit breakpoint!
我遇到了一个问题:利用链完全没有反应,尽管尝试检查和调试各种东西,却始终找不到修复方法!之后我尝试找别人的 PoC 来跑一下,但也失败了!
然而,当我去吃午饭再回来后,我重新找回了专注和冷静,开始思考一个问题:为什么这个人的 PoC 能生效,而拿到我的机器上就不行?好吧,我开始简单逆向一下他的 .lnk 和 .dll,结果发现了两件事!
1 / 我的 .dll 比他的长!但没关系,那不是问题!
2 / 当我把 .lnk 丢进 HxD 读取字符串时,我发现这家伙用的不是相对路径,而是绝对路径!
相对路径:../example.dll
绝对路径:O:/example.dll
好了,现在的修复方法是:我们需要知道 USB 插入受害者电脑时会被自动分配为哪个盘符,然后据此填入绝对路径,这样就能成功。因为在我的 Win7 上,插入 USB 时总是显示为 F 盘,所以我的构建语法是:
python Make_PoC.py FakeGoogleChrome F:\Pwned.dll
由于这是一个属于**系统架构设计思维(Logic/Architecture Flaw)**的漏洞,而不是内存溢出漏洞,Microsoft 不得不彻底改变对控制面板的处理方式:
.cpl 或 .dll 文件必须具有 Microsoft 的有效数字签名,或位于受到严格保护的系统目录(如 System32)中,以避免来自 USB 的“Binary Planting”漏洞。explorer.exe [cite: 1058] 中,而是通过一个隔离的中间进程(如 dllhost.exe 或 rundll32.exe)来运行。如果 DLL 崩溃或包含恶意代码,它只会让这个中间进程崩溃,而无法控制整个用户界面系统。越南研究
PoC
构建漏洞 .lnk 的工具