جزء من “الخمسة الصقيعية” (The Frosty Five) — سلسلة تحديات Insane جنب حدث Advent of Cyber الأساسي. الشرير هنا اسمه Blizzard Bear، واللاب بيبدأ بمفتاح (Keycard) مخبي جوه أحد تحديات اليوم الثاني عشر من الحدث الرئيسي، قبل ما توصل لهدف اللاب الحقيقي.
اللاب مقسّم لمرحلتين واضحتين: مرحلة الوصول (إيجاد الـ Keycard عبر IDOR ثم تعطيل الـ Firewall)، ومرحلة الاستغلال الفعلية اللي فيها 3 Flags متتالية — فك ضغط ملف بطريقة غير تقليدية، ثغرة Heap Overflow في binary بلغة C، وهروب كامل من Docker.
جزء من سلسلة Side Quest — أكمله مع الأربعة الباقيين واحصل على شارة الحدث كامل
تلميح اليوم الـ12 من الحدث الرئيسي بيوجّهك لتطبيق بنكي فيه endpoint اسمه /transactions بياخد ID، والـ ID ده MD5 hash لرقم بسيط. بـ Burp Intruder، عملنا brute-force على الأرقام من 1330 لـ 1350 (كل واحد بيتحول MD5 أوتوماتيك)، ولقينا رد بطول مختلف فيه Base64 بيدي مسار صورة.
الصورة اللي طلعت من الـ IDOR فيها كلمة سر الـ Keycard. بندخلها في خدمة على port 21337 فتعطّل الـ Firewall وتفتح باقي المنافذ للهدف الحقيقي.
port 21337بعد الـ Firewall، nmap بيطلّع 3 منافذ: SSH (22)، موقع طلبات تراخيص بناء (80)، وخدمة نصية غامضة (1337) — دي بالظبط الخدمة القديمة اللي Blizzard Bear “هكرها” زي ما بيقول وصف اللاب.
nmap -p- IPport 1337 (text service)فحص المجلدات بيطلّع /backup فيها binary اسمه enc، قائمة باسوردات، وملف ZIP محمي. كسر الـ ZIP مباشرة بقائمة الباسوردات العادية مبيفدش — لكن لو شغّلت كل باسورد في القائمة على الـ enc binary الأول، وبعدين جربت الناتج المشفّر كباسورد للـ ZIP، بيفتح. جوه الملف: foothold.txt (Flag 1) + الـ binary اللي هنستغله بعدين + Dockerfile.
الـ Dockerfile بيأكد إن الـ binary (secureStorage) هو نفسه الخدمة على port 1337 (عبر socat)، والـ flag موجود في جذر الـ container. تحليل الكود بـ Binary Ninja بيكشف إن دالتي create() وedit() بيكتبوا بيانات بحجم أكبر من الـ buffer المخصّص فعليًا بـ malloc — Heap Overflow كلاسيكي، لكن من غير أي استدعاء لـ free() في الكود كله.
غياب الـ free() بيلغي كل تقنيات الاستغلال العادية اللي محتاجة UAF أو Double-Free. الحل: تسريب عناوين libc والـ heap عن طريق الـ unsorted bin (House of Orange)، بعدين تلويث بيانات الـ tcache من غير free (House of Tangerine) عشان توجّه الـ malloc لعنوان تختاره إنت، وفي الآخر ret2libc بينادي system("/bin/sh") عن طريق الكتابة فوق عنوان الرجوع المحفوظ في الـ Stack.
بعد الحصول على shell جوه الـ container، فحص الصلاحيات (deepce / LinPeas) بيأكد إمكانية استغلال core_pattern: لو الـ container شغّال بصلاحيات كافية، تقدر تكتب في /proc/sys/kernel/core_pattern مسار لسكريبت مسبوق بـ | (pipe)، وأي Crash بعد كده هيخلي الـ Kernel ينفّذ السكريبت ده على مستوى الـ Host نفسه مش جوه الـ container.
حطّينا سكريبت reverse shell في مسار الـ overlay2 بتاع الـ container (اللي بيتماونت فعليًا على الهوست)، سجّلناه في core_pattern بصيغة |/path/shell.sh، وعملنا crash متعمّد. النتيجة: shell كـ root على الـ Host نفسه، والـ flag الأخير في /root/root.txt.
| الأمر | الوصف | المرحلة |
|---|---|---|
| Burp Intruder — Number payload + Hash processing (MD5) | Brute-force لأرقام الـ transaction ID المشفّرة | IDOR |
| gobuster dir -u http://IP -w wordlist | اكتشاف مجلد /backup على الموقع | Enum |
| for pw in wordlist: enc “$pw” >> encrypted.txt | إعادة تشفير كل باسورد بنفس الـ binary قبل تجربته | Flag 1 |
| fcrackzip -D -p encrypted.txt secureStorage.zip | كسر الـ ZIP بالباسوردات المشفّرة | Flag 1 |
| gef> p system / p malloc | تحديد إصدار الـ glibc من عناوين الدوال | Recon |
| python3 exploit.py (pwntools — House of Orange/Tangerine) | تسريب عناوين + تلويث tcache + ret2libc | Flag 2 |
| ./deepce.sh · ./linpeas.sh | فحص صلاحيات الـ container واكتشاف core_pattern | Enum |
| echo “|/overlay/path/shell.sh” > /proc/sys/kernel/core_pattern | تسجيل السكريبت كمعالج لأي Crash | Flag 3 |
| python3 -c ‘import os; os.abort()’ | عمل Crash متعمّد لتفعيل الاستغلال | Flag 3 |
| cat /root/root.txt | قراءة الـ Flag النهائي كـ root على الـ Host | Root Flag |
enc binary re-encrypt trick · fcrackzip · foothold.txt
House of Orange + House of Tangerine · ret2libc · root في الـ container
core_pattern breakout · root.txt على الـ Host