Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
vsftpd-deny-file-brace-child — vsftpd 3.0.5 - Alta - Remota - Privilegio residual - brace deny_file omite .private/secret | Kitploit
Herramientas/GitHubGitHub/abraxas/vsftpd-deny-file-brace-child
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebRecopilación de InformaciónSeguridad de RedesPruebas de PenetraciónLabs y Práctica
GitHub
abraxas/vsftpd-deny-file-brace-child

vsftpd-deny-file-brace-child

vsftpd 3.0.5 - Alta - Remota - Privilegio residual - brace deny_file omite .private/secret

Ver Repositorio
7hace 6 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Abraxas Labs - vsftpd-deny-file-brace-child

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  vsftpd-deny-file-brace-child

vsftpd-deny-file-brace-child

Clase: Privilegio residual Alcance: Remoto

vsftpd 3.0.5 - Chris Evans

El ejemplo de la página de manual (vsftpd.conf.5) es deny_file={*.mp3,*.mov,.private}. Los nombres coincidentes "no deberían ser accesibles de ninguna forma", incluyendo "descarga, cambio a directorio, afectar algo dentro del directorio". vsf_access_check_file (access.c:16-43) llama a vsf_filename_passes_filter sobre la ruta del cliente tal como se proporciona, luego str_locate_str del tunable de llaves completo. El filtro coincide con el último componente / prefijo; el residuo /secret falla; la subcadena de {*.mp3,*.mov,.private} no encuentra nada.

CWD .private es denegado (el basename coincide). RETR .private/secret y RETR dir/.private tienen éxito. Ese "dentro del directorio" es lo que este residuo rompe.

CVE-2015-1419 es un parche público de distro para realpath/basename. El 3.0.5 oficial nunca lo adoptó. La rama de llaves de Debian todavía coincide con la ruta completa, por lo que este recorrido hijo permanece también en paquetes de distro parcheados. No volver a reportar 2015-1419.

Este residuo es un fallo de lista de denegación condicionado por configuración. No es RCE no autenticado, no es un escape de chroot, y no es una lectura del /etc del host.

IDsin CVE aún
ClasePrivilegio residual
AlcanceRemoto (FTP autenticado)
CWECWE-863, CWE-22
CVSSAlto: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
Productovsftpd (Chris Evans)
Afectadovsftpd 3.0.5 tarball oficial SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3
AutenticaciónFTP autenticado USER/PASS (anónimo en el laboratorio). deny_file establecido a una lista de llaves (por defecto sin establecer)
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 127.0.0.1. Anónimo de solo lectura. Archivo testigo.

Qué puede hacer un atacante

Quién: un usuario FTP autenticado (anónimo ftp en el laboratorio). UID de sesión tras la caída habitual de vsftpd. deny_file es la política extra que se suponía debía quitar capacidades a ese UID. Las recetas de usuario virtual que menciona la página de manual comparten guest_username, por lo que el DAC de Unix no las separa. El 3.0.5 de fábrica con tunable_deny_file NULL no es este residuo.

Confidencialidad (probado en laboratorio)

Método + sinkPrivilegio
RETR .private/secret con la llave documentada deny_file={*.mp3,*.mov,.private}handle_retr str_open de un archivo cuyo nombre de directorio está en la lista de denegación, como el uid de sesión. Laboratorio: 150/226, 37 bytes, cuerpo VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS
RETR dir/.privatemismo sink. Un archivo llamado .private bajo otro directorio (must_match_at_current_pos rechaza una coincidencia en índice > 0). Laboratorio: 150/226, cuerpo DIRDOT-VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS

Integridad (inferido del mismo gate vsf_access_check_file; el laboratorio era de solo lectura)

Método + sinkPrivilegio
STOR / APPE la misma ruta cuando write_enable=YEShandle_upload_common crea / sobrescribe como el uid de sesión
DELE / RNTO la misma rutastr_unlink / renombrado de un nombre que la lista de denegación debía detener

Reconocimiento (inferido)

Método + sinkPrivilegio
LIST .private/x (o LIST dentro del árbol denegado)handle_dir_common verifica el acceso del argumento completo (falla), luego str_opendir del prefijo .private tras la división por barra. Solo nombres. El DAC de Unix sigue aplicándose

Negativos probados en laboratorio (misma ejecución)

Método + sinkResultado
CWD .private550 Permission denied. El basename .private coincide con la llave
RETR song.mp3550. *.mp3 es un patrón de último componente y sí coincide

Qué no otorga este residuo

  • Archivos que el uid de sesión no puede abrir a nivel Unix
  • CWD .private en sí mismo (el basename coincide)
  • Ocultación de dirent en LIST con hide_file (basename desde readdir; el RETR de un nombre oculto es intencional según la documentación)
  • /etc del host desde un chroot
  • HTTP no autenticado (http_enable por defecto desactivado; GET en modo FTP mata la sesión)
  • deny_file=.private sin llaves se salva por el fallback de subcadena (str_locate_str de .private en .private/secret)
  • Omisión de login no autenticado, PORT bounce, root, escape de chroot

Cómo lo encontré

Fijé el vsftpd oficial 3.0.5 (SHA-256 26b602ae...c91d3) en lugar de un espejo de GitHub o un árbol de Debian/Fedora. Diecinueve búsquedas en el código fuente. El demonio compilado por defecto no tiene residuos Críticos/Altos no publicados. Este requiere que el operador copie el ejemplo de llaves de la página de manual.

vsf_filename_passes_filter (ls.c) coincide con * / ? / {,} no anidados y solo hace trabajo útil en un patrón de último componente. Para el nombre .private/secret contra {*.mp3,*.mov,.private}:

  1. Las alternativas de llaves *.mp3, *.mov, .private se comparan al inicio de .private/secret. El residuo /secret falla a menos que el token fuera *.
  2. El fallback de subcadena busca el literal {*.mp3,*.mov,.private} y no encuentra nada.

Camino equivocado ya público: CVE-2015-1419 es solo realpath de distro. El Changelog oficial no tiene tal corrección. Incluso la rama de llaves de Debian copia la ruta normalizada completa, por lo que los hijos todavía se recorren.

Laboratorio

cd lab
./run.sh

Control en loopback 127.0.0.1:18710, PASV 18711-18718. Proyecto Compose vsftpd-deny-file-brace-child. Tarball oficial 3.0.5, anónimo de solo lectura, deny_file={*.mp3,*.mov,.private}. Testigo VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS. Última línea:

SUCCESS vsftpd-deny-file-brace-child cwd-dotprivate=550 retr-child=yes retr-dir-dotprivate=yes mp3=550 VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS

Corrección

Comparar las alternativas de llaves contra cada componente de la ruta, o realpath / basename antes del filtro (con las advertencias habituales sobre enlaces simbólicos). El ejemplo documentado debería realmente denegar los hijos.

La recepción del proveedor es [email protected] (vsftpd). No abrir un issue público en GitHub en ningún espejo de vsftpd.

Contacto

Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]

Descargar herramienta