一、背景最近一直在关注macOS持久化领域,专门挑选了一些低级别用户可以修改的文件,这些文件可能会影响用户交互。我发现最终用户经常与之交互的一个地方是Dock。通过研究,我发现有一个plist负责控制AppleDock应用程序的视觉呈现。这里没有太多突破性的东西,因为最终用户通常会通过图形界面(GUI)修改这个plist。查看plist中的值后,我想看看是否可以更改这些值以将合法应用程序替换为运行自定义代码的恶意应用程序。这项研究的一个突破是DockPersist.js,我将其合并到PersistentJXA项目中。在我的实施中,Safari或Chrome将被替换为恶意应用程序。我主要关注Safari和Chrome,因为它们都可能位于用户的Dock中。然而,这个理论几乎适用于任何应用程序。在最终用户点击Safari或Chrome图标后,我们的恶意应用程序就会运行。这种持久性类似于Windows上的快捷方式(.LNK)文件持久性,因为在macOS中,Dock图标通常充当实际应用程序的快捷方式。这种持久性方法需要将我们的恶意应用程序上传到目标计算机。我倾向于使用Mythic代理中的上传功能,将应用程序保存到目标上。修改plist后,我??们可以立即重新加载Dock。但是,这会导致最终用户的屏幕出现短暂的闪烁。或者,我们可以等待用户重新启动,然后再让虚假应用程序出现在Dock中,因为修改后的plist将在重新启动后持续存在。2.攻击方式2.1部署如前所述,这种持久化方式需要向目标上传恶意应用。在此过程中,有多种方法可以绕过Gatekeeper保护,从而使我们能够向目标上传恶意应用程序。这些方法包括:1.压缩应用程序包,在Mythic代理(Apfell或Poseidon)中使用上传命令,然后在目标计算机中解压。2.压缩应用程序包,将其托管在某处,使用curl将其下载到目标,并在目标计算机中解压缩。3.压缩应用程序包,进行Base64编码,Base64解码后保存在目标机上,然后在目标机解压。作为概念验证(PoC),我只是在Automator中创建了一个应用程序。PoC应用程序打开Safari浏览器,使最终用户察觉不到。然后,它将运行我们的Apfell有效载荷。在PoC应用程序中,JXA打开Safari并执行Apfell有效负载:为了不被最终用户注意到,我将默认的“自动化”图标替换为Safari浏览器。当然,如果你使用Xcode,你还可以创建更复杂的应用程序。带有Safari浏览器图标的PoC应用程序,我们将其命名为Safari:接下来,我压缩应用程序包并将其上传到目标。解压到/Users/Shared/后,如果满足前提条件,我们可以专注于调用持久化方法。注意:由于plist的二进制格式,自动实现要求伪造的应用程序被命名为“GoogleChrome”或“Safari”,并且位于/Users/Shared/。我们可以修改Safari64和Chrome64变量来改变这个位置。2.2调用持久化将脚本导入Mythic中的Apfell代理:调用DockPersist函数。该函数接受三个参数:应用程序名称(Safari或GoogleChrome)、BundleID和立即重新加载Dock的选项。注意:BundleID位于Info.plist中,可以使用以下命令获取:/usr/libexec/PlistBuddy-c'PrintCFBundleIdentifier'~/FakeApp/Safari.app/Contents/Info.plist在调用DockPersist函数Apfell代理,指定Safari,BundleID,以及重新加载Dock的选项:3.检测方法Crescendo是一个优秀的工具,可以快速捕获主机上的事件。Crescendo可用作macOS的实时事件查看器,其一项很酷的功能是它利用了Apple的端点安全框架(ESF)。ESF可以监控系统事件是否存在潜在的恶意活动,实际上它是系统扩展框架中的一个API。与Windows相比,可以理解为macOS上EventTracking(ETW)的有限功能。WithCrescendo,wecaneasilyviewfileandprocesseventscreatedbypersistentexecution.对于不太了解ESF的读者,大家需要了解下面的一些事件会同步到Crescendo:ES_EVENT_TYPE_AUTH_EXEC=process::execES_EVENT_TYPE_NOTIFY_EXIT=process::exitES_EVENT_TYPE_NOTIFY_CREATE=file::createES_EVENT_TYPE_NOTIFY_KEXTLOAD=process:kext::loadES_EVENT_TYPE_NOTIFY_MOUNT=file::mountES_EVENT_TYPE_NOTIFY_UNLINK=file::unlinkES_EVENT_TYPE_NOTIFY_RENAME=file::renameES_EVENT_TYPE_NOTIFY_UIPC_CONNECT=network::ipcconnectES_EVENT_TYPE_NOTIFY_FORK=process::fork尽管目前Crescendo不会捕获ES_EVENT_TYPE_NOTIFY_MMAP、ES_EVENT_TYPE_NOTIFY_WRITE和ES_EVENT_TYPE_NOTIFY_EXEC,但它已经捕获到了这种持久化方式对应的足够多的事件。Forothermaliciousactivity,IhighlyrecommendXorrior'sAppmon.Thefollowingfocusesontheexecutionofthepersistencemethod.Dependingonthespecificmethodusedbydifferentattackers,theeventscorrespondingtotheactualmaliciousapplicationmaybedifferent.First,plutilconvertstheDockplisttoXML.TheXMLformatiseasiertomanipulate.Plutilconvertsthecurrentcom.apple.dock.plisttoXMLformat:Subsequently,temp9876filecreationandprocesscreationarelogged.DockPersist.jscreatesarandomlynamedfileunder/private/tmp/.ThescriptmodifiestheXMLversionoftheplistandsavesitwitharandomfilename.Here,temp0wsn4pcontainsamaliciousplistinXMLformat,soweoverwritethisfilewiththeversioninbinaryformatneededtoloadtheDockproperly.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(CoreFoundationPreferencesDaemon)会触发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应用程序将导致两个Safari实例出现在Dock中。恶意Safari应用与合法Safari应用:第一个Safari是恶意应用,位于plist的“persistent-apps”部分,而第二个是真正的Safari,位于“recent-apps”plist部分。4.其他指标在浏览了ESF日志后,我注意到它们包含一些写入SQLite数据库的内容。如果攻击者利用osascript,需要注意的是osascript在~/Library/Caches/com.apple.osascript/Cache.db有一个缓存数据库。注意:以上缓存数据库的创建仅适用于攻击者使用osascript二进制文件的情况。除此之外,我还深入研究了如何使用OSAKit而不是osascript。为了进行测试,我使用了SublimeText插件来加载JXAdylib。与osascript缓存数据库的位置不同,本例中的C2条目记录在~/Library/Caches/com.sublimetext.3/Cache.db中。使用SQLite的数据库浏览器查看数据库,我注意到cfurl_cache_response表包含Mythic服务器的IP地址,以及用于Mythic中命令和控制(C2)通信的GET请求的简短日志。此缓存内容为紧急故障排除提供了宝贵的资源。通过数据库浏览器在SQLite数据库中可以看到C2通信的证据:也可以使用sqlite3命令行工具查看这些条目:五、总结在本文中,我们演示了一种类似于Windows.LNK文件在macOS中的持久化攻击方法.更重要的是,希望本文分析的持久性指标能够对正在开发检测方法的研究人员有所帮助。如果大家有找到这种持久化方法的其他检测指标,欢迎和我一起讨论。6、参考资源[1]https://posts.specterops.io/detection-engineering-using-apples-endpoint-security-framework-affdbcb18b02[2]https://medium.com/red-teaming-with-a-blue-team-mentality/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如有转载请注明原文地址:【小编推荐】Linux终端如何连接WiFi?Netflix产品Spinnaker微服务实践分析如何在Docker容器中运行Docker“3种方式”美国“禁令”周日生效:TikTok坚持诉讼,微信企业海外版悄然改名使用用于管理SSH连接的开源工具nccm
