
ProFTPD 1.3.9d - Alta - Remota - Privilegio residual / Escritura de archivo - SITE COPY dest sigue enlace simbólico
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-site-copy-dest-follow
Clase: Resto de privilegio / Escritura de archivo Alcance: Remoto
ProFTPD 1.3.9d (f59f248) - proftpd.org
El contrib mod_copy SITE COPY verifica el límite del destino con dir_canonical_vpath (sin resolver). pr_fs_copy_file2 luego hace open del destino sin O_NOFOLLOW, por lo que se sigue un enlace simbólico de destino. FTP STOR verifica el límite de una ruta resuelta (dir_realpath / dir_best_path). El destino de SITE COPY no.
Un usuario FTP autenticado sobrescribe un archivo con WRITE denegado apuntando un enlace simbólico de destino hacia él y emitiendo SITE COPY. STOR directo y SITE COPY hacia la víctima permanecen en 550. STOR / SITE RMDIR / RMD del enlace permanecen en 550. DELE elimina solo el nodo del enlace. Sin shell. El DAC de Unix sigue aplicándose.
Esto es lo inverso del público Issue 2095 (omisión de READ en el origen de SITE COPY). Es distinto del público Issue 2256 (seguimiento de enlace simbólico en RNTO EXDEV). Este resto es el destino de SITE COPY en cada copia, no solo en EXDEV.
| ID | sin CVE aún |
| Clase | Resto de privilegio / Escritura de archivo |
| 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 |
| Producto | ProFTPD |
| Afectado | 1.3.9d tag v1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_copy |
| Auth | FTP autenticado (mod_copy cargado, CopyEngine activado por defecto). La plantación de SITE SYMLINK también necesita el contrib mod_site_misc a menos que el enlace ya exista |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Quién: un usuario FTP autenticado. mod_copy cargado. Un enlace simbólico de destino en un directorio con WRITE permitido (SITE SYMLINK, o un enlace preexistente). El src de SITE SYMLINK usa dir_check_canon G_READ, por lo que plantar un enlace hacia el archivo víctima necesita READ sobre ese archivo. La división es READ permitido, WRITE denegado. El UID de la sesión aún debe poder escribir a nivel Unix en el objetivo.
| Método | Sink | Privilegio |
|---|---|---|
| SITE SYMLINK (o enlace existente) en un directorio con WRITE permitido cuyo objetivo es un archivo con WRITE denegado que el UID puede escribir a nivel Unix; SITE COPY de un src legible hacia ese enlace | pr_fsio_open sigue el destino | Integridad (probado en lab): truncar/sobrescribir el archivo denegado por Limit como el UID de la sesión. Lab: /secret/victim pasó de ORIGINAL al testigo tras SITE COPY /readable/src.txt /upload/link. SITE COPY directo a /secret/victim permaneció en 550. |
| SITE RMDIR de ese mismo enlace | dir_check_canon -> dir_best_path | Cerrado (probado en lab): 550 RMDIR /upload/link: Operation not permitted. Víctima intacta. |
| RMD del core de ese mismo enlace | dir_best_path + WRITE | Cerrado (probado en lab): 550 Permission denied. Víctima intacta. |
| STOR del enlace de destino | dir_best_path + WRITE | Cerrado (probado en lab): STOR /upload/link -> 550. Víctima intacta. |
| DELE del enlace de destino | unlink del nodo del enlace | Cerrado para la víctima (probado en lab): DELE eliminó solo el enlace; la víctima aún contenía el testigo. |
Jail de DefaultRoot al /etc del host | chroot | Cerrado. El DAC de Unix sigue aplicándose. Sin no autenticado. Sin shell. |
Probado en lab vs inferido: la sobrescritura mediante enlace simbólico de destino sin resolver, STOR/RMDIR/RMD denegados, y DELE-solo-del-enlace están probados en lab. Lo no autenticado y el DAC de Unix permanecen inferidos del modelo de auth/chroot.
Fijé proftpd/proftpd v1.3.9d (f59f248). El FTP core por defecto con el basic.conf de ejemplo no tenía Crit/High no publicados. El contrib mod_copy fue lo siguiente.
copy_copy (contrib/mod_copy.c) construye el destino con dir_canonical_vpath y luego dir_check(..., G_WRITE, to) sobre esa cadena sin resolver. pr_fs_copy_file2 (src/fsio.c) comenta que stat/open siguen el enlace simbólico de destino, luego pr_fsio_open(dst, O_WRONLY|O_CREAT|O_NONBLOCK) sin O_NOFOLLOW.
El Issue 2095 público es la omisión de READ en el origen de SITE COPY. Se omite ese bug exacto. El Issue 2256 público es el seguimiento de RNTO EXDEV. Este resto es el destino de SITE COPY en cada copia.
El seguimiento recursivo de SITE RMDIR fue un descarte del padre: SITE RMDIR usa dir_check_canon / dir_best_path, que resuelve el enlace simbólico antes del Limit. El lab confirmó que SITE RMDIR y RMD del core del enlace de destino permanecen denegados.
Giros equivocados ya registrados: tratar el Limit del destino como resuelto porque STOR lo está; tratar el Issue 2256 como este resto; afirmar que SITE RMDIR recorre la víctima. Teatro: una reverse shell. El oráculo es /secret/victim conteniendo el testigo tras SITE COPY a través de /upload/link, con STOR del enlace aún en 550.
python3 proftpd-site-copy-dest-follow-Abraxas-Labs.py
o:
cd lab
./run.sh
FTP en loopback 127.0.0.1:18720, pasivo 18721-18730. Proyecto de Compose proftpd-site-copy-dest-follow. Testigo PROFTPD-SITE-COPY-DEST-FOLLOW-WITNESS. Última línea:
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
Verificar el límite del destino resuelto (dir_realpath / dir_best_path), o abrir el destino con O_NOFOLLOW. STOR ya verifica el límite de una ruta resuelta.
La recepción del proveedor es [email protected]. No abras un issue público en GitHub sobre proftpd/proftpd.
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_copy.c copy_copysrc/fsio.c pr_fs_copy_file2<Limit READ>GNU Affero GPL v3.0. Ver LICENSE. Solo lab en loopback. Sin garantía.