Proxy MITM HTTP configurable en Rust avec usurpation d'empreinte TLS, HTTP/2 et TCP.
Un proxy MITM HTTP construit avec Rust, tokio et btls.
Ce projet a été entièrement réécrit pour tirer parti de btls (BoringSSL) afin d'obtenir des capacités avancées d'empreinte TLS. La couche d'empreinte TLS (JA3/JA4) est désormais entièrement falsifiable — les suites de chiffrement, les courbes, les algorithmes de signature, l'ALPN, la limite de taille d'enregistrement, la compression de certificat, GREASE, la permutation/ordonnancement des extensions, l'agrafage OCSP, la Certificate Transparency (SCT), les tickets de session, ALPS et Encrypted Client Hello (ECH, résolu en direct via DoH, avec repli sur GREASE) sont tous pilotés par un profil YAML. L'empreinte HTTP/2 (Akamai) ainsi que l'ordonnancement/réécriture des en-têtes HTTP/1.1 sont également entièrement configurables. L'empreinte TCP (L4) est aussi opérationnelle : les paquets SYN des connexions amont sont réécrits dans NFQUEUE (TTL, taille de fenêtre, MSS, window scale, drapeau DF, horodatages, ordre exact des options TCP, marques par domaine) avec gestion automatique d'iptables.
MITM (Man-in-the-Middle) — Interception HTTPS transparente. Il utilise rcgen pour émettre et signer dynamiquement des certificats à la volée, en les mettant en cache via moka pour la performance.
Intégration BoringSSL — Utilise btls et tokio-btls pour la gestion de la poignée de main TLS et l'interception MITM.
Falsification d'empreinte TLS (JA3/JA4) — complète. La connexion TLS amont est entièrement construite à partir d'un profil YAML passé via -c / --config <path> (voir config.yaml pour le format) :
brotli, zlib, zstd) avec prise en charge réelle de la décompression.TLS.md pour les détails.Négociation ALPN amont d'abord — Le proxy établit et négocie le TLS avec le serveur amont avant de terminer la poignée de main TLS côté navigateur. L'ALPN sélectionné par le serveur amont est ensuite utilisé pour configurer l'accepteur TLS côté client, empêchant le navigateur de sélectionner un protocole que la connexion amont ne prend pas en charge.
Falsification d'empreinte HTTP/2 (Akamai) — Empreinte HTTP/2 entièrement configurable via le profil YAML :
END_STREAM pour les requêtes vides.Falsification d'en-têtes HTTP/1.1 — Ordre et contenu des en-têtes configurables pour les connexions amont HTTP/1.1 en clair (lorsque l'ALPN ne négocie pas h2), reproduisant la même sémantique de remplacement/suppression que celle utilisée pour HTTP/2.
Falsification d'empreinte TCP (L4) — complète. Les connexions amont sortantes sont empreintées au niveau des paquets via Linux NFQUEUE (src/tcp_fingerprint/) :
Accept par défaut afin que les files ne se bloquent jamais.SO_MARK vers des profils TCP par domaine, gestion automatique d'iptables (inséré en tête au-dessus d'outils comme zapret/nfqws, dédupliqué, supprimé à l'arrêt par Ctrl+C) avec la sécurité --queue-bypass.TCP.md et le bloc tcp dans config.yaml.Prise en charge d'un proxy HTTP amont — Peut relayer les connexions via un proxy HTTP amont grâce à la méthode CONNECT.
Routage de profils par domaine — Passez -d / --domain <path> avec une table de motifs de domaines vers des surcouches partielles de profil (voir domain.yaml). Chaque connexion est mise en correspondance par SNI (exact → *.root → *.label.* → label.* → profil de base) et servie avec ses propres paramètres TCP/TLS/HTTP2/HTTP1/amont, préconstruits une fois au démarrage. Seuls les champs qui diffèrent du profil de base doivent être spécifiés ; tout le reste est hérité.
Asynchrone — Repose sur tokio pour des E/S asynchrones non bloquantes et hautes performances.
cap_net_admin,cap_net_raw=+eip (pour SO_MARK, la liaison NFQUEUE et iptables automatique ; sans cela, définissez "auto_iptables": false dans le bloc tcp et appliquez les règles mangle manuellement — voir TCP.md)Le proxy utilise tracing avec un filtrage par module via RUST_LOG.
Exemples :
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
Les tags pris en charge correspondent aux mêmes noms de modules que ceux utilisés dans le code : TCP, HTTP, H1, H2, TLS, CA, ECH, CFG, IPT, NFQUEUE, Runtime.
Les lignes de journal incluent un horodatage par défaut, ce qui facilite la corrélation des sessions de débogage.
git clone https://github.com/3Radiance/mitm-proxy-ja3-ja4.git
cd mitm-proxy-ja3-ja4
cargo build --release
Tous les paramètres — port, proxy amont et chemins des fichiers CA — se trouvent dans le fichier de configuration YAML transmis via -c / --config <path>. Il n'existe aucune option CLI --port / --upstream.
config:
port: 9090
upstream_proxy: "127.0.0.1:10808"
cert: "/path/to/ca.crt"
key: "/path/to/ca.key"
Pour exécuter sans proxy amont, définissez upstream_proxy: null.