GCP - AppEngine Privesc
Reading time: 5 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
App Engine
Per ulteriori informazioni su App Engine controlla:
appengine.applications.get
, appengine.instances.get
, appengine.instances.list
, appengine.operations.get
, appengine.operations.list
, appengine.services.get
, appengine.services.list
, appengine.versions.create
, appengine.versions.get
, appengine.versions.list
, cloudbuild.builds.get
,iam.serviceAccounts.actAs
, resourcemanager.projects.get
, storage.objects.create
, storage.objects.list
Queste sono le autorizzazioni necessarie per deploy un'App usando gcloud
cli. Forse le autorizzazioni get
e list
potrebbero essere evitate.
Puoi trovare esempi di codice python in https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine
Per impostazione predefinita, il nome del servizio App sarà default
, e può esserci solo 1 istanza con lo stesso nome.
Per cambiarlo e creare una seconda App, in app.yaml
, cambia il valore della chiave radice in qualcosa come service: my-second-app
cd python-docs-samples/appengine/flexible/hello_world
gcloud app deploy #Upload and start application inside the folder
Aspetta almeno 10-15 minuti, se non funziona chiama deploy another of times e aspetta alcuni minuti.
note
È possibile indicare il Service Account da utilizzare ma per impostazione predefinita, viene utilizzato il SA predefinito di App Engine.
L'URL dell'applicazione è qualcosa come https://<proj-name>.oa.r.appspot.com/
o https://<service_name>-dot-<proj-name>.oa.r.appspot.com
Aggiorna i permessi equivalenti
Potresti avere abbastanza permessi per aggiornare un AppEngine ma non per crearne uno nuovo. In tal caso, ecco come potresti aggiornare l'attuale App Engine:
# Find the code of the App Engine in the buckets
gsutil ls
# Download code
mkdir /tmp/appengine2
cd /tmp/appengine2
## In this case it was found in this custom bucket but you could also use the
## buckets generated when the App Engine is created
gsutil cp gs://appengine-lab-1-gcp-labs-4t04m0i6-3a97003354979ef6/labs_appengine_1_premissions_privesc.zip .
unzip labs_appengine_1_premissions_privesc.zip
## Now modify the code..
## If you don't have an app.yaml, create one like:
cat >> app.yaml <<EOF
runtime: python312
entrypoint: gunicorn -b :\$PORT main:app
env_variables:
A_VARIABLE: "value"
EOF
# Deploy the changes
gcloud app deploy
# Update the SA if you need it (and if you have actas permissions)
gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com
Se hai già compromesso un AppEngine e hai il permesso appengine.applications.update
e actAs sul conto di servizio che stai utilizzando, puoi modificare il conto di servizio utilizzato da AppEngine con:
gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com
appengine.instances.enableDebug
, appengine.instances.get
, appengine.instances.list
, appengine.operations.get
, appengine.services.get
, appengine.services.list
, appengine.versions.get
, appengine.versions.list
, compute.projects.get
Con questi permessi, è possibile accedere via ssh alle istanze di App Engine di tipo flessibile (non standard). Alcuni dei permessi list
e get
potrebbero non essere realmente necessari.
gcloud app instances ssh --service <app-name> --version <version-id> <ID>
appengine.applications.update
, appengine.operations.get
Penso che questo cambi solo il SA di background che Google utilizzerà per configurare le applicazioni, quindi non credo che tu possa abusare di questo per rubare l'account di servizio.
gcloud app update --service-account=<sa_email>
appengine.versions.getFileContents
, appengine.versions.update
Non sono sicuro di come utilizzare queste autorizzazioni o se siano utili (nota che quando cambi il codice viene creata una nuova versione, quindi non so se puoi semplicemente aggiornare il codice o il ruolo IAM di uno, ma suppongo che dovresti essere in grado di farlo, forse cambiando il codice all'interno del bucket??).
Accesso in scrittura sui bucket
Come menzionato, le versioni di appengine generano alcuni dati all'interno di un bucket con il formato nome: staging.<project-id>.appspot.com
. Nota che non è possibile prendere in anticipo il controllo di questo bucket perché gli utenti GCP non sono autorizzati a generare bucket utilizzando il nome di dominio appspot.com
.
Tuttavia, con accesso in lettura e scrittura su questo bucket, è possibile elevare i privilegi all'SA associato alla versione di AppEngine monitorando il bucket e ogni volta che viene eseguita una modifica, modificare il codice il più velocemente possibile. In questo modo, il container che viene creato da questo codice eseguirà il codice compromesso.
Per ulteriori informazioni e un PoC controlla le informazioni rilevanti da questa pagina:
Accesso in scrittura sull'Artifact Registry
Anche se App Engine crea immagini docker all'interno dell'Artifact Registry. È stato testato che anche se modifichi l'immagine all'interno di questo servizio e rimuovi l'istanza di App Engine (quindi ne viene distribuita una nuova) il codice eseguito non cambia.
Potrebbe essere possibile che eseguendo un attacco di Race Condition come con i bucket potrebbe essere possibile sovrascrivere il codice eseguito, ma questo non è stato testato.
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.