macOS Electron Applications Injection
基本信息
如果您不知道 Electron 是什么,您可以在这里找到大量信息。但现在只需知道 Electron 运行 node。 而 node 具有一些可用于使其执行其他代码的参数和环境变量。
Electron 保险丝
接下来将讨论这些技术,但近年来 Electron 已添加了几个安全标志以防止它们。这些是Electron 保险丝,这些是用于防止 macOS 中的 Electron 应用程序加载任意代码的标志:
RunAsNode:如果禁用,将阻止使用环境变量ELECTRON_RUN_AS_NODE注入代码。EnableNodeCliInspectArguments:如果禁用,参数如--inspect、--inspect-brk将不被尊重。避免以此方式注入代码。EnableEmbeddedAsarIntegrityValidation:如果启用,macOS 将验证加载的asar文件。通过这种方式防止通过修改此文件的内容进行代码注入。OnlyLoadAppFromAsar:如果启用,将仅检查和使用 app.asar,而不是按照以下顺序搜索加载:app.asar、app,最后是**default_app.asar**。因此,当与embeddedAsarIntegrityValidation保险丝结合使用时,不可能加载未经验证的代码。LoadBrowserProcessSpecificV8Snapshot:如果启用,浏览器进程将使用名为browser_v8_context_snapshot.bin的文件作为其 V8 快照。
另一个不会阻止代码注入的有趣保险丝是:
EnableCookieEncryption:如果启用,磁盘上的 cookie 存储将使用操作系统级加密密钥进行加密。
检查 Electron 保险丝
您可以从应用程序中检查这些标志:
修改 Electron 保险丝
正如文档提到的,Electron 保险丝的配置是在Electron 二进制文件中配置的,其中包含字符串**dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX**。
在 macOS 应用程序中,这通常位于 application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework。
您可以在 https://hexed.it/ 中加载此文件并搜索前述字符串。在此字符串之后,您可以在 ASCII 中看到一个数字 "0" 或 "1",表示每个保险丝是禁用还是启用。只需修改十六进制代码(0x30 是 0,0x31 是 1)以修改保险丝值。

请注意,如果您尝试覆盖应用程序中的**Electron Framework 二进制文件**,带有这些修改字节的应用程序将无法运行。
RCE 添加代码到 Electron 应用程序
可能存在外部 JS/HTML 文件,一个 Electron 应用程序正在使用,因此攻击者可以在这些文件中注入代码,其签名不会被检查,并在应用程序的上下文中执行任意代码。
然而,目前存在两个限制:
需要**
kTCCServiceSystemPolicyAppBundles** 权限来修改应用程序,因此默认情况下不再可能。编译的
asap文件通常启用了保险丝embeddedAsarIntegrityValidation和onlyLoadAppFromAsar
使得这种攻击路径变得更加复杂(或不可能)。
请注意,可以通过将应用程序复制到另一个目录(如 /tmp),将文件夹 app.app/Contents 重命名为 app.app/NotCon,修改带有您的恶意代码的 asar 文件,将其重新命名为 app.app/Contents 并执行它来绕过**kTCCServiceSystemPolicyAppBundles**的要求。
您可以使用以下命令从 asar 文件中解压缩代码:
并在修改后重新打包:
使用 ELECTRON_RUN_AS_NODE 进行 RCE
ELECTRON_RUN_AS_NODE 进行 RCE根据文档,如果设置了这个环境变量,它将以普通的 Node.js 进程启动该进程。
如果禁用了fuse RunAsNode,环境变量 ELECTRON_RUN_AS_NODE 将被忽略,这将无法工作。
从应用程序 Plist 进行注入
正如在这里提出的,您可以滥用这个环境变量在 plist 中保持持久性:
使用 NODE_OPTIONS 进行 RCE
NODE_OPTIONS 进行 RCE您可以将恶意载荷存储在不同的文件中并执行它:
如果 EnableNodeOptionsEnvironmentVariable 保持 禁用,应用程序在启动时将 忽略 环境变量 NODE_OPTIONS,除非设置了环境变量 ELECTRON_RUN_AS_NODE,如果 RunAsNode 保持禁用,那么设置了 ELECTRON_RUN_AS_NODE 也将被 忽略。
如果不设置 ELECTRON_RUN_AS_NODE,你将会遇到这个 错误:Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.
从应用程序 Plist 注入
您可以在 plist 中滥用这个环境变量以保持持久性,添加以下键:
利用检查进行RCE
根据这里,如果你使用诸如**--inspect、--inspect-brk和--remote-debugging-port等标志来执行Electron应用程序,将会打开一个调试端口**,这样你就可以连接到它(例如从Chrome中的chrome://inspect),然后你就可以在其中注入代码甚至启动新进程。
例如:
如果禁用了熔丝 EnableNodeCliInspectArguments,应用程序在启动时将忽略节点参数(如 --inspect),除非设置了环境变量 ELECTRON_RUN_AS_NODE,如果禁用了熔丝 RunAsNode,则设置的环境变量也将被忽略。
然而,您仍然可以使用 electron 参数 --remote-debugging-port=9229,但之前的有效载荷将无法执行其他进程。
使用参数 --remote-debugging-port=9222 可以从 Electron 应用程序中窃取一些信息,如历史记录(使用 GET 命令)或浏览器中的cookies(因为它们在浏览器内部解密,并且有一个json端点可以提供它们)。
您可以在这里和这里了解如何操作,并使用自动工具 WhiteChocolateMacademiaNut 或类似的简单脚本:
在这篇博文中,利用这种调试方法使一个无头chrome在任意位置下载任意文件。
从应用程序 Plist 进行注入
您可以滥用这个环境变量在一个 plist 中,以保持持久性添加这些键:
滥用旧版本的 TCC Bypass
macOS 的 TCC 守护程序不会检查应用程序的执行版本。因此,如果您无法使用任何先前的技术在 Electron 应用程序中注入代码,您可以下载应用程序的旧版本并在其中注入代码,因为它仍将获得 TCC 权限(除非信任缓存阻止)。
运行非 JS 代码
先前的技术将允许您在 Electron 应用程序的进程中运行 JS 代码。但是,请记住,子进程在相同的沙盒配置文件下运行,并继承其 TCC 权限。 因此,如果您想滥用权限以访问摄像头或麦克风,您可以从进程中运行另一个二进制文件。
自动注入
工具 electroniz3r 可轻松用于查找已安装的易受攻击的 Electron 应用程序并在其中注入代码。此工具将尝试使用**--inspect**技术:
您需要自行编译它,并可以像这样使用它:
参考资料
最后更新于