
ProFTPD 1.3.9d - Hoch - Remote - Verbleibende Berechtigungen / Dateischreiben - SFTP copy-file überspringt Ziel-WRITE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
Klasse: Privilegien-Überrest / Dateischreiben Reichweite: Remote
ProFTPD 1.3.9d (f59f248) - proftpd.org
contrib mod_sftp kündigt copy-file an, sobald SFTPEngine aktiviert ist (SFTP_FXP_EXT_DEFAULT). fxp_handle_ext_copy_file führt dest WRITE plus AllowOverwrite nur dann aus, wenn pr_fsio_stat(dst) erfolgreich ist. Ein Ziel, das noch nicht existiert, überspringt diese Prüfung. pr_fs_copy_file2 erstellt dann die Datei mit der UID der Sitzung, auch unter <Limit WRITE> DenyAll.
FTP STOR und SFTP OPEN-write durchlaufen weiterhin xfer_pre_stor, das vor dem Erstellen immer dir_check für WRITE ausführt. Der öffentliche Issue 2095 ist der umgekehrte Fall: SITE COPY übersprang source READ. Dieser Überrest ist dest WRITE auf einen neuen Namen.
| ID | noch keine CVE |
| Klasse | Privilegien-Überrest / Dateischreiben |
| Reichweite | Remote (authentifiziertes SFTP) |
| CWE | CWE-863 |
| CVSS | Hoch: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Produkt | ProFTPD |
| Betroffen | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| Auth | authentifiziertes SFTP (SFTPEngine on) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Ich habe den Tag v1.3.9d gepinnt und fxp_handle_ext_copy_file gelesen. Es führt PRE_CMD eines gefälschten SITE COPY aus. mod_copy registriert copy_copy als CMD, nicht als PRE_CMD, sodass die dest-WRITE-Prüfung von FTP auf diesem Pfad nie ausgeführt wird. Source READ wird immer dir_check't. Dest WRITE nicht, es sei denn, das Ziel existiert bereits. Das Lab ist Loopback-SFTP auf 127.0.0.1:18710.
| Methode | Sink | Privileg |
|---|---|---|
SFTP EXTENDED copy-file von lesbarer Quelle auf einen Zielnamen, der noch nicht existiert, unter <Directory> mit <Limit WRITE> DenyAll | pr_fs_copy_file2 | Integrität (lab-bestätigt): diese Datei mit der UID der Sitzung erstellen. Recon (lab-bestätigt): SFTP READ des Ziels liefert die Quellbytes zurück, wenn dest READ erlaubt ist. |
| Dasselbe Ziel existiert bereits | dir_check WRITE + AllowOverwrite | Geschlossen (lab-bestätigt): copy-file-Überschreiben liefert Permission denied. |
| SFTP OPEN / STOR / SCP-Upload desselben Ziels | xfer_pre_stor | Geschlossen (lab-bestätigt): OPEN write/create ist SSH_FX_PERMISSION_DENIED (Status 3). |
| Nicht authentifiziertes copy-file | SFTP-Auth | Geschlossen. Keine Shell. Unix-DAC gilt weiterhin. |
Lab-bestätigt vs. abgeleitet: Ziel-Erstellung, dest READ des Witness, OPEN-write-Verweigerung und Überschreib-Verweigerung bei existierendem Ziel sind lab-bestätigt. Unauth und Unix-DAC bleiben aus dem Auth-/Chroot-Modell abgeleitet.
Erfordert: contrib mod_sftp geladen, SFTPEngine on. Typischer Distro-SFTP-vHost. SFTPExtensions -copyFile schaltet die Erweiterung ab.
cd lab
./run.sh
Loopback 127.0.0.1:18710 mappt auf Container 2222. Compose-Projekt proftpd-sftp-copy-file-write. Image-Tag proftpd-sftp-copy-file-write:1.3.9d. Witness PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS. Letzte Zeile:
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
dir_check für dest WRITE auch dann, wenn das Ziel noch nicht existiert, vor pr_fs_copy_file2. Oder die Erweiterung deaktivieren: SFTPExtensions -copyFile.
f59f248e26bdfa514443e42bf72a145641df635d)fxp_handle_ext_copy_file in contrib/mod_sftp/fxp.cSFTP_FXP_EXT_DEFAULT enthält copy-file