一款新的壳---Amber----外文翻译

介绍一种新的“打包方法”(packer 这里应该翻译为”壳”:第一个“首款??”反射式PE 打包器”“—Amber
        由于操作系统内部安全标准的提高以及恶意软件检测技术的突飞猛进,如今的恶意软件作者开始利用内存内执行[由内存执行]代码的透明性。PE文件由内存执行(或者称为无PE 文件执行)就是通过手动完成通常操作系统加载器在执行一个PE 文件时所提供的功能来在内存中执行一个被编译的PE 文件(这里我用的是长单句,貌似翻译的时候最好使用分开的句子,PE 文件由内存执行就是在内存中执行一个被编译的PE文件,即手动完成通常操作系统加载器在执行一个PE 文件时所提供的功能)。内存内执行一个恶意软件有利于代码混淆和抗仿真技术(混淆和反模拟技术)。另外,使用该技术的恶意软件将在目标系统上留下更少的痕迹,因为内存内执行技术不需要在硬盘驱动器上持有一个文件。将内存内执行方法和多阶段注入模型结合起来使得恶意软件只需使用非常小的加载器程序即可感染一个系统,该加载器只需连接到远程系统然后加载并执行实际的恶意代码。小的加载器代码的使用很难被安全产品检测到,因为加载器的代码片段在合法的应用程序中十分普遍。通过扫描内存和检查进程的行为仍然可以检测出使用这种方式的恶意软件,但是从安全产品的角度来说,这些操作非常难实现(实施)且代价昂贵,因为这意味着更高的资源占用(Ramilli, 2010【1】)。
        当前恶意软件检测的上升趋势是通过使用机器学习来使恶意软件的检测自动化,这需要在系统中有大量的数据集,如所有的使用机器学习的应用程序一样,随着时间的推移,当我们输入了越来越多的恶意样本之后,这个机制会变得更加聪明,更加准确。这些机制可以为人类恶意软件分析师无法测量的大量系统提供支持。BitDefender罗马尼亚实验室的Gavriluţ Dragoş的论文“Malware Detection Using Machine Learning【2】”比较全面的讲述了机器学习应用在恶意软件检测时的内部工作。根据Konrad Rieck 的论文“Automatic Analysis of Malware Behavior using Machine Learning【3】”,有了足够的数据和时间,假阳性结果的几率将趋于0%,对于新的异常的恶意软件,恶意软件的确定性检测的有效性将显著性提高。
        因此,这个工作的目的是开发一种新的PE 文件加壳方法,该技术将改变在一个系统上释放恶意软件的方式。通过无文件代码注入将有效载荷释放到系统上直接越过了大多数的安全机制,而不是尝试寻找一种新的反检测技术,新的反检测技术最终只会成为机器学习数据集的一部分。有了这种新的加壳方法,就可以将编译生成的PE文件转换为多阶段感染有效载荷,这些有效载荷可以与常见的软件漏洞(如缓冲区溢出)一起使用。

已知的方法

        以下技术是我们新加壳方法的灵感。

  • 反射DLL 注入【4】
            这是Stephen Fewer 开发的一种比较好的库注入技术,也是这个称为“Amber”的新的壳的最主要的灵感。这个技术可以在内存中执行使用反射式编程方法特殊构建的DLL。由于采用了反射式编程,该技术支持多阶段有效载荷部署。另外,除了这个技术的许多优点外,它有很少的限制。首先,这个技术限制恶意软件必须是DLL或者被重新编译为DLL文件,不幸的是,大多数情况下,将一个已经编译的EXE 文件转换为DLL 是不可实现的,或者将需要在二进制层面上进行大量的工作。第二个限制是代码的实现需要重定位数据。反射DLL 注入技术需要重定位数据以调整DLL在内存中的基地址。另外,这个技术已经存在了很长时间,这意味着最新的安全产品可以轻易的检测到反射DLL 注入的使用。我们的新的工具,”Amber”将为这些限制提供对应的解决方法。

  • Process Hollowing【5】
            这是另一个众所周知的内存中执行恶意软件方法,该方法使用windows 的公开API 函数创建一个新的进程并将PE 文件映射进该进程。这种方法在加密器和壳中非常受欢迎,它们旨在降低恶意软件的检测率。但是这种方法也有一些缺点。由于最新的Windows 操作系统中的ASLR 安全措施,创建新进程时内存区的地址是随机的,因此在最新的Windows 系统上,”Process Hollowing”也需要实现镜像基址重定位。如前所述,基址重定位需要PE 文件中的重定位数据。另一个缺点是,由于特定的文件映射和进程创建API 函数以特定的序列被调用,这个方法很容易被安全产品识别。

  • Hyperion【6】
            这是由Christian Amman 在 2012 年开发并发布的一个PE 文件加密器。它解释了运行时加密的理论及其实现方式。其汇编格式的PE 解析方法和开发Hyperion 过程中使用的设计观点对于构建我们自己的POC 壳很有帮助。

新的壳的技术细节:”Amber”

        在操作系统内存中执行一个被编译的二进制文件的基本原则就是模仿操作系统的PE 加载器的行为。在Windows 中,PE 加载器做了许多重要的工作,其中,映射一个文件到内存中以及解析导入表对于执行一个EXE 文件来说是最重要的两个阶段。当前在内存中执行一个EXE 文件的方法使用了特定的Windows API 来模仿Windows PE 加载器。一般的方法就是通过调用CreateProcess 来创建一个暂停的进程,之后通过NtMapViewOfSection,MapViewOfFile 以及CreateFileMapping 函数将整个EXE 镜像映射到新创建的进程中。这些函数的使用表明了可疑的行为并增加了恶意软件的检测可能性。开发我们的壳的关键之一就是我们将尽量少使用API 函数。为了避免可疑的文件映射文件的使用,我们的壳使用预封装 PE 镜像,而且是在目标进程内部执行恶意软件,而不使用CreateProcess 函数。恶意软件将和其宿主进程拥有同样的进程特权,因为共享的_TEB 块中包含了一个进程的特权信息和配置。Amber 有两种存根,一个是为了那些支持ASLR的EXE设计的,另一个是为了那些被剥离,或不包含任何重定位信息的EXE 文件设计的。支持ASLR 的存根使用了总共4个Windows API,另一个使用了3个大部分正当应用程序都会使用到的API。
        支持ASLR 的存根:

1. VirtualAlloc
2. CreateThread
3. LoadLibraryA
4. GetProcAddress

不支持ASLR 的存根:

1. VirtualProtect
2. LoadLibraryA
3. GetProcAddress

        为了在运行时调用这些API,Amber使用了反射DLL 注入中所使用的公开的EAT 解析技术。此技术定位内存中的PEB 结构中的InMemoryOrderModuleList 结构,然后通过InMemoryOrderModuleList 指向的_LDR_DATA_TABLE_ENTRY 结构体可以获得所有的已加载的DLL 的导出表。获得一个加载的DLL的导出表后,它将先前计算的ROR(右转)13哈希值与每一个导出函数名的ROR13哈希值进行比较,直到发生匹配为止。
        Amber 的加壳方法另外提供了可选的Windows API 使用方法,其中一个就是使用固定的API 地址,如果使用者熟悉将宿纳Amber 有效载荷的远程进程,这将是最好的选项。使用固定的API 函数地址将直接越过最新的操作系统级别的漏洞利用缓解措施(检查导出地址表调用),另外,除去API 地址查找代码将使整个有效载荷更小。另一个可选的定位所需函数的地址的技术称为“IAT 解析技术”,Josh Pitts 在他的文章“Teaching Old Shellcode New Tricks【7】”中描述了这一方法。当前版本的Amber 仅支持固定API 地址以及EAT 解析技术,IAT 解析技术将在后续的版本中添加。

生成有效载荷

        为了生成实际的Amber有效载荷,加壳器首先创建了一个恶意软件的内存映射镜像,生成的内存映射文件包含了所有部分,可选的PE头和其它尚未使用的使用0填充的部分。
此处输入图片的描述

        得到恶意软件的映射之后,加壳器检查所提供的EXE 文件的ASLR 兼容性,如果EXE 是ASLR 兼容的,加壳器添加相关的Amber 存根,不兼容则使用为固定基地址EXE 文件准备的存根。这样Amber 有效载荷就完成了。下面的图片描述了Amber 有效载荷在目标进程中的结构。

此处输入图片的描述

ASLR 存根的执行

        支持ASLR 的存根的执行包含5个步骤:
                1.基址申请
                2.解析API 函数
                3.基址重定位
                4.文件映射的位置
                5.执行
        在基址申请阶段,存根通过调用VirtualAlloc 函数申请一个与被映射的恶意软件镜像的大小相同的可读可写可执行特权的内存空间。

此处输入图片的描述

        这个内存空间将是在重定位处理之后恶意软件的一个新的基地址。第二阶段,解析导入函数的地址,并写入到恶意软件的被映射镜像的导入地址表中。
        地址解析阶段使用的方法和Windows PE 加载器十分相似,Amber 存根将解析被映射的恶意软件镜像的导入表项并通过调用LoadLibraryA 函数来加载恶意软件所用到的每个DLL,导入表中的每一个_IMAGE_IMPORT_DESCRIPTOR 项都包含指向被对应的DLL 的名称的指针,存根将利用这个已经存在的字符串并将其传递给LoadLibraryA 函数。
此处输入图片的描述

        加载了所需要的DLL 之后,Amber 存根保存DLL 句柄并通过GetProcAddress 函数从被加载的DLL 寻找其导入函数,_IMAGE_IMPORT_DESCRIPTOR 结构还包含了一个指针,指向一个称为导入名称表的结构,这个结构包含了导入函数的名称,其顺序和IAT 的顺序相同。调用GetProcAddress 函数时,Amber 存根将保存的之前加载的DLL 的句柄,导入名称表结构中指向的导入函数的名称传递进去。
此处输入图片的描述

        第三阶段,重定位处理,即根据VirtualAlloc 函数返回的地址调整一些地址,这个功能几乎和windows 自己的PE 加载器一样,存根首先计算VirtualAlloc 函数返回的地址与恶意软件首选的基地址的差值,这个差值被加到重定位表中的每一项上。第四阶段中,Amber 存根会把文件映射放置到刚才申请的空间,通过一个简单的汇编循环就可以单字节移动它。

此处输入图片的描述

        最后,Amber 存根将以恶意软件的入口地址为参数调用CreateThread 创建一个新的线程。创建新线程是为恶意软件创建一个新的可增长的堆栈,并且在新线程中执行恶意软件将允许目标进程以以前的状态继续下去。创建恶意线程后,存根将恢复执行,返回到第一个调用者,或者进入一个无限循环中,无限循环将阻塞当前线程,同时恶意线程成功执行。

非ASLR 存根执行

        非ASLR 支持的存根的执行包含四阶段:
                1.基址申请
                2.解析API 函数
                3.文件映射的位置
                4.执行
        如果恶意软件被修剪,或者其内部没有重定位数据,只能将其放置到其首选的地址。此时,存根尝试调用VirtualProtect函数来修改目标进程的内存访问权限,从恶意软件首选的起始地址开始,大小为恶意软件大小。如果这种情况发生,首选基地址和目标进程已有内存区可能重叠,目标进程在Amber 有效载荷执行后将无法继续下去。
此处输入图片的描述

        固定的Amber存根可能无法修改特定的内存区域的访问权限,这有多方面的原因,比如,特定的内存区域没有在当前进程的页面边界内(通常是因为ASLR)或特定的地址和栈守护区域重叠。这是Amber 有效载荷的主要的限制,若所提供的恶意软件没有ASLR 支持(内部没有重定位数据)且存根不能修改目标进程的内存访问权限,有效载荷的执行将不可行。某些情况下,存根成功修改了内存区域的访问权限,但是进程立即崩溃,这可能是因为多个线程在该覆盖的区域内执行。如果目标进程拥有多个线程,当固定的存根执行的时候,进程可能由于内存的特权被修改或者覆盖了正在执行的区域而崩溃。但是,如果固定的存根不使用多阶段感染有效载荷,这些限制无关紧要,当前的POC加壳器可以相应地调整生成的EXE文件的映像基址以及Amber有效载荷的位置。如果分配尝试成功结束,第一阶段完成。第二阶段与支持ASLR的存根使用的方法相同。在完成API地址的解析之后,使用同样的汇编循环来将完整的文件映射放置到之前修改的内存区域。
此处输入图片的描述

        最后一个阶段,存根跳转到恶意软件的入口点,并开始执行,而不新生成一个线程来执行。不幸的是,非ASLR 支持的Amber存根所在的宿主进程无法以之前的状态继续执行。

多阶段应用程序

        不久的将来,操作系统将采用的安全措施会减少恶意软件的攻击面。Microsoft 在2017.05.02发布了一个新的Windows 10 S【8】,这个操作系统基本就是一个特殊配置的Windows 10,其配置了更高的安全性。这个新的操作系统所采用的其中一个主要的预防措施是:不允许从Windows 应用商店以外安装应用程序。操作系统所采用的这种白名单机制将影响那些通过可执行文件感染系统的恶意软件。在这种情境下,多阶段内存执行负载将成为最有效的攻击载体之一。Amber 存根是位置无关的,因此它允许多阶段攻击模型,当前的POC 加壳器能够从一个复杂的编译生成的PE 文件生成一个有效载荷,该有效载荷能够像通常的shellcode 注入攻击一样被加载到内存中并执行。在这种过于严格的系统中,Amber的多阶段兼容性允许利用基于内存的软件漏洞,如栈和堆为基础的缓冲区溢出。
此处输入图片的描述
        尽管如此,由于固定Amber 存根的限制,当执行多阶段感染攻击的时候,最好使用支持ASLR 的EXE 文件。POC 加壳器生成的有效载荷和Metasploit Framework 生成的小的加载器shellocode 与 有效载荷是兼容的,这意味着Amber 有效载荷可以与Metasploit Framework【9】 中使用多阶段命令shellcode 的漏洞利用一起使用。
        下面是Amber 的源码:
https://github.com/EgeBalci/Amber

Demo1-通过metasploit stagers 部署EXE 文件

        本视频演示如何使用metasploit中经常使用的有效载荷将常规的EXE文件部署到系统中。从Metasploit生成的exe文件获取Amber的阶段负载并在内存中执行。
https://youtu.be/3en0ftnjEpE

Demo2-使用Amber 配置无文件的勒索软件(3个不同AV)

        这个视频是一个很好的例子,展示了一种可能的勒索软件攻击载体。通过使用Amber,一个勒索软件EXE 文件被打包并以无文件脚本负载的方式部署在一个远程系统上。这种攻击也可以被替换为使用任何类型的缓冲区溢出漏洞。
https://youtu.be/JVv_spX6D4U

被检测率

        当前(2017.10.19)POC 加壳器的检测率是非常理想的,但由于这个方法即将公开,因此其被检测率肯定会上升。
        当没有传递其它的参数时(仅仅传递文件名),加壳器生成一个多阶段载荷,然后使用随机的多字节密钥进行基本的XOR加密,将加密后的数据组合成EXE 文件,这将增加其反检测功能。生成的EXE 文件在解密载荷之后并进行相应的环境检查之后,像常规的shellcode 一样执行载荷。这个例子是12 字节 XOR 密钥(./amber mimikatz.exe -ks 12)打包的mimikatz.exe(sha256- 9369b34df04a2795de083401dda4201a2da2784d1384a6ada2d773b3a81f8dad)文件。在VirusTotal 上,加壳前的mimikatz.exe 文件的检测率为51/66。在这个特殊的示例中,加壳器使用默认方式来查找windows API 地址,默认方法将使用hash API,避免使用hash API 会降低检测率。目前加壳器支持IAT 偏移的固定地址的使用,下一个版本将包括IAT 解析器shellcode 以提供更多可选的API 地址查找方法。

Virus Total 检测

https://www.virustotal.com/#/file/3330d02404c56c1793f19f5d18fd5865cadfc4bd015af2e38ed0671f5e737d8a/detection

此处输入图片的描述

VirusCheckmate Result

http://viruscheckmate.com/id/1ikb99sNVrOM

此处输入图片的描述

NoDistribute

https://nodistribute.com/result/image/7uMa96SNOY13rtmTpW5ckBqzAv.png

此处输入图片的描述

将来需要做的

        这个工作介绍了一种新的给PE 文件生成恶意软件壳的方法,但是这个方法当前并不支持.NET 可执行文件,将来我们可能增加对于64-bit PE 文件和.NET 可执行文件的支持。另外,就隐蔽性来说,这个方法还有很多可以提升的地方。比如说为整个被映射镜像申请RWE 权限,在我们将被映射的镜像放置好之后,根据被映射镜像的内存区来修改内存区域的访问权限可以降低检测率。另外,在地址解析阶段完成后清除PE 头可以使内存扫描器的检测更加困难。Amber POC 打包器的开发人员将继续以开源形式维护该项目。
参考链接
1 Ramilli, Marco, and Matt Bishop. “Multi-stage delivery of malware.” Malicious and Unwanted Software (MALWARE), 2010 5th International Conference on. IEEE, 2010.

2 Gavriluţ, Dragoş, et al. “Malware detection using machine learning.” Computer Science and Information Technology, 2009. IMCSIT’09. International Multiconference on. IEEE, 2009.

3 Rieck, Konrad, et al. “Automatic analysis of malware behavior using machine learning.” Journal of Computer Security 19.4 (2011): 639-668.

4 Fewer, Stephen. “Reflective DLL injection.” Harmony Security, Version 1 (2008).

5 Leitch, John. “Process hollowing.” (2013).

6 Ammann, Christian. “Hyperion: Implementation of a PE-Crypter.” (2012).

7 Pitts, Josh. “Teaching Old Shellcode New Tricks” https://recon.cx/2017/brussels/resources/slides/RECON-BRX-2017 Teaching_Old_Shellcode_New_Tricks.pdf (2017)

8 https://news.microsoft.com/europe/2017/05/02/microsoft-empowers-students-and-teachers-with-windows-10-s-affordable-pcs-new-surface-laptop-and-more/

9 Rapid7 Inc, Metasploit Framework https://www.metasploit.com

10 Desimone, Joe. “Hunting In Memory” https://www.endgame.com/blog/technical-blog/hunting-memory (2017)

11 Lyda, Robert, and James Hamrock. “Using entropy analysis to find encrypted and packed malware.” IEEE Security & Privacy 5.2 (2007).

12 Nasi, Emeric. “PE Injection Explained Advanced memory code injection technique” Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License (2014)

[13] Pietrek, Matt. “Peering Inside the PE: A Tour of the Win32 Portable Executable File Format” https://msdn.microsoft.com/en-us/library/ms809762.aspx (1994)

原文链接https://pentest.blog/introducing-new-packing-method-first-reflective-pe-packer/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值