
وكيل MITM لـ HTTP بلغة Rust قابل للتكوين مع انتحال بصمة TLS وHTTP/2 وTCP.
وكيل MITM لبروتوكول HTTP مبني باستخدام Rust وtokio وbtls.
أُعيدت كتابة هذا المشروع بالكامل للاستفادة من btls (BoringSSL) من أجل قدرات متقدمة في أخذ بصمات TLS. أصبحت طبقة أخذ بصمات TLS (JA3/JA4) قابلة للانتحال بالكامل الآن — فحزم التشفير والمنحنيات وخوارزميات التوقيع وALPN وحد حجم السجل وضغط الشهادات وGREASE وتبديل/ترتيب الامتدادات وOCSP stapling وشفافية الشهادات (SCT) وتذاكر الجلسة وALPS وEncrypted Client Hello (ECH، الذي يُحلّ مباشرةً عبر DoH، مع الرجوع إلى GREASE) كلها تُدار عبر ملف تعريف YAML. كما أن أخذ بصمات HTTP/2 (Akamai) وترتيب/إعادة كتابة ترويسات HTTP/1.1 قابلان للتهيئة بالكامل. وأخذ بصمات TCP (الطبقة L4) متاح أيضاً: إذ تُعاد كتابة حزم SYN للاتصالات الصادرة في NFQUEUE (TTL وحجم النافذة وMSS ومقياس النافذة وعلم DF والطوابع الزمنية والترتيب الدقيق لخيارات TCP وعلامات لكل نطاق) مع إدارة تلقائية لـ iptables.
MITM (رجل في المنتصف) — اعتراض شفاف لـ HTTPS. يستخدم rcgen لإصدار الشهادات وتوقيعها ديناميكياً أثناء التشغيل، مع تخزينها مؤقتاً عبر moka لتحسين الأداء.
تكامل BoringSSL — يستخدم btls وtokio-btls للتعامل مع مصافحة TLS واعتراض MITM.
انتحال بصمة TLS (JA3/JA4) — مكتمل. يُبنى اتصال TLS الصادر بالكامل من ملف تعريف YAML يُمرَّر عبر -c / --config <path> (انظر config.yaml للاطلاع على التنسيق):
brotli وzlib وzstd) مع دعم حقيقي لفك الضغط.TLS.md للتفاصيل.تفاوض ALPN بأولوية الخادم الصادر — يُنشئ الوكيل اتصال TLS ويتفاوض عليه مع الخادم الصادر قبل إكمال مصافحة TLS من جهة المتصفح. ثم يُستخدم بروتوكول ALPN الذي اختاره الخادم الصادر لتهيئة مستقبِل TLS من جهة العميل، مما يمنع المتصفح من اختيار بروتوكول لا يدعمه الاتصال الصادر.
انتحال بصمة HTTP/2 (Akamai) — أخذ بصمات HTTP/2 قابل للتهيئة بالكامل عبر ملف تعريف YAML:
END_STREAM القابل للتهيئة للطلبات الفارغة.انتحال ترويسات HTTP/1.1 — ترتيب ومحتوى ترويسات قابلان للتهيئة لاتصالات HTTP/1.1 الصادرة العادية (عندما لا يتفاوض ALPN على h2)، بما يعكس نفس دلالات التجاوز/الإزالة المستخدمة في HTTP/2.
انتحال بصمة TCP (الطبقة L4) — مكتمل. تُؤخذ بصمات اتصالات الصادرة على مستوى الحزمة عبر Linux NFQUEUE (src/tcp_fingerprint/):
تصحيح TTL/DF فقط في قائمة انتظار التدفقات القائمة (مدعوم حد قفزات IPv6)؛ يحصل كل حزمة على حكم Accept افتراضيًا حتى لا تتوقف قوائم الانتظار أبدًا.
التوجيه القائم على SO_MARK إلى ملفات تعريف TCP لكل نطاق، وإدارة تلقائية لـ iptables (تُدرج في الأعلى فوق أدوات مثل zapret/nfqws، مع إزالة التكرار، وتُزال عند الإيقاف بـ Ctrl+C) مع أمان --queue-bypass.
راجع TCP.md وكتلة tcp في config.yaml.
دعم وكيل HTTP الوسيط — يمكنه تمرير الاتصالات عبر وكيل HTTP وسيط باستخدام طريقة CONNECT.
توجيه الملفات الشخصية لكل نطاق — مرّر -d / --domain <path> مع خريطة من أنماط النطاقات إلى طبقات جزئية من الملف الشخصي (راجع domain.yaml). تُطابَق كل اتصال بواسطة SNI (مطابق تمامًا → *.root → *.label.* → label.* → الملف الشخصي الأساسي) ويُخدم بإعدادات TCP/TLS/HTTP2/HTTP1/upstream الخاصة به، مبنية مسبقًا مرة واحدة عند بدء التشغيل. يجب تحديد الحقول التي تختلف عن الملف الشخصي الأساسي فقط؛ ويُورَّث كل شيء آخر.
غير متزامن — مبني على tokio لإدخال/إخراج غير متزامن عالي الأداء وغير حاجب.
cap_net_admin,cap_net_raw=+eip (لـ SO_MARK وربط NFQUEUE وiptables التلقائي؛ بدونها اضبط "auto_iptables": false في كتلة tcp وطبّق قواعد mangle يدويًا — راجع TCP.md)يستخدم الوكيل tracing مع تصفية لكل وحدة عبر RUST_LOG.
أمثلة:
RUST_LOG='H2=error' cargo run --release -- -c profile.yaml
RUST_LOG='TCP=debug,H2=error,TLS=warn' cargo run --release -- -c profile.yaml
RUST_LOG='CA=info,TLS=warn,H2=error' cargo run --release -- -c profile.yaml
الوسوم المدعومة هي نفس أسماء الوحدات المستخدمة في الكود: TCP، HTTP، H1، H2، TLS، CA، ECH، CFG، IPT، NFQUEUE، Runtime.
تتضمن أسطر السجل طابعًا زمنيًا افتراضيًا، مما يسهّل ربط جلسات تصحيح الأخطاء ببعضها.
git clone https://github.com/3Radiance/mitm-proxy-ja3-ja4.git
cd mitm-proxy-ja3-ja4
cargo build --release
جميع الإعدادات — المنفذ، والوكيل الوسيط (upstream proxy)، ومسارات ملفات CA — موجودة في إعدادات YAML التي تُمرَّر عبر -c / --config <path>. لا توجد خيارات سطر أوامر --port / --upstream.
config:
port: 9090
upstream_proxy: "127.0.0.1:10808"
cert: "/path/to/ca.crt"
key: "/path/to/ca.key"
للتشغيل دون وكيل وسيط علوي، اضبط upstream_proxy: null.
cargo run --release -- --config profile.yaml
# or
cargo run --release -- -c profile.yaml
عند التشغيل الأول، إذا لم يكن cert/key موجودين بعد، فسيقوم الوكيل بإنشاء ملفات CA في المسارات المُهيأة:
ca.crt — شهادة CA الجذرية. يجب عليك استيرادها إلى Firefox/متصفحك والوثوق بها لتحديد مواقع الويب.ca.key — المفتاح الخاص لـ CA.cargo run --release -- -c profile.yaml -d domain.yaml
domain.yaml يربط أنماط النطاقات بتراكبات جزئية — فقط الحقول التي تختلف عن الملف الشخصي الأساسي:
"browserleaks.com":
config:
upstream_proxy: null
tls:
enable_ech: false
"*.google.com":
tls:
enable_ech: true
"tls.peet.ws":
tcp:
mark: "0x11"
ttl: 100
window_size: 64130
mss: 1400
window_scale: 7
dont_fragment: true
timestamp: false
tcp_options_order:
- mss
- sack_perm
- wscale
- nop
"mail.google.*":
tls:
curves:
- X25519
- P-256