From 7fce9e9d353eb2963813452d3c2c08f6a7006c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Tue, 4 Feb 2025 15:41:23 +0000 Subject: [PATCH] Add MITM --- MITM-Domain-Fronting/README.md | 15 ++++ MITM-Domain-Fronting/config.jsonc | 120 ++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 MITM-Domain-Fronting/README.md create mode 100644 MITM-Domain-Fronting/config.jsonc diff --git a/MITM-Domain-Fronting/README.md b/MITM-Domain-Fronting/README.md new file mode 100644 index 0000000..8aecd1b --- /dev/null +++ b/MITM-Domain-Fronting/README.md @@ -0,0 +1,15 @@ +# MITM 域前置 + +ray 很久很久就支持 MITM, 这个功能一直被雪藏,所以还是决定对代码小修改之后放出模板。 + +这是个仅客户端模板,作用是对请求进行 MITM 解密 TLS 后重新以假 SNI 发出 TLS 请求,达到强行域前置的目的。这只是一个演示其作用机制的模板,它的作用也不止于此,你单纯用来进行 TLS 卸载供后续程序处理或者把明文数据加密进 TLS 隧道什么的也是一种用法。 + +使用前请确保你足够了解 TLS 和 HTTPS 协议.(至少需要知道 SNI 和 alpn 的工作机制) + +这里的接入方法选择了手动使用 socks5 代理,实际上 socks5 代理只是个把请求劫持到本地任意门入站的方法,实际上你可以用 hosts 或者任何方法把请求劫持到 tag 为 tls-decrypt 的那个入站,都可以满足需求。 + +**请仔细阅读我留下的每一行注释**,有助于你理解工作原理和正确部署。 + +这个东西能工作的前提是该网站**接受域前置或无 SNI 请求,且有 IP 没有被墙**,你可能需要靠扫描或者社区收集寻找这样可用的 SNI 和 IP 集。 + +演示网站我选择了 e-hentai, 主要因为它的前端结构比较简单,只要处理了这个域名别的资源都可以正常加载,其他网站可能还需要处理一些资源域名。 \ No newline at end of file diff --git a/MITM-Domain-Fronting/config.jsonc b/MITM-Domain-Fronting/config.jsonc new file mode 100644 index 0000000..0e5242f --- /dev/null +++ b/MITM-Domain-Fronting/config.jsonc @@ -0,0 +1,120 @@ +{ + "log": { + "loglevel": "debug" + }, + "inbounds": [ + // 请求在该入站中被解密 + { + "port": 4431, + "listen": "127.0.0.1", + "tag": "tls-decrypt", + "protocol": "dokodemo-door", + "settings": { + "network": "tcp", + "followRedirect": true + }, + "streamSettings": { + "security": "tls", + "tlsSettings": { + // 根据实际情况填写,这里适合绝大多数情况,如果你的网站仅支持 http/1.1, 就只保留 http/1.1 + // ps: 如果你选择了 http/1.1 那么你甚至可以用后续的路由模块屏蔽部分路径 + "alpn": [ + "h2", + "http/1.1" + ], + "certificates": [ + { + "usage": "issue", + // 下面的证书和私钥使用 xray tls cert 命令生成,或者你的自签名证书也行 + // 这会生成一个 CA 证书,每个新的要被 MITM 网站请求都会单独用这个 CA 签发一张临时证书 + // 所以你只需要在系统信任这一张证书就可以了,或者你可以忍得了浏览器的红标无视风险继续访问也行 + "certificate": [], + "key": [] + } + ] + } + } + }, + // 真正用到的入站 + { + "port": 10801, + "listen": "127.0.0.1", + "tag": "socks-in", + "protocol": "socks", + "sniffing": { + // 一般情况得开 + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } + } + ], + "outbounds": [ + // 请求在该出站被强行重定向到 tls-decrypt 进行解密 + { + "tag": "redirect-out", + "protocol": "freedom", + "settings": { + "redirect": "127.0.0.1:4431" + } + }, + // 明文请求在这里被重新加密为正常 HTTPS 请求 + { + "tag": "tls-repack", + "protocol": "freedom", + "settings": { + // 你要连接到的服务器的最终IP以及端口,大多数情况下需要手动寻找这样允许域前置的IP + "redirect": "104.20.19.168:443" + }, + "streamSettings": { + "security": "tls", + "tlsSettings": { + // fromMitm 会在客户端发送仅有 alpn http/1.1(大多数时候是wss) 的情况下使用同样的alpn + // 旧版本没这个选项别直接把这玩意发出去了,去从上面复制那个h2+http/1.1复制下来(当然更新版本最好) + "alpn": [ + "fromMitm" + ], + // 你要发送的假 SNI, 根据你的网站接受的 SNI 而定 + // 当然你也可以留空或者我这样乱填个ip, 这样就不会有任何 SNI 扩展被发送,前提是你的网站接受无 SNI 请求 + "serverName": "11.45.1.4", + // 你期望服务端返回证书里的包含的域名,这是新版本选项且要求 utls 启用,如果你手动禁用了 utls 或者是旧版本只能考虑开允许不安全 + "serverNameToVerify": "e-hentai.org" + } + } + }, + // 无辜流量直接放行 + { + "tag": "direct", + "protocol": "freedom" + } + ], + "routing": { + "domainStrategy": "AsIs", + "rules": [ + { + "inboundTag": [ + "tls-decrypt" + ], + "outboundTag": "tls-repack" + }, + { + "inboundTag": [ + "socks-in" + ], + // 你要 mitm 的网址 + "domain": [ + "e-hentai.org" + ], + "outboundTag": "redirect-out" + }, + { + "inboundTag": [ + "socks-in" + ], + "outboundTag": "direct" + } + ] + } +} \ No newline at end of file