一、背景
最近,我一直专注于它macOS在持久领域,一些低级用户可以修改的文件被特别选择,这些文件可能会影响用户交互。我发现终端用户经常交互的位置之一是Dock。
通过研究,我发现有一个plist负责控制Apple Dock应用程序的可视化呈现。这里没有太多的突破,因为终端用户经常通过图形界面(GUI)来修改这一plist。在查看了plist在中值之后,我想探索是否可以改变这些值,以便使用恶意应用程序来代替合法的应用程序。
本研究的突破之一是DockPersist.js,我把它纳入PersistentJXA项目之中。在我的实现中,将使用恶意应用程序替换Safari或Chrome。我主要研究Safari和Chrome,因为它们很可能出现在用户身上Dock但这一理论实际上适用于任何应用。终端用户单击Safari或Chrome图标后,就会运行我们的恶意应用程序。这种持久化方式类似于Windows快捷方式(.LNK)因为在,文件是持久的macOS中,Dock图标通常是实际应用程序的快捷方式。
这种持久的方法需要将我们的恶意应用程序上传到目标计算机。我倾向于Mythic代理使用上传功能将应用程序保存到目标上。
在修改plist之后,我们可以立即重新加载Dock。然而,这将导致终端用户屏幕短暂闪烁。或者,我们也可以等待用户重新启动,然后让虚假的应用程序出现Dock因为修改后的plist重启后将保持不变。
二、攻击方式
2.1 部署
正如我前面所说,这种持久的方法需要将恶意应用程序上传到目标这个过程中,有很多方法可以绕过Gatekeeper允许我们将恶意应用程序上传到目标。这些方法包括:
1、压缩应用程序包,在Mythic代理(Apfell或Poseidon)使用上传命令,然后在目标计算机中减压。
2、压缩应用程序包,托管在某个位置,使用curl下载到目标,然后在目标计算机中减压。
3、压缩应用程序包Base64编码,正在进行中Base64在目标计算机中解码并保存到目标上。
作为概念验证(PoC),我仅仅是在“自动操作”(Automator)它创建了一个应用程序。PoC将打开应用程序Safari浏览器避免了终端用户没有感知。然后,它将运行我们的Apfell Payload。
在PoC在应用程序中,JXA打开Safari并执行Apfell Payload:
为了不让终端用户发现,我默认“自动操作”图标替换为Safari浏览器。当然,如果使用的话。Xcode,还可以创建更复杂的应用程序。
带有Safari浏览器图标PoC我们将应用程序命名为Safari:
接下来,我将压缩应用程序包并将其上传到目标中。解压到/Users/Shared之后,我们可以集中精力,在满足前提条件的情况下调用持久的方法。
注意:由于plist自动实现要求将虚假应用程序命名为二进制格式“Google Chrome”或“Safari”,并且位于/Users/Shared/中。我们可以修改Safari64和Chrome64为了改变这个位置,变量。
2.2 调用持久性
将脚本导入Mythic中的Apfell代理:
调用DockPersist函数。该函数接受三个参数:应用程序名称(Safari或Google Chrome)、Bundle ID、是否立即重新加载Dock的选项。
注意:Bundle ID位于Info.plist以下命令可用于获取:
在Apfell代理中调用DockPersist函数,指定Safari、Bundle ID是否重新加载Dock的选项:
三、检测方法
Crescendo在主机上快速捕捉事件是一个很好的工具。Crescendo可以作为macOS实时事件查看器的优秀功能之一是使用它Apple终端安全框架(ESF)。ESF可以监视系统事件中是否存在潜在的恶意活动,实际上它是系统扩展框架中的一个API。与Windows相比之下,可以理解为macOS跟踪最后一个功能有限的事件(ETW)。
通过Crescendo,我们可以很容易地查看由持久执行创建的文件和过程事件。
不太了解ESF读者,您需要了解以下事件将同步到Crescendo:
尽管目前Crescendo不会捕获ES_EVENT_TYPE_NOTIFY_MMAP、ES_EVENT_TYPE_NOTIFY_WRITE和ES_EVENT_TYPE_NOTIFY_EXEC,但它已经捕获了足够多的事件以这种持久的方式对应。我强烈建议使用其他恶意活动Xorrior的Appmon。
根据不同攻击者使用的具体方法,实际恶意应用程序对应的事件可能会有所不同。
首先,plutil将Dock plist转换为XML。XML格式更容易操作。
Plutil将当前com.apple.dock.plist转换为XML格式:
随后,记录了temp9876创建文件和过程。
DockPersist.js在/private/tmp创建一个随机命名的文件。脚本将被修改plist的XML以随机文件名保存版本。在这里,temp0wsn4p包含XML格式的恶意plist,所以我们用正确的加载Dock本文件所需的二进制格式版本。
Plutil将修改后的plist转换回二进制格式:
接下来,DockPersist.js在~/Library/Preferences/com.apple.dock.plist删除现有的plist。
删除当前的com.apple.dock.plist:
ESF捕捉此动作,并将新的恶意plist以二进制格式保存~/Library/Preferences/com.apple.dock.plist。
保存修改后的com.apple.dock.plist:
最后,由于我们在函数调用中重新加载Dock,因此将调用killall。
重新加载Dock:
这些事件是我们的起点。这里的关键是检测到了plutil和killall。此外,文件创建、删除和修改事件也可用于检测。在攻击者持久之前,也可以检测将恶意应用程序上传到目标计算机的动作。
3.1 正常执行
你可能有一个问题,现在我们明白了ESF是如何捕获已知恶意行为的,那么ESF如何区分正常执行?
正常执行时,cfprefsd(Core Foundation Preferences Daemon)将会在com.apple.dock.plist上触发file::rename事件(文件覆盖)。当用户通过时。GUI手动对Dock这些事件也会在更改时触发。
com.apple.dock.plist正常修改:
3.2 尽量避免检测
攻击者可以在另一个主机上修改plist,修改后的plist将其上传到目标计算机的相应位置,以减少潜在指标的数量。然而,这仍然会触发file::rename事件不会用于正常执行cfprefsd过程。从这个角度来看,识别非cfprefsd进程对plist修改动作可能是检测恶意行为的更好标准。
借助Apfell代理覆盖替换com.apple.dock.plist:
3.3 可视化指标
如果执行PoC会导致应用程序Dock中出现两个Safari实例。
恶意Safari应用程序和法律Safari应用程序:
第一个Safari位于恶意应用程序中的恶意应用程序plist的“persistent-apps”第二部分是真的Safari,它位于plist的“recent-apps”部分中。
四、其它指标
在浏览ESF日志之后,我注意到了其中包含了写入SQLite一些数据库内容。如果攻击者使用它osascript,需要注意的是,osascript在~/Library/Caches/com.apple.osascript/Cache.db位置有缓存数据库。
注:创建上述缓存数据库仅适用于攻击者osascript在二进制的情况下。此外,如果使用它,我还对它进行了深入的研究OSAKit替代osascript情况。为了测试,我用了Sublime Text Plugin加载了JXA dylib。与osascript在这种情况下,缓存数据库的位置是不同的C2记录了条目~/Library/Caches/com.sublimetext.3/Cache.db之中。
使用SQLite查看数据库后,我注意到了相应的数据库浏览器cfurl_cache_response表中包含Mythic服务器的IP地址,以及Mythic用于命令和控制(C2)通信的GET请求的简短日志。缓存内容为应急调查提供了宝贵的来源。
通过数据库浏览器SQLite在数据库中查看C2通信证据:
使用sqlite3命令行工具也可以查看这些条目:
五、总结
在本文中,我们展示了它macOS中类似于Windows .LNK文件的持久攻击方法。更重要的是,我希望本文分析的持久性指标能够帮助正在开发测试方法的研究人员。如果您发现这种持久性方法还有其他测试指标,请与我讨论。
六、参考资源
[1]https://posts.specterops.io/detection-engineering-using-apples-endpoint-security-framework-affdbcb18b02
[2]https://medium.com/red-teaming-with-a-blue-team-mentaility/taking-the-macos-endpoint-security-framework-for-a-quick-spin-802a462dba06
[3]https://attack.mitre.org/techniques/T1547/009/
[4]https://developer.apple.com/documentation/endpointsecurity?language=objc
[5]https://github.com/SuprHackerSteve/Crescendo
[6]https://bitbucket.org/xorrior/appmon/src/master/
[7]https://sqlitebrowser.org/
[8]https://eclecticlight.co/2017/07/06/sticky-preferences-why-trashing-or-editing-them-may-not-change-anything/
本文翻译自:https://posts.specterops.io/are-you-docking-kidding-me-9aa79c24bdc1若转载,请注明原址:
【编辑推荐】