# GCP Pentesting

{{#include ../../banners/hacktricks-training.md}}

## Informations de base

**Avant de commencer le pentesting** d'un **environnement GCP**, il y a quelques **choses de base que vous devez savoir** sur son fonctionnement pour vous aider à comprendre ce que vous devez faire, comment trouver des erreurs de configuration et comment les exploiter.

Des concepts tels que la **hiérarchie d'organisation**, les **permissions** et d'autres concepts de base sont expliqués dans :

{{#ref}}
gcp-basic-information/
{{#endref}}

## Laboratoires pour apprendre

- [https://gcpgoat.joshuajebaraj.com/](https://gcpgoat.joshuajebaraj.com/)
- [https://github.com/ine-labs/GCPGoat](https://github.com/ine-labs/GCPGoat)
- [https://github.com/lacioffi/GCP-pentest-lab/](https://github.com/lacioffi/GCP-pentest-lab/)
- [https://github.com/carlospolop/gcp_privesc_scripts](https://github.com/carlospolop/gcp_privesc_scripts)

## Méthodologie de Pentester/Red Team GCP

Pour auditer un environnement GCP, il est très important de savoir : quels **services sont utilisés**, ce qui est **exposé**, qui a **accès** à quoi, et comment les services internes GCP et les **services externes** sont connectés.

Du point de vue d'une Red Team, le **premier pas pour compromettre un environnement GCP** est d'obtenir des **identifiants**. Voici quelques idées sur comment faire cela :

- **Fuites** sur github (ou similaire) - OSINT
- **Ingénierie** Sociale (Consultez la page [**Sécurité Workspace**](../workspace-security/index.html))
- Réutilisation de **mot de passe** (fuites de mots de passe)
- Vulnérabilités dans les applications hébergées sur GCP
- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) avec accès au point de terminaison des métadonnées
- **Lecture de fichiers locaux**
- `/home/USERNAME/.config/gcloud/*`
- `C:\Users\USERNAME\.config\gcloud\*`
- **Tiers** compromis
- **Employé** interne

Ou en **compromettant un service non authentifié** exposé :

{{#ref}}
gcp-unauthenticated-enum-and-access/
{{#endref}}

Ou si vous faites une **révision**, vous pourriez simplement **demander des identifiants** avec ces rôles :

{{#ref}}
gcp-permissions-for-a-pentest.md
{{#endref}}

> [!NOTE]
> Après avoir réussi à obtenir des identifiants, vous devez savoir **à qui appartiennent ces identifiants**, et **à quoi ils ont accès**, donc vous devez effectuer une énumération de base :

## Énumération de base

### **SSRF**

Pour plus d'informations sur la façon d'**énumérer les métadonnées GCP**, consultez la page hacktricks suivante :

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
{{#endref}}

### Whoami

Dans GCP, vous pouvez essayer plusieurs options pour essayer de deviner qui vous êtes :
```bash
#If you are inside a compromise machine
gcloud auth list
curl -H "Content-Type: application/x-www-form-urlencoded" -d "access_token=$(gcloud auth print-access-token)" https://www.googleapis.com/oauth2/v1/tokeninfo
gcloud auth print-identity-token #Get info from the token

#If you compromised a metadata token or somehow found an OAuth token
curl -H "Content-Type: application/x-www-form-urlencoded" -d "access_token=<token>" https://www.googleapis.com/oauth2/v1/tokeninfo
```
Vous pouvez également utiliser le point de terminaison API `/userinfo` pour obtenir plus d'informations sur l'utilisateur :
```bash
curl -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: OAuth $(gcloud auth print-access-token)" https://www.googleapis.com/oauth2/v1/userinfo

curl -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: OAuth <access_token>" https://www.googleapis.com/oauth2/v1/userinfo
```
### Énumération d'Org
```bash
# Get organizations
gcloud organizations list #The DIRECTORY_CUSTOMER_ID is the Workspace ID
gcloud resource-manager folders list --organization <org_number> # Get folders
gcloud projects list # Get projects
```
### Principes & Énumération IAM

Si vous avez suffisamment de permissions, **vérifier les privilèges de chaque entité à l'intérieur du compte GCP** vous aidera à comprendre ce que vous et d'autres identités pouvez faire et comment **escalader les privilèges**.

Si vous n'avez pas suffisamment de permissions pour énumérer IAM, vous pouvez **les voler par force brute** pour les découvrir.\
Vérifiez **comment faire l'énumération et la force brute** dans :

{{#ref}}
gcp-services/gcp-iam-and-org-policies-enum.md
{{#endref}}

> [!NOTE]
> Maintenant que vous **avez des informations sur vos identifiants** (et si vous êtes une équipe rouge, espérons que vous **n'avez pas été détecté**). Il est temps de déterminer quels services sont utilisés dans l'environnement.\
> Dans la section suivante, vous pouvez vérifier quelques façons d'**énumérer certains services courants.**

## Énumération des Services

GCP a une quantité étonnante de services, dans la page suivante vous trouverez **des informations de base, des cheatsheets d'énumération**, comment **éviter la détection**, obtenir **de la persistance**, et d'autres **astuces de post-exploitation** à propos de certains d'entre eux :

{{#ref}}
gcp-services/
{{#endref}}

Notez que vous **n'avez pas** besoin d'effectuer tout le travail **manuellement**, ci-dessous dans ce post vous pouvez trouver une **section sur** [**les outils automatiques**](#automatic-tools).

De plus, à ce stade, vous pourriez avoir découvert **plus de services exposés aux utilisateurs non authentifiés**, vous pourriez être en mesure de les exploiter :

{{#ref}}
gcp-unauthenticated-enum-and-access/
{{#endref}}

## Escalade de Privilèges, Post Exploitation & Persistance

La manière la plus courante une fois que vous avez obtenu des identifiants cloud ou que vous avez compromis un service fonctionnant à l'intérieur d'un cloud est d'**abuser des privilèges mal configurés** que le compte compromis peut avoir. Donc, la première chose que vous devriez faire est d'énumérer vos privilèges.

De plus, lors de cette énumération, rappelez-vous que **les permissions peuvent être définies au niveau le plus élevé de "l'Organisation"** également.

{{#ref}}
gcp-privilege-escalation/
{{#endref}}

{{#ref}}
gcp-post-exploitation/
{{#endref}}

{{#ref}}
gcp-persistence/
{{#endref}}

### Services Exposés Publiquement

Lors de l'énumération des services GCP, vous pourriez avoir trouvé certains d'entre eux **exposant des éléments à Internet** (ports VM/Containers, bases de données ou services de file d'attente, instantanés ou buckets...).\
En tant que pentester/équipe rouge, vous devriez toujours vérifier si vous pouvez trouver **des informations sensibles / des vulnérabilités** sur eux car ils pourraient vous fournir **un accès supplémentaire au compte AWS**.

Dans ce livre, vous devriez trouver **des informations** sur comment trouver **des services GCP exposés et comment les vérifier**. Concernant comment trouver **des vulnérabilités dans des services réseau exposés**, je vous recommanderais de **chercher** le **service** spécifique dans :

{{#ref}}
https://book.hacktricks.wiki/
{{#endref}}

## GCP <--> Workspace Pivoting

**Compromettre** des principes dans **une** plateforme pourrait permettre à un attaquant de **compromettre l'autre**, vérifiez-le dans :

{{#ref}}
gcp-to-workspace-pivoting/
{{#endref}}

## Outils Automatiques

- Dans la **console GCloud**, à [https://console.cloud.google.com/iam-admin/asset-inventory/dashboard](https://console.cloud.google.com/iam-admin/asset-inventory/dashboard) vous pouvez voir les ressources et IAM utilisés par projet.
- Ici, vous pouvez voir les actifs pris en charge par cette API : [https://cloud.google.com/asset-inventory/docs/supported-asset-types](https://cloud.google.com/asset-inventory/docs/supported-asset-types)
- Vérifiez **les outils** qui peuvent être [**utilisés dans plusieurs clouds ici**](../pentesting-cloud-methodology.md).
- [**gcp_scanner**](https://github.com/google/gcp_scanner) : C'est un scanner de ressources GCP qui peut aider à déterminer quel **niveau d'accès certains identifiants possèdent** sur GCP.
```bash
# Install
git clone https://github.com/google/gcp_scanner.git
cd gcp_scanner
virtualenv -p python3 venv
source venv/bin/activate
pip install -r requirements.txt
# Execute with gcloud creds
python3 __main__.py -o /tmp/output/ -g "$HOME/.config/gcloud"
```
- [**gcp_enum**](https://gitlab.com/gitlab-com/gl-security/threatmanagement/redteam/redteam-public/gcp_enum) : Script Bash pour énumérer un environnement GCP en utilisant gcloud cli et enregistrer les résultats dans un fichier.
- [**GCP-IAM-Privilege-Escalation**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation) : Scripts pour énumérer les privilèges IAM élevés et pour escalader les privilèges dans GCP en les abusant (je n'ai pas pu faire fonctionner le script d'énumération).
- [**BF My GCP Permissions**](https://github.com/carlospolop/bf_my_gcp_permissions) : Script pour forcer vos permissions.

## gcloud config & debug
```bash
# Login so gcloud can use your credentials
gcloud auth login
gcloud config set project security-devbox
gcloud auth print-access-token

# Login so SDKs can use your user credentials
gcloud auth application-default login
gcloud auth application-default set-quota-project security-devbox
gcloud auth application-default print-access-token

# Update gcloud
gcloud components update
```
### Capture gcloud, gsutil... réseau

N'oubliez pas que vous pouvez utiliser le **paramètre** **`--log-http`** avec le **`gcloud`** cli pour **imprimer** les **requêtes** que l'outil effectue. Si vous ne voulez pas que les journaux masquent la valeur du token, utilisez `gcloud config set log_http_redact_token false`

De plus, pour intercepter la communication :
```bash
gcloud config set proxy/address 127.0.0.1
gcloud config set proxy/port 8080
gcloud config set proxy/type http
gcloud config set auth/disable_ssl_validation True

# If you don't want to completely disable ssl_validation use:
gcloud config set core/custom_ca_certs_file cert.pem

# Back to normal
gcloud config unset proxy/address
gcloud config unset proxy/port
gcloud config unset proxy/type
gcloud config unset auth/disable_ssl_validation
gcloud config unset core/custom_ca_certs_file
```
### Configuration du jeton OAuth dans gcloud

Pour **utiliser un jeton OAuth de compte de service exfiltré à partir du point de terminaison des métadonnées**, vous pouvez simplement faire :
```bash
# Via env vars
export CLOUDSDK_AUTH_ACCESS_TOKEN=<token>
gcloud projects list

# Via setup
echo "<token>" > /some/path/to/token
gcloud config set auth/access_token_file /some/path/to/token
gcloud projects list
gcloud config unset auth/access_token_file
```
## Références

- [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/)

{{#include ../../banners/hacktricks-training.md}}
