
ProFTPD 1.3.9d - Alta - Remoto - Resíduo de privilégio / Escrita de arquivo - SITE COPY dest segue symlink
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-site-copy-dest-follow
Classe: Privilégio residual / Escrita de arquivo Alcance: Remoto
ProFTPD 1.3.9d (f59f248) - proftpd.org
O contrib mod_copy SITE COPY verifica o limite do destino com dir_canonical_vpath (não resolvido). pr_fs_copy_file2 então faz open no destino sem O_NOFOLLOW, então um symlink de destino é seguido. O FTP STOR verifica o limite de um caminho resolvido (dir_realpath / dir_best_path). O destino do SITE COPY não.
Um usuário FTP autenticado sobrescreve um arquivo com WRITE negado apontando um symlink de destino para ele e emitindo SITE COPY. STOR direto e SITE COPY para a vítima permanecem 550. STOR / SITE RMDIR / RMD do link permanecem 550. DELE remove apenas o nó do link. Sem shell. O DAC do Unix ainda se aplica.
Este é o inverso da Issue 2095 pública (SITE COPY source READ skip). É distinto da Issue 2256 pública (RNTO EXDEV symlink follow). Este residual é o destino do SITE COPY em toda cópia, não apenas em EXDEV.
| ID | sem CVE ainda |
| Classe | Privilégio residual / Escrita de arquivo |
| Alcance | Remoto (FTP autenticado) |
| CWE | CWE-59, 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 |
| Produto | ProFTPD |
| Afetado | 1.3.9d tag v1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_copy |
| Auth | FTP autenticado (mod_copy carregado, CopyEngine padrão ativado). O plantio de SITE SYMLINK também precisa do contrib mod_site_misc a menos que o link já exista |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Quem: um usuário FTP autenticado. mod_copy carregado. Um symlink de destino em um diretório com WRITE permitido (SITE SYMLINK, ou um link pré-existente). O src do SITE SYMLINK usa dir_check_canon G_READ, então plantar um link para o arquivo vítima precisa de READ nesse arquivo. A divisão é READ permitido, WRITE negado. O UID da sessão ainda precisa conseguir escrever no alvo via Unix.
| Método | Sink | Privilégio |
|---|---|---|
| SITE SYMLINK (ou link existente) em um diretório com WRITE permitido cujo alvo é um arquivo com WRITE negado que o UID consegue escrever via Unix; SITE COPY readable-src that-link | pr_fsio_open destino segue | Integridade (comprovado em lab): truncar/sobrescrever o arquivo com Limite negado como o UID da sessão. Lab: /secret/victim passou de ORIGINAL para o witness após SITE COPY /readable/src.txt /upload/link. SITE COPY direto para /secret/victim permaneceu 550. |
| SITE RMDIR desse mesmo link | dir_check_canon -> dir_best_path | Fechado (comprovado em lab): 550 RMDIR /upload/link: Operation not permitted. Vítima intacta. |
| RMD do core desse mesmo link | dir_best_path + WRITE | Fechado (comprovado em lab): 550 Permission denied. Vítima intacta. |
| STOR do link de destino | dir_best_path + WRITE | Fechado (comprovado em lab): STOR /upload/link -> 550. Vítima intacta. |
| DELE do link de destino | unlink do nó do link | Fechado para a vítima (comprovado em lab): DELE removeu apenas o link; a vítima ainda continha o witness. |
DefaultRoot jail para o host /etc | chroot | Fechado. O DAC do Unix ainda se aplica. Sem unauth. Sem shell. |
Comprovado em lab vs inferido: sobrescrita via symlink de destino não resolvido, STOR/RMDIR/RMD negados, e DELE-apenas-do-link são comprovados em lab. Unauth e DAC do Unix permanecem inferidos do modelo de auth/chroot.
Eu fixei proftpd/proftpd v1.3.9d (f59f248). O FTP core padrão com o basic.conf de exemplo não tinha nenhum Crit/High não publicado. O contrib mod_copy foi o próximo.
copy_copy (contrib/mod_copy.c) constrói o destino com dir_canonical_vpath e então dir_check(..., G_WRITE, to) nessa string não resolvida. pr_fs_copy_file2 (src/fsio.c) comenta que stat/open seguem o symlink de destino, então pr_fsio_open(dst, O_WRONLY|O_CREAT|O_NONBLOCK) sem O_NOFOLLOW.
A Issue 2095 pública é source READ skip no SITE COPY. Pule esse bug exato. A Issue 2256 pública é RNTO EXDEV follow. Este residual é o destino do SITE COPY em toda cópia.
O follow recursivo do SITE RMDIR foi um descarte do pai: SITE RMDIR usa dir_check_canon / dir_best_path, que resolve o symlink antes do Limite. O lab confirmou que SITE RMDIR e RMD do core do link de destino permanecem negados.
Caminhos errados já registrados: tratar o Limite de destino como resolvido porque o STOR é; tratar a Issue 2256 como este residual; afirmar que SITE RMDIR percorre a vítima. Teatro: um reverse shell. O oráculo é /secret/victim contendo o witness após SITE COPY através de /upload/link, com STOR do link ainda 550.
python3 proftpd-site-copy-dest-follow-Abraxas-Labs.py
ou:
cd lab
./run.sh
FTP loopback 127.0.0.1:18720, passivo 18721-18730. Projeto Compose proftpd-site-copy-dest-follow. Witness PROFTPD-SITE-COPY-DEST-FOLLOW-WITNESS. Última linha:
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
Verifique o limite do destino resolvido (dir_realpath / dir_best_path), ou abra o destino com O_NOFOLLOW. O STOR já verifica o limite de um caminho resolvido.
O intake do fornecedor é [email protected]. Não abra uma issue pública no GitHub em proftpd/proftpd.
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_copy.c copy_copysrc/fsio.c pr_fs_copy_file2<Limit READ>GNU Affero GPL v3.0. Veja LICENSE. Apenas lab loopback. Sem garantia.