在这篇文章中,我们会介绍如何通过emond在macOS上实现持久化访问。根据苹果公司的说法,事件监视进程(emond)会“接受来自各种服务的事件,通过一个简单的规则引擎运行并采取相应操作(action),这些操作可以是执行命令,发送电子邮件或者短消息,推送通知等”。听起来挺有意思,实际上Emond自OS X 10.7就已经有了,所以本文所讨论的细节适用于最新版本的macOS(10.13.2)。
具体步骤emond是一个普通的守护进程,每次系统启动时都会由launchd执行,其对于launchd的配置文件和其他系统守护进程在同一个地方:/System/Library/LaunchDaemons/com.apple.emond.plist,该配置文件决定了何时执行emond,并带有LaunchDaemons经常使用的任何期望的选项。 emond.plist配置文件位于/etc/emond.d/目录中。该文件定义了规则路径,UID/GID过滤,错误日志和事件日志路径以及一些其他选项。
图1:emond.plist中的内容
规则文件被存储在/etc/emond.d/rules/目录中,且应该为plist格式。在该目录下已经有一个示例规则文件了(SampleRules.plist),该示例定义了名称,类型和事件触发后的操作。事件有几种类型(startup, periodic, auth.success, auth.failure等),在这次的演示中我们只使用startup。一旦被emond加载,startup事件类型就会触发规则;periodic事件类型只有在定义了“startTime”之后才会触发;同样的,auth.success事件类型只会在用户成功验证后触发;auth.failure会在验证失败事件上触发,还有其他的一些事件类型就不一一列举。action定义了事件发生后emond将要做什么,需要注意的是,我们可以在规则中定义多个action。只有少数action可以被用于恶意目的(如运行命令和发送电子邮件),你可能已经猜到了,运行命令可以允许你执行任意系统命令,对于发送电子邮件,目的不言自明。对于本演示,我们将重点介绍执行命令。
现在我们可以演示如何利用事件监视进程来建立持久化访问。 emond的机制与其他任何LaunchDaemon相似。 Launchd负责在启动过程中执行所有LaunchDaemons和LaunchAgent。 由于emond是在该过程中启动的,所以当使用执行命令时,应该注意一下你正在执行什么命令,以及在哪一个过程应该执行哪个命令。 这一点非常重要,因为事件发生然后触发action(执行命令)的时候电脑很可能没联网,所以任何需要网络访问的命令都没法用。接下来,我们会展示如何创建规则文件。
要创建规则文件,我们可以使用已经存在的SampleRule.plist文件,并根据需要对其进行修改。
图二:samplerules.plist
该示例包含我们的规则文件所需的一些值。 具体而言,我们可以删除“allowPartialCriterionMatch”这个key并根据需要更改名称。 所定义的action需要针对执行命令的action类型进行修改。 一个完整的例子如下所示:
图三:实现持久化访问示例
需要注意的是,第一个操作是睡眠10秒,这样是为了等待网络连接。至于是10秒还是20秒,因人而异,请自行斟酌。第二个就不用介绍了,建立会话。不过这样持久性机制还有一个奇怪之处:launchd会在启动过程中执行emond,但是在QueueDirectories路径中存在一个文件之前,服务将保持不活动状态。 这在LaunchDaemon配置文件/System/Library/LaunchDaemons/com.apple.emond.plist中指定。 放在QueueDirectories路径中的文件不需要遵循特定的命名方案,也可以为空。
图四:com.apple.emond.plist中的QueueDirectories
把plist文件放进rules目录后,emond错误日志会显示服务已启动,emond也不会提示说找不到任何规则。
图五:错误日志
一旦服务开始,如果你已经定义了一个startup事件类型,那么事件将会立即发生并触发任何action。 现在,我们应该可以看到Empire会话建立了。
图六:请求
图七:会话建立