
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
Clase: Privilegio residual Alcance: Remoto
vsftpd 3.0.5 - Chris Evans
Fijé el tarball oficial, no un espejo de GitHub ni un fork de distro. 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 de alias RFC 775 sobre los mismos manejadores: RMD||XRMD (:263-264), también CWD||XCWD, MKD||XMKD, PASV||P@SW, más EPSV / STOU / APPE por separado. Un operador que pone RMD en la lista de denegados (la receta común DELE,RMD) todavía permite que XRMD haga rmdir.
Este residual es integridad de FTP autenticado bajo una lista de denegados que el operador creía cerrada. No es no autenticado, no es root, no es un escape de chroot, y no es RCE.
| ID | sin CVE aún |
| Clase | Privilegio residual (cmds_denied token exacto) |
| 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 |
| Auth | FTP USER/PASS (lab: anónimo ftp) |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18720 |
Quién: un usuario FTP autenticado (anónimo o local) en un daemon donde el operador configuró cmds_denied. Por defecto está sin configurar. Las recetas de usuario virtual que menciona la página man comparten un uid de invitado, así 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 extra que se suponía quitaba 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 rmdir en Unix. Lab: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (directorio eliminado). Segundo MKD labctrl sigue 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 crear / añadir. Requiere write_enable |
EPSV / P@SW tras cmds_denied=PASV | handle_pasv abre un listener de datos que la lista de denegados debía detener |
El lab solo probó XRMD tras RMD. Los otros alias comparten la misma puerta 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 en bar. Eliminar un directorio es un impacto de integridad. Un CWD / RETR posterior de ese nombre da 550 como efecto secundario.
cmds_denied no autenticado (pre-login lo ignora; USER/PASS/QUIT permanecen en la tabla pre-login)allow_writeable_chroot por defecto desactivado; el lab solo escribe bajo /incoming así que la denegación sigue vigente)cmds_allowed fail-closed: verbos no listados incluyendo XRMD permanecen 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; mata chmod con chmod_enable=NO o cmds_denied=SITECacé hide/deny/cmds_denied en el 3.0.5 oficial. La puerta es un 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 común es cmds_denied=DELE,RMD. Esa cadena nunca nombra XRMD.
Camino equivocado: tratar SITE vs site como un bypass. Los verbos se convierten a mayúsculas. Tratar cmds_allowed de la misma manera: esa lista es fail-closed, así que los alias que no están listados permanecen denegados.
cd lab
./run.sh
Loopback 127.0.0.1:18720. Proyecto Compose vsftpd-cmds-denied-alias. Tarball oficial 3.0.5 en lab/ (SHA-256 arriba). cmds_denied=RMD, write_enable=YES, anónimo, escribe 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
Denegar los alias RFC al denegar el verbo moderno, o hacer coincidir alias en cmds_denied (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). Preferir cmds_allowed (lista de permitidos).
La recepción del proveedor es [email protected] (vsftpd). No remunerado. No abras un issue público en GitHub en ningún espejo de vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]