abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
技术分析文章:https://abraxaslabs.tech/research/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)中执行精确的大写令牌匹配。随后分发阶段会将 RFC 775 别名按位或到同一组处理函数上: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 精确令牌) |
| 可达性 | 远程(已认证 FTP) |
| 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 |
| 产品 | 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 手册中提到的虚拟用户配方共享同一个 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 门控以及分发阶段相同的按位或。我未对它们进行测试。
作为一类残留问题,无侦察能力。cmds_denied 并非隐藏手段。XRMD 不会列出名称。
不在评估范围内。删除目录属于完整性影响。之后对该名称的 CWD / RETR 会作为副作用返回 550。
cmds_denied(登录前会被忽略;USER/PASS/QUIT 仍属于登录前的命令表)allow_writeable_chroot 默认关闭;实验环境仅在 /incoming 下写入,因此拒绝规则仍然生效)cmds_allowed 采用失败即拒绝(fail-closed)策略:未列出的动词(包括 XRMD)仍返回 550write_enable=NO 仍会阻止写入类命令(STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE 与 site 的大小写绕过(ftpcmdio.c 中的 str_upper)cmds_denied=CHMOD 永远不会匹配;要禁用 chmod,请使用 chmod_enable=NO 或 cmds_denied=SITE我在官方 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]