背景
在免杀的过程中,分离免杀因为其加载器和shellcode分离的原因让特征不明显,分离免杀成为了现在的主流免杀方式了。
思路
两个脚本,一个负责预处理,一个负责加载。
预处理
加密(shellcode,url,密钥),文件上传并返回下载链接,随机生成加密key
1.读取配置文件,获取secret_id,secret_key,存储桶地址
2.随机生成key
3.使用生成的key将shellcode加密
4.将加密后的shellcode存储到本地txt文件中
4.使用oss的公开api将txt上传到存储桶中,并且返回随机生成的url
5.将url与key写入另一个json文件。
加载器
访问下载链接并提取shellode,解密
1.获取key和url
2.解密url
3.访问url 将加密后的shellcode拉到本地
4.使用key解密shellcode
5.将shellcode加载进内存执行
解析
预处理
首先我们需要去创建一个存储筒,我用的是腾讯云cos存储筒。因为使用的是python语言,所以我们需要按照官方上的sdk教程去调用对象存储功能。
预处理由三个部分组成,分别为读取存储筒文件
,加密手段
,上传文件
三个部分。
1 | def getConfig(): |
加密我采用的是很简单的AES ECB加密。该加密只需要使用一个公钥便可以加解密我们的内容,方便快捷。但是我们需要注意的是,每一次运行都随机生成我们的公钥。
1 | def getIv(): |
上传文件使用的就是官方上简单上传的api,首先把加密后的shellcdoe写成一个名为123.txt
文件,调用api上传该文件至筒中。随后返回一个下载该文件的url。这里可以把该url有效期设置为一小时,防止以后蓝队查到了,但是已经没有效果了。同时对返回回来的url也做了一定程度的加密。
1 | def upload(miwen): |
运行该py文件后,可以见到已经上传至筒中。
同时,预处理文件也会把加密后的url和key写入另外一个json文件用来让加载器进行读写。
1 | #生成存放密钥与url地址的文件 |
加载器
加载器的功能依然有加载配置文件
,解密过程
,加载进内存
的手段
加载配置文件:
1 | # 获取密钥 |
解密过程
1 | def ecbDncrypt(password, text): |
加载进内存
1 | def shellCodeLoad(shellcode): |
结果展示
物理机上是安装的火绒,虚拟机上是安装的360。都可以全过。
可以改进的方向
- 加密使用的是很简单的AES ECB加密,可以使用复杂一些的加密。
- 可以让在执行预处理的阶段,使用pyinstaller来自动编译加载器,避免手动用命令行来做。
- 可以把加载器改为接受传参式。这样就可以避免要考两个文件上别人主机的尴尬情况。