Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2022-42046 — إثبات المفهوم لـ CVE-2022-42046 لـ wfshbr64.sys تصعيد الامتيازات المحلية عبر DKOM | Kitploit
أدوات/GitHubGitHub/kkent030315/cve-2022-42046
تصعيد الامتيازاتتحليل الثغرات الأمنيةالاستغلالاستغلال الملفات الثنائية
GitHubkkent030315/cve-2022-42046

CVE-2022-42046

إثبات المفهوم لـ CVE-2022-42046 لـ wfshbr64.sys تصعيد الامتيازات المحلية عبر DKOM

عرض المستودع
16126منذ 3 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

EvilWfshbr

CVE-2022-42046 إثبات المفهوم لتصعيد الامتيازات المحلي لـ wfshbr64.sys

wfshbr64.sys و wfshbr32.sys الحمولة المصممة خصيصًا تسمح لأي مستخدم بإجراء عملية بتوزيع على إزاحة EPROCESS وقيمة الأعلام عشوائية لرفع عملية اللعبة بشكل متعمد إلى حماية كاملة من CodeGen عن طريق التلاعب بأعلام EPROCESS.Protection و EPROCESS.SignatureLevel (ثغرة أمنية كميزة).

الدرايفر موقّع من ناشر توافق أجهزة Microsoft والذي تم تقديمه عبر برنامج أجهزة Microsoft.

تم إجراء هذا البحث بالتعاون مع @DoranekoSystems

توجد نسخة CLI غنية بلغة Rust متاحة هنا

  • https://www.virustotal.com/gui/file/b8807e365be2813b7eccd2e4c49afb0d1e131086715638b7a6307cd7d7e9556c
  • https://www.virustotal.com/gui/file/89698cad598a56f9e45efffd15d1841e494a2409cc12279150a03842cd6bb7f3

الترخيص

MIT. انظر LICENSE

اقتراح (للمطور)

  1. استخدم ObRegisterCallbacks بدلاً من رفع حماية العملية بالقوة عن طريق التلاعب المباشر بكائنات النواة. يوجد مثال جيد هنا.

2. IRP

لا تقم بالإشارة إلى IRP بعد الانتهاء. إذا كان لديك مدقق الدرايفر مفعّلاً، فسيتم اكتشافك.

root@kitploit:~
IofCompleteRequest(Irp, IO_NO_INCREMENT); // IRP يتم تحريره هنا
return Irp->IoStatus.Status;

بدلاً من ذلك، يجب استخدام متغير محلي.

root@kitploit:~
NTSTATUS status = STATUS_SUCCESS;
Irp->IoStatus.Status = status;
IofCompleteRequest(Irp, IO_NO_INCREMENT); // IRP يتم تحريره هنا
return status;

3. العملية السياقية

يبدو أنك تتحقق من المؤشر الفارغ مقابل القيمة المرجعة لـ IoGetCurrentProcess، ولكنها لا تُرجع مؤشرًا فارغًا أبدًا حسب التصميم، لذا لا داعي للتحقق منه.

root@kitploit:~
PEPROCESS CurrentProcess = IoGetCurrentProcess();
  if ( !CurrentProcess ) // لا حاجة للتحقق من المؤشر الفارغ
    break;

الحيلة

بعد فترة من التقرير، قام المطور بتنفيذ "تحقق إضافي" خفي لهزيمة أول PoC لدينا بدلاً من التراجع عن جعل الثغرات الأمنية ميزة.

تمت إضافة التحققات إلى:

  • IOCTL_WFSHBR_REMOVE_FLAG
  • IOCTL_WFSHBR_ADD_FLAG
  • IOCTL_WFSHBR_AND_FLAG
root@kitploit:~
case IOCTL_WFSHBR_ADD_FLAG: // 0xAA013884
      if ( !KwfsVerifyCaller(Buffer) ) // التحقق من المتصل
        break;
-     if ( Buffer->ArbitraryEProcessOffset >= 0x1000 ) // حد التحقق من الإزاحة
+     if ( !KwfsVerifyOffsetAndFlags(Buffer->ArbitraryEProcessOffset,
+                                    Buffer->DesiredFlags) ) // التحقق من الإزاحة والأعلام
        break;
      *(ULONG*)(IoGetCurrentProcess() + Buffer->ArbitraryEProcessOffset) |= Buffer->DesiredFlags;

KwfsVerifyOffsetAndFlags

هذه الروتين مصممة ليتم استدعاؤها في كل مرة يطلب فيها العميل تعديل EPROCESS، وتقوم بالتحقق من Offset المقدم من حقل ArbitraryEProcessOffset في هذا PoC – وكذلك Flags المقدم من حقل DesiredFlags في هذا PoC.

التحقق بسيط جدًا حيث يقوم بعد بتات 1 في كل حقل بت من الأعلام المقدمة، وإذا كان العدد أكبر من ثمانية، يفشل.

خريطة نمط الأعلام المحتملة هي أربعة فقط:

  • 22 00 00 00
  • 00 22 00 00
  • 00 00 22 00
  • 00 00 00 22

وبناءً عليه، فإن إجراء العمليات التالية 4 مرات يضمن أن واحدة على الأقل من المحاولات ستنجح:

  • طرح حقل ArbitraryEProcessOffset حسب الفهرس: offset - index,
  • وضبط البتات في حقل DesiredFlags حسب الفهرس: flag << (index * 8).

يتم تقليل الإزاحة، لذا فإن ضبط حقل البتات سيؤدي إلى تعديل الإزاحة في عوامل البتوزيع.

root@kitploit:~
*(ULONG*)(IoGetCurrentProcess() + offset) |= flags;
*(ULONG*)(IoGetCurrentProcess() + offset) &= ~flags;

لقد أضفنا دالتين WfsProtectProcessSupreme و WfsUnprotectProcessSupreme اللتين تقومان بالمحاولة وهزيمة الحيلة الجديدة.

root@kitploit:~
enum KwfsState {
  KwfsStateOnceCall = 0,
  KwfsStateNeedsValueEquality = 1,
  KwfsStateValueHasBeenSet = 2,
};

bool KwfsVerifyOffsetAndFlags(_In_ ULONG offset, _In_ ULONG offset flags)
{
  if (KwfsState::KwfsState == KwfsState::KwfsStateOnceCall) {
    g_KwfsVerifyState = KwfsState::KwfsStateValueHasBeenSet;
    g_KwfsVerifyStateOffset = offset;
    g_KwfsVerifyStateFlags = flags;
    if (offset < 0x1000) { // تم نقل حد التحقق من الإزاحة إلى هنا
      auto bitcount = 0;
      for (auto i = 0; i < 32; ++i) { // عد بتات `1` في الأعلام
        if (flags & (1 << i)) {
          ++bitcount;
        }
      }
      if (bitcount <= 8) { // يجب أن يكون العد أقل من تسعة
        g_KwfsVerifyState = 1;
        return true;
      }
    }
  }
  else
  {
    if (g_KwfsVerifyState != KwfsState::KwfsStateValueHasBeenSet
     || offset != g_KwfsVerifyStateOffset
     || flags != g_KwfsVerifyStateFlags) {
      return false;
    }
  }
  return false;
}
تنزيل الأداة