ProFTPD 1.3.9d - 高危 - 远程 - 权限残留 / 文件写入 - SFTP copy-file 跳过目标 WRITE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
类别: 权限残留 / 文件写入 可达性: 远程
ProFTPD 1.3.9d (f59f248) - proftpd.org
contrib mod_sftp 在 SFTPEngine 开启后(SFTP_FXP_EXT_DEFAULT)会通告 copy-file。fxp_handle_ext_copy_file 仅在 pr_fsio_stat(dst) 成功时,才执行目标 WRITE 以及 AllowOverwrite 检查。目标文件尚不存在时会跳过该检查。随后 pr_fs_copy_file2 会以会话 UID 创建该文件,即使在 <Limit WRITE> DenyAll 下也是如此。
FTP STOR 和 SFTP OPEN-write 仍会经过 xfer_pre_stor,它在创建前始终会 dir_check WRITE。公开的 Issue 2095 是相反的情况:SITE COPY 跳过了源 READ。本残留问题是在新文件名上的目标 WRITE。
| ID | 暂无 CVE |
| 类别 | 权限残留 / 文件写入 |
| 可达性 | 远程(已认证 SFTP) |
| CWE | CWE-863 |
| CVSS | 高危:7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 产品 | ProFTPD |
| 受影响版本 | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| 认证 | 已认证 SFTP(SFTPEngine on) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
我固定了标签 v1.3.9d 并阅读了 fxp_handle_ext_copy_file。它分发一个伪造的 SITE COPY 的 PRE_CMD。mod_copy 将 copy_copy 注册为 CMD,而非 PRE_CMD,因此 FTP 的目标 WRITE 检查在此路径上从不运行。源 READ 始终会经过 dir_check。目标 WRITE 则不会,除非目标已存在。实验环境是 127.0.0.1:18710 上的回环 SFTP。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
SFTP EXTENDED copy-file 将可读源复制到尚不存在的目标名称,位于带有 <Limit WRITE> DenyAll 的 <Directory> 下 | pr_fs_copy_file2 | 完整性(实验证明): 以会话 UID 创建该文件。侦察(实验证明): 当目标 READ 被允许时,对目标进行 SFTP READ 会返回源字节。 |
| 相同目标已存在 | dir_check WRITE + AllowOverwrite | 已关闭(实验证明): copy-file 覆盖返回权限拒绝。 |
| 对相同目标进行 SFTP OPEN / STOR / SCP 上传 | xfer_pre_stor | 已关闭(实验证明): OPEN 写入/创建返回 SSH_FX_PERMISSION_DENIED(状态 3)。 |
| 未认证 copy-file | SFTP 认证 | 已关闭。无 shell。Unix DAC 仍然适用。 |
实验证明与推断: 目标创建、对见证文件的目标 READ、OPEN-write 拒绝以及已存在目标的覆盖拒绝均为实验证明。未认证和 Unix DAC 仍根据认证/chroot 模型推断。
要求: 加载 contrib mod_sftp,SFTPEngine on。典型的发行版 SFTP vhost。SFTPExtensions -copyFile 会关闭该扩展。
cd lab
./run.sh
回环 127.0.0.1:18710 映射到容器 2222。Compose 项目 proftpd-sftp-copy-file-write。镜像标签 proftpd-sftp-copy-file-write:1.3.9d。见证字符串 PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS。最后一行:
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
在 pr_fs_copy_file2 之前,即使目标尚不存在,也要对目标 WRITE 执行 dir_check。或者禁用该扩展:SFTPExtensions -copyFile。
f59f248e26bdfa514443e42bf72a145641df635d)fxp_handle_ext_copy_file 位于 contrib/mod_sftp/fxp.cSFTP_FXP_EXT_DEFAULT 包含 copy-file