✅ 预认证 RCE 已确认 — 漏洞利用已成功演示。
📄 技术博客(PDF):CVE-2025-32433-Technical-Blog.pdf
📸 可视化证据:screenshots/
🔍 概念验证详情:docs/PROOF_OF_CONCEPT.md
CVE-2025-32433 是 Erlang/OTP SSH 守护进程中的一个 CVSS 10.0 严重 漏洞。 未经身份验证的攻击者可以在完成身份验证之前打开 SSH 通道并执行任意命令——无需任何凭据。
本实验室为你提供一个完全可用、隔离的环境,用于复现该漏洞、运行漏洞利用、验证漏洞并测试检测机制——全部在你的本地机器上完成。
在开始之前,请确保已安装以下内容:
| 工具 | 最低版本 | 检查命令 |
|---|---|---|
| Docker Desktop | 4.x+ | docker --version |
| Docker Compose | v2.20+ | docker compose version |
| Python | 3.10+ | python --version |
你还需要 Python 的 paramiko 库用于检测套件:
pip install paramiko
在 CVE-2025-32433 披露后,Docker Hub 的
erlang:26.2.5镜像标签被静默覆盖为已修补的26.2.5.11版本。 从 Docker Hub 拉取它 得到的是已修补版本,而不是存在漏洞的版本。本实验的
lab/Dockerfile直接从官方 Erlang GitHub 发布压缩包 编译 OTP 26.2.5,以保证获得真正的存在漏洞的运行时。首次构建大约需要 10 分钟。
┌──────────────────────────────────────────┐
│ Isolated Docker Bridge │
│ (cve-lab-bridge) │
└────┬────────────────────────────┬────────┘
│ │
┌───────────────┴─────────────┐┌─────────────┴──────────────┐
│ target_vulnerable ││ target_patched │
│ OTP 26.2.5 (source-built) ││ erlang:26.2.5.11 │
│ Host Port: 127.0.0.1:2222 ││ Host Port: 127.0.0.1:2223 │
└─────────────────────────────┘└─────────────────────────────┘
│
┌──────────────┴──────────────┐
│ attacker │
│ Python 3 + Scapy/Paramiko │
│ Workdir: /work │
└─────────────────────────────┘
| 容器 | 端口 | OTP 版本 | 状态 |
|---|---|---|---|
cve-2025-32433-vulnerable | 127.0.0.1:2222 | 26.2.5 (ERTS 14.2.5) | ❌ 存在漏洞 |
cve-2025-32433-patched | 127.0.0.1:2223 | 26.2.5.11 (ERTS 14.2.5.15) | ✅ 已修补 |
cve-2025-32433-attacker | 仅内部 | Python 3 工具 | 攻击者工具集 |
git clone https://github.com/damnkrishna/CVE-2025-32433-LAB.git
cd CVE-2025-32433-LAB
⏱️ 这大约需要 10 分钟 — 它会从 C 源码编译 Erlang/OTP 26.2.5。 这是预期行为。请勿中断。
docker compose build --no-cache target_vulnerable
你将看到类似 make[1]: Leaving directory '/tmp/otp_src_26.2.5/lib/...' 的编译器输出——
这是正常的。它以如下内容结束:
✔ Image ine_cyber_assignment_job-target_vulnerable Built
docker compose build --no-cache target_patched
docker compose up -d target_vulnerable target_patched
docker compose ps
Expected output:
NAME STATUS PORTS
cve-2025-32433-vulnerable Up (healthy) 127.0.0.1:2222->2222/tcp
cve-2025-32433-patched Up (healthy) 127.0.0.1:2223->2222/tcp
两个容器都必须显示 (healthy) 才能继续。
确认容器确实运行的是 OTP 26.2.5(而非已修补的版本):
docker exec cve-2025-32433-vulnerable cat /usr/local/otp/lib/erlang/releases/RELEASES
预期输出——必须显示 14.2.5,且不带 .15 后缀:
[{release,"Erlang/OTP","26","14.2.5",
[{kernel,"9.2.4",...},
如果你看到 14.2.5.15 —— 说明容器镜像有误。请使用 --no-cache 重新构建。
以合法用户身份连接,确认服务器接受标准认证:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 [email protected]
当提示输入密码时,请输入:LabPass2026!Secured
你将进入一个 Erlang shell:
Eshell V14.2.5 (press Ctrl+G to abort, type help(). for help)
1>
在 Erlang shell 中尝试一些命令:
ls().
file:write_file("test.txt", "hello").
file:read_file("test.txt").
要退出 Erlang shell:
q().
在运行漏洞利用程序之前,请打开第二个 PowerShell 终端并跟踪服务器日志:
Get-Content -Path .\logs\target_vulnerable\ssh.log -Wait -Tail 20
保持此终端打开。你将实时看到连接事件出现。
这是预认证远程代码执行的概念验证。 不使用任何凭据。
cd attacker_work\exploit
python payload.py
Expected output:
[*] Connecting to SSH server...
[+] Received banner: SSH-2.0-Erlang/5.1.4
[*] Sending SSH_MSG_KEXINIT...
[*] Sending SSH_MSG_CHANNEL_OPEN...
[*] Sending SSH_MSG_CHANNEL_REQUEST (pre-auth)...
[✓] Exploit sent! If the server is vulnerable, it should have written to /lab.txt.
[+] Received response: 000003d4...
该 banner 必须显示 SSH-2.0-Erlang/5.1.4(不带 .15 后缀),以确认你已连接到存在漏洞的服务器。
docker exec cve-2025-32433-vulnerable cat /lab.txt
Expected output:
pwned
如果你看到 pwned —— CVE-2025-32433 预认证 RCE 已确认。
该漏洞利用在零凭据的情况下写入了容器文件系统。
对端口 2223 上已修补的容器运行相同的漏洞利用:
编辑 attacker_work\exploit\payload.py 第 6 行:
PORT = 2223 # change from 2222 to 2223
运行漏洞利用程序:
python payload.py
然后检查该文件:
docker exec cve-2025-32433-patched cat /lab.txt
Expected output:
cat: /lab.txt: No such file or directory
修补后的容器会拒绝未认证的通道请求。未写入文件 = 已修补。
完成后将 payload.py 的端口恢复为 2222。
返回仓库根目录:
cd ..\..
扫描存在漏洞的目标:
python detection\detect_cve_2025_32433.py 127.0.0.1 2222
扫描已修补的目标:
python detection\detect_cve_2025_32433.py 127.0.0.1 2223
监控容器进程表,检测由 Erlang 派生的意外子进程 (例如表明存在 RCE 的 shell 进程):
python detection\host_process_monitor.py
保持其运行,并在另一个终端中运行漏洞利用程序——它将标记该异常。
按 Ctrl+C 停止。
通过一条命令运行所有检测层:
python detection\run_all_detections.py
这会生成一张完整的诊断表,涵盖:
Erlang SSH 守护进程将结构化日志写入磁盘,并挂载到你的主机:
| 容器 | 日志文件 |
|---|---|
| 易受攻击版本 | ./logs/target_vulnerable/ssh.log |
| 已修补版本 | ./logs/target_patched/ssh.log |
实时跟踪:
Get-Content -Path .\logs\target_vulnerable\ssh.log -Wait -Tail 20
漏洞利用后需要查找的关键日志行:
debug: Connection terminated. Unexpected message for unauthenticated user.
Message: [{ssh_msg_channel_open,...}]
notice: Accept failed on any:2222 for connect from 172.20.0.X:PORT: normal
在存在漏洞的版本中,通道请求会在写入此日志条目之前执行。
docker compose down
要彻底清理镜像:
docker compose down --volumes
docker rmi ine_cyber_assignment_job-target_vulnerable --force
docker rmi ine_cyber_assignment_job-target_patched --force
| 参数 | 值 |
|---|---|
| 用户名 | labuser |
| 密码 | LabPass2026!Secured |
| 易受攻击端口 | 127.0.0.1:2222 |
| 已修补端口 | 127.0.0.1:2223 |
| 文件 | 用途 |
|---|---|
CVE-2025-32433-Technical-Blog.pdf | PDF 格式的全面研究博客(800–1,200+ 字) |
screenshots/ | 易受攻击/已修补状态及漏洞利用的完整照片证据 |
lab/Dockerfile | 从官方源码构建真实的易受攻击 OTP 26.2.5 |
lab_patched/Dockerfile | 使用官方已修补的 erlang:26.2.5.11 镜像 |
lab/start_ssh.erl | Erlang SSH 守护进程配置脚本 |
attacker_work/exploit/payload.py | CVE-2025-32433 漏洞利用(原始套接字,零依赖) |
detection/detect_cve_2025_32433.py | 基于横幅的远程漏洞扫描器 |
detection/host_process_monitor.py | 容器进程与文件完整性监控器 |
detection/run_all_detections.py | 主 4 层诊断与检测套件 |
docs/PROOF_OF_CONCEPT.md | 完整的漏洞利用分解与技术验证日志 |
logs/target_vulnerable/ssh.log | 实时 Erlang SSH 守护进程日志(易受攻击) |
logs/target_patched/ssh.log | 实时 Erlang SSH 守护进程日志(已修补) |