GCP - Storage Privesc
Storage
Informazioni di base:
GCP - Storage Enumstorage.objects.get
storage.objects.get
Questo permesso ti consente di scaricare file memorizzati all'interno di Cloud Storage. Questo potrebbe potenzialmente consentirti di elevare i privilegi perché in alcune occasioni informazioni sensibili sono salvate lì. Inoltre, alcuni servizi GCP memorizzano le loro informazioni in bucket:
GCP Composer: Quando crei un Ambiente Composer, il codice di tutti i DAG sarà salvato all'interno di un bucket. Questi compiti potrebbero contenere informazioni interessanti all'interno del loro codice.
GCR (Container Registry): L'immagine dei container è memorizzata all'interno di bucket, il che significa che se puoi leggere i bucket sarai in grado di scaricare le immagini e cercare leak e/o codice sorgente.
storage.objects.setIamPolicy
storage.objects.setIamPolicy
Puoi darti il permesso di abusare di uno qualsiasi degli scenari precedenti di questa sezione.
storage.buckets.setIamPolicy
storage.buckets.setIamPolicy
Per un esempio su come modificare i permessi con questo permesso, controlla questa pagina:
GCP - Public Buckets Privilege Escalationstorage.hmacKeys.create
storage.hmacKeys.create
La funzione di "interoperabilità" di Cloud Storage, progettata per interazioni cross-cloud come con AWS S3, prevede la creazione di chiavi HMAC per Account di Servizio e utenti. Un attaccante può sfruttare questo generando una chiave HMAC per un Account di Servizio con privilegi elevati, elevando così i privilegi all'interno di Cloud Storage. Mentre le chiavi HMAC associate agli utenti sono recuperabili solo tramite la console web, sia le chiavi di accesso che quelle segrete rimangono perpetuamente accessibili, consentendo un potenziale accesso di backup. Al contrario, le chiavi HMAC collegate agli Account di Servizio sono accessibili tramite API, ma le loro chiavi di accesso e segrete non sono recuperabili dopo la creazione, aggiungendo un ulteriore livello di complessità per l'accesso continuo.
Un altro script di exploit per questo metodo può essere trovato qui.
storage.objects.create
, storage.objects.delete
= Permessi di scrittura su Storage
storage.objects.create
, storage.objects.delete
= Permessi di scrittura su StoragePer creare un nuovo oggetto all'interno di un bucket hai bisogno di storage.objects.create
e, secondo la documentazione, hai anche bisogno di storage.objects.delete
per modificare un oggetto esistente.
Un'esploitazione molto comune dei bucket in cui puoi scrivere nel cloud è nel caso in cui il bucket stia salvando file del server web, potresti essere in grado di memorizzare nuovo codice che sarà utilizzato dall'applicazione web.
Composer
Composer è Apache Airflow gestito all'interno di GCP. Ha diverse funzionalità interessanti:
Viene eseguito all'interno di un cluster GKE, quindi il SA utilizzato dal cluster è accessibile dal codice in esecuzione all'interno di Composer
Memorizza il codice in un bucket, quindi, chiunque abbia accesso in scrittura su quel bucket sarà in grado di cambiare/aggiungere un codice DGA (il codice che Apache Airflow eseguirà) Poi, se hai accesso in scrittura sul bucket che Composer sta usando per memorizzare il codice, puoi privesc al SA in esecuzione nel cluster GKE.
Cloud Functions
Il codice delle Cloud Functions è memorizzato in Storage, quindi sovrascrivendolo, è possibile eseguire codice arbitrario.
App Engine
Il codice sorgente di App Engine è memorizzato nei bucket, sovrascrivendo il codice potrebbe essere possibile eseguire codice arbitrario. QUESTO NON È POSSIBILE
Sembra che i layer dei container siano memorizzati nel bucket, forse cambiando quelli?
GCR
Google Container Registry memorizza le immagini all'interno dei bucket, se puoi scrivere in quei bucket potresti essere in grado di muoverti lateralmente verso dove quei bucket vengono eseguiti.
Il bucket utilizzato da GCR avrà un URL simile a
gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com
(I sottodomini di primo livello sono specificati qui).
Riferimenti
Last updated