
ProFTPD 1.3.9d - Alta - Remota - Privilegi residui / Scrittura file - La copia file SFTP salta la scrittura sulla destinazione
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
Classe: Privilegio residuo / Scrittura file Raggiungibilità: Remota
ProFTPD 1.3.9d (f59f248) - proftpd.org
Il contrib mod_sftp annuncia copy-file una volta che SFTPEngine è attivo (SFTP_FXP_EXT_DEFAULT). fxp_handle_ext_copy_file esegue la WRITE sulla destinazione più AllowOverwrite solo se pr_fsio_stat(dst) ha successo. Una destinazione che non esiste ancora salta quel controllo. pr_fs_copy_file2 crea quindi il file con l'UID della sessione, anche sotto <Limit WRITE> DenyAll.
FTP STOR e SFTP OPEN-write passano comunque attraverso xfer_pre_stor, che esegue sempre dir_check sulla WRITE prima della creazione. La Issue 2095 pubblica è l'inverso: SITE COPY saltava la READ sulla sorgente. Questo residuo è la WRITE sulla destinazione con un nuovo nome.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo / Scrittura file |
| Raggiungibilità | Remota (SFTP autenticato) |
| CWE | CWE-863 |
| CVSS | Alto: 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 (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| Auth | SFTP autenticato (SFTPEngine on) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Ho fissato il tag v1.3.9d e letto fxp_handle_ext_copy_file. Esso invia il PRE_CMD di un finto SITE COPY. mod_copy registra copy_copy come CMD, non come PRE_CMD, quindi il controllo WRITE sulla destinazione di FTP non viene mai eseguito su questo percorso. La READ sulla sorgente è sempre sottoposta a dir_check. La WRITE sulla destinazione non lo è, a meno che la destinazione non esista già. Il lab è SFTP su loopback su 127.0.0.1:18710.
| Metodo | Sink | Privilegio |
|---|---|---|
SFTP EXTENDED copy-file da una src leggibile a un nome di destinazione che non esiste ancora, sotto <Directory> con <Limit WRITE> DenyAll | pr_fs_copy_file2 | Integrità (dimostrato in lab): creare quel file con l'UID della sessione. Recon (dimostrato in lab): la READ SFTP della destinazione restituisce i byte della sorgente quando la READ sulla destinazione è consentita. |
| Stessa destinazione già esistente | dir_check WRITE + AllowOverwrite | Chiuso (dimostrato in lab): la sovrascrittura con copy-file restituisce permission denied. |
| SFTP OPEN / STOR / SCP upload della stessa destinazione | xfer_pre_stor | Chiuso (dimostrato in lab): la scrittura/creazione con OPEN restituisce SSH_FX_PERMISSION_DENIED (status 3). |
| copy-file non autenticato | Auth SFTP | Chiuso. Nessuna shell. Si applica comunque il DAC Unix. |
Dimostrato in lab vs dedotto: la creazione della destinazione, la READ della destinazione del witness, il diniego della OPEN-write e il diniego della sovrascrittura di una destinazione esistente sono dimostrati in lab. Il non autenticato e il DAC Unix restano dedotti dal modello auth/chroot.
Richiede: contrib mod_sftp caricato, SFTPEngine on. Tipico vhost SFTP delle distribuzioni. SFTPExtensions -copyFile disattiva l'estensione.
cd lab
./run.sh
Loopback 127.0.0.1:18710 mappa il container 2222. Progetto compose proftpd-sftp-copy-file-write. Tag immagine proftpd-sftp-copy-file-write:1.3.9d. Witness PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS. Ultima riga:
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
Eseguire dir_check sulla WRITE della destinazione anche quando la destinazione non esiste ancora, prima di pr_fs_copy_file2. Oppure disattivare l'estensione: SFTPExtensions -copyFile.
f59f248e26bdfa514443e42bf72a145641df635d)fxp_handle_ext_copy_file in contrib/mod_sftp/fxp.cSFTP_FXP_EXT_DEFAULT include copy-file