视频教程
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)
import socket
from concurrent.futures import ThreadPoolExecutor
def is_socks_proxy(host, port):
try:
with socket.create_connection((host, port), timeout=2) as s:
s.sendall(b'\x05\x01\x00') # 使用 SOCKS5 协议发送版本号和认证方法
response = s.recv(1024)
if response and response[0] == 5:
print(f"{host}:{port} is socks5")
except Exception as e:
pass
def scan_ports(hosts, ports, num_threads=30):
with ThreadPoolExecutor(max_workers=num_threads) as executor:
for host in hosts:
for port in ports:
executor.submit(is_socks_proxy, host, port)
if __name__ == "__main__":
hosts = ['1.1.1.1', '2.2.2.2']
ports = [7890, 7891, 7892, 7893]
scan_ports(hosts, ports)
mihomo 配置(Clash.Meta)
listeners:
- name: socks-in
type: socks
port: 7891
listen: 127.0.0.1
udp: false
tunnels:
- network: [udp]
address: 127.0.0.1:7891
target: 6.6.6.6:7891
proxy: DIRECT
proxies:
- name: "socks"
type: socks5
server: 127.0.0.1
port: 7891
- name: "hysteria2"
type: hysteria2
server: 1.1.1.1
port: 443
password: 123456
skip-cert-verify: true
dialer-proxy: socks
rules:
- match,DIRECT #直接利用UDP
#- match,hysteria2 #中转利用UDP
视频文稿(忽略)
当你使用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