
vsftpd 3.0.5 - Élevé - À distance - Résidu de privilège - cmds_denied manque les alias RFC (XRMD)
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
Classe : Reliquat de privilège Portée : Distante
vsftpd 3.0.5 - Chris Evans
J'ai épinglé l'archive officielle, pas un miroir GitHub et pas un fork de distribution. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied est une correspondance exacte de jeton en majuscules dans process_post_login (postlogin.c:140-184). La répartition effectue ensuite un OR des alias RFC 775 sur les mêmes gestionnaires : RMD||XRMD (:263-264), également CWD||XCWD, MKD||XMKD, PASV||P@SW, plus EPSV / STOU / APPE séparés. Un opérateur qui met RMD sur liste de refus (la recette courante DELE,RMD) laisse toujours XRMD faire un rmdir.
Ce reliquat est une atteinte à l'intégrité FTP authentifiée sous une liste de refus que l'opérateur croyait fermée. Ce n'est pas non authentifié, pas root, pas une évasion de chroot, et pas une RCE.
| ID | pas encore de CVE |
| Classe | Reliquat de privilège (cmds_denied jeton exact) |
| Portée | Distante (FTP authentifié) |
| CWE | CWE-863 |
| CVSS | Élevé : 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Produit | vsftpd (Chris Evans) |
| Affecté | vsftpd 3.0.5 archive officielle |
| Auth | FTP USER/PASS (labo : anonyme ftp) |
| Licence | GNU Affero GPL v3.0 |
| Labo | 127.0.0.1:18720 uniquement |
Qui : un utilisateur FTP authentifié (anonyme ou local) sur un démon où l'opérateur a défini cmds_denied. Par défaut, non défini. Les recettes d'utilisateurs virtuels citées dans la page de manuel partagent un uid invité, donc le DAC Unix ne peut pas les séparer. La session est déjà l'uid mappé à l'intérieur du chroot habituel. cmds_denied était le contrôle supplémentaire censé retirer le verbe.
| Méthode + cible | Privilège |
|---|---|
XRMD labdir après cmds_denied=RMD | handle_rmd -> str_rmdir d'un répertoire que l'uid de session peut supprimer via Unix. Labo : RMD labdir 550, XRMD labdir 250, CWD labdir 550 (répertoire disparu). Second MKD labctrl toujours 550 sur RMD. |
| Méthode + cible | Privilège |
|---|---|
XMKD dir après cmds_denied=MKD | handle_mkd -> mkdir en tant qu'uid de session |
XCWD path après cmds_denied=CWD | handle_cwd -> chdir. Puis RETR si download_enable |
STOU / APPE après cmds_denied=STOR | handle_upload_common création / ajout. Nécessite write_enable |
EPSV / P@SW après cmds_denied=PASV | handle_pasv ouvre un écouteur de données que la liste de refus était censée arrêter |
Le labo n'a prouvé que XRMD après RMD. Les autres alias partagent le même filtre str_equal et le même OR dans la répartition. Je ne les ai pas exercés.
Aucune en tant que reliquat de premier ordre. cmds_denied n'est pas une dissimulation. XRMD ne liste pas les noms.
Pas dans le barème. Supprimer un répertoire est une atteinte à l'intégrité. Un CWD / RETR ultérieur de ce nom renvoie 550 en effet secondaire.
cmds_denied non authentifié (le pré-login l'ignore ; USER/PASS/QUIT restent la table de pré-login)allow_writeable_chroot désactivé par défaut ; le labo n'écrit que sous /incoming donc le refus tient toujours)cmds_allowed en échec fermé : les verbes non listés, y compris XRMD, restent 550write_enable=NO bloque toujours la famille d'écriture (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs site (ftpcmdio.c str_upper)cmds_denied=CHMOD ne correspond jamais ; tuez chmod avec chmod_enable=NO ou cmds_denied=SITEJ'ai chassé les dissimulations/refus/cmds_denied sur la 3.0.5 officielle. Le filtre est un seul parcours de jetons séparés par des virgules et str_equal contre le verbe mis en majuscules. Il n'y a pas de seconde vérification dans handle_rmd. La RFC 775 livre toujours XRMD comme RMD. Le conseil courant est cmds_denied=DELE,RMD. Cette chaîne ne nomme jamais XRMD.
Fausse piste : traiter SITE vs site comme un contournement. Les verbes sont mis en majuscules. Traiter cmds_allowed de la même manière : cette liste est en échec fermé, donc les alias qui ne sont pas listés restent refusés.
cd lab
./run.sh
Boucle locale 127.0.0.1:18720. Projet Compose vsftpd-cmds-denied-alias. Archive officielle 3.0.5 dans lab/ (SHA-256 ci-dessus). cmds_denied=RMD, write_enable=YES, anonyme, écrit uniquement sous /incoming. Témoin VSFTPD-CMDS-DENIED-ALIAS-WITNESS. Dernière ligne :
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
Refusez les alias RFC lorsque vous refusez le verbe moderne, ou faites correspondre les alias dans cmds_denied (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). Préférez cmds_allowed (liste d'autorisation).
La réception par le fournisseur est [email protected] (vsftpd). Non rémunéré. N'ouvrez pas d'issue GitHub publique sur un miroir vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]