# GCP Pentesting

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

## Osnovne informacije

**Pre nego što započnete pentesting** GCP okruženja, postoji nekoliko **osnovnih stvari koje treba da znate** o tome kako funkcioniše da bi vam pomogle da razumete šta treba da radite, kako da pronađete pogrešne konfiguracije i kako da ih iskoristite.

Koncepti kao što su **organizacija** hijerarhija, **dozvole** i drugi osnovni koncepti su objašnjeni u:

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

## Laboratorije za učenje

- [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)

## GCP Pentester/Red Team metodologija

Da biste auditovali GCP okruženje, veoma je važno znati: koje **usluge se koriste**, šta je **izloženo**, ko ima **pristup** čemu, i kako su interne GCP usluge povezane sa **spoljnim uslugama**.

Sa stanovišta Red Teama, **prvi korak za kompromitovanje GCP okruženja** je da uspete da dobijete neke **akreditive**. Ovde imate nekoliko ideja kako to učiniti:

- **Izdavanje** na github-u (ili sličnom) - OSINT
- **Društveno** inženjerstvo (Pogledajte stranicu [**Workspace Security**](../workspace-security/index.html))
- **Ponovna upotreba** lozinki (curenje lozinki)
- Ranljivosti u GCP-hostovanim aplikacijama
- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) sa pristupom metadata endpoint-u
- **Čitanje lokalnih fajlova**
- `/home/USERNAME/.config/gcloud/*`
- `C:\Users\USERNAME\.config\gcloud\*`
- 3rd parties **provaljeni**
- **Interni** zaposleni

Ili kompromitovanjem **neautentifikovane usluge** koja je izložena:

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

Ili ako radite **reviziju**, mogli biste jednostavno da **tražite akreditive** sa ovim rolama:

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

> [!NOTE]
> Nakon što ste uspeli da dobijete akreditive, treba da znate **čijim akreditivima pripadaju**, i **čemu imaju pristup**, tako da treba da izvršite neku osnovnu enumeraciju:

## Osnovna enumeracija

### **SSRF**

Za više informacija o tome kako da **enumerišete GCP metadata** pogledajte sledeću hacktricks stranicu:

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

### Whoami

U GCP-u možete probati nekoliko opcija da pokušate da pogodite ko ste:
```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
```
Možete takođe koristiti API krajnju tačku `/userinfo` da biste dobili više informacija o korisniku:
```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
```
### Org Enumeration
```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
```
### Principals & IAM Enumeration

Ako imate dovoljno dozvola, **proveravanje privilegija svake entiteta unutar GCP naloga** će vam pomoći da razumete šta vi i druge identitete možete da radite i kako da **povećate privilegije**.

Ako nemate dovoljno dozvola da enumerišete IAM, možete **ukrasti brute-force** da ih otkrijete.\
Proverite **kako da uradite numeraciju i brute-forcing** u:

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

> [!NOTE]
> Sada kada **imate neke informacije o vašim kredencijalima** (i ako ste red tim, nadamo se da **niste otkriveni**). Vreme je da otkrijete koje se usluge koriste u okruženju.\
> U sledećem odeljku možete proveriti neke načine da **enumerišete neke uobičajene usluge.**

## Services Enumeration

GCP ima neverovatan broj usluga, na sledećoj stranici ćete pronaći **osnovne informacije, cheat sheet-ove za enumeraciju**, kako da **izbegnete otkrivanje**, dobijete **persistence**, i druge **post-exploitation** trikove o nekima od njih:

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

Imajte na umu da **ne** morate obavljati sav posao **ručno**, ispod u ovom postu možete pronaći **odeljak o** [**automatskim alatima**](#automatic-tools).

Štaviše, u ovoj fazi možda ste otkrili **više usluga izloženih neautentifikovanim korisnicima**, možda ćete moći da ih iskoristite:

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

## Privilege Escalation, Post Exploitation & Persistence

Najčešći način kada ste dobili neke cloud kredencijale ili kompromitovali neku uslugu koja radi unutar clouda je da **zloupotrebite pogrešno konfigurisane privilegije** koje kompromitovani nalog može imati. Dakle, prva stvar koju treba da uradite je da enumerišete svoje privilegije.

Štaviše, tokom ove enumeracije, zapamtite da **dozvole mogu biti postavljene na najvišem nivou "Organizacije"** takođe.

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

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

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

### Publicly Exposed Services

Dok enumerišete GCP usluge, možda ste pronašli neke od njih **koje izlažu elemente internetu** (VM/Containers portove, baze podataka ili usluge reda, snimke ili kante...).\
Kao pentester/red tim, uvek biste trebali proveriti da li možete pronaći **osetljive informacije / ranjivosti** na njima jer bi vam mogle pružiti **dalji pristup AWS nalogu**.

U ovoj knjizi trebali biste pronaći **informacije** o tome kako pronaći **izložene GCP usluge i kako ih proveriti**. O tome kako pronaći **ranjivosti u izloženim mrežnim uslugama**, preporučujem vam da **pretražujete** specifičnu **uslugu** u:

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

## GCP <--> Workspace Pivoting

**Kompromitovanje** principa na **jednoj** platformi može omogućiti napadaču da **kompromituje drugu**, proverite to u:

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

## Automatic Tools

- U **GCloud konzoli**, na [https://console.cloud.google.com/iam-admin/asset-inventory/dashboard](https://console.cloud.google.com/iam-admin/asset-inventory/dashboard) možete videti resurse i IAM-ove koji se koriste po projektu.
- Ovde možete videti imovinu koju podržava ovaj API: [https://cloud.google.com/asset-inventory/docs/supported-asset-types](https://cloud.google.com/asset-inventory/docs/supported-asset-types)
- Proverite **alate** koji se mogu [**koristiti u nekoliko cloud-ova ovde**](../pentesting-cloud-methodology.md).
- [**gcp_scanner**](https://github.com/google/gcp_scanner): Ovo je GCP skener resursa koji može pomoći da se utvrdi koji **nivo pristupa određeni kredencijali poseduju** na 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): Bash skripta za enumeraciju GCP okruženja koristeći gcloud cli i čuvanje rezultata u datoteci.
- [**GCP-IAM-Privilege-Escalation**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation): Skripte za enumeraciju visokih IAM privilegija i za eskalaciju privilegija u GCP zloupotrebom istih (nisam mogao da pokrenem skriptu za enumeraciju).
- [**BF My GCP Permissions**](https://github.com/carlospolop/bf_my_gcp_permissions): Skripta za bruteforce vaših dozvola.

## 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... network

Zapamtite da možete koristiti **parameter** **`--log-http`** sa **`gcloud`** cli da **ispišete** **zahteve** koje alat izvršava. Ako ne želite da logovi redigiraju vrednost tokena, koristite `gcloud config set log_http_redact_token false`

Pored toga, da biste presreli komunikaciju:
```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
```
### OAuth token configure in gcloud

Da biste **koristili exfiltrirani OAuth token servisnog naloga sa metadata endpoint-a** možete jednostavno uraditi:
```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
```
## Reference

- [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}}
