GCP - Storage Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Storage

Temel Bilgiler:

GCP - Storage Enum

storage.objects.get

Bu izin, Cloud Storage içinde depolanan dosyaları indirmenize olanak tanır. Bu, bazı durumlarda hassas bilgilerin orada saklanması nedeniyle size escalate privileges sağlayabilir. Ayrıca, bazı GCP servisleri bilgilerini buckets içinde depolar:

  • GCP Composer: Bir Composer Environment oluşturduğunuzda tüm DAG’ların kodu bir bucket içinde saklanır. Bu görevlerin kodu içinde ilginç bilgiler bulunabilir.
  • GCR (Container Registry): Konteynerlerin image’ı buckets içinde saklanır; bu da bucket’ları okuyabiliyorsanız imajları indirip leaks ve/veya kaynak kodu aramak anlamına gelir.

storage.objects.setIamPolicy

Bu, size bu bölümdeki önceki senaryoların herhangi birini kötüye kullanma izni verebilir.

# 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

İzinleri nasıl değiştireceğinize dair bir örnek için bu sayfaya bakın:

# 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’ın “interoperability” özelliği, AWS S3 gibi cross-cloud interactions için tasarlanmıştır ve Service Accounts ve kullanıcılar için HMAC keys oluşturulmasını içerir. Bir saldırgan, yükseltilmiş ayrıcalıklara sahip bir Service Account için HMAC key oluşturarak bunu suistimal edebilir ve böylece Cloud Storage içinde ayrıcalık yükseltmesi gerçekleştirebilir. Kullanıcıya bağlı HMAC key’ler yalnızca web console üzerinden alınabilirken, access ve secret key’lerin her ikisi de sürekli erişilebilir durumda kalır; bu da potansiyel yedek erişim depolamaya olanak tanır. Buna karşılık, Service Account’a bağlı HMAC key’ler API üzerinden erişilebilir, ancak access ve secret key’leri oluşturma sonrası alınamaz, bu da sürekli erişim için ek bir karmaşıklık katmanı ekler.

# 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 Write permissions

Bir bucket içinde yeni bir object oluşturmak için storage.objects.create iznine ihtiyacınız var ve the docs’a göre mevcut bir objeyi değiştirmek için ayrıca storage.objects.delete iznine de ihtiyaç vardır.

Cloud içinde yazma iznine sahip bucket’ların çok yaygın bir istismarı, eğer bucket web sunucu dosyalarını barındırıyorsa, saldırganın web uygulaması tarafından kullanılacak yeni kod depolayabilmesidir.

Composer

Composer, GCP içinde yönetilen Apache Airflow’dur. Birkaç ilginç özelliği vardır:

  • GKE cluster içinde çalışır, bu yüzden cluster’ın kullandığı SA, Composer içinde çalışan kod tarafından erişilebilir durumdadır
  • Bir composer ortamının tüm bileşenleri (DAGs kodu, eklentiler ve veriler) bir GCP bucket içinde depolanır. Eğer saldırganın bu bucket üzerinde okuma ve yazma izinleri varsa, bucket’u izleyip herhangi bir DAG oluşturulduğunda ya da güncellendiğinde, arka kapılı bir sürüm yükleyerek composer ortamının depodan arka kapılı sürümü almasını sağlayabilir.

You can find a PoC of this attack in the repo: https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs

Cloud Functions

  • Cloud Functions kodu Storage içinde depolanır ve yeni bir versiyon oluşturulduğunda kod bucket’a itilir ve ardından bu koddan yeni container build edilir. Bu yüzden, yeni versiyon build edilmeden önce kodu overwrite etmek, cloud function’ın rastgele kod çalıştırmasını sağlamak için mümkündür.

You can find a PoC of this attack in the repo: https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions

App Engine

AppEngine versiyonları staging.<project-id>.appspot.com formatında bir bucket içinde bazı veriler oluşturur. Bu bucket içinde ae adında bir klasör bulunabilir; bu klasör AppEngine uygulamasının her versiyonu için bir alt klasör içerir ve bu klasörlerin içinde manifest.json dosyasını bulmak mümkündür. Bu dosya, belirli bir versiyonu oluşturmak için kullanılacak tüm dosyaların bulunduğu bir json içerir. Ayrıca dosyaların gerçek adlarını, GCP bucket içindeki URL’lerini (bucket içindeki dosyalar adlarını sha1 hash’lerine göre değiştirmiştir) ve her dosyanın sha1 hash’ini bulmak mümkündür.

Not: Bu bucket’ı önceden ele geçirmek mümkün değildir çünkü GCP kullanıcılarının appspot.com alan adını kullanarak bucket oluşturmaya yetkisi yoktur.

Ancak, bu bucket üzerinde okuma & yazma erişimi ile, bucket’u izleyip herhangi bir değişiklik yapıldığında (yeni versiyon) mümkün olduğunca hızlı bir şekilde yeni versiyonu değiştirerek App Engine versiyonuna bağlı SA’ya ayrıcalık yükseltme yapılabilir. Bu şekilde, bu koddan oluşturulan container arka kapılı kodu çalıştıracaktır.

Bahsedilen saldırı birçok farklı şekilde gerçekleştirilebilir, hepsi staging.<project-id>.appspot.com bucket’ını izlemekle başlar:

  • AppEngine versiyonunun tamamını farklı ve müsait bir buckete yükleyip manifest.json dosyasını yeni bucket adı ve bu dosyaların sha1 hash’leri ile hazırlayın. Ardından bucket içinde yeni bir versiyon oluşturulduğunda sadece manifest.json dosyasını değiştirip kötü amaçlı olanı upload etmeniz yeterlidir.
  • requirements.txt dosyasının değiştirilmiş bir sürümünü yükleyip zararlı bağımlılıkların kodunu kullanacak şekilde ayarlayın ve manifest.json dosyasını yeni dosya adı, URL ve hash ile güncelleyin.
  • main.py veya app.yaml dosyasını değiştirip zararlı kodu çalıştıracak şekilde yükleyin ve manifest.json dosyasını yeni dosya adı, URL ve hash ile güncelleyin.

You can find a PoC of this attack in the repo: https://github.com/carlospolop/Monitor-Backdoor-AppEngine

GCR

  • Google Container Registry, görüntüleri bucket’larda depolar; eğer bu bucket’lara yazabiliyorsanız daha sonra bu bucket’ların çalıştırıldığı yerlere lateral hareket yapabiliyor olabilirsiniz.
  • GCR tarafından kullanılan bucket’ın URL’si gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com benzeri olacaktır (Top level alt domainler here içinde belirtilmiştir).

Tip

Bu servis deprecated olduğu için bu saldırı artık kullanışlı değildir. Ayrıca, bu servisin yerine geçen Artifact Registry görüntüleri bucket’larda depolamaz.

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin