一
前言
尝试对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封装进图片的代码,自己写又太麻烦,而且不知道免杀效果如何,如果花费大力气写出来发现免杀效果不好不是白忙活了吗?
于是我先进行了实验,在exe资源中存放一张大小差不多的正常的图像,上传VT测试,发现报毒并没有降低,于是将该方法pass掉。
我尝试了两种方式的字符串法减少熵值:
无论使用哪一种方式,都会使最终的字符串变大。
方式一直接在加密后的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压缩算法,最终在方式二中得到解决。
方式二更加优雅,直接将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的图标被列入特征码了😅,只要使用这个图标就被查杀。。
后面更换的动态回调加载器:
为了增加免杀能力对字符串进行了加密,并用动态生成key。
由于Mimikatz经常被用在windows server之中,vs默认的编译配置只能在windows server 2016及以上的版本中运行,在windows server 2012及以下版本中运行会提示如下的各种dll缺少问题:
需要将属性页->C/C++->代码生成中的Runtime Library调成/MT模式,才能在windows server 2012及以下版本中运行:
打开后会导致打包exe的体积增大100到200KB,exe达到效果图中的1.7MB,同时VT报毒也会少量增加,这就需要通过其它的一些调试减少报毒了。
四
最后
前面讲的熵减法Mimikatz免杀的内容是十几天之前做的,基于intel c++编译器到达的VT全免杀效果,加了一点动态免杀,以过defender动态查杀,第二项的效果图是最近的,此时的intel c++编译器已被杀软攻陷,在VT上不再具有0查杀的效果,因此效果图中的效果还使用了其它新技术,部分会在下一篇中讲到。
对测试过程中遇到的几个问题进行总结:
关于成品和源码,成品可以直接下载,源码仅在[深情种聚集地]小密圈中下载。
五
成品下载
关注公众号回复:
30408
六
相关链接
https://github.com/glampert/compression-algorithms
https://mp.weixin.qq.com/s?__biz=Mzg5MDg0NzUzMw==&mid=2247483697&idx=1&sn=40d0c408f382325eb3ece0ed7a303f14&chksm=cfd72973f8a0a0654a47c250b2d0dc3fa3239ec9479544a848bc4ec854b106b624427b1d3e90#rd
锦鲤安全
一个安全技术学习与工具分享平台
点分享
点收藏
点点赞
点在看