# Az - Table Storage

{{#include ../../../banners/hacktricks-training.md}}

## Informazioni di Base

**Azure Table Storage** è un archivio NoSQL a chiave-valore progettato per memorizzare grandi volumi di dati strutturati e non relazionali. Offre alta disponibilità, bassa latenza e scalabilità per gestire grandi set di dati in modo efficiente. I dati sono organizzati in tabelle, con ogni entità identificata da una chiave di partizione e una chiave di riga, consentendo ricerche rapide. Supporta funzionalità come la crittografia a riposo, il controllo degli accessi basato sui ruoli e le firme di accesso condiviso per uno storage sicuro e gestito adatto a una vasta gamma di applicazioni.

Non **c'è un meccanismo di backup integrato** per l'archiviazione delle tabelle.

### Chiavi

#### **PartitionKey**

- Il **PartitionKey raggruppa le entità in partizioni logiche**. Le entità con lo stesso PartitionKey sono memorizzate insieme, il che migliora le prestazioni delle query e la scalabilità.
- Esempio: In una tabella che memorizza i dati dei dipendenti, `PartitionKey` potrebbe rappresentare un dipartimento, ad esempio, `"HR"` o `"IT"`.

#### **RowKey**

- Il **RowKey è l'identificatore unico** per un'entità all'interno di una partizione. Quando combinato con il PartitionKey, garantisce che ogni entità nella tabella abbia un identificatore globalmente unico.
- Esempio: Per la partizione `"HR"`, `RowKey` potrebbe essere un ID dipendente, ad esempio, `"12345"`.

#### **Altre Proprietà (Proprietà Personalizzate)**

- Oltre al PartitionKey e al RowKey, un'entità può avere ulteriori **proprietà personalizzate per memorizzare dati**. Queste sono definite dall'utente e funzionano come colonne in un database tradizionale.
- Le proprietà sono memorizzate come **coppie chiave-valore**.
- Esempio: `Name`, `Age`, `Title` potrebbero essere proprietà personalizzate per un dipendente.

## Enumerazione

{{#tabs}}
{{#tab name="az cli"}}
```bash
# Get storage accounts
az storage account list

# List tables
az storage table list --account-name <name>

# Read table
az storage entity query \
--account-name <name> \
--table-name <t-name> \
--top 10

# Write table
az storage entity insert \
--account-name <STORAGE_ACCOUNT_NAME> \
--table-name <TABLE_NAME> \
--entity PartitionKey=<PARTITION_KEY> RowKey=<ROW_KEY> <PROPERTY_KEY>=<PROPERTY_VALUE>

# Write example
az storage entity insert \
--account-name mystorageaccount \
--table-name mytable \
--entity PartitionKey=HR RowKey=12345 Name="John Doe" Age=30 Title="Manager"

# Update row
az storage entity merge \
--account-name mystorageaccount \
--table-name mytable \
--entity PartitionKey=pk1 RowKey=rk1 Age=31
```
{{#endtab}}
{{#tab name="PowerShell"}}
```bash
# Get storage accounts
Get-AzStorageAccount

# List tables
Get-AzStorageTable -Context (Get-AzStorageAccount -Name <mystorageaccount> -ResourceGroupName <ResourceGroupName>).Context

Get-AzStorageTableStoredAccessPolicy -Table <Table> -Context (Get-AzStorageAccount -Name <mystorageaccount -ResourceGroupName <ResourceGroupName>).Context
```
{{#endtab}}
{{#endtabs}}

> [!NOTE]
> Per impostazione predefinita, `az` cli utilizzerà una chiave dell'account per firmare una chiave e eseguire l'azione. Per utilizzare i privilegi del principale Entra ID, utilizzare i parametri `--auth-mode login`.

> [!TIP]
> Utilizzare il parametro `--account-key` per indicare la chiave dell'account da utilizzare\
> Utilizzare il parametro `--sas-token` con il token SAS per accedere tramite un token SAS

## Privilege Escalation

Stesso di storage privesc:

{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}

## Post Exploitation

{{#ref}}
../az-post-exploitation/az-table-storage-post-exploitation.md
{{#endref}}

## Persistence

Stesso di storage persistence:

{{#ref}}
../az-persistence/az-storage-persistence.md
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
