
vsftpd 3.0.5 - Alta - Remota - Privilegio residual - cmds_denied omite alias RFC (XRMD)
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
Análisis: https://abraxaslabs.tech/research/vsftpd-cmds-denied-alias
Clase: Privilegio residual Alcance: Remoto
vsftpd 3.0.5 - Chris Evans
Fijé el tarball oficial, no un espejo de GitHub ni un fork de distribución. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied es una coincidencia exacta de token en mayúsculas en process_post_login (postlogin.c:140-184). El despacho luego aplica OR con los alias de RFC 775 sobre los mismos manejadores: RMD||XRMD (:263-264), también CWD||XCWD, MKD||XMKD, PASV||P@SW, además de EPSV / STOU / APPE por separado. Un operador que incluye RMD en la lista de denegados (la receta común DELE,RMD) todavía permite que XRMD elimine el directorio.
Este residual es integridad de FTP autenticado bajo una lista de denegados que el operador creía cerrada. No es una vulnerabilidad no autenticada, no es root, no es un escape de chroot y no es RCE.
| ID | aún sin CVE |
| Clase | Privilegio residual (token exacto de cmds_denied) |
| Alcance | Remoto (FTP autenticado) |
| CWE | CWE-863 |
| CVSS | Alto: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Producto | vsftpd (Chris Evans) |
| Afectado | vsftpd 3.0.5 tarball oficial |
| Autenticación | FTP USER/PASS (laboratorio: anónimo ftp) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18720 |
Quién: un usuario FTP autenticado (anónimo o local) en un demonio donde el operador configuró cmds_denied. Por defecto no está definido. Las recetas de usuarios virtuales que menciona la página de manual comparten un uid de invitado, por lo que el DAC de Unix no puede separarlas. La sesión ya es el uid mapeado dentro del chroot habitual. cmds_denied era el control adicional que se suponía debía quitar el verbo.
| Método + sink | Privilegio |
|---|---|
XRMD labdir tras cmds_denied=RMD | handle_rmd -> str_rmdir de un directorio que el uid de la sesión puede eliminar con rmdir de Unix. Laboratorio: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (directorio eliminado). Segundo MKD labctrl sigue dando 550 en RMD. |
| Método + sink | Privilegio |
|---|---|
XMKD dir tras cmds_denied=MKD | handle_mkd -> mkdir como el uid de la sesión |
XCWD path tras cmds_denied=CWD | handle_cwd -> chdir. Luego RETR si download_enable |
STOU / APPE tras cmds_denied=STOR | handle_upload_common crea / añade. Requiere write_enable |
EPSV / P@SW tras cmds_denied=PASV | handle_pasv abre un listener de datos que la lista de denegados pretendía detener |
El laboratorio solo probó XRMD tras RMD. Los demás alias comparten la misma comprobación str_equal y el mismo OR en el despacho. No los ejercité.
Ninguno como residual de primera clase. cmds_denied no es un ocultamiento. XRMD no lista nombres.
No aplica. Eliminar un directorio es un impacto en la integridad. Un CWD / RETR posterior de ese nombre devuelve 550 como efecto secundario.
cmds_denied sin autenticación (el pre-login lo ignora; USER/PASS/QUIT permanecen en la tabla de pre-login)allow_writeable_chroot desactivado por defecto; el laboratorio escribe solo bajo /incoming, por lo que la denegación sigue vigente)cmds_allowed fail-closed: los verbos no listados, incluido XRMD, permanecen en 550write_enable=NO sigue bloqueando la familia de escritura (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs site (ftpcmdio.c str_upper)cmds_denied=CHMOD nunca coincide; elimina chmod con chmod_enable=NO o cmds_denied=SITEBusqué hide/deny/cmds_denied en la versión oficial 3.0.5. La compuerta es un único recorrido de tokens separados por comas y str_equal contra el verbo en mayúsculas. No hay una segunda comprobación dentro de handle_rmd. RFC 775 todavía incluye XRMD como RMD. El consejo habitual es cmds_denied=DELE,RMD. Esa cadena nunca nombra XRMD.
Paso en falso: tratar SITE vs site como un bypass. Los verbos se convierten a mayúsculas. Lo mismo con cmds_allowed: esa lista es fail-closed, por lo que los alias que no están listados permanecen denegados.
cd lab
./run.sh
Loopback 127.0.0.1:18720. Proyecto de Compose vsftpd-cmds-denied-alias. Tarball oficial 3.0.5 en lab/ (SHA-256 arriba). cmds_denied=RMD, write_enable=YES, anónimo, escrituras solo bajo /incoming. Testigo VSFTPD-CMDS-DENIED-ALIAS-WITNESS. Última línea:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
Deniegue los alias RFC cuando deniegue el verbo moderno, o haga coincidir los alias en cmds_denied (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). Prefiera cmds_allowed (lista de permitidos).
La recepción de proveedores es [email protected] (vsftpd). Sin remuneración. No abra un issue público en GitHub en ningún espejo de vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]