CircleCI Security
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
기본 정보
CircleCI는 코드로 무엇을 하고 언제 할지를 정의하는 템플릿을 설정할 수 있는 지속적 통합 플랫폼입니다. 이렇게 하면 예를 들어 레포 마스터 브랜치에서 직접 테스트 또는 배포를 자동화할 수 있습니다.
권한
CircleCI는 로그인하는 계정과 관련된 github 및 bitbucket의 권한을 상속합니다. 내 테스트에서 확인한 바에 따르면, github의 레포에 대한 쓰기 권한이 있는 한, CircleCI에서 프로젝트 설정을 관리할 수 있습니다(새 ssh 키 설정, 프로젝트 api 키 가져오기, 새로운 CircleCI 구성으로 새로운 브랜치 만들기 등).
그러나 레포를 CircleCI 프로젝트로 변환하려면 레포 관리자여야 합니다.
환경 변수 및 비밀
문서에 따르면, 워크플로 내에서 환경 변수에 값을 로드하는 다양한 방법이 있습니다.
내장 환경 변수
CircleCI에서 실행되는 모든 컨테이너는 항상 문서에 정의된 특정 환경 변수인 CIRCLE_PR_USERNAME
, CIRCLE_PROJECT_REPONAME
또는 CIRCLE_USERNAME
을 가집니다.
일반 텍스트
명령 내에서 일반 텍스트로 선언할 수 있습니다:
실행 환경 내에서 명확한 텍스트로 선언할 수 있습니다:
당신은 build-job 환경 내에서 명확한 텍스트로 그것들을 선언할 수 있습니다:
당신은 컨테이너의 환경 안에 평문으로 그것들을 선언할 수 있습니다:
프로젝트 비밀
이것은 프로젝트(모든 브랜치에서)만 접근할 수 있는 비밀입니다. 다음 링크에서 선언된 내용을 확인할 수 있습니다: https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables
"변수 가져오기" 기능은 다른 프로젝트에서 변수를 가져올 수 있게 해줍니다.
컨텍스트 비밀
이것은 조직 전체에 해당하는 비밀입니다. 기본적으로 모든 레포는 여기 저장된 모든 비밀에 접근할 수 있습니다:
그러나 다른 그룹(모든 구성원 대신)을 선택하여 특정 사람들에게만 비밀에 대한 접근을 허용할 수 있습니다. 현재 이것은 비밀의 보안을 강화하는 가장 좋은 방법 중 하나로, 모든 사람이 접근할 수 없도록 하고 특정 사람들만 접근할 수 있도록 합니다.
공격
평문 비밀 검색
VCS(예: github)에 접근할 수 있다면, 각 레포의 각 브랜치에서 .circleci/config.yml
파일을 확인하고 저장된 평문 비밀을 검색하세요.
비밀 환경 변수 및 컨텍스트 열거
코드를 확인하면 각 .circleci/config.yml
파일에서 사용되는 모든 비밀 이름을 찾을 수 있습니다. 또한 해당 파일에서 컨텍스트 이름을 가져오거나 웹 콘솔에서 확인할 수 있습니다: https://app.circleci.com/settings/organization/github/<org_name>/contexts.
프로젝트 비밀 유출
모든 프로젝트 및 컨텍스트 비밀을 유출하기 위해서는 전체 github 조직에서 단 1개의 레포에 쓰기 권한만 있으면 됩니다 (그리고 귀하의 계정은 컨텍스트에 접근할 수 있어야 하지만 기본적으로 모든 사람이 모든 컨텍스트에 접근할 수 있습니다).
"변수 가져오기" 기능은 다른 프로젝트에서 변수를 가져올 수 있게 해줍니다. 따라서 공격자는 모든 레포에서 모든 프로젝트 변수를 가져온 다음 모두 함께 유출할 수 있습니다.
모든 프로젝트 비밀은 항상 작업의 env에 설정되므로, env를 호출하고 base64로 난독화하면 워크플로우 웹 로그 콘솔에서 비밀을 유출할 수 있습니다:
만약 웹 콘솔에 접근할 수 없지만 레포에 접근할 수 있고 CircleCI가 사용된다는 것을 안다면, 매 분마다 트리거되는 워크플로우를 생성하고 비밀을 외부 주소로 유출하는 것을 할 수 있습니다:
컨텍스트 비밀 추출
컨텍스트 이름을 지정해야 합니다 (이것은 프로젝트 비밀도 추출합니다):
만약 웹 콘솔에 접근할 수 없지만 레포에 접근할 수 있고 CircleCI가 사용되고 있다는 것을 안다면, 매 분마다 트리거되는 워크플로우를 수정하여 비밀을 외부 주소로 유출할 수 있습니다:
저는 새로운 .circleci/config.yml
을 레포에 생성하는 것만으로는 circleci 빌드를 트리거할 수 없습니다. circleci 콘솔에서 프로젝트로 활성화해야 합니다.
클라우드로 탈출
CircleCI는 당신의 빌드를 그들의 머신에서 실행하거나 당신의 머신에서 실행할 수 있는 옵션을 제공합니다. 기본적으로 그들의 머신은 GCP에 위치하고 있으며, 처음에는 관련된 정보를 찾을 수 없습니다. 그러나 피해자가 자신의 머신(잠재적으로 클라우드 환경)에서 작업을 실행하고 있다면, 흥미로운 정보가 있는 클라우드 메타데이터 엔드포인트를 찾을 수 있습니다.
이전 예제에서는 모든 것이 도커 컨테이너 내에서 실행되었지만, VM 머신을 실행하도록 요청할 수도 있습니다(다른 클라우드 권한이 있을 수 있습니다):
또는 원격 도커 서비스에 접근할 수 있는 도커 컨테이너:
Persistence
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 소유자인 경우 검증되지 않은 오브를 허용하고 작업에서 백도어로 구성할 수 있습니다.
일부 작업에서 명령 주입 취약점을 찾아 비밀의 값을 수정하여 명령을 주입할 수 있습니다.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated