abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
类别: 权限残留 可达性: 远程
vsftpd 3.0.5 - Chris Evans
我固定的是官方 tarball,不是 GitHub 镜像,也不是发行版分支。SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3。vsftpver.h VSF_VERSION "3.0.5"。
cmds_denied 在 process_post_login(postlogin.c:140-184)中是对大写 token 的精确匹配。随后分发时会把 RFC 775 别名 OR 到同一批处理函数上:RMD||XRMD(:263-264),还有 CWD||XCWD、MKD||XMKD、PASV||P@SW,以及单独的 EPSV / STOU / APPE。运维人员把 RMD 加入拒绝列表(常见的 DELE,RMD 配方)后,XRMD 仍然可以 rmdir。
这个残留是在运维人员以为已经关闭的拒绝列表下,对已认证 FTP 完整性的影响。它不是未认证、不是 root、不是 chroot 逃逸,也不是 RCE。
| ID | 暂无 CVE |
| 类别 | 权限残留(cmds_denied 精确 token) |
| 可达性 | 远程(已认证 FTP) |
| CWE | CWE-863 |
| CVSS | High: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 产品 | vsftpd(Chris Evans) |
| 受影响 | vsftpd 3.0.5 官方 tarball |
| 认证 | FTP USER/PASS(实验环境:匿名 ftp) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18720 |
谁:在运维人员设置了 cmds_denied 的守护进程上,一个已认证的 FTP 用户(匿名或本地)。默认未设置。man page 中提到的虚拟用户配方共享同一个 guest uid,因此 Unix DAC 无法区分它们。会话在通常的 chroot 内已经是映射后的 uid。cmds_denied 本应是那个用来拿走该动词的额外控制。
| 方法 + 汇聚点 | 权限 |
|---|---|
在 cmds_denied=RMD 后执行 XRMD labdir | handle_rmd -> str_rmdir,作用于会话 uid 能在 Unix 上 rmdir 的目录。实验环境:RMD labdir 550,XRMD labdir 250,CWD labdir 550(目录已消失)。第二次 MKD labctrl 在 RMD 上仍为 550。 |
| 方法 + 汇聚点 | 权限 |
|---|---|
在 cmds_denied=MKD 后执行 XMKD dir | handle_mkd -> 以会话 uid 执行 mkdir |
在 cmds_denied=CWD 后执行 XCWD path | handle_cwd -> chdir。若 download_enable 开启,随后可 RETR |
在 cmds_denied=STOR 后执行 STOU / APPE | handle_upload_common 创建 / 追加。需要 write_enable |
在 cmds_denied=PASV 后执行 EPSV / P@SW | handle_pasv 打开一个数据监听器,而拒绝列表本应阻止它 |
实验环境只证明了 RMD 之后的 XRMD。其他别名共享同一个 str_equal 门控以及分发中的同一个 OR。我没有实际测试它们。
作为一等残留,没有。cmds_denied 不是隐藏。XRMD 不会列出名称。
不在范围内。删除目录是完整性影响。之后对该名称执行 CWD / RETR 会作为副作用返回 550。
cmds_denied(登录前会忽略它;USER/PASS/QUIT 仍属于登录前表)allow_writeable_chroot 默认关闭;实验环境只在 /incoming 下写入,因此拒绝仍然成立)cmds_allowed 失败关闭:未列出的动词包括 XRMD 仍为 550write_enable=NO 仍会阻止写入系列(STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE 与 site 大小写绕过(ftpcmdio.c str_upper)cmds_denied=CHMOD 永远不会匹配;用 chmod_enable=NO 或 cmds_denied=SITE 来阻止 chmod我在官方 3.0.5 上寻找 hide/deny/cmds_denied。这个门控是一次遍历逗号 token,并对大写后的动词执行 str_equal。handle_rmd 内部没有第二次检查。RFC 775 仍然把 XRMD 作为 RMD 提供。常见建议是 cmds_denied=DELE,RMD。这个字符串从未提到 XRMD。
错误方向:把 SITE 与 site 当作绕过。动词会被大写。把 cmds_allowed 也当作同样处理:该列表是失败关闭的,因此未列出的别名仍会被拒绝。
cd lab
./run.sh
回环 127.0.0.1:18720。Compose 项目 vsftpd-cmds-denied-alias。官方 3.0.5 tarball 位于 lab/(SHA-256 见上)。cmds_denied=RMD,write_enable=YES,匿名,只在 /incoming 下写入。见证 VSFTPD-CMDS-DENIED-ALIAS-WITNESS。最后一行:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
在拒绝现代动词时,同时拒绝 RFC 别名,或在 cmds_denied 中匹配别名(XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE)。优先使用 cmds_allowed(允许列表)。
厂商接收邮箱是 [email protected](vsftpd)。无报酬。不要在任何 vsftpd 镜像上公开提交 GitHub issue。
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]