本文由 简悦 SimpRead 转码, 原文地址 bulianglin.com
视频教程 youtube 播放地址:https://youtu.be/IU2cfu08ky0 查询你的公网 IP:https://www.ip138.com 检测端口是否开放:https://mtool….
不良林 • 2024 年 05 月 09 日
视频教程
youtube 播放地址:https://youtu.be/IU2cfu08ky0
查询你的公网 IP:https://www.ip138.com
检测端口是否开放:https://mtool.chinaz.com/port
相关讨论:https://github.com/v2fly/v2fly-github-io/issues/104
自用专线机场推荐: https://b.880805.xyz
GIA 线路 VPS 推荐: https://w.880805.xyz
流量中转平台推荐: https://g.880805.xyz
相关指令
shodan
搜索 x-ui:http.html:assets/qs/qs.min.js
shodan
搜索中国区 clash:http.html_hash:-121906438 country:CN
检测 socks5 代理(python)
mihomo 配置(Clash.Meta)
视频文稿(忽略)
当你使用 v2ray、xray 或者 clash 进行科学上网的时候,有可能已经成为别人的中转服务器了,不怀好意的黑客可以利用你的 IP 做跳板干坏事,本期就来聊聊 v2ray、xray、clash 都存在的安全风险
很多朋友在进行科学上网的时候,会将 socks 代理暴露在公网上,比如软路由用户要进行远程访问,或者电脑直接拨号在 DMZ 区域,以及在 vps 上使用 xui 搭建 socks 节点等行为,很多小白用户跟着网上的教程配置好科学上网之后,并不知道自己的 socks 代理已经暴露在公网,而有经验的用户知道暴露在公网,但给 socks 设置了密码认证,以为万事大吉,殊不知 socks 的认证可以轻松绕过,导致节点被人白嫖或者变成别人的中转跳板机
在解释这个问题之前我们先来演示一下利用之后的效果,事先声明,本教程仅供学习交流,视频中的演示均为实验环境,禁止任何公网环境的扫描利用活动
访问这条链接,我们可以获取到中国区暴露在公网的 clash 用户,搜索到了将近 5000 条结果,如果用 fofa 的话搜索结果会更多,这里可以看到地区分布,最多的是深圳,然后是上海,北京,随便访问一个,返回内容是未通过 clash 授权的 api 页面,说明这个用户的 clash 暴露在公网上,但开启了 api 鉴权,列表里其他的搜索结果也都是这种情况,通过一些手段,我获取了其中一部分 ip,接着使用 python 脚本简单扫描 openclash 的默认 socks 端口 7891,可以轻易获取到一堆符合条件的 ip,如果全端口扫描的话结果会更多,这些 ip 大部分都能被利用 (有些甚至没有开启密码认证),接着使用这段配置来运行 mihomo,mihomo 也就是 clash.meta,现在改名了,为了便于理解,以下我们还是把它叫做 clash,先不用管这些配置是什么意思,随便复制一个刚扫描出来的 ip,把 target 替换掉,保存配置,然后运行 clash,现在 clash 收到的所有 udp 数据将会发给这个 ip 地址的 7891 端口,可以通过 nat 检测工具来观察这一现象,该软件设置的代理是 7891 端口,也就是说这个软件的 udp 数据会发给 clash,点击 test 尝试连接,不通可以多尝试几次,多次尝试不通的话,大概率是对方使用的节点不支持 udp,换一个再试试,重新运行 clash,再次尝试连接,可以看到这里返回了一个 103 开头的 ip,这个既不是我的 ip,也不是对方 113 开头的 ip,而是对方当前 clash 使用的节点 ip,简单验证一下 ip 的归属地,是香港的节点,用同样的方法再来测试几个,显示了一个 103 开头的 ip,说明这个 117 的用户正在使用 103 的节点进行科学上网,并且这个节点的 udp 是通的,同样是香港的节点,这个用户使用的是日本的节点
现在的情况相当我电脑的 udp 数据可以直接让别人家里的 clash 帮我代理,即使别人的 clash 开启了 api 鉴权,socks 也开启了密码认证,都可以被直接绕过
造成这个问题的原因是 v2ray 系和 clash 系的 socks 协议没有按照 rfc 的规范来实现
这里简单讲讲 socks 协议的代理流程,假设电脑开启了 v2ray 或者 clash,并且开启了 socks 代理以及 socks 密码认证,端口为 7890,浏览器访问谷歌的 tcp 请求会交给 clash 的 7890 端口,由于开启了密码认证,clash 会询问 socks 的账号密码,假设浏览器支持 socks 的密码认证,并且设置了正确的账号密码,会将账号密码发给 clash,clash 验证通过,然后帮我们代理访问谷歌,再假设浏览器通过 udp 访问谷歌,由于 socks 的 udp 本身是没有认证机制的,所以需要借助 tcp 完成认证,浏览器会先和 clash 的 7890 端口建立 tcp 的 socks 连接,clash 同样会询问 socks 的账号密码,浏览器将账号密码发给 clash,此时就是关键步骤,按照 rfc 的规范,socks 验证通过后,会随机监听一个空闲的 udp 端口发送给浏览器,假设为 6666,浏览器会将 udp 数据发给这个随机的 6666 端口,让其帮忙代理,6666 端口是 clash 开启的,所以 clash 收到数据后,会帮我们代理 udp 数据,但 v2ray 和 clash 的 socks 并没有按照 rfc 的标准实现 udp,端口并不是随机的,而是固定和 tcp 的端口一样,比如 tcp 的 socks 端口是 7890,那么 udp 的 socks 端口也是 7890,这是一个非常省事的做法,如果只是在本机使用的话确实没有什么问题,问题出在公网环境,假设你的电脑或者软路由暴露在公网环境,socks 代理也暴露在公网环境,我通过刚才演示的扫描获取到了你的 ip 地址以及 socks 端口,此时我并不知道你的 socks 账号密码,但你的 udp 是不需要认证的,所以我只需要在我的电脑上使用 clash 开启 socks 代理,当我电脑想通过 udp 访问谷歌的时候,请求来到 clash,我可以让 clash 将我电脑的 udp 请求直接转发到你的 clash,由于 udp 并没有认证机制,所以你的 clash 会乖乖代理我的 udp 数据,这样就绕过了 tcp 的认证可以直接代理 udp 数据了。
clash 和 v2ray 都存在这种问题,以及衍生的 xray 和 clash.meta 也都继承了这个问题,而 singbox 是按标准的 rfc 规范实现的 socks 代理,每次连接 udp 都会开一个随机端口,所以不存在这个问题。
其实早在 3 年前这个问题就已经讨论过了,但一直没有解决,或许是开发者们并没有意识到很多人会直接将本地的 socks 代理暴露在公网环境,尤其是软路由流行之后,大部分人都不知道自己暴露了
另外这里说他是漏洞,对此我不敢苟同,这怎么会是漏洞呢?你只要把家里的网线拔了别人不就没法利用了,被利用都是用户自己配置的问题, 况且你见过 3 年不修的漏洞吗?所以这不是漏洞,is feature
现在可以来讲讲这个 clash.meta 的配置文件了,clash 在 7891 端口开启了 socks 代理,为了防止 udp 端口被占用,将 udp 设置为 false 关闭,然后在下面的 tunnel 里监听 udp 的 7891 端口,将该端口收到的数据全都通过直连转发到 target 目标 ip 和端口,当 clash 从 tcp 的 7891 端口收到 socks 的认证信息后,clash 会将 udp 的 7891 端口返回给浏览器,浏览器会将 udp 数据发给 udp 的 7891 端口,而 udp 的 7891 端口收到的数据会被 clash 转交给 target,这样就实现了我们刚才演示的效果,udp 跑到别人家的 clash 上去了
单单只能利用 udp 的话用处并不大,除了游戏以及部分使用 quic 的网页外,目前互联网上大部分流量都是 tcp,但我们可以间接利用他的 udp 来中转纯 udp 的代理协议,实现跳板的效果,比如 hy2 协议就是基于 udp 的,忽略 hy2 本身可以提速的特点,如果你家的 udp 对我来说速度不错,那就可以用来中转加速我的节点,还能防止我的节点被墙
这个 clash 配置中还创建了两个节点,一个 socks 节点,一个是 hy2 节点,hy2 节点的数据会交给 socks 节点代理,而 socks 节点其实就是本机的 7891 端口,由于 hy2 是纯 udp 数据,所以数据都会交给 7891 的 udp 端口,而 7891 的 udp 端口收到数据后,会直接转发给 target,也就是别人家的 clash,这样就实现了中转 hy2,
首先我在这台 vps 上搭建了 hy2 节点,流控用的是 bbr,怎么搭建可以回看这期视频,hy2 本身就有提速效果,我们这里主要是介绍利用方法,中转之后效果可能还不如直连,将分流规则改成发给 hy2 节点,重新运行 clash,udp 数据还是直接发给别人的 clash,接着浏览器开启代理,浏览器所有数据将会发给 clash,而 clash 会发给 hy2 节点,hy2 节点再将数据发给别人家的 clash,实现中转跳板的效果
另外我见过很多人使用 xui 搭建 socks,可以通过这条链接搜索 xui 面板,有 4w 多条结果,由于 xui 搭建节点都是随机端口,一个个扫的话显然不科学,一般都是按 asn 和地区过滤,比如价值比较高的搬瓦工香港 cn2gia 线路,600 多一个月的线路被人扫到的话就会被当成游戏加速器了
而有些用户使用 xui 搭建 socks 节点后,可能 vps 速度不理想,还会再使用中转来加速 socks 代理,但他们忽略了中转会绕过 udp 的流量,因为根据刚才的讲解,socks 代理会直接返回本机 ip 作为 udp 的入口,所以你的 udp 流量根本没有经过中转,而是直接发给了 vps,我之前的视频中也提醒过大家不要用来中转 socks 协议,不仅 udp 会被绕过起不到中转加速的效果,还会被人利用
假设现在我创建一条中转,准备用来加速游戏,所以选择最贵的阿里专线,倍率为 240 倍,这里的可用端口是 1w 到 5w,我这里视频演示就随便填一个目标地址,点击确定,我的目的仅仅是为了拿到这个专线入口的 ip 地址,另外这里分配给我的随机端口是 44569,接着使用 nmap 对这个 ip 进行扫描,获取开放的端口,端口范围是 1w-5w,可以看到开放了很多端口,包括我刚才创建的 44569,接着用同样的方法扫描这些端口看看哪些是 socks 代理,有了 ip 和端口,又知道他是 socks 代理,如果他用的是 v2ray 或者 xray 搭建的 socks,那么就可以白嫖这条 240 倍的阿里专线了,随便尝试一个,运行 clash,尝试连接,成功获取到了落地 ip,现在我们是通过阿里专线中转访问对方的 vps,这个 vps 的归属地为香港,并且可以用来加速中转我们的 hy2 节点,消耗的 240 倍流量将会算在别人的头上
再次强调,以上演示均为实验环境,目的在于让大家了解被利用后的具体危害
最后再来讲讲怎么确认自己的 socks 代理已经暴露在公网,首先访问这个网址获取运营商分配给你的公网 ip,如果检测到的是节点 ip,需要先关闭翻墙软件,然后打开这个端口扫描的网站,将你的公网 ip 填入这里,下面填写你的 socks 代理端口,比如你用的是 v2rayN,那么默认的 socks 端口是 10810,clash for windows 的话默认是 7890,openclash 默认是 7891 和 7893,具体以你使用的软件为准,然后点击查询,如果多次查询后这里显示关闭,说明你目前不存在这个问题,不用太担心
如果显示开启,说明你的 socks 代理已经暴露在公网了,大概率可以被别人利用,对于这种情况你需要修改防火墙配置,软路由用户进入网络下的防火墙设置,将 wan 区域的入站改为拒绝,然后保存应用就可以解决了,再重新扫描端口的话应该就是关闭状态,但这样做会影响你的其他需要公网访问的服务,因为你改为接受的目的应该就是为了公网访问,所以我们可以通过规则只屏蔽 socks 端口,进入通信规则,点击添加,随便给个名称,你可以单独选择只屏蔽 udp 流量,或者 tcp 和 udp 都屏蔽,源区域设置为 wan,目标端口填写 socks 端口,有多个的话用空格隔开,操作改为拒绝,点击保存,最后点击保存并应用,再重新扫描端口的话应该就是关闭状态,你自己也无法在公网连接家里的 socks 代理了,但你的其他公网服务是可以正常访问的。另外如果是你通过端口转发的方式开放端口到公网,建议只开放 tcp 端口,或者直接关闭 socks 的端口转发
如果你是用 v2rayN 或者 clash for windows 这种桌面客户端,出现这种情况的概率很小,除非电脑是直接拨号或者放在 DMZ 区域,就会出现被人强制疯狂连接的情况,这种小概率事件就不讲了,如果你确实遇到了请自行谷歌搜索怎么配置系统防火墙
另外对于 xui 的用户肯定是暴露在公网了,所以不建议搭建 socks 代理,如果你有非搭建不可的原因,建议不要开启 udp,但如果你又非要用到 udp 的话,那就自求多福吧,当然还有一个最简单彻底的办法,换 singbox