Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
wcfproxy — وكيل لحركة مرور WCF القائمة على net.tcp. | Kitploit
أدوات/GitHubGitHub/syss-research/wcfproxy
بروكسيات الويب والاعتراضاختبار أمان APIأمن الشبكاتاختبار الاختراقتحليل الملفات الثنائيةالمصادقة
GitHubsyss-research/wcfproxy

wcfproxy

وكيل لحركة مرور WCF القائمة على net.tcp.

عرض المستودع
8منذ 4 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

بناء

يمكنك إما تجميع الأداة مرة واحدة ثم استخدام الملف الثنائي الناتج، أو تشغيلها "مثل السكربت" (ستقوم سلسلة أدوات Go بتجميعها أثناء التشغيل). للتطوير، الخيار الثاني مريح. للاستخدام الإنتاجي، يُوصى بتجميعها مرة واحدة (من دليل cli) واستخدام الملف التنفيذي الناتج. بفضل مترجم Go، يمكنك البناء من أجل Linux أو Windows ومنهما. يلزم إصدار 1.18 على الأقل من Go للبناء (مُختبر مع Go 1.23).

البناء من Linux

للبناء من Linux من أجل Windows أو Linux، ما عليك سوى تعيين GOOS بشكل مناسب (نفذ من دليل cli):``` GOOS=windows GOARCH=amd64 go build -o wcfproxy.exe

root@kitploit:~
- بالنسبة لـ `ns_query`: للاستعلام عن خادم الأسماء لنطاق ما.
- بالنسبة لـ `ns_answer`: الرد من الخادم .
- بالنسبة لـ `ns_query`: منافذ المصدر والوجهة.```
GOOS=linux GOARCH=amd64 go build -o wcfproxy

البناء من Windows

للبناء من Windows، نفذ الأوامر المكافئة، على سبيل المثال من PowerShell:``` $env:GOOS='windows'; $env:GOARCH='amd64'; go build -o wcfproxy.exe

root@kitploit:~
تمت كتابة وحدة التحكم وواجهة المستخدم الرسومية باستخدام [Stuart](https://github.com/Bee-Mar/mmpm) وهي مباشرة جدًا وسهلة الاستخدام. يوجد ملف تكوين في `$HOME/.config/mmpm/config.json` يتم تحريره من خلال واجهة المستخدم الرسومية، لتجنب التحرير اليدوي للملف مباشرةً. كما يتم عرض جميع حزم MagicMirror المُثبّتة في واجهة المستخدم الرسومية أيضًا.

يستخدم MMPM حزمة طرف ثالث من [MagicMirror](https://magicmirror.builders) تُدعى [web-scraper](https://github.com/Bee-Mar/mmpm/wiki/MagicMirror-Package-Lists#mmpm-list-of-available-magicmirror-packages)، والتي تقدم للمجتمع تجربة أكثر اتساقًا ودقة وسهولة في الصيانة.```
$env:GOOS='linux'; $env:GOARCH='amd64'; go build -o wcfproxy

الاستخدام

يتم توفير الإعدادات الخاصة بـ wcfproxy عبر ملف JSON. افتراضيًا، يتم استخدام ملف الإعدادات config.json، ولكن يمكن تحديد مسار ملف إعدادات باستخدام الوسيط -config. ملف الإعدادات مصمم لاحتواء عدد غير محدود من الإعدادات المسماة، كما يلي:

root@kitploit:~
{
  "configs": {
    "default": {
      "listen": "0.0.0.0:8080",
      "target": "192.168.1.100:80"
    }
  }
}
``````json
{
	"my-config": { 
        " ... ": " ... " 
    }
}

قيمة كائنات التهيئة المُسماة يجب أن تتطابق مع بنية Config (انظر هيكل التهيئة). يعمل ملف المصدر هذا مع التعليقات المضمنة أيضًا كأفضل وثائق دقيقة لخيارات التهيئة لـ wcfproxy. من بين جميع خيارات التهيئة المقدمة، يتم تحديد الخيار المراد استخدامه بواسطة اسمه عبر خيار سطر الأوامر -enable:``` wcfproxy.exe -config config.json -enable my-config

root@kitploit:~
## هيكل التكوين
الهيكل الأعلى لكل كائن تكوين هو ما يلي:```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": {
         " ... ": " ... "
    }
}

لاحظ أن تكوين TLS (tls-server و/أو tls-client) لا يمكن توفيره في حالة وجود تكوين NTLM.

خيارات التهيئة

  • listen - نقطة نهاية TCP التي يجب أن يستمع إليها wcfproxy، مثلاً 127.0.0.1:8000 أو [::1]:8000
  • connect - نقطة نهاية TCP لخادم WCF العلوي، مثلاً 127.0.0.1:9000 أو [::1]:9000
  • retarget - مواصفات الهدف الأصلي (والاحتياطي لـ retarget-map)؛ للشرح انظر إعادة كتابة الهدف
  • retarget-map - تعميم لـ retarget؛ يسمح بإجراء إعادة كتابة الهدف لنقاط نهاية متعددة (مفيد فقط عند العمل مع خدمات WCF متعددة على نفس المنفذ)
    • إذا تطابق أحد المفاتيح في retarget-map مع الهدف الحالي، سيتم استبدال URI الهدف بالقيمة المحددة للاتصال العلوي
    • إذا لم يتطابق أي مفتاح في retarget-map مع الهدف الحالي، سيتم استخدام retarget بدلاً من ذلك

تكوين خادم TLS

يُعطي تكوين جانب خادم TLS التحكم في معظم إعدادات خادم TLS ذات الصلة النموذجية. له الهيكل التالي:```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
+ `cert-pem` - مسار شهادة X.509 (بتنسيق PEM)
+ `cert-key` - مسار المفتاح المقابل للشهادة
+ `max-version` - أقصى إصدار TLS مقبول؛ واحد من `1.0`، `1.1`، `1.2`، `1.3` (الافتراضي)
+ `min-version` - أدنى إصدار TLS مقبول؛ واحد من `1.0` (الافتراضي)، `1.1`، `1.2`، `1.3`
+ `client-roots` - قائمة مفصولة بفواصل لمسارات الشهادات الجذرية المقبولة (PEM) لمصادقة العميل؛ اختياري
+ `client-auth` - سياسة مصادقة العميل؛ القيم الأكثر فائدة: `none` (الافتراضي)، `require-and-verify`
+ `keylog` - ملف لكتابة أسرار TLS بتنسيق NNS

### تكوين عميل TLS
يُعطي جانب تكوين عميل TLS التحكم في أكثر إعدادات عميل TLS شيوعًا.
وله الهيكل التالي:```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

  • مماثلة لـ خيارات تكوين خادم TLS
  • roots - المسار إلى قائمة مفصولة بفواصل لمسارات شهادات الجذر (PEM)؛ اختياري مع skip-verify
  • server-name - اسم الخادم (SNI)؛ اختياري
  • skip-verify - منطقي؛ ما إذا كان يجب على العميل تخطي التحقق من شهادة الخادم (الافتراضي: false)

تكوين NTLM

يحدد تكوين NTLM اسم المجال واسم الخادم بالإضافة إلى بيانات اعتماد المستخدم. لكل مستخدم يجب أن يكون قادرًا على المصادقة عبر الوكيل، يجب توفير بيانات اعتماد صالحة.```json { "domain": "test.local", "server": "server.local", "credentials": [ { " ... ": " ... " } ] }

root@kitploit:~
#### خيارات تكوين NTLM
+ `domain` - المجال الذي سيتم المصادقة ضده، على سبيل المثال test.local؛ إذا تُرك فارغًا، سيتم استخدام اسم الخادم
+ `server` - اسم الخادم الذي سيتم المصادقة ضده؛ إذا تُرك فارغًا، سيتم استخدام اسم المضيف للنظام الحالي
+ `credentials` - مصفوفة من `NtlmCredential` (انظر أدناه)

يتم تمرير بيانات اعتماد NTLM كمصفوفة من كائنات `NtlmCredential`، والتي لها الهيكل التالي:```json
{
	"name": "wcflab",
	"password": "Sup3rS3cr3t",
	"nt-hash": "a8fc07dede90b0ec10bc1ef355f99292",
	"lm-hash": "3e9cb63e11a812cbc467021088dc706f"
}
  • name - اسم المستخدم
  • password - كلمة مرور المستخدم؛ سيتم اشتقاق التجزئات منها؛ تتجاوز التجزئات المعطاة للمستخدم
  • nt-hash - تجزئة NT (سداسي عشري) لكلمة مرور المستخدم؛ بديل لكلمة المرور
  • lm-hash - تجزئة LM (سداسي عشري) لكلمة مرور المستخدم؛ بديل لكلمة المرور؛ لا ينبغي أن تكون مطلوبة في معظم الحالات

إذا تم تقديم كلمة مرور، يتم حساب تجزئة LM (غير ممكنة لجميع كلمات المرور) وتجزئة NT منها. سيتم الكتابة فوق أي قيم تجزئة معطاة لهذا المستخدم بواسطة التجزئات المحسوبة. من الممكن أيضًا تقديم تجزئة (تجزئات) المستخدم فقط. لا ينبغي أن تكون تجزئة LM مطلوبة في معظم السيناريوهات.

تكوين المعترض

يحدد تكوين المعترض المعترض (بالاسم) الذي يجب استخدامه، وبشكل اختياري وسائط خاصة بالمعترض. للحصول على شرح للمعترضات، انظر المعترضات.

معترض السجل

لاستخدام معترض السجل، استخدم ببساطة تكوين المعترض التالي. يتم كتابة المخرجات إلى موقع التسجيل الرئيسي، والذي قد يكون ملفًا أو stdout، اعتمادًا على تكوين log-file.```json { "name": "log" }

root@kitploit:~
#### معترض HTTP
لاستخدام معترض HTTP، استخدم تكوين المعترض التالي مع الخيارات المناسبة لـ `server-url` و `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 لنقطة نهاية اعتراض خادم HTTP الخاص بك (مثل نقطة نهاية صدى بسيطة)؛ للحصول على تفاصيل حول كيفية عمل معترض HTTP، انظر HTTP Interceptor
  • args.proxy-url - عنوان URL لخادم الوكيل HTTP؛ اختياري

تكوين خادم التحكم

يأتي wcfproxy مزودًا بخادم ويب مدمج يخدم وظيفتين. أولاً، يمكنه توفير نقطة نهاية HTTP تعكس ببساطة كل المحتوى المرسل إليها. هذا مفيد بالاقتران مع HTTP Interceptor.```json { "ctrl": { "listen": "127.0.0.1:9999", "enable-control": false, "enable-echo": true } }

root@kitploit:~
> [!WARNING]  
> يمكن لأي شخص لديه وصول إلى واجهة برمجة التطبيقات (API) المصادقة باستخدام بيانات الاعتماد المقدمة (شهادات عميل NTLM أو TLS).
> على الأنظمة المشتركة، قد يكون هذا ذا صلة حتى لو كانت واجهة برمجة التطبيقات متاحة محليًا فقط.

### خيارات تكوين خادم التحكم
+ `listen` - نقطة نهاية TCP حيث يجب أن يستمع خادم التحكم
+ `enable-contorl` - تفعيل ميزات التحكم مثل حقن الرسائل أو إنشاء الاتصال (انظر [حقن الرسائل](#message-injection))
+ `enable-echo` - تفعيل خادم HTTP echo بسيط على `http://{listen}/echo`

# تفاصيل
تقدم الأقسام التالية بعض المعلومات الأساسية التي قد تساعد في فهم WCF بالإضافة إلى بعض خيارات التكوين بشكل أفضل.

## إعادة كتابة الهدف
يتم ترميز نقطة النهاية المقصودة لـ WCF في مقدمة net.tcp وكذلك رأس `To` المنقول في مغلفات SOAP.
قد تتحقق الخوادم من أن مواصفات نقطة النهاية هذه تطابق المواصفات المتوقعة.
عندما يتم التلاعب بالعميل للاتصال بالوكيل بدلاً من الخادم الأصلي، فمن المحتمل أن تتغير مواصفات نقطة النهاية هذه وقد يرفض الخادم الاتصال.
لذلك من المنطقي عادةً تصحيح مواصفات نقطة النهاية في حركة المرور الصادرة إلى الخادم.
للقيام بذلك، قم بتوفير مواصفات نقطة النهاية الأصلية (مثل التي تم الحصول عليها من تكوين العميل) في خيار `retarget` في ملف التكوين.
عادةً ما تبدو مواصفات نقطة النهاية هكذا: `net.tcp://some/endpoint`.

عند العمل مع نقاط نهاية متعددة لـ WCF في وقت واحد، قد يكون من الضروري إجراء إعادة كتابة الهدف لجميعها.
لهذا الغرض، يوجد خيار `retarget-map` الذي يحدد التعيين بين عناوين URI الهدف.
عند عدم العثور على تطابق في `retarget-map`، سيتم تغيير URI الهدف إلى القيمة المعطاة في `retarget`.

## تلميحات النوع
تقوم XML الثنائية، كما هو محدد بواسطة `MC-NBFX`، بترميز معلومات النوع الأساسية في التنسيق الثنائي (أنواع السجلات).
ليست كل هذه المعلومات قابلة للاسترداد بسهولة من تمثيل XML (النصي) لمستند XML ثنائي.
لهذا السبب، يقوم *wcfproxy* بإدراج تلميحات النوع في رموز بيانات الأحرف (وبعض السمات) XML.
تأخذ هذه التلميحات النوعية الشكل `<h>:` حيث `<h>` هو سلسلة قصيرة ترمّز نوعًا ما (مثل `i` للعدد الصحيح، `ch` للأحرف).
يمكن العثور على قائمة كاملة بتلميحات النوع في [typehint.go](https://github.com/syss-research/wcfproxy/blob/HEAD/binxml/typehint.go).
لا يُنصح بالتلاعب بتلميحات النوع.

## المعترضون
يحدد المعترضون كيفية معالجة حركة المرور المستلمة ويتم تحديدهم عبر [تكوين المعترض](#interceptor-configuration).
يتعاملون مع حركة المرور المرسلة في كلا الاتجاهين (عميل -> خادم وخادم -> عميل).
يوجد حاليًا معترضان: **log** و **http**.

### معترض السجل
يقوم معترض **log** بتحويل مغلفات SOAP المشفرة ثنائيًا إلى نظيراتها القابلة للقراءة البشرية المشفرة باستخدام XML نصي عادي.
لا يتم إجراء أي تلاعب نشط (باستثناء إعادة كتابة مواصفات الهدف).
يتم إرسال المخرجات إلى موقع السجل المحدد (`stdout` افتراضيًا).
تأكد من تعيين مستوى السجل إلى `info` (أو `debug`)، وإلا فسيتم كتم المخرجات ذات الصلة.

### معترض HTTP
يقوم معترض **http** بتحويل مغلفات SOAP الثنائية إلى نظيراتها النصية ويرسلها إلى نقطة نهاية HTTP محددة بواسطة `-http-url`.
يتم إرسال رسائل SOAP المفككة في نص الطلب.
يجب أن يعيد خادم HTTP مغلف SOAP صالح بنفس تنسيق الرسائل الواردة.
ثم يتم تحويل هذه الرسائل مرة أخرى إلى التنسيق الثنائي الأصلي وإرسالها إلى الخادم الأعلى.

يعتبر مجرد عكس الرسالة الأصلية دائمًا خيارًا صالحًا لخادم HTTP.
ومع ذلك، يمكن أيضًا تحقيق التلاعب البرمجي بالرسائل من خلال توفير خادم HTTP مخصص يقوم بالاستبدالات المطلوبة.
يجب توخي الحذر لعدم كسر بنية رسائل SOAP.
يُنصح بعدم العبث بتنسيق الرسائل إلا إذا كنت تعرف ما تفعله.
علاوة على ذلك، لا ينبغي التلاعب بتلميحات النوع التي يُدرجها *wcfproxy*، لأن هذا قد يعطل تحويل رسائل SOAP النصية مرة أخرى إلى نظيراتها الثنائية أو تحليل الرسائل على نقطة النهاية المشروعة (عميل أو خادم).

يأتي *wcfproxy* مع خادم HTTP تافه يقوم ببساطة بعكس نص طلبات HTTP المستلمة.
سيتم بدء تشغيل هذا الخادم عند تقديم [تكوين خادم التحكم](#control-server-configuration) وتعيين خيار `enable-echo` إلى `true`.
يتم توفير عنوان URL لخادم HTTP المطلوب عبر خيار `server-url` في [تكوين معترض HTTP](#http-interceptor).

للسماح بالتلاعب التفاعلي، يمكن تحديد وكيل HTTP (مثل BurpSuite) عبر خيار `proxy-url`.
سيتم بعد ذلك إرسال الرسائل إلى خادم HTTP عبر وكيل HTTP المحدد.
لاحظ أنه لكل رسالة WCF (على سبيل المثال، عميل -> خادم)، يتم إنتاج زوج طلب واستجابة HTTP.

لربط الرسائل باتصال net.tcp الذي نشأت منه، يتم إدراج الرأس `X-Wcpf-Conn-Id` في الطلبات التي يُنشئها معترض **http**.

توضح الصورة التالية تدفق البيانات مع معترض **http**.

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

## خيارات TLS
يمكن لـ WCF (عبر net.tcp) استخدام TLS لأمان النقل.
يدعم *wcfproxy* اعتراض اتصالات TLS (فقط TLS 1.0 - 1.3، بدون SSL).
يمكن التحكم في إعدادات TLS من جانب الخادم وجانب العميل باستخدام تكوين TLS المقابل (انظر [تكوين خادم TLS](#tls-server-configuration) أو [تكوين عميل TLS](#tls-client-configuration)).

## خيارات NTLM
يدعم *wcfproxy* مصادقة NTLM.
حاليًا، يتم دعم مصادقة NTLM المباشرة أو التفاوض عبر SPNEGO.
تحتاج إلى تقديم بيانات الاعتماد الخاصة بالمستخدم (المستخدمين) الذين سيتم مصادقتهم.
يتم تقديم بيانات الاعتماد هذه بتنسيق JSON، انظر [تكوين NTLM](#ntlm-configuration).
يتم دعم تمرير التجزئات من خلال توفير التجزئات عبر الخاصية `nt-hash`.

## حقن الرسائل وإنشاء الاتصال
عند تمكين [خادم التحكم](#control-server-configuration)، يتم توفير واجهة HTTP API صغيرة يمكن استخدامها لإنشاء الاتصالات أو إنهائها وحقن الرسائل في الاتصالات الحالية.
نقاط النهاية التالية متاحة.

### GET `/connection`
سرد الاتصالات النشطة حاليًا.
بالنسبة للاتصالات الخاصة بالخادم فقط (التي تم إنشاؤها عبر [POST /connection/new](#post-connectionnew))، سيتم عرض العميل كـ `wcfproxy`.

### POST `/connection/new`
إنشاء اتصال جديد.
يجب أن يكون النص كائن JSON يحدد الترقية المقصودة (TLS أو Negotiate (NTLM)) إن وجدت.
يتم توفير URI نقطة النهاية عبر الخاصية `target-uri`.

#### مثال: بدون ترقية
إذا لم تكن هناك حاجة إلى ترقية، يمكن حذف الخاصية `upgrade`.```json
{
    "target-uri":"net.tcp://127.0.0.1:9510/example/notes-nettcp"
}

مثال: ترقية TLS

لبدء ترقية TLS، حدد آلية الترقية tls.```json { "target-uri":"net.tcp://wcf-notes.local:9511/example/notes-nettcp-tls", "upgrade": { "mechanism":"tls" } }

root@kitploit:~
#### مثال: ترقية NTLM
يحتاج كائن `upgrade` إلى تحديد `ntlm` كآلية والمستخدم للمصادقة معه.
يجب توفير بيانات اعتماد المستخدم مع تكوين `ntlm`.```json
{
    "target-uri":"net.tcp://localhost:8203/WCFLab/WCFDemoService/nettcp-winauth",
    "upgrade": {
		"mechanism": "ntlm",
		"ntlmuser": "wcflab"
	}
}

POST /connection/{id}/kill

تدمير الاتصال المحدد بواسطة {id}.

POST /connection/{id}/inject

حقن الرسالة المقدمة في نص هذا الطلب في الاتصال المحدد بواسطة {id}. يجب أن يكون النص بنفس التنسيق المستخدم لإعادة توجيه رسائل WCF إلى المعترضات HTTP. لذلك من الأفضل نسخ رسالة تمت ملاحظتها، وتعديلها حسب الحاجة، ثم حقنها عبر نقطة النهاية هذه.

افتراضيًا، لا تظهر الردود على الرسائل المحقونة. ومع ذلك، إذا كان المعترض نشطًا، يجب أن تظهر الردود هناك. للتيسير، عندما يتم توفير معامل الاستعلام retrieve=true، ينتظر wcfproxy الرد على الرسالة المحقونة ويعرضها.

Connection limit

يتم فرض حد أعلى اصطناعي لعدد الاتصالات النشطة المتزامنة. هذا الحد مضبوط حاليًا على 20. هذا لتجنب استنزاف الموارد العرضي عند (إساءة) استخدام واجهة برمجة التطبيقات التحكم (انظر Message injection and connection establishment). من النادر أن يشكل هذا مشكلة لعملاء WCF الشرعيين. ومع ذلك، قد تكون هناك حالات استخدام تتطلب المزيد من الاتصالات المتزامنة. في هذه الحالة قم بتعديل الثابت maxConnections في proxy.go حسب الحاجة.

Examples

توضح الأمثلة التالية بعض الاستخدامات الأساسية لـ wcfproxy. قد تتغير المخرجات الدقيقة، ولكن يجب أن تصل الفكرة.

Using the log interceptor

يوضح هذا المثال استخدام wcfproxy في بيئة اختبار WCF للاتصال البسيط عبر net.tcp باستخدام المعترض 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:~
باستخدام التكوين أعلاه (الموجود في `config.json`)، يمكننا استخدامه كما هو موضح أدناه.
يجب بعد ذلك تفريغ حركة المرور عبر الوكيل إلى وحدة التحكم (`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

استخدام المعترض http

يستخدم التكوين التالي المعترض http بالاشتراك مع وكيل 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:~
مع هذا التكوين، لا يظهر السجل أي شيء مثير للاهتمام.```
> 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

ومع ذلك، يتم تحويل حركة مرور WCF إلى مغلفات SOAP عادية (تقريبًا) تُرسل عبر HTTP. صورة مثال اعتراض http

إعداد اعتراض (m)TLS

يمكن إعداد wcfproxy لاعتراض حركة مرور WCF المؤمنة بـ mTLS، بشرط توفر شهادات الخادم والعميل المناسبة. يكون التكوين لـ TLS دون مصادقة العميل مشابهًا؛ حيث لا تكون شهادات العميل مطلوبة في هذه الحالة. يوفر التكوين التالي مثالاً لحالة الاستخدام هذه:```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:~
لاحظ أن العملاء يحتاجون إلى الثقة بشهادة الخادم (`server.pem`).
علاوة على ذلك، يجب أن يثق الخادم بالشهادة التي يقدمها جزء العميل من *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

إعداد مصادقة NTLM

بافتراض أن خدمة WCF تعتمد على مصادقة NTLM (إما مباشرة أو عبر SPNEGO) يمكن استخدام الإعداد التالي لاعتراض حركة المرور:```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:~
لاحظ أنه من الأكثر متانة حالياً تقديم اسم المضيف عبر حقل `server` أو `domain` بدلاً من الاعتماد على التهيئة التلقائية.
علاوة على ذلك، لم يتم اختبار المصادقة في سياق نطاق AD وبالتالي من المحتمل أن تكون معطلة في الوقت الحالي.
عند استخدام SPNEGO، يجب حالياً أن تكون آلية NTLM هي المفضلة، وإلا سيفشل التفاوض.```
> .\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
تنزيل الأداة
  • log-level - مستوى السجل؛ القيم المتاحة: debug، info (افتراضي)، warn، error
  • log-file - مسار ملف السجل؛ إذا لم يتم توفير مسار، يُكتب السجل إلى stdout
  • tls-server - مثيل لـ TlsServerConfig (انظر تكوين خادم TLS)؛ مطلوب فقط إذا كان يجب دعم ترقية TLS
  • tls-client - مثيل لـ TlsClientConfig (انظر تكوين عميل TLS)؛ ذو صلة فقط إذا كان يجب دعم ترقية TLS
  • ntlm - مثيل لـ NtlmConfig (انظر تكوين NTLM)؛ مطلوب فقط إذا كان يجب دعم ترقية NTLM (مباشرة أو عبر SPNEGO)
  • interceptor - مثيل لـ InterceptorConfig (انظر تكوين المعترض)؛ مطلوب
  • ctrl - مثيل لـ ControlServerConfig (انظر تكوين خادم التحكم) والذي يمكن أن يوفر خادم HTTP افتراضي للصدى (مفيد مع معترض HTTP) بالإضافة إلى واجهة برمجة تطبيقات صغيرة للتحكم في تدفق الرسائل (لا يزال قيد التطوير)