Meterpreter免杀及对抗分析

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是世界上最好的渗透测试工具!

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-12-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

comsol快速入门教程

我自己参照官网的教程,写了个比较通俗易懂的入门教程,字多图多慎看(大三的时候写的)。

17950
来自专栏Python爬虫与算法进阶

敲敲级简单的鉴别H图片的小程序

首先,来看一下程序运行结果的截图 ? 功能实现 一、下载SDK pip install qcloud_image 先贴出官方给的实例代码: #!/usr/bi...

34140
来自专栏Crossin的编程教室

【每周一坑】缩小图片尺寸

之前我们的题目大多偏向解决数学问题,今天来一道偏应用的: 我们知道,通常来说一张图片的分辨率越高,它就越清晰,但文件占用的空间就越大。有时候我们并不需要那么高的...

31270
来自专栏人工智能头条

实战:从0搭建完整 AI 开发环境写出第一个 AI 应用

那么,作为多年的程序员,或者准备着成为新一代程序员的读者们,该如何为智能时代做好准备,成为 AI 时代的程序员呢?

49050
来自专栏开源项目

你真的会用 Issue 吗?

大家对 Issue 一定不陌生,它灵活又实用,可以用来做 Bug 跟踪、需求管理、项目管理、交流探讨、写文章…… 不少新用户在后台问我们,如何优雅地使用 Iss...

31050
来自专栏PHP实战技术

手把手教你玩转12306验证码的秘密!

12306相信对很多小伙伴都不陌生,假如问你对这个网站的印象的时候,你不是会立即想起那个坑爹的验证码,而正是这个验证码,也一时间成为小伙伴们讨论的话题,今天思梦...

29080
来自专栏机器之心

TensorFlow初学者指南:如何为机器学习项目创建合适的文件架构

选自MetaFlow 作者:Morgan 机器之心编译 参与:李亚洲、蒋思源 在这篇文章中,作者根据自己的经验为 TensorFlow 初学者给出了设计文件、文...

39060
来自专栏云飞学编程

非常适合新手的一个Python爬虫项目:打造一个英文词汇量测试脚本

最近朋友在苦学英文,但是又不知道自己学的怎么样了,直到有一天,他找到了扇贝网,里面有个“评估你的单词量”功能非常的好,就推荐给我了!

15210
来自专栏cloudskyme

Win10下用Anaconda安装TensorFlow

什么是Anaconda anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。它是一个用pytho...

58540
来自专栏阮一峰的网络日志

如何使用 Issue 管理软件项目?

软件开发(尤其是商业软件)离不开项目管理,Issue 是最通用的管理工具之一。 本文介绍 Issue 的基本用法。 ? 一、Issue 是什么? Issue 指...

60950

扫码关注云+社区

领取腾讯云代金券