
ProFTPD 1.3.9d - Alta - Remoto - Privilegi residui / Scrittura file - SITE COPY dest segue symlink
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-site-copy-dest-follow
Classe: Privilegio residuo / Scrittura file Raggiungibilità: Remota
ProFTPD 1.3.9d (f59f248) - proftpd.org
Il contrib mod_copy SITE COPY verifica il limite sulla destinazione con dir_canonical_vpath (non risolto). pr_fs_copy_file2 esegue poi open sulla destinazione senza O_NOFOLLOW, quindi un symlink di destinazione viene seguito. FTP STOR verifica il limite su un percorso risolto (dir_realpath / dir_best_path). La destinazione di SITE COPY no.
Un utente FTP autenticato sovrascrive un file con WRITE negato puntando un symlink di destinazione verso di esso ed emettendo SITE COPY. STOR diretto e SITE COPY verso la vittima restano 550. STOR / SITE RMDIR / RMD del link restano 550. DELE rimuove solo il nodo del link. Nessuna shell. Il DAC Unix si applica comunque.
Questo è l'inverso della Issue 2095 pubblica (skip READ della sorgente in SITE COPY). È distinto dalla Issue 2256 pubblica (follow del symlink in RNTO EXDEV). Questo residuo è la destinazione di SITE COPY a ogni copia, non solo in EXDEV.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo / Scrittura file |
| Raggiungibilità | Remota (FTP autenticato) |
| CWE | CWE-59, 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 |
| Prodotto | ProFTPD |
| Affetto | 1.3.9d tag v1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_copy |
| Auth | FTP autenticato (mod_copy caricato, CopyEngine attivo di default). Anche il plant di SITE SYMLINK richiede il contrib mod_site_misc a meno che il link esista già |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Chi: un utente FTP autenticato. mod_copy caricato. Un symlink di destinazione in una directory con WRITE consentito (SITE SYMLINK, o un link preesistente). SITE SYMLINK src usa dir_check_canon G_READ, quindi piantare un link verso il file vittima richiede READ su quel file. La separazione è READ consentito, WRITE negato. L'UID della sessione deve comunque poter scrivere a livello Unix sul target.
| Metodo | Sink | Privilegio |
|---|---|---|
| SITE SYMLINK (o link esistente) in una dir con WRITE consentito il cui target è un file con WRITE negato che l'UID può scrivere a livello Unix; SITE COPY readable-src quel-link | pr_fsio_open segue la destinazione | Integrità (provato in lab): tronca/sovrascrive il file con Limit negato come UID della sessione. Lab: /secret/victim è passato da ORIGINAL al witness dopo SITE COPY /readable/src.txt /upload/link. SITE COPY diretto verso /secret/victim è rimasto 550. |
| SITE RMDIR di quello stesso link | dir_check_canon -> dir_best_path | Chiuso (provato in lab): 550 RMDIR /upload/link: Operation not permitted. Vittima intatta. |
| RMD core di quello stesso link | dir_best_path + WRITE | Chiuso (provato in lab): 550 Permission denied. Vittima intatta. |
| STOR del link di destinazione | dir_best_path + WRITE | Chiuso (provato in lab): STOR /upload/link -> 550. Vittima intatta. |
| DELE del link di destinazione | unlink del nodo del link | Chiuso per la vittima (provato in lab): DELE ha rimosso solo il link; la vittima conteneva ancora il witness. |
DefaultRoot jail verso /etc dell'host | chroot | Chiuso. Il DAC Unix si applica comunque. Nessuna unauth. Nessuna shell. |
Provato in lab vs dedotto: la sovrascrittura tramite symlink di destinazione non risolto, STOR/RMDIR/RMD negati e DELE-solo-del-link sono provati in lab. Unauth e DAC Unix restano dedotti dal modello auth/chroot.
Ho fissato proftpd/proftpd v1.3.9d (f59f248). Il core FTP di default con il basic.conf di esempio non aveva Crit/High non pubblicati. Il contrib mod_copy è stato il passo successivo.
copy_copy (contrib/mod_copy.c) costruisce la destinazione con dir_canonical_vpath e poi dir_check(..., G_WRITE, to) su quella stringa non risolta. pr_fs_copy_file2 (src/fsio.c) commenta che stat/open seguono il symlink di destinazione, poi pr_fsio_open(dst, O_WRONLY|O_CREAT|O_NONBLOCK) senza O_NOFOLLOW.
La Issue 2095 pubblica è lo skip READ della sorgente su SITE COPY. Salta esattamente quel bug. La Issue 2256 pubblica è il follow in RNTO EXDEV. Questo residuo è la destinazione di SITE COPY a ogni copia.
Il follow ricorsivo di SITE RMDIR è stato un drop del genitore: SITE RMDIR usa dir_check_canon / dir_best_path, che risolve il symlink prima del Limit. Il lab ha confermato che SITE RMDIR e RMD core del link di destinazione restano negati.
Vicoli ciechi già registrati: trattare il Limit di destinazione come risolto perché lo è STOR; trattare la Issue 2256 come questo residuo; affermare che SITE RMDIR percorra la vittima. Teatro: una reverse shell. L'oracolo è /secret/victim che contiene il witness dopo SITE COPY attraverso /upload/link, con STOR del link ancora 550.
python3 proftpd-site-copy-dest-follow-Abraxas-Labs.py
oppure:
cd lab
./run.sh
FTP su loopback 127.0.0.1:18720, passivo 18721-18730. Progetto Compose proftpd-site-copy-dest-follow. Witness PROFTPD-SITE-COPY-DEST-FOLLOW-WITNESS. Ultima riga:
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
Verificare il limite sulla destinazione risolta (dir_realpath / dir_best_path), oppure aprire la destinazione con O_NOFOLLOW. STOR verifica già il limite su un percorso risolto.
L'intake del vendor è [email protected]. Non aprire una issue pubblica su GitHub per proftpd/proftpd.
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_copy.c copy_copysrc/fsio.c pr_fs_copy_file2<Limit READ>GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.