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 지원하기

Storage

Basic Information:

GCP - Storage Enum

storage.objects.get

이 권한은 Cloud Storage에 저장된 파일을 다운로드할 수 있게 합니다. 이는 경우에 따라 민감한 정보가 그곳에 저장되어 있기 때문에 잠재적으로 당신이 escalate privileges 할 수 있게 합니다. 또한 일부 GCP 서비스는 그들의 정보를 buckets에 저장합니다:

  • GCP Composer: Composer Environment를 생성하면 모든 DAGs의 codebucket 안에 저장됩니다. 이러한 작업들은 그들의 code 안에 흥미로운 정보를 포함하고 있을 수 있습니다.
  • GCR (Container Registry): 컨테이너의 imagebuckets 안에 저장되며, 따라서 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 지원하기