【技术分享】SpookFlare: 黑暗中前行

http://p3.qhimg.com/t018a76b889d04eb748.jpg

译者:Kp_sover

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


Windows与安全

Windows 作为最成功和市场占有率最高的操作系统,也承载了各种各样的安全产品,下面是2017年8月份 NetMarketShare 的一份报告,给出了操作系统市场份额情况,当然,任何一款操作系统伴随着它更高的使用率,随之而来的肯定也会成为更多攻击者的目标,这意味着更多的安全产品会被用于这些操作系统中,并且这些安全产品必须不断改进自己以避免要保护的系统受到攻击。

http://p1.qhimg.com/t01b73f6584f08b29de.png


安全产品检测

Windows作为最常用的操作系统,它经常充当着渗透测试者的目标。如果你打算侵入/渗透 Windows操作系统,Meterpreter 会是你最常用的RAT,因为它可以和Metasploit充分的结合起来。Meterpreter不仅被用于合法的目的,更多的时候是非法的,这意味着,Meterpreter经常会被安全产品归为恶意的工具。这就导致在目标系统的渗透测试过程中,绕过这些安全产品成为必要的步骤。那么,安全产品到底是怎么运作的? SpookFlare 将怎么帮助我们绕过它们?

我们可以分三个方向来描述安全产品检测的方法:

第一个是基于特征的检测;

第二个是基于行为检测,

第三个是基于软件信誉的检测。

首先为了逃避安全产品的特征检测,我们可以采用的方法是混淆加密;其次,你必须处理软件的行为来避开安全产品的行为检测,比如说如果你在受害者的系统中使用Mimikatz去获得本地用户数据的行为已经被检测到,那你完全可以换成微软 SysInternals 提供的procdump工具来进行相似的操作,因为它已经被正规机构授权并且通常认为是用于合法目的,所以在这里你可以用来避开安全产品的行为检测;最后是基于信誉的检测,事情从这里开始就变得复杂了,因为每种安全产品的判断机制和信誉检测的算法是不一样的,所以有时候你的软件会被某些安全产品定义为恶意的。这个时候,为了避开安全产品的检测你只能充分运用你的经验。因为最终,安全产品还是通过他们所了解的攻击向量来检测的,我的意思是如果你有不被大家知道的技术或方法,当然你就可以避开目标系统安全软件的检测。

目前有很多可以避开安全产品检测的方法,SpookFlare 提供了新的策略去实现这些,它可以让你避开无论是终端还是网络端的检测。SpookFlare 是 Meterpreter反向HTTP和HTTPS stage的加载器。它具有自定义加密、字符串混淆和代码运行时编译的特点,因此你可以很容易避开目标系统的安全对策,直到某一天它们识别出了SpookFlare的技术和行为。

从下面图片中可以发现SpookFlare的技术细节和一些重要执行步骤:

http://p9.qhimg.com/t01f2d972a872caae8d.png

混淆技术

在软件的发展历程中,混淆是一种用来增加人们理解源代码或者机器代码难度的技术。 SpookFlare把混淆用于字符串名称上,因此,安全产品通过提取字符串特征的做法将变得很困难。事实上为字符串添加特征的行为大多时候还是由恶意软件分析专家或安全产品开发者完成的。当恶意软件分析师分析样本的时候,一旦断定该样本是恶意软件,那么有关这个恶意软件的某些特征将会被提取,并且被添加到AV或终端安全产品的特征数据库里。如果一个文件的任何一个字节被改变,那适用于这个文件的特征库也会改变。如果你修改了某个被定位为特征部分的字符串,或许你就能绕过安全产品基于特征的这部分检测,SpookFlare 就是使用字符串混淆技术来让每个生成的payload都尽可能的独特。

代码运行时编译

即使你的程序已经使用了混淆技术,你的代码部分也必须作出相应的改变,因为基于字符串的混淆只能在一定程度上达到目的,比如,如果安全产品将字符串检测技术用在 打开进程(OpenProcess)、分配虚拟内存(VirtualAlloc)等系统调用上时,有可能你的程序仍会被安全产品检测到。因为有很多的恶意软件都会使用那些系统函数,所以安全产品认为这是可疑的。为躲避这种检测,SpookFlare通过在这些可疑代码开始的地方定义新的payload,让它在运行时隐藏这种调用行为.

.net有一套机制叫做 CodeDOM ,它可以让开发者编写出一种代码,代码里包含一段只在运行时才会编译的代码,类似下面这段C#程序,它可以定义一段c#代码到 "code"这个变量里,然后只当这个程序运行时才会去编译并执行它.

http://p9.qhimg.com/t01ec8a5dabe8c31a19.png

SpookFlare 的payload使用了这种实时编译和执行的技术,每个SpookFlare生成的payload都包含了相应的loader代码,你可以把这段代码拷贝到编译器去编译.

源代码加密

目前为止,我们了解了字符串混淆和代码实时编译技术,接下来我们还得了解如何去隐藏 loader 里的明文代码,因为如果我们加载器里的代码有可能已经被杀软提取了特征,所以是有可能被检测到的,因此这里我使用了c#提供的 RijnDaelManaged 类来加密明文代码,这就像是一个加密软件的行为一样.

bypass网络层检测

这部分知识是受到了 @Arno0x0x  的启发,在这里我再进一步,通常我们使用 Meterpreter 的 Stager 负载,这种负载通过网络来下载它的核心模块(stage)并在内存里执行,但安全产品不只是在终端起作用,在网络层可能也是个大麻烦,别忘了 IDS/IPS这类产品,即使我们绕过了终端的安全策略,但在网络层的行动仍有可能被破坏掉。

那么,这些安全策略是如何检测网络层的威胁呢?答案还是基于特征码的检测,所以这个时候你可能会想到用一个编码器给 Meterpreter 的核心负载(stage)编码来绕过这种检测,这种方法有一定的作用,这样做的话,你也必须在 stage上添加一段代码去解码,但这同时也为恶意分析员提供了便利。因此我们必须有所改变,让检测和分析变得更加困难,在这点上,SpookFlare 可能比其他任何编码器都做的要好.

恶意软件分析员是怎样为一个二进制文件添加特征的?其实就是为每一个二进制文件的头部数据提取出一个特有的模型,这样恶意软件分析员就可以很方便的识别和检测出有害的文件了.针对这种情况我们可以在Metasploit 的头部添加一段随机的自定义字节,这样就可以绕过网络层的检测了.这也是 SpookFlare 提供的解决方案.

http://p4.qhimg.com/t01eea78f9bc9e79090.png

我们知道,meterpreter_loader.rb 这个脚本是负责创建 meterpreter 的stage,

/usr/share/metasploit-framework/lib/msf/core/payload/windows/x64/meterpreter_loader.rb 这个是作为64位的stage.

/usr/share/metasploit-framework/lib/msf/core/payload/windows/meterpreter_loader.rb是x86 的stage.我们使用 Ruby 提供的 安全随机数库(securerandom library)来添加随机字节到 stage 的头部,下面是具体的代码实现.

http://p9.qhimg.com/t01aedb4e84eb5e38ef.png

下面是添加随机的数据并重新定义stage的开始部分

http://p8.qhimg.com/t015b3b1e6e3e1899f8.png

最后我们告诉加载器跳过开头的这些随机字段,从它后面部分开始执行,c#里的Array.Copy 或 Buffer.BlockCopy函数可以实现这个功能,但Array.Copy 比 Buffer.BlockCopy速度更快,因此在这里 Spookflare 采用了Array.Copy函数

好了,到这里一切都结束了,现在是到了检测成果的时候了,下面分别是 Spookflare 加载器、一般的 Meterpreter stages、patch后的Meterpreter stages的检测结果:

http://p9.qhimg.com/t01b0a9c93760029787.png

SpookFlare Loader 的扫描结果

http://p5.qhimg.com/t013a5f9443573de3eb.png

Meterpreter Stage 的扫描结果

http://p5.qhimg.com/t01d12f3be79f229bbc.png

Patch后的Meterpreter Stage的扫描结果


总结

当然你知道的,随着 SpookFlare 使用人数的不断增加,安全公司肯定会为SpookFlare 定义一套单独的特征和行为检测算法,不过别担心,当这个情况发生的时候,SpookFlare 的特征和行为也会随之改变,那时可能会是另一种新的技术被用来实现这个功能,我是有很大的信心做到的,因为绕过杀软本身就是一个猫鼠游戏,永远没有终点 ? ,最后声明下,我开发 SpookFlare 只是为了渗透测试、团队交流,仅仅是出于学习的目的,所以责任自负.

我已经尽可能解释了 SpookFlare 它的工作原理,下面提供了视频和代码地址告诉你怎样去使用它.

视频演示:

工程地址:

https://github.com/hlldz/SpookFlare

References

Usage share of operating systems – Wikipedia

Dynamic Source Code Generation and Compilation

Compiling C# Code at Runtime

Array.Copy vs Buffer.BlockCopy

Buffer.BlockCopy Not As Fast As You Think

Meterpreter stage AV/IDS evasion with powershell

(完)