Chrome插件于2009年12月首次向公众推出,它使用HTML、JavaScript和CSS来扩展Chrome的功能。Chrome插件可以利用Chrome API来阻止广告,更改浏览器用户界面,管理Cookie,甚至与桌面应用程序配合使用。它们还受到用户在安装过程中授予的一组有限权限的限制。借助丰富的原生API,Chrome插件为隐藏恶意代码提供了足够的替代方案。随着EDR产品的出现以及macOS和Windows 10的新安全特性,终端安全性得到了提升。但是,在macOS上使用恶意Chrome插件缺乏检测机制。结果,它们已成为一种诱人的初始访问和持久性有效载荷。本文将介绍macOS插件的有效载荷传递机制,利用自动更新功能进行攻击,使用Apfell的实际示例,以及一些基本但可操作的检测指南。
一、有效载荷传递
有一些方法可用于在macOS上合法安装插件。Google强制开发人员通过网络商店分发插件。最近,Google更改了其政策,因此无法从第三方网站安装插件。无论如何,攻击者仍然可以在网上商店中托管插件,但这是必要的政策变更。取而代之,可以使用移动配置文件在macOS上安装插件。配置文件在macOS和iOS上用于管理各种设置,包括电源管理、DNS服务器、登录项、WiFi设置、壁纸甚至谷歌Chrome等应用程序。终端用户可以通过双击文件或使用profiles命令在命令行上安装配置文件。移动配置文件是XML格式的,并遵循相对简单的格式。要创建移动配置文件,需要有效载荷uuid,应用程序ID和更新URL(稍后将介绍)。有关配置文件的更多信息,请参阅本文和此参考(reference)。这是一个可以用作模板的示例。ExtensionInstallSources值指定可以从中安装插件的URL。通配符可用于协议,主机和URI字段。ExtensionInstallForceList值是指未经用户同意安装且无法卸载的插件列表。 PayloadRemovalDisallowed可防止非管理员用户卸载配置文件。有关用于管理插件和其他Google Chrome设置的其他键值,请参阅此处(this)。配置文件可用于管理macOS的大量设置,并需要进一步调查其他攻击用例。
有关配置文件的有趣说明;它们可以通过电子邮件发送,随后,终端用户将看不到Gatekeeper,MacOS的代码签名执行和验证工具的任何提示。但是,将提示用户确认配置文件的安装。
图1
如果配置文件未签名,则在提示输入管理员凭据之前,向终端用户显示第二个提示(图2)。
图2
但是,在安装签名的配置文件时,操作系统只会提示一次安装,然后提示管理员凭据。安装后,可以在* Profiles *首选项窗格中查看配置文件内容。 如果配置文件未签名,则会用红色标记。
图3
现在已经为Chrome设置了扩展策略,当打开应用程序时,它将对配置文件中指定的更新URL发出一系列Web请求。更新URL应指向更新清单文件,该文件指定应用程序ID和扩展文件(.crx)的URL。有关示例清单文件,请参阅自动更新文档(documentation )。接下来,Chrome会下载该插件并将其保存到~/Library/Application Support/Google/Chrome/Default/Extensions/APPID。此时,插件被加载到浏览器中并执行。请注意,在整个过程中,配置文件是唯一需要用户交互的组件。同样,在Windows上,可以通过修改此处提到的注册表项来静默安装插件。但是,如果安装源是第三方网站,则Chrome只允许内联安装。此类安装需要用户浏览网站,然后将用户重定向到Chrome网上应用商店来完成。
二、自动更新FTW
为轻松管理错误修复和安全补丁,可以自动更新插件。在Chrome网上应用商店中托管插件时,Google会处理更新插件。只需上传插件的新副本,几个小时后,浏览器将通过网上商店更新插件。对于在Web商店外部托管的插件,开发人员可以更好地控制。Chrome使用manifest.json文件中的更新网址来定期检查更新。在此过程中,Chrome将读取更新清单文件,并将清单中的版本与插件的当前版本进行比较。如果清单版本较高,浏览器将下载最新版本的插件并安装它。有关示例更新清单,请转到此处(here)。更新清单是XML格式的文件,其中包含APPID和指向.crx文件的URL。自动更新对于攻击者来说是一个特别有用的功能。在图4和图5中,恶意插件使用一个域名用于标准C2通信,并使用另一个域名来托管更新清单和插件文件。想象一下,事件响应已将C2域名识别为恶意并阻止该域名的所有流量(1)。但是,仍允许更新URL(2和3)。攻击者可以更新清单版本,更改C2域名(4),更新URL,甚至修改一些扩展核心代码。一段时间后,Google Chrome会向新网址发出请求,并使用新的C2域名加载新版本的插件。
图4
图5
此外,如果攻击者失去对插件的控制权,或者插件发生崩溃,他们可以通过更新来远程触发执行。 只要插件仍然安装,Chrome就会继续尝试检查更新。如果仅更新清单版本,Chrome将重新安装插件并触发其执行。接下来,我们将介绍如何使用PoC安装Chrome插件并使用Apfell管理C2服务器。
三、恶意扩展:IRL
Apfell是一个以定制和模块化为中心的开发利用框架。该框架默认以macOS平台为目标,但用户可以创建以任何平台为目标的新C2配置文件。 Apfell是用于恶意Chrome插件的理想框架。让我们一起来配置自定义C2配置文件并生成有效载荷。
1) 有关初始设置说明,请参阅此处(here)的apfell文档。 一旦apfell服务器启动,注册一个新用户并让自己成为管理员。接下来,需要将chrome-extension和chrome_extension-server项目克隆到apfell服务器上。
2) 导航到管理操作 – >有效载荷管理。apfell-jxa和linfell的有效载荷都在此页面上定义。对于每个有效载荷,都定义了几个命令。可以在控制台中修改这些命令中的任何一个,然后在agent中进行更新(特别是对于apfell-jxa和linfell)。在有效载荷页面的左下角是一个导入按钮。这允许用户从json文件导入自定义有效载荷以及每个命令。请导入此文件以节省创建有效载荷的时间。如果导入成功,则应该将* chrome-extension *视为新的有效载荷类型,并使用一些命令启动。
图6
3) 现在在apfell服务器上打开终端会话并导航到chrome_extension-server项目。运行install.sh脚本安装golang并编译server二进制文件。验证server二进制文件是否已成功编译并存在于$$HOME/go/src/chrome-ext-server目录中。
4) 导航到管理- > C2配置文件。单击页面左下角的注册C2配置文件。 在这里,提供配置文件,描述和支持的有效载荷的名称。 上传C2 server的二进制文件($HOME/go/src/chrome-ext-sever/server)和C2 client代码(./chrome-ext/apfell/c2profiles/chrome-extension.js)。
图7
5) 提交配置文件后,配置文件页面应更新并显示新配置文件。
6) 回到apfell服务器上的终端会话中,编辑c2config.json文件并选择所需的选项。
图8
7) 将c2config.json复制到apfell/app/c2profiles/default/chrome-extension/directory。 将server二进制文件重命名为chrome-extension_server。 这是从apfell UI启动c2服务器所必需的。现在在apfell中启动C2服务器。
图9
8) 导航到创建组件 – >创建基本有效载荷。为C2配置文件和有效载荷类型选择chrome-extension。 填写所需的参数(主机名,端口,端点,SSL和间隔)。 提供所需的文件名,然后单击“提交”。 如果一切顺利,页面顶部将显示成功消息。
图10
9) 要下载有效载荷,请转至管理 – >有效载荷管理。现在已设置了扩展有效载荷和C2配置文件,可以将它们导出以用于其他操作。
10) 将有效载荷中的所有代码复制并粘贴到chrome插件项目文件./chrome_ext/apfell/extension-skeleton/src/bg/main.js。 编辑extension-skeleton目录中的manifest.json文件并替换所有* _REPLACE值。 如果未使用自动更新,则update_url不需要是合法URL。
图11
11) 打开Google Chrome,点击更多 – >更多工具 – >插件,然后切换开发者模式。单击pack扩展,然后在chrome_ext项目中选择extension-skeletondirectory。 再次点击包插件,Chrome将使用私钥输出.crx文件。 请注意,需要保留私钥才能更新插件。
12) 需要的最后一条信息是应用程序ID。不幸的是,获得此功能的唯一方法是安装插件并记下插件页面上显示的ID。将插件文件(.crx)拖到插件页面上进行安装。
图12
13) 现在,已拥有创建移动配置文件和托管更新清单和crx文件所需的信息。将指向crx文件的应用程序ID和URL添加到更新清单文件。然后在此处将应用程序ID和update_url添加到示例移动配置文件中。 此外,还需要添加两个唯一的UUID。
图13
图14
14) 现在设置完成了!如果一切都已正确配置,则安装移动配置文件应触发插件的静默安装,并在apfell活动回调页面上添加新的回调。有关安装配置文件的详细信息,请参阅“有效载荷交付”部分。
图15
四、检测
在目标感染部分,我们简要介绍了Chrome插件的交付机制,允许通过移动配置文件进行静默和隐藏安装。从防御的角度来看,此传递机制的检测应该集中在* profiles *命令及其参数上。这在攻击者已经可以访问受害主机的情况下最合适。 具体来说,安装配置文件的命令如下所示:
profiles install -type=configuration -path=/path/to/profile.mobileconfig
相应的osquery规则如下所示:“SELECT * FROM process_events WHERE cmdline=’%profiles install%’;”。 这不是企业环境中的最佳方案,但它是一个坚实的起点。 另请注意,osquery架构现在包含chrome插件表。此外,通过UI安装配置文件时,MCXCompositor进程会将二进制plist写入/Library/Managed Preferences/username/目录。plist文件是移动配置文件的副本。文件名由配置文件中的PayloadType确定。
图16
可能还有其他数据源可以为移动配置文件的使用提供更强大的检测功能,但这应该是一个良好的开端。
对于初始访问和持久性,绝对应考虑使用Google Chrome插件。鼓励其他红队专家和安全研究人员调查Chrome API以获得更多功能。