macOS恶意软件排查实践指南

41yf1sh 系统安全 2019年7月17日发布
Favorite收藏

导语:在我们最近的文章《恶意软件如何维持macOS持久性》中,我们讨论了威胁参与者可以确保持久性的方式,一旦威胁参与者攻破了macOS设备,其恶意代码理论上可以在设备注销或重启后仍然存在。但是,持久性仅仅是攻击链中的一个因素。

概述

在我们最近的文章《恶意软件如何维持macOS持久性》中,我们讨论了威胁参与者可以确保持久性的方式,一旦威胁参与者攻破了macOS设备,其恶意代码理论上可以在设备注销或重启后仍然存在。但是,持久性仅仅是攻击链中的一个因素。众所周知,一些威胁行为者不仅仅满足于一次性感染或重复利用漏洞后保持隐蔽,他们可能会让恶意软件在实现其目标后进行自动清理,从而确保不留下任何痕迹。显然,仅仅寻找持久化的项目并不足以进行威胁排查。因此,在本文中我们将深入讨论如何在macOS设备上搜寻威胁。

1.jpg

收集有关Mac的信息

如何在macOS终端上搜索恶意软件,很大程度上取决于我们对设备的访问权限,以及当前在设备上运行的软件类型。我们将假设用户的设备此时没有安全产品的保护,并分析应该如何检测其中任何可能存在的隐藏恶意软件。如果我们的设备上具有安全产品,排查过程的原则也保持不变,掌握相关的排查方法论,将有助于我们利用威胁搜索软件开展排查。

另外一件需要考虑的事情是,我们是直接访问设备,还是仅通过命令行访问设备,还是仅通过日志访问设备。出于练习的目的,我们假设目前可以访问命令行,并且可以从中提取任何日志。

第1步:获取用户列表

我们要做的第一件事,就是了解Mac上当前存在哪些用户帐户。有几种不同的方式可以实现这一点,其中最有效的方法是查看dscl的输出,该输出结果可以显示可能隐藏在系统偏好设置应用程序和登录屏幕中的用户帐户。

命令类似于:

$ dscl . list /Users UniqueID

执行该命令后,其结果不仅仅列出/Users文件夹的内容,还可以列出一些隐藏的帐户。如果使用ls命令,就不会向我们展示隐藏的用户,或主文件夹位于其他位置的用户,因此请务必使用dscl来获取完整的用户情况。

dscl list命令的一个缺点在于,它可能会向我们展示出100个或更多的帐户,其中大多数帐户都是由系统使用,而不是由控制台(即登录)用户使用。我们可以通过忽略那些以下划线开头的帐户来排除掉所有系统帐户,从而缩小列表的范围:

$ dscl . list /Users UniqueID | grep -v ^_

2.jpg

但是,这样就无法排除恶意行为者可能创建以下划线开头的帐户名称的可能性:

3.jpg

因此,我们还是应该检查完整列表,并使用有关用户活动的其他信息来补充进行用户搜索。在这里,有一个很好的命令就是w,它可以显示出每个登录的用户,以及这些用户当前的活动。

4.jpg

在这里,我们看到了用户_mrmalicious,如果我们过滤掉以下划线开头的用户,这个可疑的用户就不会在dscl结果中出现。我们看到,这个用户正在使用bash。

尽管w实用程序是查看当前活动状态的一个好方法,但它也不会显示过去的用户,因此,我们还有最后一个命令来补足短板,可以向我们展示出以前的登录情况。

$ last

下面是部分输出结果,展示了用户的登录以及关闭系统情况。

5.jpg

第2步:检查持久性

我们已经在之前的文章中详细介绍了这一点,因此请大家先参考此前的文章,并重点关注一些容易被忽略的方法。

需要注意的是,在查找LaunchAgents和其他进程时,我们必须考虑Mac上的所有用户,包括root用户。如果存在,我们应该可以在/var/root中找到。

下面是一个Mac恶意软件的案例。在所有用户每次启动时,会运行系统级别的LaunchDaemon,调用隐藏在root用户的Library文件夹内不可见文件夹中的Python脚本。

6.jpg

我们还需要考虑利用开放端口和互联网连接的持久性方法,因此我们需要继续排查下一步。

第3步:检查开放的端口和连接

对后门感兴趣的恶意软件作者通常会尝试在未使用的端口上设置服务器以监听连接。一个很好的例子是最近的Zoom漏洞,该漏洞迫使公司推出紧急补丁,尝试修复Mac用户的0-Day漏洞。Zoom客户端会在端口19421上运行隐藏的服务器,可能会向攻击者公开实时的网络摄像头,并允许远程执行代码。这是一个很好的例子,能够说明一个特权进程要设置一个持久的服务器是多么容易,该服务器可以充当后门,轻松逃避普通用户的检测,也能避开macOS内置的安全机制。

7.jpg

我们可以看到,有服务器正在监听22、88、445端口。这表明Mac的共享首选项中已经启用了远程登录和远程文件共享。我们可以在这里查看Apple服务使用的完整端口列表。

接下来,我们使用以下命令:

$ lsof –i

列出具有开放IPv4、IPv6和HP-UX X25连接的所有文件。

8.jpg

该输出结果为我们提供了相当多的有用信息,包括IP地址、命令和PID。我们可以查询ps实用程序,获取有关每个进程的更多信息。

$ ps -p <pid>

9.jpg

第4步:排查正在运行的进程

ps命令有很多有用的选项,也可以作为我们可以使用的工具之一,用于查看信息收集过程中在Mac上运行的内容。

我需要做的第一件事,就是以超级用户身份运行它,从而获取所有进程的完整列表。

$ ps -axo user,pid,ppid,%cpu,%mem,start,time,command

我通常会将其转储到文本文件中,并对PPID(父进程标识符)不为1的命令进行重点关注,这表明用户进程会生成子进程。

此外,可以通过下面的命令转储输出:

$ lsappinfo list

这将提供许多有关应用程序的重要信息,包括可执行路径、PID、Bundle标识符(用于检测目的)和启动时间。

10.jpg

我们还可以通过launchctl实用程序检查正在运行的守护程序、代理和XPC服务。我发现一些较旧的、已经弃用的语法比新语法更加容易解析,但这可能仅仅是我的习惯偏好,因此请尝试使用其中的任意一种。

在旧语法中,我们可以简单地运行下面的命令,来获取有关该特定用户域中正在运行的内容的大量相关信息。

$ launchtl list

如果该命令与sudo共同使用,还可以生成在系统范围域中运行的服务列表。

在新语法中,我们可以使用类似如下的方法:

$ launchctl print user/501

将501替换为我们需要查看的任意UID,并使用下面的语句来定位系统范围的域:

$ launchctl print system

使用旧语法和新语法的输出是完全不同的,具体哪种语法更合适,可能要取决于我们想要的信息类型。我经常使用旧语法,并使用com.apple标签来进行grep操作,以便我可以专注于绝大多数的费系统进程。但是,有些macOS恶意软件故意使用了apple这个名字,所以如果我们按照这样的建议进行了排查,必须要确保在其他位置解析带有“apple”标签的东西,例如从原始数据中,或者使用ps实用程序。

第5步:排查打开的文件

此前,我们使用了带有-i选项的lsof来列出开放的端口,但实际上,我们也可以通过不带参数运行lsof来列出所有打开的文件。这样会产生出大量的信息,我们希望将其迅速缩小,以使其易于管理。

11.jpg

如果在系统运行时,已经打开了系统完整性保护(提示:我们可以使用命令csrutil status来确定),那么通常可以解析lsof的输出,例如使用BBEdit,并删除包含对System文件夹引用的所有行。请记住,这样做可能会导致我们遗漏掉某些内容,并非所有系统文件夹都受到SIP的保护,但在排查的前期阶段,我觉得这种概率是可以接受的,并且也无法找到其他的威胁指标。

出于类似的原因,我倾向于首先关注不属于常规应用程序的打开文件。我们必须清楚地认识到,恶意软件作者有时可以使用常规的应用程序来实现恶意操作,比如使用浏览器的0-Day漏洞,或者通过供应链攻击的方式。因此,我们必须要清楚知道已经过滤掉的内容,并且在后续任何有必要的时候回过头来再次排查。

第6步:排查文件系统

到此时,如果我们还没有发现任何可疑进程,那么很可能是因为恶意软件已经执行完成,所以现在是时候对文件系统进行初步排查了。在这里,我们只是试图确定存在威胁,而不是对整个系统进行深入地调查取证,因此我们可以迅速地排查我们能够看到的资源访问和解析,从而查找恶意行为的证据。

但是,在我们开始之前,请关注一个问题。如果我们是在macOS 10.14 Mojave以上版本进行排查,我们可能会发现命令行排查过程会受到macOS最近用户保护的阻碍。为避免这些,需要确保已经将终端(Terminal)添加到“隐私”(Privacy)窗格中的“完全磁盘访问”(Full Disk Access)面板中。

12.jpg

我倾向于首先对某些未知的文件进行排查,这些位置是恶意软件最常用的地方。其中包括用户主文件夹中的隐藏文件和文件夹、添加到/Library和~/Library中的异常文件夹,以及所有这些文件夹中的Application Support文件夹。需要关注的是,每个用户都有一个单独的Library文件夹,以及计算机域级别。

我们可以使用单行程序,在当前用户和计算机域上获取这些内容:

$ ls -al ~/.* ~/~/Library /Library ~/Library/Application\ Support /Library/Application\ Support/

如果Mac上有多个用户帐户,需要使用bash脚本下拉到sudo并列举每个用户。

接下来,检查/Users/Shared文件夹,以及/private/tmp中的临时目录和用户的临时目录(这些都不相同),我们可以使用$TMPDIR环境变量。

$ ls -al /Users/Shared
$ ls -al /private/tmp
$ ls -al $TMPDIR

此外,不要忘记我们应该已经有一个项目列表,其中包含启动文件夹和调查持久性机制的任何Cron任务。通常情况下,如果在其中发现了可疑的项目,就应该进行重点排查。

在大多数情况下,如果Mac已经感染,上述步骤的排查过程中就会发现可疑项,并且能够给出我们进一步的方向,但如果没有,还有一些其他需要注意的事项。如果我们怀疑是不久前刚刚感染(例如几天,或更短时间内),可以尝试搜索查找自特定时间或日期之后(或之间)创建的任何文件。例如,下面的例子将会查找在过去30分钟内当前工作目录中修改的所有文件。我们可以将m替换为h来指定使用小时作为单位,或者不使用说明符,将会默认为天。

$ find . -mtime +0m -a -mtime -30m –print

取决于该设备的常规活动量,以及搜索的时间范围,可能会产生大量数据,也可能会产生易于排查的少量数据,因此我们需根据实际需要灵活调整搜索参数。

我们还可以查询LSQuarantine数据库,查看电子邮件客户端和浏览器下载了哪些项目。

$ sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV* 'select LSQuarantineEventIdentifier, LSQuarantineAgentName, LSQuarantineAgentBundleIdentifier, LSQuarantineDataURLString, LSQuarantineSenderName, LSQuarantineSenderAddress, LSQuarantineOriginURLString, LSQuarantineTypeNumber, date(LSQuarantineTimeStamp + 978307200, "unixepoch") as downloadedDate from LSQuarantineEvent order by LSQuarantineTimeStamp' | sort | grep '|' –color

同样,我们可以首先获取大量数据方便筛选,在具体过滤时可以选择特定的日期范围。LSQuarantine的好处在于,它会为我们提供文件下载位置的确切URL,我们可以使用这一信息在VirusTotal或其他信誉平台上进行查询。LSQuarantine的缺点在于,数据库很容易通过用户(或恶意行为者)在UI中采取的正常操作来实现清除。因此,如果在这里找不到某些内容,不排除文件时机上没有通过隔离进程的可能性。

还有一个有用的技巧,是通过对隔离位执行mdfind查询,并分析输出结果:

$ mdfind com.apple.quarantine

使用这样的命令,可以找到已经下载的文件,包括恶意PDF、Word等,其中也标明了隔离位的情况。但是,这里面会有很多合法的文件,因此需要进行认真筛选。

第7步:排查Mac的网络配置

在某些情况下,macOS上的恶意软件会操纵DNS和AutoProxy网络配置,因此我们有必要检查这些配置。我们可以从命令行获取信息,因此,首先使用下面的命令,获取网络接口配置的详细信息:

$ ifconfig

该命令会输出关于无线网络、以太网、蓝牙和其他接口的信息。我们还需要收集SystemConfiguration属性列表,以查找试图劫持Mac上DNS服务器设置的恶意软件。在2018年发现的OSX.MaMi恶意软件就是这样做的。

$ plutil -p /Library/Preferences/SystemConfiguration/preferences.plist

可以使用下面的命令来检查Mac的自动代理设置:

$ scutil --proxy

像OnionSpy这样的间谍软件,会配置这些设置,从而将用户流量重定向到攻击者选择的服务器上。

深入排查macOS的隐藏数据库

根据用户拥有的访问权限和授权,可以深入排查并恢复文件系统事件、用户浏览记录、电子邮件历史记录、应用程序使用情况、连接设备等非常详尽的信息。在后续关于macOS数字取证和事件响应的文章中,我们将介绍Apple内置的system_profiler和sysdiagnose实用程序、统一日志记录、fsevents以及sqlite缓存,这些缓存几乎包含了我们可能希望了解的所有细节。在大多数情况下,上述所列出的步骤足以帮助我们找到macOS恶意软件的证据,即使是遇到最为隐秘的恶意软件也是如此。通过深入研究这些证据,可以为我们提供更多信息,从而帮助检测、修复和归因。

总结

如果各位读者有兴趣学习如何排查macOS上的恶意软件感染情况,无论是挖矿软件、广告恶意软件、后门程序还是民族国家的高级攻击,本文列出的步骤都可以为大家提供一个良好的开端,让我们掌握应该在哪里找、应该要找什么。建议大家阅读我们关于macOS持久性的文章,因为这通常是最容易检测的指标。也请大家持续关注我们,我们会陆续推出关于macOS安全的系列文章。

本文翻译自:https://www.sentinelone.com/blog/malware-hunting-macos-practical-guide/如若转载,请注明原文地址: https://www.4hou.com/system/19184.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论