
Este repositorio proporciona un informe y un PoC para CVE-2023-41717.
Control inadecuado de tipos de archivo en Zscaler Proxy versiones 3.6.1.25 y anteriores permite a atacantes locales eludir las restricciones de descarga/carga de archivos.
Durante el verano de 2022, encontré una vulnerabilidad que afecta al proxy ZScaler (versiones 3.6.1.25 y anteriores). Esta vulnerabilidad permitiría a atacantes locales eludir la restricción de descargas/cargas de archivos protegidos con contraseña utilizando herramientas como Burp o incluso utilidades nativas de Microsoft como Bitsadmin, que se basa en el protocolo Background Intelligent Transfer Service (BITS).
Según la documentación de Microsoft, el protocolo BITS “define una forma de transferir grandes cargas útiles desde un cliente a un servidor HTTP o viceversa, incluso ante interrupciones, enviando la carga útil en múltiples fragmentos”. Esto permite eludir las restricciones basadas en el tipo de archivo, ya que Zscaler no puede reconstruir correctamente el archivo a través de múltiples solicitudes.
Aunque esta prueba de concepto se centrará solo en el aspecto de descarga, esta vulnerabilidad también aplica a las cargas.
En esta sección, se destacan dos métodos diferentes para eludir las restricciones de Zscaler en la descarga de archivos protegidos con contraseña. Las pruebas se realizaron en la versión 3.6.1.25 del cliente, utilizando la siguiente URL.
El primer método implica modificar la solicitud HTTP, lo cual se puede hacer usando un navegador o una herramienta como Burp Suite. Para los fines de esta prueba, elegí la primera opción.
La imagen a continuación muestra la solicitud siendo interceptada y bloqueada por Zscaler. Luego, la solicitud se retransmite después de agregar el encabezado Range con el valor bytes = 0-x, donde x es un valor arbitrario menor que el tamaño total del archivo.

Una vez que se retransmite la solicitud, se recibe una respuesta con el código de estado “206 Partial Content”. Los encabezados de la respuesta mostrarán el tamaño total del archivo, mientras que la carga útil de la respuesta está codificada en base64.


Las solicitudes se repiten aumentando manualmente el valor del rango de bytes, hasta llegar al último fragmento del archivo.

La carga útil resultante se puede reconstruir de varias maneras: para esta prueba, se utilizó un script personalizado de Powershell (puede encontrarlo en Reconstruct-Payload.ps1).
El hash MD5 del archivo zip reconstruido (CE6CFFEA60C6CDF40C998E56B6EFBD20) coincide con el esperado encontrado en Virus Total.



El segundo método aprovecha el protocolo BITS de Microsoft, que divide de forma nativa las solicitudes de descarga en fragmentos.
Esta prueba se realizó utilizando la utilidad de línea de comandos bitsadmin.exe, con la siguiente línea de comandos:
bitsadmin.exe /transfer <job name> /download /priority normal <URL> <path_destination_file>


El hash MD5 del zip resultante coincide con el encontrado en la sección anterior.