前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++熵减法免杀-Mimikatz免杀

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

作者头像
Creaper
发布2023-11-20 12:35:53
6790
发布2023-11-20 12:35:53
举报
文章被收录于专栏:锦鲤安全锦鲤安全

前言

尝试对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的图标被列入特征码了😅,只要使用这个图标就被查杀。。

后面更换的动态回调加载器:

为了增加免杀能力对字符串进行了加密,并用动态生成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查杀的效果,因此效果图中的效果还使用了其它新技术,部分会在下一篇中讲到。

对测试过程中遇到的几个问题进行总结:

  • exe取名不要保护shellcode、mimikatz等字眼,不然会被查杀。
  • exe最好不要有图标,如果一定要有的话,一定要经常更换,因为图标可能会被列入特征码。

关于成品和源码,成品可以直接下载,源码仅在[深情种聚集地]小密圈中下载。

成品下载

关注公众号回复:

30408

相关链接

https://github.com/glampert/compression-algorithms

https://mp.weixin.qq.com/s?__biz=Mzg5MDg0NzUzMw==&mid=2247483697&idx=1&sn=40d0c408f382325eb3ece0ed7a303f14&chksm=cfd72973f8a0a0654a47c250b2d0dc3fa3239ec9479544a848bc4ec854b106b624427b1d3e90#rd

锦鲤安全

一个安全技术学习与工具分享平台

点分享

点收藏

点点赞

点在看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 锦鲤安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 图像法减少熵值
  • 2. 字符串法减少熵值
    • (1)方式一
      • (2)方式二
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档