
vsftpd 3.0.5 - Hoch - Remote - Privilege leftover - cmds_denied verpasst RFC-Aliase (XRMD)
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
Klasse: Privilegien-Überbleibsel Reichweite: Remote
vsftpd 3.0.5 - Chris Evans
Ich habe das offizielle Tarball gepinnt, nicht einen GitHub-Mirror und nicht einen Distro-Fork. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied ist ein exakter, in Großbuchstaben umgewandelter Token-Abgleich in process_post_login (postlogin.c:140-184). Der Dispatch OR-verknüpft dann RFC-775-Aliase auf dieselben Handler: RMD||XRMD (:263-264), ebenso CWD||XCWD, MKD||XMKD, PASV||P@SW, plus separate EPSV / STOU / APPE. Ein Operator, der RMD auf die Denylist setzt (das übliche DELE,RMD-Rezept), erlaubt XRMD weiterhin das rmdir.
Dieses Überbleibsel ist authentifizierte FTP-Integrität unter einer Denylist, die der Operator für geschlossen hielt. Es ist nicht unauth, nicht root, kein Chroot-Escape und kein RCE.
| ID | noch keine CVE |
| Klasse | Privilegien-Überbleibsel (cmds_denied exakter Token) |
| Reichweite | Remote (authentifiziertes 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 |
| Produkt | vsftpd (Chris Evans) |
| Betroffen | vsftpd 3.0.5 offizielles Tarball |
| Auth | FTP USER/PASS (Lab: anonym ftp) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18720 |
Wer: ein authentifizierter FTP-Benutzer (anonym oder lokal) auf einem Daemon, bei dem der Operator cmds_denied gesetzt hat. Standard ist nicht gesetzt. Virtual-User-Rezepte, die die Manpage nennt, teilen sich eine Gast-UID, sodass Unix-DAC sie nicht trennen kann. Die Session ist bereits die gemappte UID innerhalb des üblichen Chroots. cmds_denied war die zusätzliche Kontrolle, die das Verb wegnehmen sollte.
| Methode + Sink | Privileg |
|---|---|
XRMD labdir nach cmds_denied=RMD | handle_rmd -> str_rmdir eines Verzeichnisses, das die Session-UID per Unix-rmdir entfernen kann. Lab: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (Verzeichnis weg). Zweites MKD labctrl weiterhin 550 bei RMD. |
| Methode + Sink | Privileg |
|---|---|
XMKD dir nach cmds_denied=MKD | handle_mkd -> mkdir als die Session-UID |
XCWD path nach cmds_denied=CWD | handle_cwd -> chdir. Dann RETR, falls download_enable |
STOU / APPE nach cmds_denied=STOR | handle_upload_common create / append. Benötigt write_enable |
EPSV / P@SW nach cmds_denied=PASV | handle_pasv öffnet einen Data-Listener, den die Denylist stoppen sollte |
Das Lab bewies nur XRMD nach RMD. Die anderen Aliase teilen dasselbe str_equal-Gate und dasselbe OR im Dispatch. Ich habe sie nicht ausgeführt.
Keine als erstklassiges Überbleibsel. cmds_denied ist kein Versteck. XRMD listet keine Namen.
Nicht in der Leiste. Das Entfernen eines Verzeichnisses ist ein Integritätstreffer. Ein späteres CWD / RETR dieses Namens liefert als Nebeneffekt 550.
cmds_denied (Pre-Login ignoriert es; USER/PASS/QUIT bleiben die Pre-Login-Tabelle)allow_writeable_chroot standardmäßig aus; Lab schreibt nur unter /incoming, sodass die Deny weiterhin hält)cmds_allowed fail-closed: nicht gelistete Verben einschließlich XRMD bleiben 550write_enable=NO blockiert weiterhin die Write-Familie (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs. site Case-Bypass (ftpcmdio.c str_upper)cmds_denied=CHMOD matcht nie; chmod mit chmod_enable=NO oder cmds_denied=SITE killenIch habe nach Hide/Deny/cmds_denied auf offiziellem 3.0.5 gejagt. Das Gate ist ein Durchlauf von Komma-Tokens und str_equal gegen das in Großbuchstaben umgewandelte Verb. Es gibt keine zweite Prüfung innerhalb von handle_rmd. RFC 775 liefert XRMD weiterhin als RMD. Üblicher Rat ist cmds_denied=DELE,RMD. Dieser String nennt nie XRMD.
Fehlweg: SITE vs. site als Bypass zu behandeln. Verben werden in Großbuchstaben umgewandelt. cmds_allowed genauso zu behandeln: Diese Liste ist fail-closed, sodass Aliase, die nicht gelistet sind, denied bleiben.
cd lab
./run.sh
Loopback 127.0.0.1:18720. Compose-Projekt vsftpd-cmds-denied-alias. Offizielles 3.0.5-Tarball in lab/ (SHA-256 oben). cmds_denied=RMD, write_enable=YES, anonym, schreibt nur unter /incoming. Witness VSFTPD-CMDS-DENIED-ALIAS-WITNESS. Letzte Zeile:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
Die RFC-Aliase denyen, wenn das moderne Verb denied wird, oder Aliase in cmds_denied matchen (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). cmds_allowed (Allowlist) bevorzugen.
Vendor-Intake ist [email protected] (vsftpd). Unbezahlt. Kein öffentliches GitHub-Issue auf irgendeinem vsftpd-Mirror öffnen.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]