本仓库包含在 Black Hat USA 2026 和 DEF CON 34 演讲“被遗忘但并未消失:遗留 Linux 服务中的未认证 RCE 与 LPE”中所述漏洞的概念验证脚本。
TelnetD 中的本地权限提升:无特权攻击者可利用 TelnetD 的环境变量功能为其授予 root 权限的 shell。按照设计和 RFC,Telnet 协议允许其客户端为 shell 会话设置环境变量。该功能从安全角度来看设计得很差。该服务允许未认证客户端为 telnetd 进程本身及其所有子进程设置环境变量。其子进程之一是 /usr/bin/login。作为远程 telnet 客户端设置环境变量,使我们能够以环境变量“CREDENTIALS_DIRECTORY”启动 /usr/bin/login。这会导致 login 进程在“CREDENTIALS_DIRECTORY”指定的目录中搜索名为“login.noauth”的文件。如果该文件包含字符串“yes”,login 进程将跳过身份验证,并为客户端提供以客户端指定用户身份运行的 shell。该用户可以是任何用户,甚至是 root。
通过 SAMR 在 Samba 中实现未认证远程代码执行:Samba 依赖其配置文件 (smb.conf) 中设置的 shell 命令来执行客户端请求的各种操作,例如添加新网络共享、添加新打印机等。其中一些 shell 命令根据客户端发送的请求接收参数。大多数情况下,参数会被清理,特殊字符会在执行命令前被转义,以防止 shell 注入。
该漏洞位于函数“check_password_complexity”中,该函数将客户端指定的字符串格式化为 shell 命令,但未进行清理。该漏洞需要满足两个条件:
要将 samba 的 RPC 守护进程 (samba-dcerpcd) 配置为使用 NCACN_IP_TCP,需要将其作为独立的系统服务启动,而不是作为主 samba 服务的一部分。此外,配置文件中的选项“rpc start on demand helpers”需要设置为“no”。
通过 SPOOLSS 在 Samba 中实现未认证远程代码执行:函数 generic_job_submit 也将客户端控制的字符串格式化为 shell 命令,且未进行清理。以下配置组合导致此漏洞:
未认证客户端可以通过 spoolss RPC 接口请求访问打印机共享。然后,可以通过函数 RpcStartDocPrinter 提交打印作业。请求中指定的文档名称将用作作业名称,并格式化为命令的“%J”参数。调用 hRpcEndDocPrinter 会触发 generic_job_submit,该函数在格式化作业名称后执行配置中的“print command”,且不进行清理。漏洞利用程序发送的代码将以用户“nobody”的身份执行。如果将配置“valid users = @users”添加到打印机共享部分,利用仍然有效,但需要有效的凭据。如果执行了身份验证,漏洞利用程序发送的代码将以经过身份验证的用户身份执行,而不是以“nobody”身份执行。