
وكيل MITM لبروتوكولي HTTP/HTTPS مبني بلغة Go، مع اعتراض لحركة المرور عبر HTTP/2 وHTTP/1.1، وتوليد شهادات CA محلية/خاصة بكل مضيف، ونفق CONNECT/WebSocket، وتخزين مؤقت على القرص، ولوحة تحكم إدارية، والتقاط حركة المرور، وسياسات حظر، وفحص تهديدات اختياري مدعوم بالذكاء الاصطناعي مع التنقيح والعزل وتسجيل التدقيق.
وكيل HTTP/HTTPS خفيف وسهل الاستخدام للمطورين، يعمل وفق تقنية رجل في المنتصف (MITM)، مكتوب بلغة Go. يدعم HTTP/1.1 و HTTP/2، وتوجيه CONNECT، ونفق WebSocket (ws/wss)، والتخزين المؤقت للاستجابات على القرص مع فلاتر مرنة، وإعادة تحميل الإعدادات أثناء التشغيل.

Go MITM Proxy هو بروكسي اعتراض مخصص لتصحيح الأخطاء والاختبار والتعلم والاعتراض المتحكم به لحركة مرور HTTP(S). عند تمكين MITM، يقوم ديناميكيًا بتوليد شهادات طرفية لكل مضيف موقعة من مرجع تصديق محلي (CA)، مما يسمح للبروكسي بفك تشفير حركة HTTPS وفحصها. يمكنه أيضًا العمل كنفق TCP شفاف عند تعطيل MITM أو للنطاقات/المنافذ المستثناة.
مهم: يقوم هذا التطبيق باعتراض من نوع رجل في المنتصف (MITM) فعّال، بما في ذلك توليد واستخدام شهادات TLS لفك تشفير حركة مرور HTTPS. اعتمادًا على ولايتك القضائية وبيئة الشبكة، قد يكون اعتراض حركة المرور دون موافقة مسبقة وواضحة من جميع المستخدمين المتأثرين غير قانوني وقد ينتهك الخصوصية أو سياسات مكان العمل أو المتطلبات التنظيمية.
قبل استخدام هذا البرنامج في أي بيئة غير جهازك المحلي:
يجب إعلام جميع مستخدمي أي شبكة قد يعترض فيها هذا البروكسي حركة المرور بوضوح بأن اعتراض HTTP(S) وفحصه سيحدثان. وينبغي أن تكون الموافقة صريحة وموثقة بشكل مثالي.
لا تشغّل هذا البرنامج على شبكات لا تملكها أو لا تديرها أو لا تملك إذنًا صريحًا لاختبارها أو مراقبتها.
لدى العديد من المناطق قوانين صارمة تحكم اعتراض بيانات المستخدمين وتسجيلها وتخزينها (على سبيل المثال: GDPR و CCPA وقوانين التنصت). أنت مسؤول عن ضمان امتثال استخدامك لجميع اللوائح المعمول بها.
مفتاح CA الخاص المُنشأ (عادةً ca-key.pem) يسمح لحامله بانتحال أي نطاق للمستخدمين الذين يثقون بالشهادة المقابلة.
صُمم هذا البروكسي لأغراض التطوير والتصحيح والاختبار الموجه أو التعليم — وليس للمراقبة الخفية أو التجسس غير المصرح به.
باستخدامك لهذا البرنامج، فأنت تقر وتتحمل المسؤولية الكاملة عن ضمان أن استخدامك قانوني وأخلاقي ومُبلَّغ به بشكل صحيح لجميع المستخدمين المتأثرين.
المتطلبات الأساسية:
استنساخ المستودع وبناؤه: ```bash git clone https://github.com/Welfordian/mitm-proxy.git cd mitm-proxy go build ./
ينتج هذا ملفًا ثنائيًا باسم mitm-proxy (أو mitm-proxy.exe على ويندوز) في جذر المشروع.
## بدء سريع
1) شغّل البروكسي بالإعدادات الافتراضية (يستمع على :8080): ```bash
./mitm-proxy
عند أول تشغيل، سيتم إنشاء مرجع تصديق محلي (CA) وحفظه في ca-cert.pem و ca-key.pem.
قم بتكوين متصفحك أو curl لاستخدام البروكسي على http://localhost:8080.
قم بالوثوق بشهادة CA المُنشأة (ca-cert.pem) في نظام التشغيل/المتصفح لديك للسماح باعتراض HTTPS. راجع الوثوق بمرجع التصديق المحلي.
قم بزيارة موقع HTTPS عبر البروكسي ولاحظ السجلات. استخدم الوضع المفصّل لمزيد من التفاصيل: ```bash ./mitm-proxy --verbose
## الاستخدام
### خيارات سطر الأوامر
- --config string: مسار ملف config.json
- --listen string: عنوان الاستماع (يتجاوز إعدادات config)
- --ca-cert string: مسار شهادة CA موجودة (يتجاوز إعدادات config)
- --ca-key string: مسار مفتاح CA موجود (يتجاوز إعدادات config)
- --mitm bool: تفعيل اعتراض MITM (الافتراضي true؛ تعيينه إلى false يُجبر على استخدام النفق)
- --verbose bool: تفعيل التسجيل التفصيلي
- --watch-config bool: مراقبة config.json لاكتشاف التغييرات وتطبيقها تلقائيًا (الافتراضي true)
- --admin-enabled bool: تفعيل API/لوحة تحكم الإدارة المحلية (الافتراضي true)
- --admin-addr string: عنوان الاستماع لـ API/لوحة تحكم الإدارة (الافتراضي 127.0.0.1:9090)
- --admin-token string: توكن Bearer للإدارة (يتم إنشاؤه عند بدء التشغيل إذا لم يُحدَّد)
- --admin-read-token string: توكن Bearer للقراءة فقط للوصول إلى واجهة الإدارة عبر GET/HEAD/OPTIONS
- --admin-ui bool: تقديم واجهة مستخدم الإدارة المدمجة (الافتراضي true)
- --admin-store string: مسار تخزين SQLite للإدارة (الافتراضي dashboard.db)
خيارات سطر الأوامر تتجاوز قيم ملف الإعدادات في الحالات المذكورة.
### التكوين (config.json)
يتضمن المستودع مثالًا على config.json: ```json
{
"listen_addr": ":8080",
"proxy_name": "MITM-Proxy",
"ca_cert_path": null,
"ca_key_path": null,
"ca_cert_output_path": "ca-cert.pem",
"ca_key_output_path": "ca-key.pem",
"enable_mitm": true,
"admin_enabled": true,
"admin_addr": "127.0.0.1:9090",
"admin_token": "",
"admin_read_token": "",
"admin_ui": true,
"admin_store": "dashboard.db",
"excluded_domains": [],
"blocked_ports": [25, 445, 3389],
"blocked_domains": [],
"blocked_ips": [],
"block_action": "deny",
"block_response_status": 403,
"traffic_capture": {
"store_bodies": false,
"max_body_bytes": 32768,
"redact_bodies": true,
"store_headers": true,
"redacted_headers": ["Authorization", "Cookie", "Proxy-Authorization", "Set-Cookie", "X-Api-Key"],
"store_cookies": true,
"redacted_cookies": []
},
"proxy_auth": {
"enabled": false,
"realm": "MITM Proxy",
"require_auth_for_loopback": false,
"default_action": "allow"
},
"verbose_logging": true,
"log_requests": true,
"max_idle_conns": 200,
"idle_conn_timeout_seconds": 90,
"tls_handshake_timeout_seconds": 10,
"min_tls_version": "1.2",
"tls_next_protos": ["h2", "http/1.1"],
"cache": {
"enabled": true,
"directory": "/var/cache/mitm-proxy",
"include_domains": [],
"exclude_domains": [],
"include_extensions": ["jpg", "png", "webp", "css", "js"],
"exclude_extensions": [],
"ttl": 3600
}
}
ملاحظات:
يقدم خادم الإدارة لوحة التحكم على http://127.0.0.1:9090/admin/ افتراضيًا. تتطلب مسارات API Authorization: Bearer <token>؛ أما للاستخدام من المتصفح محليًا، فيخزن /admin/?token=<token> الـ token في التخزين المحلي للمتصفح.
تشمل التغطية الأولية للوحة الإدارة/API ما يلي:
تتضمن لوحة الإدارة تأكيدًا على الاستخدام المسؤول عند التشغيل الأول. لا يتم أبدًا كشف المفتاح الخاص لشهادة CA عبر API الإدارة.
يتم تخزين حالة لوحة الإدارة في SQLite في dashboard.db افتراضيًا. تُطبَّق الإعدادات التي يتم تغييرها عبر لوحة الإدارة فورًا وتُكتب مرة أخرى إلى ملف JSON المكوَّن، أو إلى config.json عند بدء تشغيل الوكيل من الإعدادات الافتراضية.
واجهة لوحة الإدارة الأمامية هي تطبيق Vite/React داخل internal/admin/ui. يتم إصدار بنيتها الإنتاجية إلى internal/admin/ui/dist وتضمينها في ثنائي Go. لتحديث أصول لوحة الإدارة:```bash
cd internal/admin/ui
npm install
npm run build
### الربط عبر الوكيل العلوي
يمكن ربط حركة المرور الصادرة عبر وكيل علوي HTTP أو HTTPS، مثل Burp أو ZAP أو وكيل خروج مؤسسي. عند التفعيل، تستخدم إعادة التوجيه المعتادة HTTP(S) وأنفاق المرور المباشر CONNECT وWebSockets وإرسالات Repeater الوكيل العلوي، ما لم يطابق مضيفٌ ما `no_proxy`.```json
{
"upstream_proxy": {
"enabled": true,
"url": "http://127.0.0.1:8080",
"username": "",
"password_env": "UPSTREAM_PROXY_PASSWORD",
"no_proxy": ["localhost", "127.0.0.1", "*.internal"],
"chain_tunnels": true,
"apply_to_repeater": true
}
}
فقط عناوين URL للوكيل العلوي http:// و https:// مدعومة في v1. إذا كانت المصادقة الأساسية (Basic auth) مطلوبة، فعيّن username وقدّم كلمة المرور عبر متغير البيئة المسمّى؛ بيانات الاعتماد المضمّنة في URL مرفوضة ولا تظهر أبدًا في إعدادات لوحة التحكم. إذا كان الوكيل العلوي مفعّلًا لكنه غير متاح، تفشل الطلبات المتأثرة بشكل مرئي بدلاً من التراجع الصامت إلى الاتصالات المباشرة.
تعرض عرض التحكم في الوصول (Access Control) في لوحة التحكم إدارة مستخدمي وكيل العميل وقواعد ACL المرتبة (سماح/منع). يُخزَّن مستخدمو الوكيل في SQLite مع تجزئات كلمة مرور bcrypt؛ كلمات المرور النصية الصريحة تُقبل فقط عند إنشاء مستخدم أو إعادة تعيينه ولا يتم إرجاعها أبدًا عبر API.
فعّل مصادقة الوكيل الأساسية عبر proxy_auth في config.json أو من عرض الإعدادات (Settings). عند التفعيل، يجب على العملاء إرسال Proxy-Authorization: Basic ... ما لم يكن عملاء الحلقة المحلية (loopback) معفيين. تُقيَّم قواعد ACL حسب الأولوية ويمكن أن تطابق اسم المستخدم، وعنوان IP/CIDR للمصدر، والمضيف أو مضيف البدل (wildcard)، والمنفذ أو نطاق المنفذ، والطريقة، ونطاق البحث. قوائم المطابقة الفارغة تعني "أي".
يتم إزالة Proxy-Authorization قبل التوجيه، وسلسلة الوكيل العلوي، والتقاط الحركة، والبحث في ذاكرة التخزين المؤقت، وفحص التهديدات، واستنساخ Repeater. تتضمن الحركة الملتقطة إسناد proxy_user عند توفره، ويمكن لمربع البحث في الحركة (Traffic) مطابقة أسماء مستخدمي الوكيل.
يتيح عرض المكرر (Repeater) في لوحة التحكم لباحثي الأمن استنساخ حركة HTTP الملتقطة إلى حالات قابلة للتحرير ومحفوظة. تخزّن الحالة الطريقة، وعنوان URL، والترويسات، وعينة الجسم، والمهلة الزمنية، ومعرّف تدفق حركة المصدر الاختياري. يخزّن كل إرسال تشغيلة (run) بالحالة، والمدة، وترويسات الاستجابة، وعينة جسم استجابة محدودة الحجم، وأي خطأ في الوكيل العلوي.
يتم ملء أجسام الطلبات الملتقطة مسبقًا فقط عندما يكون traffic_capture.store_bodies مفعّلًا وقت الالتقاط. إذا كان تنقيح الجسم مفعّلًا، يتلقى المكرر العينة المنقّحة؛ الأجسام غير الملتقطة تبقى فارغة ويمكن تعديلها يدويًا.
تبقى نقطة النهاية القديمة POST /api/traffic/{id}/replay متاحة لإعادة التشغيل لمرة واحدة، بينما يهدف المكرر إلى تكرار تغيير الطلب ومقارنة الاستجابات.
يعرض عرض مجموعة أدوات الاختراق (Pentest Toolkit) في لوحة التحكم خرائط أهداف سلبية مبنية من الحركة الملتقطة. إعادة بناء خريطة تحلل فقط الحركة المخزنة للنطاق المحدد، وتجمّع نقاط النهاية حسب المسار المطبَّع، وتستخرج معاملات الاستعلام/الجسم/الكوكيز/الترويسات، وتسجّل المعاملات المنعكسة والمثيرة للاهتمام، وتضيف تلميحات سلبية مثل ترويسات الأمان المفقودة، وثغرات سمات الكوكيز، و CORS المتساهل، والأخطاء المطوّلة.
تُحفظ خرائط الاختراق في SQLite ويمكن حذفها بشكل مستقل. لا ترسل مجموعة الأدوات طلبات أبدًا، ولا تزحف، ولا تختبر بالـ fuzzing، ولا تعدّل الأهداف؛ يمكن استنساخ أدلة نقاط النهاية إلى المكرر للاختبار اليدوي.
يتيح عرض النطاقات (Scopes) في لوحة التحكم للباحثين تحديد حدود أهداف مسماة بأنماط مضيف، ونص فرعي من URL، وأنماط طريقة اختيارية. تُطابَق النطاقات المفعّلة تلقائيًا عند التقاط الحركة؛ تتلقى التدفقات المطابقة، وحالات المكرر المستنسخة، وأحداث ماسح التهديدات scope_id واحدًا.
يقوم محدد النطاق العام بتصفية عروض الحركة (Traffic)، والمكرر (Repeater)، وماسح التهديدات (Threat Scanner) عبر كل الحركة، أو نطاق مفعّل محدد، أو عناصر خارج النطاق. حذف نطاق يزيل قيم scope_id ذات الصلة دون حذف الحركة الملتقطة، أو حالات المكرر، أو التشغيلات، أو بيانات التهديدات.
فلاتر النطاق متاحة على GET /api/traffic و GET /api/repeater/cases و GET /api/threats/events مع scope_id=<id> أو scope_id=__out_of_scope__. أضف include_out_of_scope=true لتضمين الصفوف غير المصنفة بجانب نطاق محدد.
يخزّن عرض مساعد الذكاء الاصطناعي (AI Copilot) في لوحة التحكم ملاحظات بحث مولّدة بالذكاء الاصطناعي مرتبطة بالحركة، وحالات المكرر، والتشغيلات، والنطاقات، أو أحداث التهديدات. يمكن لتفاصيل الحركة أن تطلب من المساعد شرح طلب أو اقتراح اختبارات يدوية تالية؛ يمكن للمكرر اقتراح اختبارات لحالة محفوظة أو مقارنة آخر تشغيلتين.
المساعد استشاري فقط. لا يرسل حركة أبدًا، ولا يعدّل حالات المكرر، ولا يغيّر النطاقات، ولا يغيّر الإعدادات، ولا يمحو البيانات. يمكن شرح الحركة خارج النطاق، لكن اقتراحات الاختبار النشط تُمنع عمدًا.
فعّله عبر ai_copilot في config.json أو من عرض الإعدادات (Settings):```json
{
"ai_copilot": {
"enabled": true,
"provider": "openai",
"model": "gpt-5.4-nano",
"timeout_ms": 10000,
"max_body_bytes": 32768,
"redact_before_ai": true,
"openai_api_key_env": "OPENAI_API_KEY"
}
}
تتم قراءة مفتاح OpenAI API من متغير البيئة المُهيأ ولا يتم تخزينه في لوحة التحكم أو ملف الإعدادات. يتم تعتيم الترويسات الحساسة وعينات الجسم وقيم الاستعلام قبل إرسال سياق الذكاء الاصطناعي عند تفعيل `redact_before_ai`. تتضمن الملاحظات المحفوظة النموذج وتجزئة المطالبة والملخص ومخرجات الذكاء الاصطناعي المنظمة، وليس المطالبة الكاملة.
### فحص التهديدات بالذكاء الاصطناعي
يمكن لماسح التهديدات فحص طلبات واستجابات HTTP باستخدام استدلالات محلية، وعند تكوينه، يطلب رأيًا ثانيًا من OpenAI قبل حظر حركة المرور المشبوهة.
1. أنشئ مفتاح OpenAI API وعرّضه لعملية الوكيل:```powershell
$env:OPENAI_API_KEY = "sk-..."
على macOS/Linux:```bash export OPENAI_API_KEY="sk-..."
2. فعّل الماسح في `config.json`:```json
{
"threat_scanner": {
"enabled": true,
"mode": "suspicious_only",
"provider": "openai",
"model": "gpt-5.4-nano",
"second_opinion_model": "gpt-5.4-mini",
"scan_requests": true,
"scan_responses": true,
"max_body_bytes": 131072,
"max_ai_body_bytes": 32768,
"ai_timeout_ms": 750,
"block_threshold": 0.85,
"warn_threshold": 0.65,
"require_ai_confirmation_for_block": true,
"block_critical_local_on_ai_failure": true,
"fail_open": true,
"scan_content_types": [
"text/html",
"text/plain",
"application/json",
"application/javascript",
"text/javascript",
"application/xml"
],
"skip_content_types": [
"image/",
"video/",
"audio/",
"font/",
"application/octet-stream"
],
"trusted_domains": [
"accounts.google.com",
"login.microsoftonline.com",
"github.com"
],
"allowlist_domains": [],
"malicious_domains": [],
"malicious_file_hashes": [],
"threat_intel_updated": "",
"quarantine_dir": "quarantine",
"debug_log_path": "threats.log",
"redact_before_ai": true,
"store_bodies": false,
"openai_api_key_env": "OPENAI_API_KEY"
}
}
تُظهر شاشة **Threat Scanner** في لوحة التحكم أعداد الطلبات/الاستجابات الممسوحة، وأعداد استدعاءات الذكاء الاصطناعي، والاكتشافات، وتفاصيل الأحكام، وأهم القواعد المحلية، وإجراءات التجاوز.
أوضاع الماسح:
- `suspicious_only`: الافتراضي؛ تحدد الاستدلالات المحلية متى يتم استدعاء الذكاء الاصطناعي.
- `all_text`: يستدعي الذكاء الاصطناعي لحركة المرور النصية.
- `paranoid`: يستدعي الذكاء الاصطناعي أيضًا لحركة المرور النصية وهو مخصص للاختبار عالي الحساسية.
- `metadata_only`: يستخدم الترويسات وعنوان URL والمضيف والبيانات الوصفية دون مراجعة نص الطلب بواسطة الذكاء الاصطناعي.
- `off`: يعطل المسح.
عناصر تحكم مفيدة للسلامة والخصوصية:
- `redact_before_ai`: يحذف الأسرار الشائعة والبيانات الشخصية قبل إرسال الأدلة إلى OpenAI.
- `max_ai_body_bytes`: يحد من حجم عينة النص المضمّنة في أدلة الذكاء الاصطناعي.
- `require_ai_confirmation_for_block`: يمنع الاستدلالات المحلية من الحظر ما لم يؤكد الذكاء الاصطناعي ذلك، إلا عندما يكون `block_critical_local_on_ai_failure` مفعّلاً للأدلة المحلية الحرجة.
- `fail_open`: يسمح بمرور حركة المرور عند فشل الماسح، ما لم تنطبق إعدادات حظر أكثر تشددًا.
- `trusted_domains` و`allowlist_domains`: تقللان النتائج الإيجابية الخاطئة للمضيفين المعروفين بأنهم آمنون.
- `malicious_domains` و`malicious_file_hashes`: يضيفان نتائج استخبارات التهديدات المحلية دون انتظار الذكاء الاصطناعي.
- `debug_log_path`: يكتب قرارات الماسح إلى سجل محلي بصيغة JSONL لتصحيح الأخطاء.
لاستخدام اسم متغير بيئة مختلف لمفتاح API، عيّن `openai_api_key_env` وقم بتصدير هذا المتغير قبل بدء تشغيل الوكيل. لا تضع مفاتيح API مباشرة في `config.json`.
### الثقة بالمرجع المصدّق المحلي
لاعتراض حركة مرور HTTPS، استورد ca-cert.pem وثق به في نظام التشغيل/المتصفح:
- macOS: Keychain Access ← تسجيل الدخول/النظام ← الشهادات ← استيراد ca-cert.pem ← تعيين «الوثوق دائمًا».
- Windows: certmgr.msc ← جهات التصديق الجذرية الموثوقة ← الشهادات ← استيراد ca-cert.pem.
- Linux (يختلف): مثل update-ca-certificates، أو مخزن خاص بالمتصفح (Firefox: الإعدادات ← الخصوصية والأمان ← الشهادات ← عرض ← الجهات ← استيراد).
بدون الثقة بالمرجع المصدّق، ستعرض المتصفحات تحذيرات الشهادة للمواقع التي يتم اعتراضها.
### استخدام الوكيل
عيّن وكيل HTTP/HTTPS على عنوان الاستماع (الافتراضي http://localhost:8080).
أمثلة باستخدام curl: ```bash
# HTTP
curl -x http://localhost:8080 http://example.com/
# HTTPS (after trusting the CA for full MITM)
curl -x http://localhost:8080 https://example.com/
# Disable MITM and tunnel only
./mitm-proxy --mitm=false
# Change listen address
./mitm-proxy --listen=127.0.0.1:9090
WebSocket notes:
ذاكرة التخزين المؤقت مبنية على الملفات وتنظر فقط في طلبات HTTP GET عند تفعيلها. يتم التحكم في التحديد بواسطة:
عند حدوث إصابة في ذاكرة التخزين المؤقت، تتضمن الاستجابات:
يتم ضمان وجود دليل ذاكرة التخزين المؤقت عند بدء التشغيل وعند تغييرات التكوين. إذا لم يتم تعيين أي دليل، فسيتم استخدام ./cache افتراضيًا.
go build ./ ./mitm-proxy --config ./config.json
يرتبط الخادم بـ listen_addr المهيأ ويتعامل مع HTTP + HTTPS عبر ALPN.
## خارطة الطريق
- مصادقة الوكيل (Basic/NTLM) وقوائم التحكم في الوصول (ACLs)
- دعم الوكيل العلوي/التسلسل
- توليد ملفات PAC والسكربتات المساعدة
- واجهة مستخدم لفحص التدفقات وإدخالات الكاش
- ضوابط بصمة TLS وتنسيق JA3
- نقاط نهاية المقاييس/الصحة وتكامل Prometheus
## المساهمة
نرحب بالمشكلات (Issues) وطلبات السحب (Pull Requests). بالنسبة للتغييرات المهمة، يرجى فتح issue أولاً لمناقشة النطاق والتصميم.
أسلوب البرمجة: أبقِ التغييرات في حدها الأدنى ومركّزة؛ فضّل الوضوح والدوال الصغيرة القابلة للتركيب.