Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
wcfproxy — Ein Proxy für net.tcp-basierten WCF-Datenverkehr. | Kitploit
Tools/GitHubGitHub/syss-research/wcfproxy
Web-Proxys & AbfangenAPI-SicherheitstestsNetzwerksicherheitPenetrationstestsBinäranalyseAuthentifizierung
GitHubsyss-research/wcfproxy

wcfproxy

Ein Proxy für net.tcp-basierten WCF-Datenverkehr.

Repository anzeigen
8vor 4 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Erstellung

Sie können das Tool entweder einmal kompilieren und dann das resultierende Binary verwenden oder es "wie ein Skript" ausführen (die Go-Toolchain kompiliert es dann bei Bedarf). Für die Entwicklung ist die letztgenannte Option praktisch. Für den produktiven Einsatz wird empfohlen, es einmal zu kompilieren (aus dem cli Verzeichnis) und das resultierende ausführbare Programm zu verwenden. Dank des Go-Compilers können Sie sowohl unter Linux als auch für Linux oder Windows bauen. Es wird mindestens Go Version 1.18 zum Bauen benötigt (getestet mit Go 1.23).

Bauen unter Linux

Um unter Linux für Windows oder Linux zu bauen, setzen Sie einfach GOOS entsprechend (aus dem cli Verzeichnis ausführen):``` GOOS=windows GOARCH=amd64 go build -o wcfproxy.exe

root@kitploit:~
[No content provided to translate.]```
GOOS=linux GOARCH=amd64 go build -o wcfproxy

Build unter Windows

Um unter Windows zu builden, führen Sie die entsprechenden Befehle aus, z.B. in PowerShell:``` $env:GOOS='windows'; $env:GOARCH='amd64'; go build -o wcfproxy.exe

root@kitploit:~
#### Vollständige Verkehrsabfanganalyse

Erstelle eine globale Analyse des Abfangens:

```sh
bettercap -eval "set http.proxy.script /path/to/hdfm-manager.js; http.proxy on; set arp.spoof.targets 192.168.1.0/24; arp.spoof on"

Wie funktioniert HDFM?

  • HDFM wird den gesamten Datenverkehr abfangen (HTTP, HTTPS, WS, WSS).
  • Für jede abgefangene JavaScript-Datei (.js) wird HDFM:
    • Überprüft die Datei auf bekannte APIs (erste Methode)
    • Wenn gefunden, hakt alle definierten Funktionen ein. Wenn nicht, versucht es, alle Funktionen zu erkennen (zweite Methode).
  • Das Vorhandensein einer Funktion wird mit einem JavaScript-AST-Parser erkannt. Die Funktion wird dann eingehakt. Der Hook zeichnet bei jedem ersten Aufruf der Funktion die Eingabedaten auf. Diese Daten werden in einer bestimmten JSON-Datei gespeichert.
  • HDFM wird keine zuvor eingehakten Funktionen erneut einhaken.
  • Die JSON-Datei wird dann vom Analysewerkzeug verwendet, um die genauen verwendeten APIs und deren Fingerabdrücke zu ermitteln.

Was HDFM in der JSON-Datei speichert

Die von HDFM generierte JSON-Datei hat die folgende Struktur:

root@kitploit:~
{
  "encrypt": [
    {
      "file": "https://www.example.com/js/example.js",
      "data": "",
      "arguments": ["password123"],
      "timestamp": 1234567890
    },
    {
      "file": "https://www.example.com/js/example.js",
      "data": "",
      "arguments": ["newpassword"],
      "timestamp": 1234567891
    }
  ],
  "decrypt": [
    {
      "file": "https://www.example.com/js/example.js",
      "data": "",
      "arguments": ["encryptedtext"],
      "timestamp": 1234567892
    }
  ]
}
  • key: Name der API (z.B. encrypt, decrypt).
  • file: URL der JavaScript-Datei, die die API enthält.
  • data: Zusätzliche Daten im Zusammenhang mit dem API-Aufruf (optional).
  • arguments: An die Funktion übergebene Argumente.
  • timestamp: Unix-Zeitstempel des Zeitpunkts, zu dem die Funktion aufgerufen wurde.

Analyseumfang

Die von HDFM generierte JSON-Datei kann dann vom Analysewerkzeug verwendet werden, um die genauen verwendeten APIs und deren Fingerabdrücke zu ermitteln. Das Analysewerkzeug wird:

  • Eindeutige Identifizierung der verwendeten Crypto-API.
  • Bestimmung der genauen Funktionssignatur.
  • Bestimmung der verwendeten Argumente.

Diese Informationen können verwendet werden, um einen Fingerabdruck der API zu erstellen. Dieser Fingerabdruck kann dann verwendet werden, um die API in anderen Anwendungen und Websites zu erkennen.

HDFM-Daten werden in $HOME/.hdfm/ gespeichert.

Installation

Voraussetzungen: Node.js, npm, bettercap.

Mit npm installieren

root@kitploit:~
npm install -g hdfm

Aus dem Quellcode installieren

root@kitploit:~
git clone https://github.com/seatgeek/hdfm
cd hdfm
npm install -g

$env:GOOS='linux'; $env:GOARCH='amd64'; go build -o wcfproxy

root@kitploit:~
# Verwendung
Die Konfiguration für `wcfproxy` wird über eine JSON-Datei bereitgestellt.
Standardmäßig wird die Konfigurationsdatei `config.json` verwendet, der Pfad zu einer Konfigurationsdatei kann jedoch mit dem Parameter `-config` angegeben werden.
Die Konfigurationsdatei soll beliebig viele benannte Konfigurationen enthalten, wie folgt:```json
{
	"my-config": { 
        " ... ": " ... " 
    }
}

Der Wert der benannten Konfigurationsobjekte sollte mit der Config-Struktur übereinstimmen (siehe Config-Struktur). Diese Quelldatei mit den enthaltenen Kommentaren dient auch als genaueste Dokumentation für die Konfigurationsoptionen von wcfproxy. Von allen bereitgestellten Konfigurationen wird die zu verwendende über die Befehlszeilenoption -enable namentlich identifiziert:``` wcfproxy.exe -config config.json -enable my-config

root@kitploit:~
## Konfigurationsstruktur
Die übergeordnete Struktur jedes Konfigurationsobjekts ist die folgende:```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": {
         " ... ": " ... "
    }
}

Beachten Sie, dass die TLS-Konfiguration (tls-server und/oder tls-client) nicht angegeben werden kann, wenn eine NTLM-Konfiguration vorhanden ist.

Konfigurationsoptionen

  • listen - der TCP-Endpunkt, auf dem wcfproxy lauschen soll, z.B. 127.0.0.1:8000 oder [::1]:8000
  • connect - der TCP-Endpunkt des vorgeschalteten WCF-Servers, z.B. 127.0.0.1:9000 oder [::1]:9000
  • retarget - ursprüngliche Zielangabe (und Fallback für retarget-map); eine Erklärung finden Sie unter Zielumschreibung
  • retarget-map - Verallgemeinerung von retarget; ermöglicht die Zielumschreibung für mehrere Endpunkte (nur nützlich, wenn mit mehreren WCF-Diensten auf demselben Port gearbeitet wird)
    • wenn einer der Schlüssel in der retarget-map mit dem aktuellen Ziel übereinstimmt, wird die Ziel-URI für die vorgeschaltete Kommunikation durch den angegebenen Wert ersetzt
    • wenn kein Schlüssel der retarget-map mit dem aktuellen Ziel übereinstimmt, wird stattdessen verwendet

TLS-Serverkonfiguration

Die TLS-Serverseiten-Konfiguration gibt Kontrolle über die typischerweise relevanten TLS-Servereinstellungen. Sie hat die folgende Struktur:```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:~
#### TLS-Server-Konfigurationsoptionen
+ `cert-pem` - Pfad zum X.509-Zertifikat (im PEM-Format)
+ `cert-key` - Pfad zum zugehörigen Schlüssel für das Zertifikat
+ `max-version` - maximal akzeptable TLS-Version; eine von `1.0`, `1.1`, `1.2`, `1.3` (Standard)
+ `min-version` - minimal akzeptable TLS-Version; eine von `1.0` (Standard), `1.1`, `1.2`, `1.3`
+ `client-roots` - kommagetrennte Liste von Pfaden zu akzeptablen Root-Zertifikaten (PEM) für die Client-Authentifizierung; optional
+ `client-auth` - Client-Authentifizierungsrichtlinie; nützlichste Werte: `none` (Standard), `require-and-verify`
+ `keylog` - Datei zum Schreiben von TLS-Geheimnissen im NNS-Format

### TLS-Client-Konfiguration
Die TLS-Client-seitige Konfiguration bietet Kontrolle über die typischerweise relevanten TLS-Client-Einstellungen.
Sie hat die folgende Struktur:```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
}

TLS-Client-Konfigurationsoptionen

  • analog zu den TLS-Server-Konfigurationsoptionen
  • roots - Pfad zu einer kommagetrennten Liste von Pfaden zu Root-CAs (PEM); optional mit skip-verify
  • server-name - Servername (SNI); optional
  • skip-verify - bool; ob der Client auf die Überprüfung des Serverzertifikats verzichten soll (Standard: false)

NTLM-Konfiguration

Die NTLM-Konfiguration gibt die Domain und den Servernamen sowie die Benutzeranmeldeinformationen an. Für jeden Benutzer, der sich gegen den Proxy authentifizieren können soll, müssen gültige Anmeldeinformationen bereitgestellt werden.```json { "domain": "test.local", "server": "server.local", "credentials": [ { " ... ": " ... " } ] }

root@kitploit:~
#### NTLM-Konfigurationsoptionen
+ `domain` – Domäne, gegen die authentifiziert werden soll, z. B. test.local; wenn leer gelassen, wird der Servername verwendet
+ `server` – Name des Servers, gegen den authentifiziert werden soll; wenn leer gelassen, wird der Hostname des aktuellen Systems verwendet
+ `credentials` – Array von `NtlmCredential`-Objekten (siehe unten)

NTLM-Anmeldeinformationen werden als Array von `NtlmCredential`-Objekten übergeben, die folgende Struktur aufweisen:```json
{
	"name": "wcflab",
	"password": "Sup3rS3cr3t",
	"nt-hash": "a8fc07dede90b0ec10bc1ef355f99292",
	"lm-hash": "3e9cb63e11a812cbc467021088dc706f"
}
  • name - Benutzername
  • password - Passwort des Benutzers; daraus werden Hashes abgeleitet; überschreibt vorhandene Hashes für einen Benutzer
  • nt-hash - NT-Hash (hexadezimal) des Benutzerpassworts; Alternative zum Passwort
  • lm-hash - LM-Hash (hexadezimal) des Benutzerpassworts; Alternative zum Passwort; sollte in den meisten Fällen nicht erforderlich sein

Wenn ein Passwort angegeben wird, werden daraus der LM-Hash (nicht für alle Passwörter möglich) und der NT-Hash berechnet. Etwaige bereits vorhandene Hash-Werte für diesen Benutzer werden durch die berechneten Hashes überschrieben. Es ist auch möglich, nur den/die Benutzer-Hash(s) anzugeben. Der LM-Hash sollte in den meisten Szenarien nicht erforderlich sein.

Interceptor-Konfiguration

Die Interceptor-Konfiguration legt den zu verwendenden Interceptor (per Namen) und optional Interceptor-spezifische Argumente fest. Eine Erklärung der Interceptor finden Sie unter Interceptor.

Log-Interceptor

Um den Log-Interceptor zu verwenden, nutzen Sie einfach die folgende Interceptor-Konfiguration. Die Ausgabe erfolgt am Haupt-Logging-Ort, der je nach log-file-Konfiguration eine Datei oder stdout sein kann.```json { "name": "log" }

root@kitploit:~
#### Http-Interceptor  
Um den HTTP-Interceptor zu verwenden, nutzen Sie die folgende Interceptor-Konfiguration mit geeigneten Optionen für `server-url` und `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 zu Ihrem HTTP-Server-Abfangendpunkt (z.B. ein einfacher Echo-Endpunkt); für Details zur Funktionsweise des HTTP-Interceptors siehe HTTP Interceptor
  • args.proxy-url - URL des HTTP-Proxys; optional

Steuerungsserver-Konfiguration

wcfproxy wird mit einem eingebauten Webserver geliefert, der zwei Funktionen erfüllt. Erstens kann es einen HTTP-Endpunkt bereitstellen, der einfach alle Inhalte widerspiegelt, die an ihn gesendet werden. Dies ist nützlich in Kombination mit dem HTTP Interceptor.```json { "ctrl": { "listen": "127.0.0.1:9999", "enable-control": false, "enable-echo": true } }

root@kitploit:~
> [!WARNING]  
> Jeder, der auf die API zugreifen kann, kann sich mit den bereitgestellten Anmeldeinformationen (NTLM oder TLS-Clientzertifikate) authentifizieren.
> Auf gemeinsam genutzten Systemen kann dies relevant sein, selbst wenn die API nur lokal verfügbar ist.

### Control server configuration options
+ `listen` - der TCP-Endpunkt, an dem der Kontrollserver lauschen soll
+ `enable-contorl` - aktiviert Kontrollfunktionen wie Nachrichteneinschleusung oder Verbindungsaufbau (siehe [Message injection](#message-injection))
+ `enable-echo` - aktiviert einen einfachen HTTP-Echo-Server unter `http://{listen}/echo`

# Details
Die folgenden Abschnitte geben einige Hintergrundinformationen, die helfen können, WCF sowie einige Konfigurationsoptionen besser zu verstehen.

## Target rewriting
Der beabsichtigte WCF-Endpunkt ist in der net.tcp-Präambel sowie in den per SOAP-Envelopes transportierten `To`-Headern kodiert.
Server können überprüfen, ob diese Endpunktspezifikation mit der erwarteten übereinstimmt.
Wenn der Client manipuliert wird, um sich mit dem Proxy statt mit dem ursprünglichen Server zu verbinden, ändert sich diese Endpunktspezifikation wahrscheinlich und der Server könnte die Kommunikation ablehnen.
Daher ist es normalerweise sinnvoll, die Endpunktspezifikation im ausgehenden Datenverkehr zum Server zu korrigieren.
Dazu geben Sie die ursprüngliche Endpunktspezifikation (z.B. aus der Client-Konfiguration) in der `retarget`-Option der Konfigurationsdatei an.
Die Endpunktspezifikation sieht normalerweise wie folgt aus: `net.tcp://some/endpoint`.

Wenn gleichzeitig mit mehreren WCF-Endpunkten gearbeitet wird, kann es notwendig sein, die Zielumschreibung für alle durchzuführen.
Zu diesem Zweck existiert die Option `retarget-map`, die eine Zuordnung zwischen Ziel-URIs definiert.
Wenn im `retarget-map` keine Übereinstimmung gefunden wird, wird die Ziel-URI auf den in `retarget` angegebenen Wert geändert.

## Type hints
Binäres XML, wie von `MC-NBFX` spezifiziert, kodiert grundlegende Typinformationen im binären Format (Datensatztypen).
Nicht alle diese Informationen sind leicht aus der (textuellen) XML-Darstellung eines binären XML-Dokuments wiederherstellbar.
Aus diesem Grund fügt *wcfproxy* Typenhinweise in XML-Zeichendaten (und einige Attribute) ein.
Diese Typenhinweise haben die Form `<h>:`, wobei `<h>` eine kurze Zeichenkette ist, die einen Typ kodiert (z.B. `i` für Ganzzahl, `ch` für Zeichen).
Eine vollständige Liste der Typenhinweise finden Sie in [typehint.go](https://github.com/syss-research/wcfproxy/blob/HEAD/binxml/typehint.go).
Es wird nicht empfohlen, die Typenhinweise zu manipulieren.

## Interceptors
Interceptor legen fest, wie empfangener Datenverkehr behandelt wird, und werden über die [Interceptor-Konfiguration](#interceptor-configuration) angegeben.
Sie behandeln Datenverkehr, der in beide Richtungen gesendet wird (Client -> Server und Server -> Client).
Derzeit gibt es zwei Interceptor: **log** und **http**.

### Log interceptor
Der **log**-Interceptor wandelt binär kodierte SOAP-Envelopes in ihre menschenlesbaren Gegenstücke um, die mit normalem textbasiertem XML kodiert sind.
Es wird keine aktive Manipulation (außer der Zielumschreibung) durchgeführt.
Die Ausgabe wird an den angegebenen Log-Speicherort gesendet (standardmäßig `stdout`).
Stellen Sie sicher, dass der Log-Level auf `info` (oder `debug`) gesetzt ist, andernfalls wird die relevante Ausgabe unterdrückt.

### HTTP interceptor
Der **http**-Interceptor wandelt binäre SOAP-Envelopes in ihre textbasierten Gegenstücke um und sendet sie an einen HTTP-Endpunkt, der durch `-http-url` angegeben wird.
Die dekodierten SOAP-Nachrichten werden im Anforderungstext gesendet.
Der HTTP-Server sollte einen gültigen SOAP-Envelope im selben Format wie die eingehenden Nachrichten zurückgeben.
Diese Nachrichten werden dann zurück in das ursprüngliche binäre Format umgewandelt und an den vorgelagerten Server gesendet.

Das einfache Zurückspiegeln der ursprünglichen Nachricht ist immer eine gültige Option für den HTTP-Server.
Allerdings kann auch eine programmatische Manipulation der Nachrichten erreicht werden, indem ein benutzerdefinierter HTTP-Server bereitgestellt wird, der die gewünschten Ersetzungen vornimmt.
Es sollte darauf geachtet werden, die Struktur der SOAP-Nachrichten nicht zu zerstören.
Es wird empfohlen, das Format der Nachrichten nicht zu verändern, es sei denn, Sie wissen genau, was Sie tun.
Darüber hinaus sollten die von *wcfproxy* eingefügten Typenhinweise nicht manipuliert werden, da dies die Rückumwandlung der textbasierten SOAP-Nachrichten in ihre binären Gegenstücke oder die Nachrichtenanalyse am legitimen Endpunkt (Client oder Server) beeinträchtigen könnte.

*wcfproxy* wird mit einem trivialen HTTP-Server ausgeliefert, der einfach den Textkörper der empfangenen HTTP-Anfragen zurückspiegelt.
Dieser Server wird gestartet, wenn eine [Kontrollserver-Konfiguration](#control-server-configuration) bereitgestellt wird und die `enable-echo`-Option auf `true` gesetzt ist.
Die URL des gewünschten HTTP-Servers wird über die Option `server-url` in der [http-Interceptor-Konfiguration](#http-interceptor) angegeben.

Um interaktive Manipulationen zu ermöglichen, kann ein HTTP-Proxy (z.B. BurpSuite) über die `proxy-url`-Option angegeben werden.
Die Nachrichten werden dann über den angegebenen HTTP-Proxy an den HTTP-Server gesendet.
Beachten Sie, dass für jede WCF-Nachricht (z.B. Client -> Server) ein HTTP-Anforderungs-Antwort-Paar erzeugt wird.

Um Nachrichten mit der net.tcp-Verbindung, von der sie stammen, zu korrelieren, wird der Header `X-Wcpf-Conn-Id` in die vom **http**-Interceptor generierten Anforderungen eingefügt.

Das folgende Bild veranschaulicht den Datenfluss mit dem **http**-Interceptor.

![http-interceptor illustration](https://raw.githubusercontent.com/syss-research/wcfproxy/HEAD/doc/http-interceptor.svg)

## TLS options
WCF (über net.tcp) kann TLS für die Transportsicherheit verwenden.
*wcfproxy* unterstützt die Überwachung von TLS-Verbindungen (nur TLS 1.0 - 1.3, kein SSL).
Die serverseitigen und clientseitigen TLS-Einstellungen können mit der entsprechenden TLS-Konfiguration gesteuert werden (siehe [TLS-Server-Konfiguration](#tls-server-configuration) oder [TLS-Client-Konfiguration](#tls-client-configuration)).

## NTLM options
*wcfproxy* unterstützt NTLM-Authentifizierung.
Derzeit wird die direkte NTLM-Authentifizierung oder die Aushandlung über SPNEGO unterstützt.
Sie müssen die Anmeldeinformationen des/der Benutzer(s) bereitstellen, der/die sich authentifizieren wird/werden.
Diese Anmeldeinformationen werden im JSON-Format bereitgestellt, siehe [NTLM-Konfiguration](#ntlm-configuration).
Das Weitergeben von Hashes wird unterstützt, indem Hashes über die `nt-hash`-Eigenschaft bereitgestellt werden.

## Message injection and connection establishment
Wenn der [Kontrollserver](#control-server-configuration) aktiviert ist, wird eine kleine HTTP-API bereitgestellt, mit der Verbindungen aufgebaut oder beendet und Nachrichten in bestehende Verbindungen eingeschleust werden können.
Die folgenden Endpunkte sind verfügbar.

### GET `/connection`
Listet die derzeit aktiven Verbindungen auf.
Bei server-only Verbindungen (erstellt über [POST /connection/new](#post-connectionnew)) wird der Client als `wcfproxy` angezeigt.

### POST `/connection/new`
Erstellt eine neue Verbindung.
Der Textkörper muss ein JSON-Objekt sein, das das gewünschte Upgrade (TLS oder Aushandlung (NTLM)) angibt, falls vorhanden.
Die Endpunkt-URI wird über die `target-uri`-Eigenschaft bereitgestellt.

#### Example: No upgrade
Wenn kein Upgrade erforderlich ist, kann die `upgrade`-Eigenschaft weggelassen werden.```json
{
    "target-uri":"net.tcp://127.0.0.1:9510/example/notes-nettcp"
}

Beispiel: TLS-Upgrade

Um ein TLS-Upgrade zu initiieren, geben Sie den Upgrade-Mechanismus tls an.```json { "target-uri":"net.tcp://wcf-notes.local:9511/example/notes-nettcp-tls", "upgrade": { "mechanism":"tls" } }

root@kitploit:~
#### Beispiel: NTLM-Upgrade
Das `upgrade`-Objekt muss `ntlm` als Mechanismus und den zu authentifizierenden Benutzer angeben.
Die Anmeldeinformationen für den Benutzer müssen mit der `ntlm`-Konfiguration bereitgestellt werden.```json
{
    "target-uri":"net.tcp://localhost:8203/WCFLab/WCFDemoService/nettcp-winauth",
    "upgrade": {
		"mechanism": "ntlm",
		"ntlmuser": "wcflab"
	}
}

POST /connection/{id}/kill

Zerstöre die durch {id} identifizierte Verbindung.

POST /connection/{id}/inject

Injiziere die im Body dieser Anfrage bereitgestellte Nachricht in die durch {id} identifizierte Verbindung. Der Body muss im gleichen Format sein, das zum Weiterleiten von WCF-Nachrichten an HTTP-Interceptor verwendet wird. Daher ist es am besten, eine beobachtete Nachricht zu kopieren, sie nach Bedarf zu ändern und dann über diesen Endpunkt zu injizieren.

Standardmäßig werden Antworten auf injizierte Nachrichten nicht angezeigt. Wenn jedoch ein Interceptor aktiv ist, sollten die Antworten dort erscheinen. Der Einfachheit halber wartet wcfproxy bei Angabe des Abfrageparameters retrieve=true auf die Antwort auf die injizierte Nachricht und zeigt sie an.

Verbindungslimit

Es wird eine künstliche Obergrenze für die Anzahl gleichzeitig aktiver Verbindungen erzwungen. Diese Grenze ist derzeit auf 20 gesetzt. Dies dient dazu, eine versehentliche Ressourcenerschöpfung bei (Miss-)Verwendung der Steuerungs-API zu vermeiden (siehe Nachrichteninjektion und Verbindungsaufbau). Dies sollte für legitime WCF-Clients selten ein Problem darstellen. Es kann jedoch Anwendungsfälle geben, die mehr gleichzeitige Verbindungen erfordern. Ändern Sie in diesem Fall die Konstante maxConnections in proxy.go nach Bedarf.

Beispiele

Die folgenden Beispiele zeigen einige grundlegende Verwendungen von wcfproxy. Die genaue Ausgabe kann sich ändern, aber die Idee sollte rüberkommen.

Verwenden des Log-Interceptors

Dieses Beispiel zeigt die Verwendung von wcfproxy in der WCF-Playground-Umgebung für einfache WCF-Kommunikation über net.tcp unter Verwendung des log-Interceptors.```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:~
Mit der obigen Konfiguration (platziert in `config.json`) können wir sie wie unten gezeigt verwenden.
Der Datenverkehr über den Proxy sollte dann an die Konsole (`stdout`) ausgegeben werden.```
> .\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

Verwenden des http Interceptors

Die folgende Konfiguration verwendet den http Interceptor in Kombination mit einem HTTP-Proxy.```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:~
Mit dieser Konfiguration zeigt das Protokoll nichts Interessantes.```
> 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

Der WCF-Verkehr wird jedoch in (fast) normale SOAP-Umschläge konvertiert, die über HTTP gesendet werden. Beispielbild des HTTP-Interceptors

Einrichten der (m)TLS-Abfangfunktion

wcfproxy kann so eingerichtet werden, dass mTLS-gesicherter WCF-Verkehr abgefangen wird, sofern geeignete Server- und Clientzertifikate verfügbar sind. Die Konfiguration für TLS ohne Client-Authentifizierung ist ähnlich; die Clientzertifikate sind in diesem Fall nicht erforderlich. Die folgende Konfiguration zeigt ein Beispiel für diesen Anwendungsfall:```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:~
Beachten Sie, dass die Clients dem Serverzertifikat (`server.pem`) vertrauen müssen. Darüber hinaus muss der Server dem von der Client-Komponente von *wcfproxy* präsentierten Zertifikat (`client.pem`) vertrauen.```
> .\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

Einrichten der NTLM-Authentifizierung

Angenommen, der WCF-Dienst verwendet NTLM zur Authentifizierung (entweder direkt oder über SPNEGO), kann die folgende Konfiguration verwendet werden, um den Datenverkehr abzufangen:```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:~
Beachten Sie, dass es derzeit robuster ist, den Hostnamen über das `server`- oder `domain`-Feld anzugeben, als sich auf die automatische Konfiguration zu verlassen.
Außerdem wird die Authentifizierung in einem AD-Domänenkontext nicht getestet und ist daher momentan wahrscheinlich defekt.
Wenn SPNEGO verwendet wird, muss derzeit der NTLM-Mechanismus der bevorzugte sein, andernfalls schlägt die Verhandlung fehl.```
> .\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
Tool herunterladen
retarget
  • log-level - Protokollierungsstufe; verfügbare Werte: debug, info (Standard), warn, error
  • log-file - Pfad zur Protokolldatei; wenn kein Pfad angegeben wird, wird das Protokoll auf stdout ausgegeben
  • tls-server - Instanz von TlsServerConfig (siehe TLS-Serverkonfiguration); nur erforderlich, wenn TLS-Upgrade unterstützt werden soll
  • tls-client - Instanz von TlsClientConfig (siehe TLS-Clientkonfiguration); nur relevant, wenn TLS-Upgrade unterstützt werden soll
  • ntlm - Instanz von NtlmConfig (siehe NTLM-Konfiguration); nur erforderlich, wenn NTLM-Upgrade (direkt oder über SPNEGO) unterstützt werden soll
  • interceptor - Instanz von InterceptorConfig (siehe Interceptor-Konfiguration); erforderlich
  • ctrl - Instanz von ControlServerConfig (siehe Steuerungsserver-Konfiguration), die einen standardmäßigen HTTP-Echo-Server (nützlich zusammen mit HTTP-Interceptor) sowie eine kleine API zur Steuerung des Nachrichtenflusses bereitstellen kann (noch in Entwicklung)