GCP - Storage Privesc

Support HackTricks

Storage

기본 정보:

GCP - Storage Enum

storage.objects.get

이 권한은 Cloud Storage에 저장된 파일을 다운로드할 수 있게 해줍니다. 이는 경우에 따라 민감한 정보가 저장되어 있기 때문에 권한 상승을 가능하게 할 수 있습니다. 게다가, 일부 GCP 서비스는 정보를 버킷에 저장합니다:

  • GCP Composer: Composer 환경을 생성할 때 모든 DAG의 코드버킷 안에 저장됩니다. 이 작업들은 코드 안에 흥미로운 정보를 포함할 수 있습니다.

  • GCR (Container Registry): 컨테이너의 이미지버킷 안에 저장되며, 이는 버킷을 읽을 수 있다면 이미지를 다운로드하고 정보 유출 및/또는 소스 코드를 검색할 수 있음을 의미합니다.

storage.objects.setIamPolicy

이 권한을 통해 이 섹션의 이전 시나리오를 악용할 수 있는 권한을 부여할 수 있습니다.

storage.buckets.setIamPolicy

이 권한으로 권한을 수정하는 방법에 대한 예시는 이 페이지를 확인하세요:

GCP - Public Buckets Privilege Escalation

storage.hmacKeys.create

Cloud Storage의 "상호 운용성" 기능은 AWS S3와 같은 크로스 클라우드 상호 작용을 위해 설계되었으며, 서비스 계정 및 사용자에 대한 HMAC 키 생성을 포함합니다. 공격자는 상승된 권한을 가진 서비스 계정에 대한 HMAC 키를 생성하여 Cloud Storage 내에서 권한을 상승시킬 수 있습니다. 사용자와 연결된 HMAC 키는 웹 콘솔을 통해서만 검색할 수 있지만, 접근 및 비밀 키는 영구적으로 접근 가능하여 잠재적인 백업 접근 저장소를 허용합니다. 반면, 서비스 계정에 연결된 HMAC 키는 API를 통해 접근할 수 있지만, 생성 후에는 접근 및 비밀 키를 검색할 수 없어 지속적인 접근에 대한 복잡성을 더합니다.

# Create key
gsutil hmac create <sa-email> # You might need to execute this inside a VM instance

## If you have TROUBLES creating the HMAC key this was you can also do it contacting the API directly:
PROJECT_ID = '$PROJECT_ID'
TARGET_SERVICE_ACCOUNT = f"exam-storage-sa-read-flag-3@{PROJECT_ID}.iam.gserviceaccount.com"
ACCESS_TOKEN = "$CLOUDSDK_AUTH_ACCESS_TOKEN"
import requests
import json
key = requests.post(
f'https://www.googleapis.com/storage/v1/projects/{PROJECT_ID}/hmacKeys',
params={'access_token': ACCESS_TOKEN, 'serviceAccountEmail': TARGET_SERVICE_ACCOUNT}
).json()
#print(json.dumps(key, indent=4))
print(f'ID: {key["metadata"]["accessId"]}')
print(f'Secret: {key["secret"]}')


# Configure gsutil to use the HMAC key
gcloud config set pass_credentials_to_gsutil false
gsutil config -a

# Use it
gsutil ls gs://[BUCKET_NAME]

# Restore
gcloud config set pass_credentials_to_gsutil true

이 방법에 대한 또 다른 익스플로잇 스크립트는 여기에서 찾을 수 있습니다.

storage.objects.create, storage.objects.delete = 스토리지 쓰기 권한

버킷 내에 새 객체를 생성하려면 storage.objects.create가 필요하며, 문서에 따르면 존재하는 객체를 수정하려면 storage.objects.delete도 필요합니다.

클라우드에서 쓸 수 있는 버킷의 일반적인 익스플로잇버킷이 웹 서버 파일을 저장하는 경우로, 웹 애플리케이션에서 사용될 새 코드를 저장할 수 있습니다.

Composer

Composer는 GCP 내에서 관리되는 Apache Airflow입니다. 여러 흥미로운 기능이 있습니다:

  • GKE 클러스터 내에서 실행되므로, 클러스터가 사용하는 SA는 Composer 내에서 실행되는 코드에 의해 접근 가능합니다.

  • 코드를 버킷에 저장하므로, 해당 버킷에 쓰기 권한이 있는 사람은 DGA 코드를 변경/추가할 수 있습니다 (Apache Airflow가 실행할 코드) 그런 다음, 코드 저장을 위해 Composer가 사용하는 버킷에 쓰기 권한이 있다면, GKE 클러스터에서 실행 중인 SA로 권한 상승을 할 수 있습니다.

Cloud Functions

  • Cloud Functions 코드는 스토리지에 저장되므로, 이를 덮어쓰면 임의의 코드를 실행할 수 있습니다.

App Engine

  • App Engine 소스 코드는 버킷에 저장되며, 코드를 덮어쓰면 임의의 코드를 실행할 수 있습니다. 이는 불가능합니다.

  • 컨테이너 레이어가 버킷에 저장되는 것 같으며, 이를 변경할 수 있을까요?

GCR

  • Google Container Registry는 이미지를 버킷에 저장하며, 이 버킷에 쓸 수 있다면 이 버킷이 실행되는 곳으로 수평 이동할 수 있습니다.

  • GCR에서 사용하는 버킷의 URL은 gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com과 유사합니다 (최상위 하위 도메인은 여기에서 지정됩니다).

참고문헌

HackTricks 지원하기

Last updated