Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
wcfproxy — Un proxy pour le trafic WCF basé sur net.tcp. | Kitploit
Outils/GitHubGitHub/syss-research/wcfproxy
Proxies Web et InterceptionTests de Sécurité des APISécurité RéseauTests d'IntrusionAnalyse de BinairesAuthentification
GitHubsyss-research/wcfproxy

wcfproxy

Un proxy pour le trafic WCF basé sur net.tcp.

Voir le dépôt
84il y a 5 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Build

Vous pouvez soit compiler l'outil une fois et utiliser le binaire résultant, soit l'exécuter "comme un script" (la chaîne d'outils Go le compilera à la volée). Pour le développement, cette dernière option est pratique. Pour une utilisation en production, il est recommandé de le compiler une fois (depuis le répertoire cli) et d'utiliser l'exécutable résultant. Grâce au compilateur Go, vous pouvez compiler depuis et pour Linux ou Windows. Au moins la version 1.18 de Go est nécessaire pour la compilation (testé avec Go 1.23).

Compilation depuis Linux

Pour compiler depuis Linux pour Windows ou Linux, définissez simplement GOOS de manière appropriée (exécutez depuis le répertoire cli) :``` GOOS=windows GOARCH=amd64 go build -o wcfproxy.exe

root@kitploit:~

GOOS=linux GOARCH=amd64 go build -o wcfproxy

root@kitploit:~
## Compilation depuis Windows
Pour compiler depuis Windows, exécutez les commandes équivalentes, par exemple depuis PowerShell :```
$env:GOOS='windows'; $env:GOARCH='amd64'; go build -o wcfproxy.exe

RÈGLES CRITIQUES :

  • Traduire UNIQUEMENT le texte en langage naturel. NE JAMAIS traduire : code, commandes de terminal, chemins de fichiers, URLs, noms de paquets, identifiants CVE, noms de variables d'environnement, identifiants.
  • Préserver INTACTE la structure Markdown : titres, listes, listes imbriquées, tableaux (y compris l'alignement), liens, images, code en ligne, blocs de code, citations, blocs HTML et règles horizontales.
Télécharger l’outil
  • Préserver la mise en forme exacte : espaces, sauts de ligne, indentation, nombre de colonnes des tableaux et marqueurs d'alignement.
  • Préserver les badges, boucliers et images d'état EXACTEMENT tels quels.
  • NE JAMAIS ajouter, supprimer ou modifier la ponctuation qui pourrait modifier le comportement du code.
  • Retourner UNIQUEMENT le texte traduit. AUCUN préambule, AUCUN « Voici la traduction », AUCUN « Bien sûr ! », AUCUNE explication, AUCUN commentaire, AUCUN méta-texte.
  • NE JAMAIS encapsuler votre réponse dans des blocs de code Markdown.
  • NE JAMAIS produire de JSON, YAML, XML, tableaux, objets, wrappers clé/valeur, schémas ou champs comme « translated », « language », « markdown », « content » ou « result ».
  • Votre réponse doit être uniquement du contenu brut en Markdown/texte brut. Si la source contient des exemples JSON/YAML/XML à l'intérieur de blocs de code, préservez ces exemples textuellement dans le Markdown ; ne transformez pas la réponse entière en un objet structuré.
  • Ne posez pas de questions. N'engagez pas de conversation.
  • Si vous ne pouvez pas traduire un terme technique en toute sécurité, laissez-le non traduit plutôt que de risquer de le casser.
  • TRADUIRE :``` $env:GOOS='linux'; $env:GOARCH='amd64'; go build -o wcfproxy

    root@kitploit:~
    # Utilisation
    
    La configuration pour `wcfproxy` est fournie via un fichier JSON.
    Par défaut, le fichier de configuration `config.json` est utilisé, mais le chemin vers un fichier de configuration peut être spécifié avec le paramètre `-config`.
    Le fichier de configuration est destiné à contenir un nombre arbitraire de configurations nommées, comme ceci :```json
    {
    	"my-config": { 
            " ... ": " ... " 
        }
    }
    

    La valeur des objets de configuration nommés doit correspondre à la structure Config (voir Config structure). Ce fichier source avec les commentaires inclus sert également de documentation la plus précise pour les options de configuration de wcfproxy. Parmi toutes les configurations fournies, celle à utiliser est identifiée par son nom via l'option de ligne de commande -enable :``` wcfproxy.exe -config config.json -enable my-config

    root@kitploit:~
    ## Structure de la configuration
    La structure de plus haut niveau de chaque objet de configuration est la suivante :```json
    {
    	"listen": "[::1]:8000",
    	"connect": "[::1]:9000",
    	"retarget": "net.tcp://127.0.0.1:8000/WCFLab/WCFDemoService/nettcp",
        "retarget-map": {
            "nettcps": "net.tcp://localhost:8210/WCFLab/WCFDemoService/nettcps",
            "winauth": "net.tcp://localhost:8220/WCFLab/WCFDemoService/nettcp-winauth"
        },
    	"log-level": "debug|info|warn|error",
    	"log-file": "path/to/log/file",
    	"tls-server": {
            " ... ": " ... " 
        },
    	"tls-client": {
             " ... ": " ... "
        },
    	"ntlm": {
             " ... ": " ... "
        },
    	"interceptor": {
             " ... ": " ... "
        },
    	"ctrl": {
             " ... ": " ... "
        }
    }
    

    Note that TLS configuration (tls-server and/or tls-client) ne peut pas être fournie si une configuration NTLM est présente.

    Options de configuration

    • listen - le point d'extrémité TCP sur lequel wcfproxy doit écouter, par ex. 127.0.0.1:8000 ou [::1]:8000
    • connect - le point d'extrémité TCP du serveur WCF en amont, par ex. 127.0.0.1:9000 ou [::1]:9000
    • retarget - spécification de cible d'origine (et solution de repli pour retarget-map) ; pour une explication, voir Réécriture de cible
    • retarget-map - généralisation de retarget ; permet de réécrire la cible pour plusieurs points d'extrémité (utile uniquement si l'on travaille avec plusieurs services WCF sur le même port)
      • si l'une des clés dans retarget-map correspond à la cible actuelle, l'URI cible sera remplacée par la valeur donnée pour la communication en amont
      • si aucune clé dans retarget-map ne correspond à la cible actuelle, retarget sera utilisé à la place
    • log-level - niveau de journalisation ; valeurs disponibles : debug, info (par défaut), warn, error
    • log-file - chemin vers le fichier de journalisation ; si aucun chemin n'est fourni, la journalisation se fait sur stdout
    • tls-server - instance de TlsServerConfig (voir Configuration du serveur TLS) ; requise uniquement si la mise à niveau TLS doit être prise en charge
    • tls-client - instance de TlsClientConfig (voir Configuration du client TLS) ; pertinente uniquement si la mise à niveau TLS doit être prise en charge
    • ntlm - instance de NtlmConfig (voir Configuration NTLM) ; requise uniquement si la mise à niveau NTLM (directement ou via SPNEGO) doit être prise en charge
    • interceptor - instance de InterceptorConfig (voir Configuration de l'intercepteur) ; obligatoire
    • ctrl - instance de ControlServerConfig (voir Configuration du serveur de contrôle) qui peut fournir un serveur HTTP de base par défaut (utile avec l'intercepteur HTTP) ainsi qu'une petite API pour contrôler le flux de messages (encore en développement)

    Configuration du serveur TLS

    La configuration côté serveur TLS permet de contrôler les paramètres de serveur TLS les plus typiquement pertinents. Elle a la structure suivante :```json { "cert-pem": "path/to/certificate", "cert-key": "path/to/certificate-key", "max-version": "1.0|1.1|1.2|1.3", "min-version": "1.0|1.1|1.2|1.3", "client-roots": "path/to/client-ca1,path/to/client-ca2", "client-auth": "none|request|require-any|verify-if-given|require-and-verify", "keylog": "path/to/keylog-file" }

    root@kitploit:~
    #### Options de configuration du serveur TLS
    + `cert-pem` - chemin vers le certificat X.509 (au format PEM)
    + `cert-key` - chemin vers la clé correspondante pour le certificat
    + `max-version` - version TLS maximale acceptable ; l'une de `1.0`, `1.1`, `1.2`, `1.3` (par défaut)
    + `min-version` - version TLS minimale acceptable ; l'une de `1.0` (par défaut), `1.1`, `1.2`, `1.3`
    + `client-roots` - liste séparée par des virgules de chemins vers les certificats racine acceptables (PEM) pour l'authentification client ; optionnel
    + `client-auth` - politique d'authentification client ; valeurs les plus utiles : `none` (par défaut), `require-and-verify`
    + `keylog` - fichier pour écrire les secrets TLS au format NNS
    
    ### Configuration du client TLS
    La configuration côté client TLS donne le contrôle sur les paramètres client TLS les plus couramment pertinents.
    Elle a la structure suivante :```json
    {
    	"cert-pem": "path/to/certificate",
    	"cert-key": "path/to/certificate-key",
    	"max-version": "1.0|1.1|1.2|1.3",
    	"min-version": "1.0|1.1|1.2|1.3",
    	"roots": "path/to/root-ca1,path/to/root-ca2",
    	"server-name": "therealone.local",
    	"skip-verify": false
    }
    

    Options de configuration du client TLS

    • analogues aux options de configuration du serveur TLS
    • roots - chemin vers une liste séparée par des virgules de chemins vers les CA racines (PEM) ; facultatif avec skip-verify
    • server-name - nom du serveur (SNI) ; facultatif
    • skip-verify - booléen ; indique si le client doit renoncer à la vérification du certificat du serveur (par défaut : false)

    Configuration NTLM

    La configuration NTLM spécifie le domaine et le nom du serveur ainsi que les identifiants de l'utilisateur. Pour chaque utilisateur devant pouvoir s'authentifier auprès du proxy, des identifiants valides doivent être fournis.```json { "domain": "test.local", "server": "server.local", "credentials": [ { " ... ": " ... " } ] }

    root@kitploit:~
    #### Options de configuration NTLM
    + `domain` - domaine à authentifier, par ex. test.local ; si laissé vide, le nom du serveur sera utilisé
    + `server` - nom du serveur à authentifier ; si laissé vide, le nom d'hôte du système actuel sera utilisé
    + `credentials` - tableau d'objets `NtlmCredential` (voir ci-dessous)
    
    Les identifiants NTLM sont passés sous forme d'un tableau d'objets `NtlmCredential`, qui ont la structure suivante :```json
    {
    	"name": "wcflab",
    	"password": "Sup3rS3cr3t",
    	"nt-hash": "a8fc07dede90b0ec10bc1ef355f99292",
    	"lm-hash": "3e9cb63e11a812cbc467021088dc706f"
    }
    
    • name - nom d'utilisateur
    • password - mot de passe de l'utilisateur ; les hachages en seront dérivés ; remplace les hachages donnés pour un utilisateur
    • nt-hash - hachage NT (hex) du mot de passe de l'utilisateur ; alternative au mot de passe
    • lm-hash - hachage LM (hex) du mot de passe de l'utilisateur ; alternative au mot de passe ; ne devrait pas être nécessaire dans la plupart des cas

    Si un mot de passe est fourni, le hachage LM (pas possible pour tous les mots de passe) et le hachage NT sont calculés à partir de celui-ci. Toutes les valeurs de hachage données pour cet utilisateur seront écrasées par les hachages calculés. Il est également possible de fournir uniquement le(s) hachage(s) de l'utilisateur. Le hachage LM ne devrait pas être nécessaire dans la plupart des scénarios.

    Configuration de l'intercepteur

    La configuration de l'intercepteur spécifie l'intercepteur (par nom) qui doit être utilisé et éventuellement des arguments spécifiques à l'intercepteur. Pour une explication des intercepteurs voir Interceptors.

    Intercepteur de journal

    Pour utiliser l'intercepteur de journal, utilisez simplement la configuration d'intercepteur suivante. La sortie est écrite vers l'emplacement de journalisation principal, qui peut être un fichier ou stdout, selon la configuration log-file.```json { "name": "log" }

    root@kitploit:~
    #### Intercepteur Http
    Pour utiliser l'intercepteur HTTP, utilisez la configuration d'intercepteur suivante avec des options appropriées pour `server-url` et `proxy-url`.```json
    {
    	"name": "http",
    	"args": {
    		"server-url": "http://127.0.0.1:9999/echo",
    		"proxy-url": "http://127.0.0.1:8080"
    	}
    }
    
    • args.server-url - URL vers votre point de terminaison d'interception HTTP (par exemple, un simple point de terminaison echo) ; pour plus de détails sur le fonctionnement de l'intercepteur HTTP, voir HTTP Interceptor
    • args.proxy-url - URL du proxy HTTP ; optionnel

    Configuration du serveur de contrôle

    wcfproxy est livré avec un serveur web intégré qui remplit deux fonctions. Tout d'abord, il peut fournir un point de terminaison HTTP qui reflète simplement tout le contenu qui lui est envoyé. Ceci est utile en combinaison avec l'intercepteur HTTP.```json { "ctrl": { "listen": "127.0.0.1:9999", "enable-control": false, "enable-echo": true } }

    root@kitploit:~
    > [!WARNING]  
    > Toute personne ayant accès à l'API peut s'authentifier en utilisant les identifiants fournis (NTLM ou certificats clients TLS).
    > Sur les systèmes partagés, cela peut être pertinent même si l'API n'est disponible que localement.
    
    ### Options de configuration du serveur de contrôle
    + `listen` - le point de terminaison TCP sur lequel le serveur de contrôle doit écouter
    + `enable-contorl` - active les fonctionnalités de contrôle comme l'injection de messages ou l'établissement de connexions (voir [Injection de messages](#message-injection))
    + `enable-echo` - active un simple serveur HTTP echo à l'adresse `http://{listen}/echo`
    
    # Détails
    Les sections suivantes fournissent des informations de base qui peuvent aider à mieux comprendre WCF ainsi que certaines options de configuration.
    
    ## Réécriture de cible
    Le point de terminaison WCF prévu est encodé dans le préambule net.tcp ainsi que dans l'en-tête `To` des enveloppes SOAP transportées.
    Les serveurs peuvent vérifier que cette spécification de point de terminaison correspond à celle attendue.
    Lorsque le client est manipulé pour se connecter au proxy au lieu du serveur d'origine, cette spécification de point de terminaison changera probablement et le serveur peut rejeter la communication.
    Il est donc généralement judicieux de corriger la spécification de point de terminaison dans le trafic sortant vers le serveur.
    Pour ce faire, fournissez la spécification de point de terminaison d'origine (par exemple obtenue à partir de la configuration du client) dans l'option `retarget` du fichier de configuration.
    La spécification de point de terminaison ressemble généralement à ceci : `net.tcp://some/endpoint`.
    
    Lorsque vous travaillez avec plusieurs points de terminaison WCF simultanément, il peut être nécessaire d'effectuer une réécriture de cible pour tous.
    Pour cela, l'option `retarget-map` existe, qui définit un mappage entre les URI cibles.
    Lorsqu'aucune correspondance n'est trouvée dans `retarget-map`, l'URI cible sera modifiée pour la valeur donnée dans `retarget`.
    
    ## Indicateurs de type
    Le XML binaire, tel que spécifié par `MC-NBFX`, encode les informations de type de base dans le format binaire (types d'enregistrement).
    Toutes ces informations ne sont pas facilement récupérables à partir de la représentation XML (textuelle) d'un document XML binaire.
    Pour cette raison, *wcfproxy* insère des indicateurs de type dans les données de caractères XML (et certains attributs) des jetons.
    Ces indicateurs de type prennent la forme `<h>:`, où `<h>` est une courte chaîne qui encode un certain type (par exemple `i` pour entier, `ch` pour caractères).
    Une liste complète des indicateurs de type se trouve dans [typehint.go](https://github.com/syss-research/wcfproxy/blob/main/binxml/typehint.go).
    Il est déconseillé de modifier les indicateurs de type.
    
    ## Intercepteurs
    Les intercepteurs spécifient comment le trafic reçu est traité et sont spécifiés via la [configuration des intercepteurs](#interceptor-configuration).
    Ils traitent le trafic envoyé dans les deux directions (client -> serveur et serveur -> client).
    Actuellement, il existe deux intercepteurs : **log** et **http**.
    
    ### Intercepteur Log
    L'intercepteur **log** convertit les enveloppes SOAP encodées en binaire en leurs équivalents lisibles par l'homme, encodés en XML textuel standard.
    Aucune manipulation active (sauf la réécriture de la spécification de cible) n'est effectuée.
    La sortie est envoyée à l'emplacement de journalisation spécifié (`stdout` par défaut).
    Assurez-vous de définir le niveau de journalisation sur `info` (ou `debug`), sinon la sortie pertinente est supprimée.
    
    ### Intercepteur HTTP
    L'intercepteur **http** convertit les enveloppes SOAP binaires en leurs équivalents textuels et les envoie à un point de terminaison HTTP spécifié par `-http-url`.
    Les messages SOAP décodés sont envoyés dans le corps de la requête.
    Le serveur HTTP doit renvoyer une enveloppe SOAP valide dans le même format que les messages entrants.
    Ces messages sont ensuite retransformés au format binaire d'origine et envoyés au serveur en amont.
    
    Le simple reflet du message d'origine est toujours une option valide pour le serveur HTTP.
    Cependant, une manipulation programmatique des messages peut également être réalisée en fournissant un serveur HTTP personnalisé qui effectue les remplacements souhaités.
    Il faut veiller à ne pas casser la structure des messages SOAP.
    Il est conseillé de ne pas altérer le format des messages à moins de savoir ce que l'on fait.
    De plus, les indicateurs de type insérés par *wcfproxy* ne doivent pas être altérés, car cela pourrait casser la transformation des messages SOAP textuels en leurs équivalents binaires ou l'analyse des messages sur le point de terminaison légitime (client ou serveur).
    
    *wcfproxy* est livré avec un serveur HTTP trivial qui reflète simplement le corps des requêtes HTTP reçues.
    Ce serveur sera démarré lorsqu'une [configuration du serveur de contrôle](#control-server-configuration) est fournie et que l'option `enable-echo` est définie sur `true`.
    L'URL du serveur HTTP souhaité est fournie via l'option `server-url` dans la [configuration de l'intercepteur HTTP](#http-interceptor).
    
    Pour permettre une manipulation interactive, un proxy HTTP (par exemple BurpSuite) peut être spécifié via l'option `proxy-url`.
    Les messages seront alors envoyés au serveur HTTP via le proxy HTTP spécifié.
    Notez que pour chaque message WCF (par exemple client -> serveur), une paire requête/réponse HTTP est produite.
    
    Pour corréler les messages avec la connexion net.tcp dont ils proviennent, l'en-tête `X-Wcpf-Conn-Id` est inséré dans les requêtes générées par l'intercepteur **http**.
    
    L'image suivante illustre le flux de données avec l'intercepteur **http**.
    
    ![Illustration de l'intercepteur HTTP](https://raw.githubusercontent.com/syss-research/wcfproxy/HEAD/doc/http-interceptor.svg)
    
    ## Options TLS
    WCF (sur net.tcp) peut utiliser TLS pour la sécurité du transport.
    *wcfproxy* prend en charge l'interception des connexions TLS (uniquement TLS 1.0 - 1.3, pas de SSL).
    Les paramètres TLS côté serveur et côté client peuvent être contrôlés avec la configuration TLS correspondante (voir [Configuration TLS serveur](#tls-server-configuration) ou [Configuration TLS client](#tls-client-configuration)).
    
    ## Options NTLM
    *wcfproxy* prend en charge l'authentification NTLM.
    Actuellement, l'authentification NTLM directe ou la négociation via SPNEGO est prise en charge.
    Vous devez fournir les identifiants du ou des utilisateurs qui s'authentifieront.
    Ces identifiants sont fournis au format JSON, voir [Configuration NTLM](#ntlm-configuration).
    La transmission de hachages est prise en charge en fournissant des hachages via la propriété `nt-hash`.
    
    ## Injection de messages et établissement de connexions
    Lorsque le [serveur de contrôle](#control-server-configuration) est activé, une petite API HTTP est fournie qui peut être utilisée pour établir ou terminer des connexions et injecter des messages dans des connexions existantes.
    Les points de terminaison suivants sont disponibles.
    
    ### GET `/connection`
    Liste les connexions actuellement actives.
    Pour les connexions côté serveur uniquement (créées via [POST /connection/new](#post-connectionnew)), le client sera affiché comme `wcfproxy`.
    
    ### POST `/connection/new`
    Crée une nouvelle connexion.
    Le corps doit être un objet JSON spécifiant la mise à niveau prévue (TLS ou Negotiate (NTLM)) le cas échéant.
    L'URI du point de terminaison est fournie via la propriété `target-uri`.
    
    #### Exemple : Aucune mise à niveau
    Si aucune mise à niveau n'est requise, la propriété `upgrade` peut être omise.```json
    {
        "target-uri":"net.tcp://127.0.0.1:9510/example/notes-nettcp"
    }
    

    Exemple : Mise à niveau TLS

    Pour initier une mise à niveau TLS, spécifiez le mécanisme de mise à niveau tls.```json { "target-uri":"net.tcp://wcf-notes.local:9511/example/notes-nettcp-tls", "upgrade": { "mechanism":"tls" } }

    root@kitploit:~
    #### Exemple : Mise à niveau NTLM
    L'objet `upgrade` doit spécifier `ntlm` comme mécanisme et l'utilisateur avec lequel s'authentifier.
    Les identifiants de l'utilisateur doivent être fournis avec la configuration `ntlm`.```json
    {
        "target-uri":"net.tcp://localhost:8203/WCFLab/WCFDemoService/nettcp-winauth",
        "upgrade": {
    		"mechanism": "ntlm",
    		"ntlmuser": "wcflab"
    	}
    }
    

    POST /connection/{id}/kill

    Détruisez la connexion identifiée par {id}.

    POST /connection/{id}/inject

    Injectez le message fourni dans le corps de cette requête dans la connexion identifiée par {id}. Le corps doit être dans le même format que celui utilisé pour transférer les messages WCF vers les intercepteurs HTTP. Par conséquent, il est préférable de copier un message observé, de le modifier si nécessaire, puis de l'injecter via ce point de terminaison.

    Par défaut, les réponses aux messages injectés ne sont pas affichées. Cependant, si un intercepteur est actif, les réponses devraient y apparaître. Pour plus de commodité, lorsque le paramètre de requête retrieve=true est fourni, wcfproxy attend la réponse au message injecté et l'affiche.

    Limite de connexion

    Une limite supérieure artificielle du nombre de connexions simultanément actives est appliquée. Cette limite est actuellement fixée à 20. Ceci permet d'éviter un épuisement accidentel des ressources lors de l'utilisation (ou de la mauvaise utilisation) de l'API de contrôle (voir Injection de messages et établissement de connexion). Cela devrait rarement poser problème pour les clients WCF légitimes. Cependant, il peut y avoir des cas d'utilisation qui nécessitent plus de connexions simultanées. Dans ce cas, modifiez la constante maxConnections dans proxy.go selon les besoins.

    Exemples

    Les exemples suivants montrent une utilisation de base de wcfproxy. La sortie exacte peut être sujette à changement, mais l'idée devrait être comprise.

    Utilisation de l'intercepteur log

    Cet exemple montre l'utilisation de wcfproxy dans l'environnement de démonstration WCF pour une communication WCF simple via net.tcp en utilisant l'intercepteur log.```json { "wcflab-plain": { "listen": "127.0.0.1:7201", "connect": "127.0.0.1:8201", "retarget": "net.tcp://127.0.0.1:8201/WCFLab/WCFDemoService/nettcp", "log-level": "debug", "interceptor": { "name": "log" } } }

    root@kitploit:~
    Avec la configuration ci-dessus (placée dans `config.json`), nous pouvons l'utiliser comme indiqué ci-dessous.
    Le trafic via le proxy devrait ensuite être affiché sur la console (`stdout`).```
    > .\wcfproxy.exe -config .\config.json -enable wcflab-plain
    2025/07/10 15:03:59 dbg: local time zone (for DateTime handling): CEST
    INFO:  Listening on 127.0.0.1:7201 and connecting to 127.0.0.1:8201
    INFO:  No server certificates given. TLS upgrade not supported.
    INFO:  No client certificates given. TLS client authentication not supported.
    INFO:  Retargeting to net.tcp://127.0.0.1:8201/WCFLab/WCFDemoService/nettcp
    INFO:  [proxy] Handling new connection 0: 127.0.0.1:50216 <-> 127.0.0.1:8201
    INFO:  [proxy] Connection 0 established (127.0.0.1:50216 <-> 127.0.0.1:8201)
    INFO:  [proxy] Envelope (Connection 0, Client -> Server):
    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
     <s:Header>
      <a:Action s:mustUnderstand="c:1">ch:http://tempuri.org/IWCFDemoService/AddInts</a:Action>
      <a:MessageID>uid:urn:uuid:b2d5fc85-4bcd-6442-b701-164655365198</a:MessageID>
      <a:ReplyTo>
       <a:Address>ch:http://www.w3.org/2005/08/addressing/anonymous</a:Address>
      </a:ReplyTo>
      <a:To s:mustUnderstand="c:1">ch:net.tcp://127.0.0.1:8201/WCFLab/WCFDemoService/nettcp</a:To>
     </s:Header>
     <s:Body>
      <AddInts xmlns="http://tempuri.org/">
       <a>i:1234</a>
       <b>i:37</b>
      </AddInts>
     </s:Body>
    </s:Envelope>
    INFO:  [proxy] Envelope (Connection 0, Server -> Client):
    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
     <s:Header>
      <a:Action s:mustUnderstand="c:1">ch:http://tempuri.org/IWCFDemoService/AddIntsResponse</a:Action>
      <a:RelatesTo>uid:urn:uuid:b2d5fc85-4bcd-6442-b701-164655365198</a:RelatesTo>
      <a:To s:mustUnderstand="c:1">ch:http://www.w3.org/2005/08/addressing/anonymous</a:To>
     </s:Header>
     <s:Body>
      <AddIntsResponse xmlns="http://tempuri.org/">
       <AddIntsResult>i:1271</AddIntsResult>
      </AddIntsResponse>
     </s:Body>
    </s:Envelope>
    INFO:  [proxy] Connection 0 closed (127.0.0.1:50216 <-> 127.0.0.1:8201)
    ERROR: [net.tcp] Error readEnvelopeOrFaultI2R: read tcp 127.0.0.1:50217->127.0.0.1:8201: i/o timeout. Entering fault state.
    INFO:  [proxy] Done handling connection 0: 127.0.0.1:50216 <-> 127.0.0.1:8201
    

    Utilisation de l'intercepteur http

    La configuration suivante utilise l'intercepteur http en combinaison avec un proxy HTTP.```json { "wcflab-plain-http": { "listen": "127.0.0.1:7201", "connect": "127.0.0.1:8201", "retarget": "net.tcp://127.0.0.1:8201/WCFLab/WCFDemoService/nettcp", "log-level": "info", "ctrl": { "listen": "127.0.0.1:9999", "enable-echo": true }, "interceptor": { "name": "http", "args": { "proxy-url": "http://127.0.0.1:8080" } } } }

    root@kitploit:~
    Avec cette configuration, le journal ne montre rien d'intéressant.```
    > go run ./ -config .\config.json -enable wcflab-plain-http
    2025/07/10 18:06:02 dbg: local time zone (for DateTime handling): CEST
    2025/07/10 18:06:02 DBG - configuring intercrptor: &{http map[proxy-url:http://127.0.0.1:8080]}
    INFO:  Listening on 127.0.0.1:7201 and connecting to 127.0.0.1:8201
    INFO:  No server certificates given. TLS upgrade not supported.
    INFO:  No client certificates given. TLS client authentication not supported.
    INFO:  Retargeting to net.tcp://127.0.0.1:8201/WCFLab/WCFDemoService/nettcp
    INFO:  [proxy] Starting control server on 127.0.0.1:9999 (echo enabled: true, control enabled: false)
    INFO:  [proxy] Handling new connection 0: 127.0.0.1:22664 <-> 127.0.0.1:8201
    ERROR: [net.tcp] Error readEnvelopeOrFaultI2R: read tcp 127.0.0.1:22665->127.0.0.1:8201: i/o timeout. Entering fault state.
    INFO:  [proxy] Done handling connection 0: 127.0.0.1:22664 <-> 127.0.0.1:8201
    

    Cependant, le trafic WCF est converti en enveloppes SOAP (presque) régulières envoyées via HTTP. http interceptor example image

    Configuration de l'interception (m)TLS

    wcfproxy peut être configuré pour intercepter le trafic WCF sécurisé par mTLS, pourvu que des certificats serveur et client appropriés soient disponibles. La configuration pour TLS sans authentification client est similaire ; les certificats client ne sont pas requis dans ce cas. La configuration suivante fournit un exemple pour ce cas d'utilisation :```json { "wcflab-mtls": { "listen": "127.0.0.1:7203", "connect": "127.0.0.1:8203", "retarget": "net.tcp://localhost:8203/WCFLab/WCFDemoService/nettcps-mtls", "interceptor": { "name": "log" }, "tls-server": { "cert-pem": "../testdata/pki/server.pem", "cert-key": "../testdata/pki/server.key" }, "tls-client": { "cert-pem": "../testdata/pki/client.pem", "cert-key": "../testdata/pki/client.key", "skip-verify": true } }

    root@kitploit:~
    Note that the clients need to trust the server certificate (`server.pem`). Furthermore, the server must trust the certificate presented by the client part of *wcfproxy* (`client.pem`).```
    > .\wcfproxy.exe -config .\config.json -enable wcflab-mtls
    2025/07/10 15:01:32 dbg: local time zone (for DateTime handling): CEST
    INFO:  Using client certificate client-01.local (SHA256-fingerprint: 9b258653a4d5f338f2be1dafe0caf892b01d271183e52f0821d80439de4b7564)
    INFO:  Listening on 127.0.0.1:7203 and connecting to 127.0.0.1:8203
    INFO:  Using server certificate wcflab.local (SHA256-fingerprint: 7286ff75d3bb6dc4d96c0c8ac08dbac2204af67e0b1814b3d8c59c24d5bd781a)
    INFO:  Server supports TLS versions 1.0 - 1.3
    INFO:  Using client certificate client-01.local (SHA256-fingerprint: 9b258653a4d5f338f2be1dafe0caf892b01d271183e52f0821d80439de4b7564)
    INFO:  Client supports TLS versions 1.0 - 1.3
    INFO:  Retargeting to net.tcp://localhost:8203/WCFLab/WCFDemoService/nettcps-mtls
    INFO:  [proxy] Handling new connection 0: 127.0.0.1:50214 <-> 127.0.0.1:8203
    INFO:  [proxy] Connection 0 established (127.0.0.1:50214 <-> 127.0.0.1:8203)
    INFO:  [proxy] Initiating TLS upgrade
    INFO:  [proxy] 127.0.0.1:50214 <-> 127.0.0.1:7203: negotiated TLS 1.2 (TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
    INFO:  [proxy] 127.0.0.1:50215 <-> 127.0.0.1:8203: negotiated TLS 1.2 (TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
    INFO:  [proxy] Upgrade done
    INFO:  [proxy] Envelope (Connection 0, Client -> Server):
    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
     <s:Header>
      <a:Action s:mustUnderstand="c:1">ch:http://tempuri.org/IWCFDemoService/AddInts</a:Action>
      <a:MessageID>uid:urn:uuid:d36e17be-2cc2-a94f-83a7-cd2442dba24e</a:MessageID>
      <a:ReplyTo>
       <a:Address>ch:http://www.w3.org/2005/08/addressing/anonymous</a:Address>
      </a:ReplyTo>
      <a:To s:mustUnderstand="c:1">ch:net.tcp://localhost:8203/WCFLab/WCFDemoService/nettcps-mtls</a:To>
     </s:Header>
     <s:Body>
      <AddInts xmlns="http://tempuri.org/">
       <a>i:1234</a>
       <b>i:37</b>
      </AddInts>
     </s:Body>
    </s:Envelope>
    INFO:  [proxy] Envelope (Connection 0, Server -> Client):
    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
     <s:Header>
      <a:Action s:mustUnderstand="c:1">ch:http://tempuri.org/IWCFDemoService/AddIntsResponse</a:Action>
      <a:RelatesTo>uid:urn:uuid:d36e17be-2cc2-a94f-83a7-cd2442dba24e</a:RelatesTo>
      <a:To s:mustUnderstand="c:1">ch:http://www.w3.org/2005/08/addressing/anonymous</a:To>
     </s:Header>
     <s:Body>
      <AddIntsResponse xmlns="http://tempuri.org/">
       <AddIntsResult>i:1271</AddIntsResult>
      </AddIntsResponse>
     </s:Body>
    </s:Envelope>
    INFO:  [proxy] Connection 0 closed (127.0.0.1:50214 <-> 127.0.0.1:8203)
    ERROR: [net.tcp] Error readEnvelopeOrFaultI2R: read tcp 127.0.0.1:50215->127.0.0.1:8203: i/o timeout. Entering fault state.
    INFO:  [proxy] Done handling connection 0: 127.0.0.1:50214 <-> 127.0.0.1:8203
    

    Configuration de l'authentification NTLM

    En supposant que le service WCF utilise NTLM pour l'authentification (directement ou via SPNEGO), la configuration suivante peut être utilisée pour intercepter le trafic :```json { "wcflab-ntlm": { "listen": "[::1]:7204", "connect": "[::1]:8204", "retarget": "net.tcp://localhost:8204/WCFLab/WCFDemoService/nettcp-winauth", "interceptor": { "name": "log" }, "ntlm": { "domain": "DESKTOP-65ITJF5", "credentials": [ { "name": "", "password": "" } ] } } }

    root@kitploit:~
    Notez qu'actuellement, il est plus robuste de fournir le nom d'hôte via le champ `server` ou `domain` que de se fier à la configuration automatique.
    De plus, l'authentification dans un contexte de domaine AD n'est pas testée et est donc probablement cassée pour le moment.
    Lorsque SPNEGO est utilisé, le mécanisme NTLM doit actuellement être le préféré, sinon la négociation échouera.```
    > .\wcfproxy.exe -config .\config.json -enable wcflab-ntlm
    2025/07/10 15:15:15 dbg: local time zone (for DateTime handling): CEST
    INFO:  Listening on [::1]:7204 and connecting to [::1]:8204
    INFO:  No server certificates given. TLS upgrade not supported.
    INFO:  No client certificates given. TLS client authentication not supported.
    INFO:  Retargeting to net.tcp://localhost:8204/WCFLab/WCFDemoService/nettcp-winauth
    INFO:  [proxy] Handling new connection 0: [::1]:50247 <-> [::1]:8204
    INFO:  [proxy] Connection 0 established ([::1]:50247 <-> [::1]:8204)
    INFO:  [proxy] Initiating Negotiate upgrade
    INFO:  [NTLM server] User wcflab authenticated successfully
    INFO:  [proxy] [::1]:50247 <-> [::1]:7204: negotiated NTLM
    INFO:  [proxy] [::1]:50248 <-> [::1]:8204: negotiated NTLM
    INFO:  [proxy] Upgrade done
    INFO:  [proxy] Envelope (Connection 0, Client -> Server):
    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
     <s:Header>
      <a:Action s:mustUnderstand="c:1">ch:http://tempuri.org/IWCFDemoService/AddInts</a:Action>
      <a:MessageID>uid:urn:uuid:f9cc5af3-3930-9242-be3c-d36d2a0cb09e</a:MessageID>
      <a:ReplyTo>
       <a:Address>ch:http://www.w3.org/2005/08/addressing/anonymous</a:Address>
      </a:ReplyTo>
      <a:To s:mustUnderstand="c:1">ch:net.tcp://localhost:8204/WCFLab/WCFDemoService/nettcp-winauth</a:To>
     </s:Header>
     <s:Body>
      <AddInts xmlns="http://tempuri.org/">
       <a>i:1234</a>
       <b>i:37</b>
      </AddInts>
     </s:Body>
    </s:Envelope>
    INFO:  [proxy] Envelope (Connection 0, Server -> Client):
    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
     <s:Header>
      <a:Action s:mustUnderstand="c:1">ch:http://tempuri.org/IWCFDemoService/AddIntsResponse</a:Action>
      <a:RelatesTo>uid:urn:uuid:f9cc5af3-3930-9242-be3c-d36d2a0cb09e</a:RelatesTo>
      <a:To s:mustUnderstand="c:1">ch:http://www.w3.org/2005/08/addressing/anonymous</a:To>
     </s:Header>
     <s:Body>
      <AddIntsResponse xmlns="http://tempuri.org/">
       <AddIntsResult>i:1271</AddIntsResult>
      </AddIntsResponse>
     </s:Body>
    </s:Envelope>
    INFO:  [proxy] Connection 0 closed ([::1]:50247 <-> [::1]:8204)
    ERROR: [net.tcp] Error readEnvelopeOrFaultI2R: read tcp [::1]:50248->[::1]:8204: i/o timeout. Entering fault state.
    INFO:  [proxy] Done handling connection 0: [::1]:50247 <-> [::1]:8204