
ProFTPD 1.3.9d – Hoch – Remote – Privilegien-Reste / Dateischreiben – SITE COPY dest folgt Symlink
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-site-copy-dest-follow
Klasse: Privilegien-Überrest / Dateischreiben Reichweite: Remote
ProFTPD 1.3.9d (f59f248) - proftpd.org
Contrib mod_copy SITE COPY prüft das Ziel mit dir_canonical_vpath (unaufgelöst) gegen das Limit. pr_fs_copy_file2 ruft dann open auf dem Ziel ohne O_NOFOLLOW auf, sodass einem Ziel-Symlink gefolgt wird. FTP STOR prüft einen aufgelösten Pfad (dir_realpath / dir_best_path) gegen das Limit. SITE COPY Ziel tut dies nicht.
Ein authentifizierter FTP-Benutzer überschreibt eine schreibgeschützte Datei, indem er einen Ziel-Symlink darauf zeigen lässt und SITE COPY ausführt. Direktes STOR und SITE COPY auf das Opfer bleiben 550. STOR / SITE RMDIR / RMD des Links bleiben 550. DELE entfernt nur den Link-Knoten. Keine Shell. Unix-DAC gilt weiterhin.
Dies ist das Gegenteil des öffentlichen Issue 2095 (SITE COPY Quell-READ-Überspringen). Es unterscheidet sich vom öffentlichen Issue 2256 (RNTO EXDEV Symlink-Follow). Dieser Überrest betrifft das SITE COPY Ziel bei jeder Kopie, nicht nur bei EXDEV.
| ID | noch keine CVE |
| Klasse | Privilegien-Überrest / Dateischreiben |
| Reichweite | Remote (authentifiziertes FTP) |
| CWE | CWE-59, 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 Tag v1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_copy |
| Auth | authentifiziertes FTP (mod_copy geladen, CopyEngine standardmäßig aktiv). SITE SYMLINK-Anlegen benötigt zusätzlich contrib mod_site_misc, es sei denn, der Link existiert bereits |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Wer: ein authentifizierter FTP-Benutzer. mod_copy geladen. Ein Ziel-Symlink in einem schreibberechtigten Verzeichnis (SITE SYMLINK oder ein bereits vorhandener Link). SITE SYMLINK-Quelle verwendet dir_check_canon G_READ, sodass das Anlegen eines Links auf die Opferdatei READ auf diese Datei erfordert. Die Aufteilung ist READ erlaubt, WRITE verweigert. Die Session-UID muss weiterhin in der Lage sein, das Ziel auf Unix-Ebene zu schreiben.
| Methode | Sink | Privileg |
|---|---|---|
| SITE SYMLINK (oder vorhandener Link) in einem schreibberechtigten Verzeichnis, dessen Ziel eine schreibgeschützte Datei ist, die die UID auf Unix-Ebene schreiben kann; SITE COPY lesbare Quelle auf diesen Link | pr_fsio_open Ziel folgt | Integrität (lab-bestätigt): Truncate/Überschreiben der Limit-verweigerten Datei als Session-UID. Lab: /secret/victim wechselte von ORIGINAL zum Witness nach SITE COPY /readable/src.txt /upload/link. Direktes SITE COPY auf /secret/victim blieb 550. |
| SITE RMDIR desselben Links | dir_check_canon -> dir_best_path | Geschlossen (lab-bestätigt): 550 RMDIR /upload/link: Operation not permitted. Opfer intakt. |
| Core RMD desselben Links | dir_best_path + WRITE | Geschlossen (lab-bestätigt): 550 Permission denied. Opfer intakt. |
| STOR des Ziel-Links | dir_best_path + WRITE | Geschlossen (lab-bestätigt): STOR /upload/link -> 550. Opfer intakt. |
| DELE des Ziel-Links | Unlink des Link-Knotens | Geschlossen für das Opfer (lab-bestätigt): DELE entfernte nur den Link; das Opfer hielt weiterhin den Witness. |
DefaultRoot-Jail auf Host /etc | chroot | Geschlossen. Unix-DAC gilt weiterhin. Keine Unauth. Keine Shell. |
Lab-bestätigt vs. abgeleitet: Überschreiben über unaufgelösten Ziel-Symlink, verweigertes STOR/RMDIR/RMD und DELE-nur-Link sind lab-bestätigt. Unauth und Unix-DAC bleiben aus dem Auth-/Chroot-Modell abgeleitet.
Ich habe proftpd/proftpd v1.3.9d (f59f248) gepinnt. Standard-Core-FTP mit Beispiel-basic.conf hatte keine unveröffentlichten Crit/High. Contrib mod_copy war als Nächstes dran.
copy_copy (contrib/mod_copy.c) baut das Ziel mit dir_canonical_vpath und dann dir_check(..., G_WRITE, to) auf diesem unaufgelösten String. pr_fs_copy_file2 (src/fsio.c) kommentiert, dass stat/open dem Ziel-Symlink folgen, dann pr_fsio_open(dst, O_WRONLY|O_CREAT|O_NONBLOCK) ohne O_NOFOLLOW.
Das öffentliche Issue 2095 ist Quell-READ-Überspringen bei SITE COPY. Diesen exakten Bug überspringen. Das öffentliche Issue 2256 ist RNTO EXDEV Follow. Dieser Überrest betrifft das SITE COPY Ziel bei jeder Kopie.
SITE RMDIR rekursives Follow war ein Parent-Drop: SITE RMDIR verwendet dir_check_canon / dir_best_path, was den Symlink vor dem Limit auflöst. Lab bestätigte, dass SITE RMDIR und Core RMD des Ziel-Links verweigert bleiben.
Bereits dokumentierte Irrwege: das Ziel-Limit als aufgelöst zu behandeln, weil STOR es ist; Issue 2256 als diesen Überrest zu behandeln; zu behaupten, SITE RMDIR durchlaufe das Opfer. Theater: eine Reverse Shell. Das Orakel ist /secret/victim, das den Witness nach SITE COPY über /upload/link hält, während STOR des Links weiterhin 550 ist.
python3 proftpd-site-copy-dest-follow-Abraxas-Labs.py
oder:
cd lab
./run.sh
Loopback-FTP 127.0.0.1:18720, passiv 18721-18730. Compose-Projekt proftpd-site-copy-dest-follow. Witness PROFTPD-SITE-COPY-DEST-FOLLOW-WITNESS. Letzte Zeile:
SUCCESS PROFTPD-SITE-COPY-DEST-FOLLOW victim-has-witness=yes stor-secret=denied stor-link=denied site-rmdir-walk=no rmd-walk=no dele-victim=intact PROFTPD-SITE-COPY-DEST-FOLLOW-WITNESS
Das aufgelöste Ziel (dir_realpath / dir_best_path) gegen das Limit prüfen oder das Ziel mit O_NOFOLLOW öffnen. STOR prüft bereits einen aufgelösten Pfad gegen das Limit.
Vendor-Intake ist [email protected]. Kein öffentliches GitHub-Issue auf proftpd/proftpd öffnen.
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_copy.c copy_copysrc/fsio.c pr_fs_copy_file2<Limit READ>GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.