Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Loki — 🧙‍♂️ 用于脚本劫持存在漏洞的 Electron 应用的 Node.js 命令与控制 | Kitploit
工具/GitHubGitHub/boku7/loki
持久化机制漏洞利用IDS/IPS规避Shellcode后渗透利用命令与控制红队Payload 开发
GitHubboku7/loki

Loki

🧙‍♂️ 用于脚本劫持存在漏洞的 Electron 应用的 Node.js 命令与控制

查看仓库
1.4k2204个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

🧙‍♂️ Loki 命令与控制(C2)

Loki 是一个用 Node.js 编写的阶段一命令与控制(C2)框架,旨在对易受攻击的 Electron 应用实施脚本劫持(script-jacking)MITRE ATT&CK T1218.015。Loki 专为红队行动而开发,通过利用受信任的、已签名的 Electron 应用,实现规避安全软件并绕过应用程序控制。

脚本劫持通过使用任意 Node.js 代码修改 Electron 应用在运行时加载的 JavaScript 文件,从而劫持其执行流程。该技术可用于:

  • 对 Electron 应用植入后门
  • 掏空 Electron 应用
  • 将执行链式传递给另一个进程

虽然已有多种工具涉及利用脚本劫持将执行链式传递给另一个进程,但 Loki 是首个能够对已签名 Electron 应用进行后门植入和掏空操作,且不会使它们的代码签名签名失效的工具。

有关 Loki 工作原理的更多细节,请查看这篇博客文章:

  • 使用 Loki C2 绕过 Windows Defender 应用程序控制

🚀 贡献者

姓名贡献
Bobby Cooke创建者与维护者
Dylan Tran创建者
Ellis SpringeAlpha 测试者
Shawn Jones汇编执行代码
Trusted SecCOFFLoader 代码
Simon Exley视频创作者
Clinton Elves视频创作者
John Hammond视频创作者

视频

看看 John Hammond 制作的这段关于使用 Loki C2 对 Cursor AI 进行后门植入的视频吧!🎩

  • 在视频中,他演示了如何发现一个新的易受攻击的 Electron 应用、使用 Loki C2 对其进行后门植入、完成客户端 GUI 的设置,我们甚至还提出了两种让应用在后台持续运行的方法 🪄 -- 从最终用户的角度来看,Cursor 运行完全正常!🥷

我对 Cursor AI 进行了后门植入

看看 Simon Exley & Clinton Elves 制作的这段关于快速上手 Loki C2 的视频吧!🧙‍♂️

使用 Loki C2 绕过 Windows Defender 应用程序控制

功能与详情

  • Azure 存储 Blob C2 通道
    • 使用 SAS 令牌保护 C2 存储帐户
  • AES 加密的 C2 消息
  • 支持代理的 agent
    • 使用 Chromium 渲染器子进程执行 agent、shellcode 以及 assembly 的 fork-n-run 风格执行 -- 继承了 Chromium 的代理感知能力。
  • 无需 Teamserver
    • 与传统 C2 中 agent 向 Teamserver 发送消息不同,Loki 没有 Teamserver
    • GUI 客户端和 agent 均向同一数据存储进行回连
  • 隐藏执行 -- 在后台运行

命令

所有 agent 命令均使用原生 Node.JS 编写,不需要额外的依赖或库加载操作。唯一例外的是 scexec 和 assembly 命令,它们会对 keytar.node 和 assembly.node 执行库加载。

  • 所有命令接受使用 / 的路径,路径中的 \ 将无法正常工作。

Set - 从应用程序控制排除路径加载节点

  • 如果存在阻止节点文件进行库加载的应用程序控制规则,你可以使用 set 命令更改 assembly.node 和 scexec.node 的加载路径。
  • 通过使用 ls、cat、cp 和 mv,你或许能够枚举应用程序控制规则,从而发现一个属于排除项的可写目录。
  • 这样一来,你可以将节点文件放入排除目录,并使用 set 命令将其加载路径更改为排除目录,从而绕过应用程序控制。
  • 有关此攻击向量的更多细节,请参阅 Daniel Duggan (@_RastaMouse) 的 CRTO2 课程
root@kitploit:~
[04-04-2025 8:50AM MST] advsim$ help set
Set the Node load paths for assembly node and scexec nodes
	set scexec_path C:/Users/user/AppData/ExcludedApp/scexec.node
	set assembly_path C:/Users/user/AppData/ExcludedApp/assembly.node
[04-04-2025 8:51AM MST] advsim$ set scexec_path C:/Users/user/AppData/ExcludedApp/scexec.node
SCEXEC Node Load Path Set to : C:/Users/user/AppData/ExcludedApp/scexec.node

Agent 功能

点击此处了解更多 Agent 功能信息

客户端功能

点击此处了解更多客户端功能信息

🧙‍♂️ 部署幻象

首先,你需要找到一个不进行 ASAR 安全完整性检查的易受攻击的 Electron 应用,例如 Microsoft Teams。较新的应用可能带有完整性检查,从而阻止后门植入。目标应用的旧版本更可能存在漏洞。

  • 发现易受攻击的 Electron 应用指南

简单说明

对 Electron 应用进行后门植入时,你无需编译 agent。只需用 Loki agent 文件替换 {ELECTRONAPP}/resources/app/ 中的内容即可。

详细说明

步骤 1:创建 Azure 存储 Blob 帐户并获取 SAS 令牌

  • 通过 Azure 门户创建 Azure 存储帐户
  • 通过 Azure CLI 创建 Azure 存储帐户

步骤 2:创建混淆后的 Loki Payload

  • 克隆此仓库并 cd 进入其中
  • 安装 Node.JS
  • 安装 javascript-obfuscator 模块
root@kitploit:~
npm install --save-dev javascript-obfuscator
  • 运行 create_agent_payload.js 脚本,使用你的存储帐户信息创建 Loki payload
root@kitploit:~
bobby$ node create_agent_payload.js 
[+] Provide Azure storage account information:
        - Enter Storage Account  : 7f7584ty218ba5dba778.blob.core.windows.net
        - Enter SAS Token        : se=2025-05-28T23%3A14%3A48Z&sp=rwdlac&spr=https&sv=2022-11-02&ss=b&srt=sco&sig=5MXQzJ6FDZK8yYiBSgJ6FDZKgQzJMXBSgg6qE4ydrJ6FDZKSgg%3D

[+] Configuration:
        - Storage Account : 7f7584ty218ba5dba778.blob.core.windows.net
        - SAS Token       : se=2025-05-28T23%3A14%3A48Z&sp=rwdlac&spr=https&sv=2022-11-02&ss=b&srt=sco&sig=5MXQzJ6FDZK8yYiBSgJ6FDZKgQzJMXBSgg6qE4ydrJ6FDZKSgg%3D
        - Meta Container  : mllyi2zjmafjm

[+] Updated /Users/bobby/apr2/LokiC2/config.js with storage configuration. 
 - Enter into the Loki Client UI
        Loki Client > Configuration

[+] Modifying PE binaries to have new hashes...
        - Payload assembly.node hash : e9d126407264821d3c2d324da0e2d1bc13cbc53e7c56340fe12b07f69b707f02
        - Payload keytar.node   hash : 292c14ffebd6cae3df99d9fbee525e29a5a704f076b82207eb3e650de45b075d

[+] Payload ready!
         - Obfuscated payload in the ./app directory

步骤 3:对 Electron 应用进行后门植入

  • 你的混淆 Loki payload 会输出到 ./app/
  • 将目录切换到 {ELECTRONAPP}/resources/
  • 删除所有内容
  • 将 Loki 的 ./app/ 文件夹复制到 {ELECTRONAPP}/resources/app/
  • 点击 Electron PE 文件,确保 Loki 正常工作

步骤 4:配置 Loki 客户端

  • 启动 Loki GUI 客户端

  • 从菜单栏点击 Loki Client > Configuration 打开设置窗口

  • 输入你的存储帐户详细信息,然后点击 Save

  • agent 现在应该会显示在仪表板中

  • 在仪表板表格中点击 agent 以打开 agent 窗口

  • 进行测试以确保 Loki 正常工作

对 Electron 应用进行后门植入并让真实应用保持正常运行

使用 Loki 最直接的方式是用 Loki 文件替换 {ELECTRONAPP}/resources/app/ 中的文件。这会掏空应用,也就是说应用将无法正常运行 -- Loki 取代了它的功能。

如果你真的想让 Electron 应用保持运行,同时让它在后台部署 Loki,那么一切希望并未破灭!John Hammond 和我想出了一种让真实 Electron 应用保持运行的方法。我们已将你需要的文件添加到本仓库的 /loki/backdoor/init.js 中。

目前它的配置针对 Cursor 有效,该应用由 John Hammond 发现存在漏洞。

为此,你需要:

  • 下载 Cursor 应用
  • 将所有 Loki 文件(package.json 除外)粘贴到 cursor/resources/app/
    • 不要替换真实的 package.json
  • 将 /loki/backdoor/init.js 复制到 cursor/resources/app/
  • 将 cursor/resources/app/package.json 的内容修改为:
    • 设置 "main":"init.js",
    • 删除 "type":"module",
    • 删除 "private":true,

工作原理

  • 经过这些修改后,Cursor.exe 在点击/执行时会加载 init.js
  • init.js 读取 package.json
  • init.js 将 "main":"init.js", 改为 "main":"main.js",
    • main.js 即 Loki
  • init.js 生成并脱离一个新的指向 Loki 的 Cursor.exe
  • Loki 在后台被生成
  • init.js 再次读取 package.json
  • init.js 将 "main":"main.js", 改为

这样,应用将保持持续后门植入状态并正常运行。如果 Cursor 应用被退出,Loki 仍会在后台继续运行。

未来计划

未来我会编写一个脚本来自动化这一过程。

OPSEC 建议

  • OPSEC 建议

编译指南

以下是构建 agent 和客户端的编译说明。这些说明涵盖多个平台,包括 Windows、Linux 和 macOS。建议在目标平台和架构上编译客户端。

客户端

  • Windows
  • macOS
  • Linux

Agent

如果你正在对 Electron 应用进行后门植入,则无需编译 agent。

我不建议编译 agent 并将其用于实战操作。Agent 编译说明仅供开发使用。

  • Windows
  • Linux
  • macOS

检测指南

  • 查看 MITRE 提供的信息,以获取有关此 TTP 的更多细节、示例和信息:
    • MITRE ATT&CK T1218.015:Electron 应用
  • 从异常目录(例如 ~/Downloads/Teams/Teams.exe)执行 Electron 应用
  • Electron 应用向 Azure 存储 Blob *.blob.core.windows.net 进行 beacon 回连
  • 网络流量中出现 SAS 令牌的使用
  • Electron 应用生成子进程,例如 netstat.exe 或 whoami.exe
  • 当 Loki JavaScript 在 Electron 进程中执行时,会在 ~/AppData/Roaming/{NAME} 下创建一个与 Loki package.json 中名称同名的目录。
  • 这条 LOLBAS Teams 条目涵盖了针对 Electron 应用后门植入的检测方法。检测信息已复制到下方。
  • IOC:创建了 %LOCALAPPDATA%\Microsoft\Teams\current\app 目录
  • IOC:%LOCALAPPDATA%\Microsoft\Teams\current\app.asar 文件被非 Teams 安装程序/更新程序创建或修改
  • SIGMA 规则,用于检测从 Electron 应用建立的 Loki C2 通道
  • SIGMA 规则,用于检测劫持 Electron 应用文件夹(Teams、VS Code、RingCentral、Postman)以加载 C2 框架的行为

参考资料 || 致谢 || 进攻性 Electron 研究

  • Dylan Tran (@d_tranman)
    • Loki agent 的共同创建者。创建了用于 shellcode 和 assembly 执行的 node 模块。
  • Valentina Palmiotti (@chompie1337)、Ellis Springe (@knavesec) 和 Ruben Boonen,感谢他们此前在针对持久化目的对 Electron 应用进行后门植入方面的内部工作
  • Ruben Boonen
    • Wild West Hackin' Fest 演讲 Statikk Shiv:利用 Electron 应用进行后渗透
  • Andrew Kisliakov
    • 将 Microsoft Teams 及其他 Electron 应用用作 LOLbins
  • Shawn Jones
    • 为了实现 Loki 的 assembly 执行功能,Dylan 移植了 Shawn 公开发布的 InlineExecute-Assembly 代码
  • mr.d0x (@mrd0x),感谢他们此前关于利用 Teams Electron 应用执行任意 Node.JS 代码并将研究成果发布到 LOLBAS 项目的工作。
  • Michael Taggart
    • quASAR 项目,一个旨在通过修改 Electron 应用来启用命令执行功能的工具
    • Quasar:攻陷 Electron 应用
  • Raphael Mudge,感谢他激励我深入研究红队技术,并支持本工具的发布
    • The Security Conversation
  • Fletcher Davis
    • BSides:滥用 Electron 应用
  • Pavel Tsakalidis
    • BEEMKA - Electron 漏洞利用工具包

许可证

本项目采用 Business Source License 1.1 许可。根据许可条款,允许非商业用途。商业用途需要获得作者的明确许可。2030 年 4 月 3 日,本许可将转换为 Apache 2.0。完整详情请参阅 LICENSE。

下载工具
命令说明
help显示帮助。用法:help 或 help scan
pwd打印当前工作目录
ls列出文件和目录
cat显示文件内容
env显示进程环境变量
spawn生成一个子进程
drives列出驱动器
mv将文件移动到新位置
sleep休眠指定秒数并带有抖动(jitter)
cp将源文件复制到目标位置
exit-all退出 agent,agent 之后不再回连
load将磁盘上的 node PE 文件加载到进程中
scexec执行 shellcode
assembly执行 .NET assembly 并获取命令输出
upload将文件从本地操作员主机上传到远程 agent 主机
download将文件从远程 agent 主机下载到本地操作员主机
scan在 CIDR 范围内对选定端口执行 TCP 网络扫描
dnsDNS 查询。使用系统的 DNS 配置
set设置 assembly 节点和 scexec 节点的 Node 加载路径
bof执行 COFF 文件并返回输出
"main":"./out/main.js",
  • ./out/main.js" 是真实的 Cursor 应用
  • init.js 生成并脱离一个新的指向真实 Cursor 的 Cursor.exe
  • 真实的 Cursor 应用被生成,对用户可见且正常运行
  • 当用户退出 Cursor 时:
    • init.js 捕获退出事件
    • init.js 第三次读取 package.json
    • init.js 将 "main":"./out/main.js", 改为 "main":"init.js",