جزء تاني من قصة Bandit Yeti — بعد ما وصلت لأول مفتاح، دلوقتي عليك تخترق محيط الشرطة السيبرانية (CyberPolice) نفسه. المفتاح الوحيد المعروض عليك: كاميرا مراقبة قديمة شغّالة على معالج ARM.
اللاب ده من أصعب لابات الموقع تقنيًا — مش بس استغلال، لكن بناء الاستغلال نفسه بلغة ARM Assembly يدويًا، وبعدين Pivoting داخلي معقّد عشان توصل لتطبيق ويب تاني، واستغلال NoSQL Injection على MongoDB لتخطي تسجيل الدخول.
من أصعب 4 أجزاء متصلة تحكي قصة اختراق Best Festival Company كاملة
سكان صامت (nmap -sS) عشان ما نلفتش النظر (تلميح: “بيني كالثلج المتساقط”). بيطلّع 4 منافذ: SSH و23(tcpwrapped) و8080(Apache، 403 Forbidden) وport 50628 غامض بيرد بإعادة توجيه لجهاز اسمه NC-227WF-HD-720P — كاميرا مراقبة قديمة.
بحث عن اسم الكاميرا بيطلّع writeup منشور فعليًا لنفس التحدي بالظبط — بيوضّح Buffer Overflow في حقل الـ Basic Auth بتاع صفحة الدخول، وبيوفّر سكريبت pwntools كامل بـ ARM shellcode جاهز لتنفيذ /bin/sh عبر reverse shell.
الـ IP بتاع المهاجم الأصلي مكوّد جوه الـ shellcode نفسه. لازم نستبدله بـ IP بتاعنا — لكن أي رقم فيه فك تشفيره لـ Byte من ضمن “Bad Characters” (زي 0x0a) بيكسر السكريبت. الحل: نفكّك الكود بمُجمِّع ARM أونلاين، نعدّل الرياضيات (زي جمع 8+2 بدل كتابة 10 مباشرة) عشان نتجنّب الـ Byte الممنوع، ونجمّعه تاني.
avoid bad chars (0x00,0x0a,0x0d…)online ARM assembler/disassemblerتشغيل السكريبت المعدّل بيدّي reverse shell بصلاحية root مباشرة على الجهاز المدمج (embedded). مفيش أدوات تعداد فيه، فبنتصفح المجلدات يدويًا ونلاقي بيانات دخول لوحة تحكم الكاميرا بالنص الصريح في /var/etc/umconfig.txt. الدخول بيها بيوريك بث كاميرا مكتب Frosteau وأول Flag من اللاب ده.
تطبيق الويب الحقيقي (port 8080) بيرفض الوصول من بره الشبكة، لكن من جوه الكاميرا نفسها بيرد 401 بدل 403 — يعني متاح محليًا بس. بما إن socat وnetstat مش موجودين على الجهاز (ARM)، بنجيب نسخ static ARM binaries، نلاقي الـ PID بتاع خدمة “Webs” الشاغلة port 50628، نقفلها، ونربط نفس المنفذ فورًا بـ socat يوجّه لـ 8080 الداخلي — كده بقى متاح من بره.
netstat-armel-static -tulpenkill webs; socat tcp-listen:50628,fork → tcp:127.0.0.1:8080Gobuster وNikto على المنفذ المُعاد توجيهه بيكشفوا: مجلد /vendor، ملفات .DS_Store مسرّبة (بتكشف إن الـ Backend شغّال بـ MongoDB)، وثغرة تصميم بسيطة: أي مسار بينتهي بـ .php/ (بشرطة مايلة إضافية) بيتخطى الحماية اللي بتمنع الوصول المباشر لملفات .php.
تطبيق تسجيل الدخول عرضة لـ NoSQL Injection كلاسيكي: تحويل باراميتر PHP من نص عادي لمصفوفة (username[$regex]=.*) بيخلي MongoDB يطابق أول مستخدم في القاعدة، متجاوزين التحقق من الباسورد بالكامل.
نفس ثغرة الـ NoSQL بتسمح بتعداد أسماء وباسوردات المستخدمين حرف بحرف (blind regex enumeration) باستخدام سكريبت عام من GitHub. بعد استخراج 17 اسم مستخدم وعدة باسوردات، تجربتهم في Burp Repeater بتوريك إن حساب المستخدم Frosteau عنده dashboard فيه yetikey2.txt.
| الأمر | الوصف | المرحلة |
|---|---|---|
| nmap -sS -sV -sC -p 22,23,8080,50628 IP | سكان صامت لتجنّب إغلاق الخدمة الحساسة | Recon |
| python3 exploit.py # ARM shellcode, IP معدّل | استغلال Buffer Overflow في واجهة الكاميرا | RCE |
| ./netstat-armel-static -tulpen | إيجاد الـ PID الشاغل للمنفذ المكشوف | Pivot |
| kill PID; ./socat-armel-static tcp-listen:50628,fork,reuseaddr tcp:127.0.0.1:8080 | إعادة توجيه المنفذ العام لتطبيق داخلي | Pivot |
| gobuster dir -u http://IP:50628 -w wordlist | اكتشاف مسارات التطبيق الداخلي | Enum |
| python3 ds_store_exp.py -u http://IP:50628/ | استخراج ملفات .DS_Store المسرّبة | Enum |
| username[$regex]=.*&password[$regex]=.* | تجاوز تسجيل الدخول عبر NoSQL Injection | Auth Bypass |
| python3 nosqli-user-pass-enum.py -u …/login.php/ -up username -pp password -ep username | تعداد أسماء المستخدمين حرف بحرف | Enum |
ARM shellcode RCE على الكاميرا · بيانات دخول بالنص الصريح
Port pivoting · NoSQL Injection · تعداد مستخدمين