V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mikewang
V2EX  ›  信息安全

代理检测:在线检测您是否在使用 Clash

  mikewang · 72 天前 · 24815 次点击
这是一个创建于 72 天前的主题,其中的信息可能已经有所发展或是发生改变。

ClashScan

(推荐使用最新 Chrome 内核浏览器) https://mikewang000000.github.io/ClashScan/

代码开源在 GitHub ,页面部署在 GitHub Pages 上。


Clash 是一个比较常见的代理软件,有很多衍生版本和 GUI 程序。
不过我最近才发现它是允许 CORS (跨域)的,这带来了不小的安全隐患。

再加上很多 GUI 默认不加 Secret 进行身份验证,即使运行在 127.0.0.1 ,也能被外部网站随时调用。

如果您没有修改默认配置,值得检测一次。


  • 默认配置下容易检测的:Clash Verge / Clash Verge Rev / ClashX / ClashX Pro / ClashX Meta
  • 默认配置下相对安全的:最新的 Clash for Windows / Clash Nyanpasu
第 1 条附言  ·  34 天前

附:检测工具的原理 /t/1076961

153 条回复    2024-11-05 19:18:54 +08:00
1  2  
yyzh
    1
yyzh  
   72 天前 via Android
在手机上不能用?没看见有按钮
ByteCat
    2
ByteCat  
   72 天前
好慢的扫描
Configuration
    3
Configuration  
   72 天前   ❤️ 1
探测 127.0.0.1 的,循环端口。。。scannedPorts++; 难怪这么慢
GeekGao
    4
GeekGao  
   72 天前
确实是个大问题
yanyao233
    5
yanyao233  
   72 天前   ❤️ 1
草,这确实有点危险了
mikewang
    6
mikewang  
OP
   72 天前
@yyzh 手机端不用扫了(检测电脑端的

@Configuration @ByteCat
实际上常用端口排在最前面的,十秒内没扫到基本上是安全的。
后面虽然会扫整个 65535 ,实际因为浏览器性能低,而且会漏,作用不大。只是作为理论参考。
oneisall8955
    7
oneisall8955  
   72 天前
openclash 透明代理没有检测到
mikewang
    8
mikewang  
OP
   72 天前
@oneisall8955 透明代理等不在 127.0.0.1 上的不会检测到。本质是探测 Clash 在本机的 API 端口。
lower
    9
lower  
   72 天前
太慢了,懒得等了
ffnil
    10
ffnil  
   72 天前
这 Chrome 为啥不阻止网站访问 127.0.0.1
chinni
    11
chinni  
   72 天前
哦扫描本地端口啊 我代理都是在局域网的.. 电脑上啥都没装(
leilinJune
    12
leilinJune  
   72 天前
应该改什么配置
yjxjn
    13
yjxjn  
   72 天前
那怎么避免呢???如何修改默认配置?
s4d
    14
s4d  
   72 天前
有点吓人哦,怎么把我服务器的配置给读出来了?什么原理?
epiphyllum
    15
epiphyllum  
   72 天前
一个解决方法:使用 NoScript 浏览器扩展屏蔽网页对本地网络发起的请求
asuraa
    16
asuraa  
   72 天前
路由上跑的,检测不到
mikewang
    17
mikewang  
OP
   72 天前   ❤️ 1
@leilinJune @yjxjn @s4d 原理是默认端口,并且 API 没有上密码,就被读了。

在 yaml 里面,修改下面两个配置:

external-controller: '127.0.0.1:9090'
secret: 'xxxxxxx'

把 7890 改成随机高位端口,避免扫描; secret 改为随机密码(如果没有这个配置手动加上)。

---

如果被检测并读出服务器配置了,那么你之前可能一直在裸奔(
gzlock
    18
gzlock  
   72 天前   ❤️ 7
1 clash 核心默认打开外部控制功能
2 clash 核心的外部控制功能就是允许跨域的(不然无法使用第三方的外部控制功能 GUI
3 @ffnil 浏览器必然是允许第三方网站读取局域网 ip 资源的
4 @s4d 设置外部控制功能的密钥

其实让这些软件提供个开关切换 启用 / 禁用外部控制功能 即可解决这个问题,楼主的项目正好引发了这个需求
mikewang
    19
mikewang  
OP
   72 天前
#10 @ffnil > 这 Chrome 为啥不阻止网站访问 127.0.0.1

一个是本地调试很多都是在 127.0.0.1 ,另外就是向 QQ 一键登录等功能实际上也是在 127.0.0.1 上的,不过它的接口有鉴权。
ewiglicht
    20
ewiglicht  
   72 天前
不是很懂这个原理,不过我的没扫描出来。PC 本地跑 tun 模式。
LandCruiser
    21
LandCruiser  
   72 天前
@s4d clash 的 gui 你点击打开,相当于在本机运行了一个程序在 127.0.0.1 的某个端口,知道一些 clash 的内部接口,比如获取节点的,然后调用这个接口可以了。
http://127.0.0.1:9097/proxies 比如这个接口,就可以获取 clash 的所有代理节点
gzlock
    22
gzlock  
   72 天前
诸君,刚刚实测把外部控制端口设置为 0 ,即可解决这个问题,clash verge rev 提供的第三方 webui 也无法访问到 clash 核心的数据了

代理功能依然可用,但不确定这些 gui 软件是不是也使用外部控制来控制 clash 核心的,所以把这个信息发出来让大家参与找出 [把外部控制端口设置为 0] 会不会引起其它问题
katsusan
    23
katsusan  
   72 天前
我看了目前在用的机场给 clash 下发的配置都开了这个 external-controller 还是用的默认 9090 端口没加鉴权,
这么大个漏洞居然现在才发现( ╯□╰ )
gzlock
    24
gzlock  
   72 天前
@gzlock #22 好吧,初始阶段没有找到后我就发表了以上回复,但是后续缓慢扫描阶段还是读取出在使用 clash ,上面那个回复当我没发😂😂
gzlock
    25
gzlock  
   72 天前
@gzlock #24 原因:设置 0 端口后,clash 核心就使用随机端口作为外部控制端口了
Goooooos
    26
Goooooos  
   72 天前
127.0.0.1 的还好
openclash 那个如果不是 127.0.0.1 的才危险
chesha1
    27
chesha1  
   72 天前
这速度也太慢了
ochatokori
    28
ochatokori  
   72 天前 via Android
再加个把常见网关地址都扫了
LandCruiser
    29
LandCruiser  
   72 天前
其实我觉得问题不大,上上外网又不是什么杀头的罪,真要较真,运营商那什么都能查到。
ewiglicht
    30
ewiglicht  
   72 天前
貌似原理是循环请求?
因为默认配置无加密,所以请求成功了就知道用户使用了代理软件,甚至根据 api 获取完整配置信息。
因为我修改了控制台的密码,所以检测不出来。
但是我记得如果有密码,HTTP 的响应好像是 403 还是什么来着,而不是无响应,能不能也根据这个判断是否使用了代理类软件。。。
Ashore
    31
Ashore  
   72 天前 via Android
用手机 chrome 请求电脑版网页,能检测出来。。
mikewang
    32
mikewang  
OP
   72 天前
@ewiglicht 是的,加了密码也能扫出来。不过浏览器扫效率太低了,您看上面有很多说慢的(
另外连接数高了也会失败(漏掉)。所以加密码和高端口算是安全的。
mikewang
    33
mikewang  
OP
   72 天前
@Ashore 手机版 Clash 也能读出来吗(捂脸)
出乎意料了。按钮问题是主题设计的,我有空改下。
llsquaer
    34
llsquaer  
   72 天前
这么说本机加个防火墙是不是就好了?
lekai63
    35
lekai63  
   72 天前
所以感觉不是改 7890 端口。而是 external 相关配置咯,端口和 secret
mikewang
    36
mikewang  
OP
   72 天前
#17 @mikewang
#23 @lekai63

是的。我 #17 写的 external-controller 默认应该是 9090 。最好 7890 和 9090 两个一起改了。浏览器一定条件下也能检测 7890 端口的情况,不过读不到东西。
czfy
    37
czfy  
   72 天前
感觉和好久之前提过的这个情况类似?不过看起来是没什么人重视
https://www.v2ex.com/t/946991
nyxsonsleep
    38
nyxsonsleep  
   72 天前   ❤️ 1
把 web 控制直接改成其他地址就行了,比如 127.0.0.2 ,关掉这个控制功能。

没密钥的控制端口,来点漏洞都可以注入攻击了。
mouyase
    39
mouyase  
   72 天前
还以为是什么高端的骚操作,原来只是扫本机的 clash 的 webui 和 proxy 端口……
jqtmviyu
    40
jqtmviyu  
   72 天前
singbox 没扫出来.
其实把常见的客户端端口 9090 9999 之类的扫一扫就行了
crackidz
    41
crackidz  
   72 天前
现在还有一个问题是 Clash Verge Rev 之类的 GUI 客户端覆写了这部分设置,secret 没有生效。你需要去 GUI 界面的设置里调整一下对应的 WebUI 设置。
0o0O0o0O0o
    42
0o0O0o0O0o  
   72 天前
1. 本站曾经有人提醒过 /t/946991 ,我可能也在一些回复里提醒过
2. 想跑题联动一下近期的一个热门帖 /t/1075187 ,不知道有没有哪些朋友看那个帖子 OP 和 @4KMOMhIkocgLELMt 提到的安全隐患觉得不以为然,然而在这个帖子一测试又觉得有被吓到😂
addenvex
    43
addenvex  
   72 天前
我加了 secret ,接口是 401, 也认为我使用了吗

wniming
    44
wniming  
   72 天前
不准,我没用 clash 也能检测成 clash
mikewang
    45
mikewang  
OP
   72 天前   ❤️ 1
#43 @addenvex 是的,即使有密码,返回 401 也能检测到。
请求记录里这些接口会返回 401 ,然后你访问一些其他的路径会返回 404 。通过这些接口路径特征,能推断出 Clash 及其版本号。

#44 @wniming 有一定的推断逻辑在里面,可能你的环境刚好命中特征了。会有误报的可能。
loveqianool
    46
loveqianool  
   72 天前 via Android   ❤️ 1
http://sing-box.sagernet.org/zh/configuration/experimental/clash-api

access_control_allow_origin

自 sing-box 1.10.0 起

允许的 CORS 来源,默认使用 *。

要从公共网站访问私有网络上的 Clash API ,必须在 access_control_allow_origin 中明确指定它而不是使用 *。
access_control_allow_private_network

自 sing-box 1.10.0 起

允许从私有网络访问。

要从公共网站访问私有网络上的 Clash API ,必须启用 access_control_allow_private_network 。
ko20
    47
ko20  
   72 天前
我用的局域网当中的某台机器部署的 clash 暴露出来的 http/https/socks5 代理,然后使用 switchy omega 插件添加 socks5 proxy profile 的。没有检测到 clash
RyougiShiki
    48
RyougiShiki  
   72 天前   ❤️ 1
检测到了,订阅信息都出来了。
ziseyinzi
    49
ziseyinzi  
   72 天前
再加几个常用的路由/旁路由网关地址
shitshit666
    50
shitshit666  
   72 天前
是时候写个蜜罐了,看看是谁偷偷检测了 clash
TossPig
    51
TossPig  
   72 天前
我还以为能扫到我旁路由上的 clash ,结果啥都没监测到
proxytoworld
    52
proxytoworld  
   72 天前
@shitshit666 蜜罐已经自动化利用 cfw 漏洞了...更别说扫描 clash 端口
vvhy
    53
vvhy  
   72 天前
firefox 上被 uBlock Origin 拦截了,关了 ub 之后也被 CORS 拦截了
不会真有人不加密码跑在公网上吧 https://en.fofa.info/result?qbase64=ImV4dGVybmFsLWNvbnRyb2xsZXI6IDkwOTAi
kenvix
    54
kenvix  
   72 天前
TLDR:
如果没开管理端口 secret ,会直接扫出正在打开的网站和节点名称和地址信息
开了 secret 能知道你在用,但无法获取隐私信息
hoofei
    55
hoofei  
   72 天前   ❤️ 1
被检测到了
Xu3Xan89YsA7oP64
    56
Xu3Xan89YsA7oP64  
   72 天前   ❤️ 1
能不能用外行也能看懂的话来描述一下,到底有什么风险?
YCCD
    57
YCCD  
   72 天前
![img]( )
liuzimin
    58
liuzimin  
   72 天前 via Android
你们说的什么外部控制端口?在哪里设置?我只知道 7890 那个。
mikewang
    59
mikewang  
OP
   72 天前   ❤️ 3
#56 @shizhibuyu2023

部分 clash 客户端,默认配置下(默认端口,无密码验证):

1. 即使 clash 端口不暴露外部,运行在本地,外部网站也能通过网页调用,读取或者修改 clash 配置;
2. 如果是老版本 clash 核心,利用这种方法,还可以配合( CVE-2023-24205 )漏洞,控制整台电脑。

如果加了密码,但保持默认端口:

1. 外部网站也能通过网页调用,根据不同的报错情况,推断出你在使用 clash 。

================

#57 @YCCD

好的反馈!我在 macOS Safari 上测试了一下,Safari 不允许从 https 页面上发起 http 请求。
所以是检测不到的。但是如果 GitHub Pages 是 http 的,那就可以调用了。
mikewang
    60
mikewang  
OP
   72 天前
#58 @liuzimin 说的是 9090 的 api 端口,verge 默认是 9097 。
venompool88
    61
venompool88  
   72 天前
配置文件里设置 secret 还没用,要在设置里添加才行,订阅拉取的配置文件被软件覆盖掉了
adsltsee94
    62
adsltsee94  
   72 天前
被检测到了,要怎么搞?
WhatTheBridgeSay
    63
WhatTheBridgeSay  
   72 天前   ❤️ 3
打开控制台发现全被 uBlock Orign 拦截了
WhatTheBridgeSay
    64
WhatTheBridgeSay  
   72 天前
建议在检测页上稍微写一点技术原理,比如这个页面仅仅是通过扫描 127.0.0.1 、遍历端口号的方式查找 clash 及其衍生分支所使用的 external-controller 来确认是否正在使用 clash 。

而不是仅神秘兮兮一句”任何网站都能检测您是否正在使用 Clash 。“,这种表述只会给不明所以的吃瓜群众带来不必要恐慌。

很多情况都会影响判断结果,并且也不一定会造成实际危害。比如 uBlock 之类的拦截器订阅了 Block Outsider Intrusion into LAN 之类的规则,或者干脆浏览器安全策略就直接禁止 FQDN 网站向私有 IP 发起网络请求,并且还有可能各种 GUI 面板给 external-controller 设置了随机密码等等等等实际完全没有危害的情况。
y1y1
    65
y1y1  
   72 天前 via iPhone
跨域不被挡吗?
LeoAshton
    66
LeoAshton  
   71 天前   ❤️ 1
算是挺恶性的漏洞了,clash-verge-rev 默认情况下不设置 secret 是没想到的,建议开个 issue 跟开发者反馈一下
yjxjn
    67
yjxjn  
   71 天前
@gzlock #25 我改成 0 ,并且把密码设置了,貌似可以了。
ltkun
    68
ltkun  
   71 天前
扫描了一个小时 50% 虽然我不用 clash 哈
yexian
    69
yexian  
   71 天前
最新的 Clash for Windows ?什么时候更新了,我还在用很早的版本
gzeng17291
    70
gzeng17291  
   71 天前
把 clash api 的端口给 block 就监测不出了
jhiiii
    71
jhiiii  
   71 天前
还好还好
katana97
    72
katana97  
   71 天前
未发现 Clash,但我是用了的,而且就在 127.0.0.1:7893
blacklinux
    73
blacklinux  
   71 天前
测了一下,无法发现
linux 环境,Clash 在 windows 里,两台物理机
ZeroDu
    74
ZeroDu  
   71 天前
这个被人讲出来有一年了吧,建议还是注明一下。不然以为又是啥大新闻
JingHG
    75
JingHG  
   71 天前
半小时了还在 70%
xxxxxyz
    76
xxxxxyz  
   71 天前
(还用过 op 写的抢座哈哈哈
ZeroDu
    77
ZeroDu  
   71 天前
marc2017
    78
marc2017  
   71 天前
感谢提醒,设了密码好了,不然点订阅节点都给我干出来了。
ihciah
    79
ihciah  
   71 天前
我记得以前某个客户端,api 甚至默认监听 0.0.0.0 ,局域网内即可直接拿到配置信息
asdjgfr
    80
asdjgfr  
   71 天前
clash-verge-rev 默认配置确实被扫到了服务器的配置,必须要在设置里手动设置外部控制器的配置才行,感谢楼主分享
gengGui
    81
gengGui  
   71 天前
还没尝试检测,看了一下 Clash X 设置,包含了这些配置项:
- 代理端口:7890 、
- Api 端口:9090 ,允许局域网控制(不推荐):未勾选、
- Api 密钥:已设置,覆盖配置文件设置:未勾选
为了安全些,是不是要修改默认端口号,更新 Api 密钥,勾选覆盖配置文件设置这些。
clf
    82
clf  
   71 天前
127.0.0.2 就扫不到了。
vishun
    83
vishun  
   71 天前
@nyxsonsleep #38 目前这个程序是扫描'127.0.0.1',如果其他程序设置扫描'127.0.1.2'是不是还是能扫描到?
vishun
    84
vishun  
   71 天前
@WhatTheBridgeSay #64 原理写不写倒是无太关紧要,最好是能将解决方法维护上,方便让大家修改。
nyxsonsleep
    85
nyxsonsleep  
   71 天前
@vishun #83 可以。所以我说了《比如 127.0.0.2 》,一定要设置可以自己高位的 ip ,不在本地的 ip 。也可以自己去改源码,编译,彻底关掉这个功能。
nyxsonsleep
    86
nyxsonsleep  
   71 天前   ❤️ 1
目前看到的风险主要是钓鱼网站可以通过这个手段偷机场代理。如果 clash 被发现漏洞可以提权抓肉鸡。
opengps
    87
opengps  
   71 天前
这部很原始的穷举本地所有端口方式
SenLief
    88
SenLief  
   71 天前
你们都是有公网 ip 的吗
mikewang
    89
mikewang  
OP
   71 天前 via iPhone   ❤️ 2
@ZeroDu
也不完全一样,做了一些加强。

这次想说明,即使改成 127.0.0.1 ,加密码不改端口号,也能通过路径探测到 clash (虽然获取不到节点信息,但是能知道你在用。)当然不加密码更是直接读配置。

———
@y1y1

之所以能成功跨域,是因为 clash 内核的 header 设置了 Access-Control-Allow-Origin: *,相当于解除浏览器跨域限制,欢迎大家来访问。
不过还有一些浏览器像 Safari 限制更严格,https 不能跨域到 http 被拦截,还有一些隐私插件会拦截,所以不是 100%保证成功。

这次做的比较匆忙,是一个粗糙的 demo ,没有太大技术含量。只是为了证明 CORS 的设置不合理,应有配置能默认关闭。

———
@WhatTheBridgeSay

网页“任何网站都能检测”是对 Access-Control-Allow-Origin: *的解释,通配符允许了所有网站。不过确实不够严谨,因为可能还会遇到其他限制。

时间原因,没法做到面面俱到。网页就在 GitHub 上,如果有好的建议欢迎直接提 PR ~

———
对于端口扫描,正常情况下浏览器前端是没法对本地端口扫描的。Access-Control-Allow-Origin: *导致有被扫到的风险。就是这样。
mikewang
    90
mikewang  
OP
   71 天前 via iPhone   ❤️ 2
@SenLief 这次说明的不是公网问题。而是 Clash 的 CORS 设定不合理,可以通过浏览器前端,让浏览器扫到你 127.0.0.1 上的端口,借浏览器跨域控制 clash 。
wcwac
    91
wcwac  
   71 天前
@nyxsonsleep 直接修改你的代理配置搞中间人攻击也很可怕吧
vitovan
    92
vitovan  
   71 天前
@mikewang #90 感谢楼主。
huangzhiyia
    93
huangzhiyia  
   71 天前
提了个提升 128 倍速度的 PR
huangzhiyia
    94
huangzhiyia  
   71 天前   ❤️ 2
128 倍扫描速度的体验地址: https://zmaplex.github.io/ClashScan/
PositionZero
    95
PositionZero  
   71 天前
Clash Verge Rev 好像是默认覆盖配置文件里的 external-controller 字段的 ……?确实是个安全问题
lvlongxiang199
    96
lvlongxiang199  
   71 天前
自从 clash 爆出远程代码执行漏洞后, 就把它关在 docker 里的
Felldeadbird
    97
Felldeadbird  
   71 天前
卧槽。马上改。
SiuRayyy
    98
SiuRayyy  
   71 天前
所以这个问题应该怎么解?
wind1986
    99
wind1986  
   71 天前
@ffnil 最新版好像会限制访问本地网站
idou
    100
idou  
   71 天前
谢谢提醒
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1226 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 23:47 · PVG 07:47 · LAX 15:47 · JFK 18:47
Developed with CodeLauncher
♥ Do have faith in what you're doing.