如何在macOS上不被感染的情况下逆向恶意软件第一部分

630 阅读8分钟

如何设置安全环境来测试恶意软件

要测试恶意软件,您需要下载一些虚拟化软件来运行操作系统确保电脑不被感染。macOS 上基本上有三种选择:VirtualBoxParallelsVMWare。我在这里没有偏好,所以选择一个,阅读文档以设置 macOS 虚拟机(任何最新版本都可以,但本教程将使用运行 macOS 10.14.3 的 Parallels Desktop VM 实例)

image.png 查看客户操作系统的配置选项。您需要更改一些内容。首先,VM 可能会滞后,因此请确保您已经为 VM 提供了足够的 RAM:至少 2GB,但 4GB 应该会让事情变得更流畅。出于同样的原因,将图形内存增加到至少 512MB。

一些恶意软件会尝试检测您是否在VM中运行它并因此改变其行为,尽管我们不会在被教程中处理这种情况,但是可以提供帮助的一个技巧是更改机器的默认MAC地址.对于Parallels更改MAC地址。使其以开头00-1C-42,对于VirtualBox,将其更改为08-00-27为开头的以外的任何内容,请避免以下前缀00-50-5600-0C-2900-05-69.

image.png

隔离macOS主机

重要的是利用VM隔离您的主机,这意味着您不能共享任何驱动器或者文件夹,包括备份。恶意软件必须无法从您的虚拟机中逃脱,我甚至不共享剪贴板

您如何执行此操作取决于您特定的VM软件以及版本,但是例如在Parallels Desktop 14的偏好设置中“安全”选项卡中有隔离Mac设置。

image.png

在我拥有的VMWare Fusion最新版本中,隔离面板并不是唯一可以查看的地方。在其他面板"共享"中可以禁止任何将"客人"连接到主机的能力,虚拟机应用唯一需要访问的是互联网,这通常是默认设置的。

进行这些更改后,启动VM并且确保共享文件夹为空

image.png

隔离是必不可少的,但是如果您想一些屏幕截图或者文件输出以供将来参考怎么办?在这种情况下,您可以使用电子邮件发送给自己(注意:记得加密).

在macOS上测试恶意软件的工具

从这里开始,假设我们讨论的所有内容都是在您隔离的VM应用中的操作,花费一点时间根据自己的喜好调整任何系统偏好设置或者应用偏好设置。尤其是终端,因为我们大部分时间都是在里面.

在命令行上,调用strings实用程序触发安装Apple命令行工具的提示。完成提示,直到完成。

image.png

现在我们已经安装了学习macOS恶意软件分析和逆向工程所需要的所有工具。 这些工具包括字符串解码器(strings) 文件分析实用程序(file、nm、xattr、mdls)十六进制编辑器(hexdump、od、xxd)静态反汇编器(otool)以及调试器、内存读取器和动态反汇编器(lldb)。 当然还有一些专业人士所使用的许多非常牛逼的工具,例如HopperCutterRadare2Floss以及公共存储库上提供的数百种优秀的社区提供工具。

image.png

我们将在本系列中和最后提到其中的一些,但在这个阶段我们不需要它们。为什么不?因为作为学习者,我们想了解我们正在做的事情的基本概念。专业工具非常适合节省时间和提高工作效率,但在学习环境中,它们很容易混淆或隐藏重要细节。

如何查找macOS的恶意软件样本

在我们开始 macOS 恶意软件分析和逆向工程之前,只缺少一件事:一些 macOS 恶意软件!

让我们在 VM 虚拟机上设置一个工作目录,我们将在其中保存示例并完成所有工作。就像是:

$ mkdir ~/Malware

有许多获取样本恶意软件的来源。最受欢迎的可能之一是Virustotal,但如果您有付费帐户,则只能从那里下载样本。幸运的是,还有其他公共存储库,例如malpediamalshare。我们将在本教程中使用的示例具有以下哈希值,并且适用于所有三个:

197977025c53d063723e6ca2bceb9b98beff6f540de80b28375399cdadfed42c

它不是世界上最危险的恶意软件——在我们学习的过程中对我们有好处!- 但它确实有一些意想不到的行为,包括删除一个被苹果标记为MACOS.35846e4的神秘恶意软件实例作为其后果之一。它还有一些棘手的混淆代码,我们需要弄清楚如何在途中解密。

image.png

macOS恶意软件文件分析-第一步

下载示例并将其移至您的工作目录。如果您还没有在终端中这样做,现在让我们切换到命令行并将文件重命名为更易于管理的名称:

$ mv 197977025c53d063723e6ca2bceb9b98beff6f540de80b28375399cdadfed42c.dms malware01

file让我们看看这个实用程序是什么样的:

$ file malware01

确定文件类型的图像

这是一个 zip 文件,所以让我们对其进行解压,看看我们有什么: $ unzip malware01

Terminal 的输出向我们展示了它是一个具有常规层次结构的 macOS 应用程序包

image.png

如何检查代码签名

有趣的是,有一个_CodeSignature文件夹,仅当开发人员对捆绑包进行了代码签名时才存在该文件夹。因此,让我们找出开发人员是谁。

$ codesign -dvvvv -r - UnpackNw.app/

image.png

这告诉我们一些有用的东西,我们可以使用这些东西来构建我们的 IoC 列表。bundle Identifier 和 TeamIdentifier(又名 Apple 开发者签名证书)都可用于检测软件,因此如果存在,请务必在分析的早期记录它们。

让我们看看开发者的证书是否仍然有效,或者是否已被 Apple 吊销:

spctl --verbose=4 --assess --type execute UnpackNw.app

如果不再接受文件的代码签名,您将 CSSMERR_TP_CERT_REVOKED在输出中看到。在这种情况下,证书被接受。

代码签名并不意味着那么多。有很多虚假和流氓开发者帐户。它的意思是,如果应用程序运行,它应该受到 Gatekeeper 和 XProtect 的检查,除非我们绕过它们,我们将在进行一些动态分析时进一步讨论。

应用程序包结构

现在让我们将目标更为bundle包,以便我们可以更轻松地处理内容

cd UnpackNw.app/Contents

在 Mac 应用程序包中,有几件事是必需的。必须有一个 Info.plist,并且必须至少有两个其他文件夹:一个 MacOS 文件夹,其中包含包的主要可执行文件,以及一个 Resources 文件夹,其中可以包含开发人员想要打包的任何其他内容,包括脚本和可执行文件。您可能还会在其他示例中看到其他文件夹,例如 Frameworks、Plugins 等。请参阅 Apple 的文档以了解有关捆绑包结构的更多信息。

Info.plist 可以包含有关应用程序功能的有用信息。我们使用plutil -p 命令读取它们

image.png

请注意,它包含来自 codesign 实用程序的包标识符,因此如果您正在处理未进行代码签名的示例,您可以在此处为您的 IoC 列表获取该标识符。

我们可以从 Info.plist 中了解许多有用的信息,例如运行样本的最低 macOS 版本,甚至恶意软件作者在构建它时使用的 macOS 版本和内部版本号。这些细节对于归因和分析都很有用:如果我们试图弄清楚为什么包含或不包含某些代码,或者为什么某些版本的恶意软件在不同版本上运行不同,那么了解开发人员的构建版本可能是一个重要线索受害者的机器。

让我们转到 Resources 文件夹。当我们之前解压缩 zip 文件时,我注意到这里有一些有趣的东西。

image.png 那个“unpack.txt”文件是什么,为什么后面有一个星号?在我们窥探内部之前,让我们收集有关它的更多详细信息。

如何收集文件元数据

您可以在 macOS 上的任何文件上使用许多有用的命令来收集有关它的元数据,并且在打开未知文件之前这样做总是一个好主意。

让我们从file实用程序开始,看看该项目是否真的是它的扩展所声称的那样。在这种情况下,它原来是一个常规的 ASCII 文本文件。

image.png

如上图所示,我们可以同时使用xattr -lls -al@来列出文件的扩展属性和权限。

mdls工具是一个很棒的实用程序,它还将列出 Spotlight 和 Finder 保存的元数据。由于此元数据在文件传输中是持久的,因此您有时也可以在此处捕获有关源的信息。这些实用程序的man页面将告诉您有关如何使用它们的更多信息

再次查看 的输出ls -al@。权限列表中的这三个x字符表明它具有可执行权限,这对于应该是纯文本文件的东西来说非常奇怪。这也是文件名末尾的星号所表示的:具有可执行权限的文件。

好吧,让我们开始破解,看看里面有什么!您可以cat在 GUI 中使用或常规文本编辑器,但我更喜欢使用vi.

image.png

哇,这很有趣!我们有一个具有可执行权限的纯文本文件,其中充满了混淆代码。可疑,确实!但是所有这些混淆的代码是什么意思?我们将需要深入研究主要的可执行文件以找出答案。接下来就是这样!

结论

在这篇文章中,我们介绍了很多内容。我们已经看到了设置安全测试环境的重要性以及如何测试 macOS 恶意软件。我们已经了解了如何以及从何处获取恶意软件样本,并且我们已经研究了确定应用程序包包含的内容以及如何读取文件元数据的方法。在我们的示例中,我们发现了一些有趣且被混淆的东西。但它是否是恶意的,我们如何解码它?