C++熵减法免杀-Mimikatz免杀

2023-11-20 12:35:53 浏览数 (1)

前言

尝试对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的图标被列入特征码了

0 人点赞