前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Meterpreter免杀及对抗分析

Meterpreter免杀及对抗分析

作者头像
FB客服
发布2018-02-26 10:45:21
2.5K0
发布2018-02-26 10:45:21
举报
文章被收录于专栏:FreeBuf

0x00 前言

本文就常见的一些杀毒软件检测方法及meterpreter远控对抗杀毒软件的思路进行了一些介绍,相关内容可以参考我的上一篇文章meterpreter技巧分享。 另外说一句,metasploit是世界上最好的渗透测试工具!

0x01 静态检测与对抗

静态分析原理

简单的来说,就是通过特征码识别静态文件,杀软会扫描存在磁盘上的镜像文件,如果满足特征码,就识别为恶意软件。 恶意软件匹配规则yara匹配恶意软件的时候就是用的这样的方式。 通过特征来识别抓HASH工具QuarksPwDump,yara规则如下(查看原文)

可以看到匹配匹配$s1 $s2 $s3 $s4全部四条规则及标记为识别。 当然还有通过md5、sha1来计算文件hash识别恶意软件,最简单粗暴而且有效,但是也很容易绕过,也有分段进行hash来识别相似度的方法,原理和上面的特征码识别都是一样的,这里不再赘述。

对抗静态分析

1.修改特征码 特征码的识别也有一些不同的方式,最开始是使用单个特征码来定位,就有了与之对抗的ccl,随着对抗技术的升级,就有了多条的特征码,对应的也就有了mutilccl, myccl, virtest,甚至现在github上的自动化特征码识别,技术越来越多样。 修改特征码最重要的是定位特征码,但是定位了特征码修改后并不代表程序就能正常运行,费时费力,由于各个杀软厂商的特征库不同,所以一般也只能对一类的杀软起效果。虽然效果不好,但有时候在没有源码的情况下可以一用。 虽然meterpreter对于我们来说是开源的,但是偶尔编译出来的文件修改一些小地方就能让杀软直接报废,也算是一个保留方法吧,这里限于篇幅我就不贴代码和操作了。 2.加壳 加壳虽然对于特征码绕过有非常好的效果,加密壳基本上可以把特征码全部掩盖,但是缺点也非常的明显,因为壳自己也有特征。在某些比较流氓的国产杀软的检测方式下,主流的壳如VMP, Themida等,一旦被检测到加壳直接弹框告诉你这玩意儿有问题,虽然很直接,但是还是挺有效的。有些情况下,有的常见版本的壳会被直接脱掉分析。 面对这种情况可以考虑用一切冷门的加密壳,有时间精力的可以基于开源的压缩壳改一些源码,效果可能会很不错。 总得来说,加壳的方式来免杀还是比较实用的,特别是对于不开源的PE文件,通过加壳可以绕过很多特征码识别。 3.shellcode 编译 metasploit是我认为世界上最好用的渗透测试工具。 msfvenom不仅提供多种格式的payload,其中就包括shellcode。shellcode对于源码免杀来说基本上是最好用的那种,绕过静态杀软的神器。 shellcode编译的具体方式请参考我之前的文章meterpreter技巧分享,这里不再赘述。 使用msfvenom选择encoder的时候大家一般都会选择shikata_ga_nai这个编码方式(因为x86的encoder里只有它的Rank是excellent),这个encoder的解码和编码过程都是随机生成的。(编码过程可参考源码)。 但是,这个编码内容是有特征的,经过shikata_ga_nai 编码之后的shellcode必定含有\xd9\x74\x24\xf4 这串16进制字符,我写了一个yara规则可以轻松检测到由 shikata_ga_na编码的shellcode,规则如下:

测试结果如图:

当然不止是 shikata_ga_na 编码方式,其他的编码方式特征可能更加明显(x86/fnstenv_mov 的编码方式就被很多杀软能直接检测到,远不如 shikata_ga_na)。那么如果要对抗这样的情况,只能自己再将编码过后的shellcode进行编码或者加密。 我这里写一个简单的xor作为demo供大家感受一下,代码如下:

4.shellcode植入后门 目前有不少文章和工具都提供了植入后门的方法。例如shellter,the-backdoor-factory,工具的功能都很强大。 这里介绍一下手动在code cave(代码间隙)植入后门的方法,整体流程如图:

其中比较关键的部分是调整堆栈平衡,通过sub esp, 或者add esp, 来调整堆栈,否则执行完payload后的正常程序会崩溃。 如果没有适合大小的code cave或者payload 的非常大,这个时候可能需要多个code cave一起使用,关键部分如下图流程

还可以结合上一部分的编码或加密,免杀效果很好,大部分的杀软都直接GG . 5.多平台多语言 同一种编译器生成的PE文件在某些区段上是有相同或相近的二进制字节的,杀软在收集同一方式生成的大量木马后,很容易就将这些PE文件的特征提取出来加以识别(例如现在msfvenom直接生成的exe就是这样的)。因此,通过更改编译环境,让被识别的特征码改变,达到免杀的目的,改变语言也是同样的思路。 linux下的跨编译器有mingw-w64, tdm-gcc等,veil-evasion的c语言编译器是用的mingw64,而AVET的编译器用的是tdm-gcc,最开始使用时效果还是不错的,用得多了杀软开始有意的提取这些编译器编译后的特征码,就被一杀一个准了。 veil作为一个持续更新的免杀框架,利用多种语言进行编译,来实现绕过特征码免杀的目的,使用的语言包括c, python, ruby, perl, powershell, c#, go 等,再通过pytoexe或者 pywin32来转换python代码成exe,来保持自己木马的多样性(payload生成源码【阅读原文】)。 当然还有更猥琐的方式,如转换成js,php,sct等非编译型语言执行,这里就不详细展开了,有兴趣的自己去了解。 6.小结 静态免杀大概就这样方法,有时候需要结合多种方法一起使用,当然在没有源码的前提下一般都采用第一种和第二种方法,当然也可以考虑反汇编加花加空等修改源码,这样需要投入更多的时间和精力,也对操作者有更高的技能要求。

0x02 流量检测与对抗

1.Meterpreter的传输加载

要知道meterpreter的流量特征,首先要搞清楚meterpreter的传输方式。 metasploit的木马分为两个大类,staged 和stageless 。 staged类型的木马的运行流程为: 客户端在从服务器端接收stager后,stager由引导代码loader和payload组成,客户端在内存中分配一段地址将payload暂存起来,再通过loader来加载内存中的payload。这种内存中注入PE文件的方式称为反射型DLL注入。 stageless的则是将完整的payload都编译在木马中,相对与staged的木马来说,前者体积庞大不灵活,而且容易被杀。 我们以windows/meterpreter/reverse_tcp为例,下面是部分源码(完整源码阅读原文)

asm_block_api 部分是用来定义查询API调用地址的函数。 asm_reverse_tcp 部分是用来发送socket请求的。 asm_block_recv 部分是建立连接后,接收服务端发送的stager,再通过 VirtualAlloc() 分配RWX权限的内存,然后执行后续。 那么大家可以看到,这部分建客户端发起连接的过程其实是没有什么特征的,特征主要是在服务端发送的stager,接下来让我们详细看看发送的stager里是什么。 为了让客户端运行服务端发送的meterpreter payload,需要先发送一个加载meterpreter_loader,这个引导代码的源码如下(完整源码地址):

这段代码主要作用是加载反射性注入的引导代码ReflectiveLoader,通过ReflectiveLoader来加载meterpreter及相关配置。由于篇幅原因,这里我们不深究反射性注入的详细加载方式,知道大概原理即可,如果有兴趣可以阅读源码理解。

2.Meterpreter检测

这段meterpreter_loader是固定的一段汇编代码,通过nasm将该部分汇编代码转化为机器码如下(可能随环境变化):

该16进制字符串即为meterpreter的特征。为了验证思路,通过抓取流量来查看发送的payload,可以看到传输后发送的payload最开始的部分就是上面的机器码,如图所示:

编写一个yara规则来测试是否能检测到(yara除了能检测静态PE格式文件,也能检测流量文件,当然你也可以使用snort),规则如下:

用yara检测传输的流量包,瞬间检测到,如图所示:

注:如果用该yara规则直接检测进程中的内存的话,不管流量怎么加密最终都会解密,然后被yara检测到meterpreter_loader,除了效率较低之外,能绕过就只能靠修改源码了。 这里限于篇幅限制,其他payload的流量特征请各位看官自己去摸索测试,这里就不多浪费篇幅。

3.对抗流量检测

既然流量是有特征的,那么有没有办法对流量进行加密呢,答案是肯定的,通过在服务端设置

效果如图所示,(当然这里的stagerencoder可以任意选)

发送出去的stager就被编码过了,从流量看都是被编码过的数据,看不出来任何特征,如图:

如果你觉得这种对流量进行编码的方式也不够保险,那么msf还提供了偏执模式(paranoid-mode),可以用证书对流量进行加密。 具体操作方法可以参考官方文档或者我的博客。

0x03 动态监测对抗

静态检测和流量监测都说到了,接下来我们说如何对抗沙盒。要做到完全对抗沙盒工程量是很大的,这里我们只讲一些猥琐的小技巧来骗过杀软的沙盒分析。 杀毒软件最大的问题就是面对成千上万的文件,如何最快速度的扫描完所有的文件,而不浪费大量的性能在单个文件上(在扫描过程中把机器卡死是相当糟糕的体验)。要做到这个,需要在大量的文件中进行合理的取舍。

1.sleep

在很早的对抗杀软的技术中,通过一个sleep,占用大量的时间,就能够绕过杀软的动态分析,当然现在这样肯定是不行的了。推测杀软会hook 系统sleep函数,然后直接略过,直接后面的代码,这样是最聪明和省事儿的方法了。为了验证想法,我们通过一段代码来测试一下。 为了除去别的容易干扰的因素,我选择使用固定的一种编译器对shellcode进行编译。 直接编译生成,virustotal的结果如下,19/67

添加如下的代码之后再进行检测:

检测16/66

虽然只减少了3个,不过也说明部分杀软还是吃这一套。。

2.NUMA

NUMA代表Non Uniform Memory Access(非一致内存访问)。它是一个在多系统中配置内存管理的方法。它与定义在Kernel32.dll中所有一系列函数连接在一起。 更多的信息可以参考官方文档: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).aspx 代码如下:

检测结果17/67,又少了两个。

3.总结

这里截图的效果不好主要是因为stagerd meterpreter是没有什么行为的,主要是靠静态查杀,如果行为明显那么这些方法还是能起到不少的效果。 还有很多其他的一些技巧,由于篇幅原因就不过多的介绍了。 有兴趣可以参考维基解密。

0x04 结语

最近老有兄弟跟我交流免杀的事情,尤其是meterpreter的免杀方式,花了点时间研究并写下了这篇文章,希望各位读者能够有所收获。 如果你有任何问题欢迎与我交流,博客或者微博 都可以。 最后,Metasploit是世界上最好的渗透测试工具!

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

本文分享自 FreeBuf 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 静态检测与对抗
    • 静态分析原理
      • 对抗静态分析
      • 0x02 流量检测与对抗
        • 1.Meterpreter的传输加载
          • 2.Meterpreter检测
            • 3.对抗流量检测
            • 0x03 动态监测对抗
              • 1.sleep
                • 2.NUMA
                  • 3.总结
                  • 0x04 结语
                  相关产品与服务
                  网站渗透测试
                  网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档