一
前言
尝试对Mimikatz进行免杀,提取Mimikatz的shellcode,然后使用免杀的加载器进行加载,用加载器在加载cs shellcode时免杀效果挺好,但在加载Mimikatz的shellcode发现直接被360、defender等静态查杀了,VT上报毒也很高,于是尝试找出问题并进行免杀。
二
效果图
VT查杀:
过360、火绒:
过defender静态加动态:
使用卡巴扫描的时候被查杀了:
猜测是编译器的问题,编译时使用的vs141 xp编译器,换回vs142编译器不报毒了,但是意义不大,卡巴对密码有保护,无法获取到密码,而且不时弹出已阻止:
三
免杀
由于Mimikatz的大小1.4MB,转换成shellcode后shellcode的大小也接近1.4MB,相比CS的1KB,大了上千倍,而且我们对shellcode进行了加密,这就有了一个不能忽视的因素——熵值。
许多杀软对未知的二进制文件进行评估时都会考虑熵值,熵值越高,越容易被认为是恶意文件。当对CS进行加密后,正常的文本字符通常集中在0-127的ascii码范围,加密后多了非常多的处在128-255的字符以及很多的不可见字符,但CS的shellcode非常小,加密后熵值增高了也很难被杀软注意到;到了Mimikatz上就不同了,Mimikatz的shellcode大小1.4MB,很难不被杀软注意到,即使加密了shellcode,由于熵值太高,导致VT报毒很高。
常见的减少熵值的办法有:
- 图像法:添加一些熵值较低的资源到二进制中,比如说图像。
- 字符串法:在加密后的shellcode中插入字符串,如一些英文单词、路径等。
1. 图像法减少熵值
在网上没有找到将shellcode封装进图片的代码,自己写又太麻烦,而且不知道免杀效果如何,如果花费大力气写出来发现免杀效果不好不是白忙活了吗?
于是我先进行了实验,在exe资源中存放一张大小差不多的正常的图像,上传VT测试,发现报毒并没有降低,于是将该方法pass掉。
2. 字符串法减少熵值
我尝试了两种方式的字符串法减少熵值:
- 方式一:直接插入字符串。
- 方式二:直接将shellcode转换成可见字符串。
无论使用哪一种方式,都会使最终的字符串变大。
(1)方式一
方式一直接在加密后的shellcode中插入字符串,为了实现简单,插入的都是同样的单词,同时设置了插入因子,当插入因子为1时,每间隔一个字符串的长度插入一个字符串,最终的字符串长度增长一倍;当插入因子为2时,每间隔0.5个字符串的长度插入一个字符串,最终的字符串长度增长两倍。也就是说插入因子越大,插入密度越大,同时最终的字符串也会越大。
加密的代码如下,在我经常使用的自定义随机值异或加解密的基础上改来:
加密后的shellcode如下面这样,插入字符串“ Being single is better than being in an unfaithful relationship.”,插入因子为1:
最终打包的exe(还弄了个图标,后面简直啪啪打脸):
由于插入因子为1,最终的字符串长度增长一倍,因此exe相对于原Mimikatz的大小变大了一倍。
当时的VT查杀:
过了11天,再次进行查看时发现变成16个了,但是不重要,随便改一下特征码重写打包即可,我们仅需关注刚上传时的查杀:
中间有尝试先压缩shellcode,再插入字符串,先试了第三方库zlib,对大shellcode的压缩率在50%左右,这样插入字符串后大小接近原大小,但是打包后的exe需要依赖zlib.dll,非常不方便,尝试寻找能够简单实现且自定义无需依赖第三方dll压缩算法,最终在方式二中得到解决。
(2)方式二
方式二更加优雅,直接将shellcode按照字符转换表转换成可见字符串,加密后的字符串增长也更小,仅增长0.5倍。
转换表如下:
0-90可以用可见的单个字符表示(换行除外),91-255不可用可见的单个字符表示,于是用两个可见(空格除外)的字符表示,比如空格 字母,点 字母等组合方式。通过这一种转换方式将加密字符全部转换键盘上可以打出来字符,同时加密字符串中有空格、点和换行等字符存在,将其分成多词多段,有利用减低熵值。
加密后的字符串长度增长0.5还是太多了,经过在github上的一番寻找,最终找到了一个比较合适的加密算法lzw加密算法——具有不同代码长度和 4096 个最大条目字典的Lempel–Ziv–Welch压缩,对大shellcode的压缩在60%左右,接近zlib。
部分加密代码如下:
加密后的shellcode如下面这样:
可以看到还是很乱,其中还有del字符存在,应该是我写的代码出了bug,但是没有关系,这在杀软眼中已经是属于熵值很低的了。
打包后的exe只有1.5MB,接近于原版大小:
VT查杀:
后面进行360、defender查杀测试时出了点问题,不是被360查杀,就是被defender查杀,还以为是加载器的问题,一直被静态查杀,更换了更强的加载器,发现还是被defender查杀了,接着寻找问题,感觉问题应该不是出在导入表上,后面才发现问题,是前面埋的坑,exe的图标被列入特征码了