FreeBuf|Alerts在macOS上实现持久化,如何利用Calendar

【FreeBuf|Alerts在macOS上实现持久化,如何利用Calendar】
FreeBuf|Alerts在macOS上实现持久化,如何利用Calendar
文章图片
写在前面的话在这篇文章中 , 我们将介绍如何利用CalendarAlerts在macOS上实现持久化 , 并深入讨论如何在渗透测试行动中使用这项技术 。 其中包括如何对Automator.app进行逆向工程分析以找到一个未记录的API来启用该技术 。 除此之外 , 我们还会提供一个针对Aotumation(JXA)代码的JavaScript来实现持久化攻击 。
Calendar.appmacOS种的一项重要功能就是CalendarAlerts , 也就是日历行程提醒 , 它可以根据用户设置的事件来提醒信息或执行一款应用程序 。 我们可以在如下图所示的GUI界面中设置一个新的事件:
FreeBuf|Alerts在macOS上实现持久化,如何利用Calendar
文章图片
在这里 , 我们关注的是持久化技术 。 研究人员Andy曾对此进行了深入分析 , 其中还包括针对代码执行和数据过滤方面的研究 。 除此之外 , 他还讨论了在尝试使用AppleScript以编程方式插入事件来执行此任务时遇到的问题 , 以及日历应用程序忽略请求的情况 。 还有一种方法 , 就是修改驱动应用程序的SQLite数据库 , 这种方法非常好 , 因为这样可以帮助我们为所有的事件都设置默认的警报 , 但是这种修改方式在现实场景中很难实现 。
技术分析在进行技术研究过程中 , 我还对Automator.app进行了分析 , 即苹果通过拖放应用程序来构建重复任务执行所使用的技术 。 Automator中包含了一个内置模板 , 可以用于构建日历警报:
FreeBuf|Alerts在macOS上实现持久化,如何利用Calendar
文章图片
通过GUI进行配置并保存之后 , 我们就可以看到日历中添加了一个新的事件 , 接下来我们就有可能通过编程的方式来执行自动化任务了 。
为此 , 我开始深入研究EventKit的苹果开发人员文档 , 该框架负责与日历事件继续宁交互 , 但我没有发现任何关于API的说明 , 不过这个API允许我们通过添加警报来执行我们的应用程序 。 所以 , 我觉得有必要仔细研究一下Automator , 看看它是如何做到这一点的 。
首先 , 我使用了FileMonitor和ProcessMonitor来对Automator背后的工作机制进行了分析 。 它没有修改日历数据库 , 也没有修改任何其他文件 。 所以 , 我转而使用LLVM调试器lldb来分析 。 在剔除一些EventKit函数后 , 最后我找到了一个函数:[AMICalPluginWorkflowPersonalityfinishSavingWorkflow:forOperation:atURL:error:] 。 分析该函数的反汇编代码后 , 我们可以看到一系列EventKit函数 , 这些函数跟苹果官方文档中提供的函数非常相似:
我们可以看到 , 代码会使用EKEvent类来创建一个新的事件 , 设置事件标题、以及开始和结束的日期时间 。 这里有一个很有意思的函数 , 即[EKAlarmprocedureAlarmWithBookmark] , 其部分反汇编代码如下:
<+876>:movq0x58d6ec05(%rip),%rsi;"bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error:"<+934>:movq0x58d6fe9b(%rip),%rdi;(void*)0x00007fff90b872b0:AMEventKitSoftLinking我们可以看到 , Automator会创建一个新的书签 , 它是一个数据结构 , 指向的是磁盘中的一个特定文件 。 接下来 , 它还会创建一个EKAlarm类的新实例 , 并通过传入书签数据来调用该类中的procedureAlarmWithBookmark函数 。
技术实现接下来 , 我们需要通过编程的方式实现持久化攻击 , 然后利用这种攻击技术 , 将新的日历事件添加到特定的日历中 。 除此之外 , 我们还可以利用JXA代码来通过现有事件来植入后门 , 或者修改用户日历 。
参考代码:https://github.com/FSecureLABS/CalendarPersist