# Az - Table Storage

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

## Osnovne Informacije

**Azure Table Storage** je NoSQL skladište ključ-vrednost dizajnirano za skladištenje velikih količina strukturiranih, nestrukturiranih podataka. Pruža visoku dostupnost, nisku latenciju i skalabilnost za efikasno upravljanje velikim skupovima podataka. Podaci su organizovani u tabelama, pri čemu je svaka entitet identifikovan pomoću partition key i row key, što omogućava brze pretrage. Podržava funkcije kao što su enkripcija u mirovanju, kontrola pristupa zasnovana na ulogama i potpisane pristupne dozvole za sigurno, upravljano skladištenje pogodno za širok spektar aplikacija.

**Ne postoji ugrađeni mehanizam za pravljenje rezervnih kopija** za table storage.

### Ključevi

#### **PartitionKey**

- **PartitionKey grupiše entitete u logičke particije**. Entiteti sa istim PartitionKey se skladište zajedno, što poboljšava performanse upita i skalabilnost.
- Primer: U tabeli koja skladišti podatke o zaposlenima, `PartitionKey` može predstavljati odeljenje, npr., `"HR"` ili `"IT"`.

#### **RowKey**

- **RowKey je jedinstveni identifikator** za entitet unutar particije. Kada se kombinuje sa PartitionKey, osigurava da svaki entitet u tabeli ima globalno jedinstveni identifikator.
- Primer: Za particiju `"HR"`, `RowKey` može biti ID zaposlenog, npr., `"12345"`.

#### **Ostala Svojstva (Prilagođena Svojstva)**

- Pored PartitionKey i RowKey, entitet može imati dodatna **prilagođena svojstva za skladištenje podataka**. Ova svojstva su definisana od strane korisnika i deluju kao kolone u tradicionalnoj bazi podataka.
- Svojstva se skladište kao **ključ-vrednost parovi**.
- Primer: `Name`, `Age`, `Title` mogu biti prilagođena svojstva za zaposlenog.

## Enumeracija

{{#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]
> Podrazumevano `az` cli će koristiti ključ naloga za potpisivanje ključa i izvršavanje akcije. Da biste koristili privilegije Entra ID glavnog korisnika, koristite parametre `--auth-mode login`.

> [!TIP]
> Koristite parametar `--account-key` da biste naznačili ključ naloga koji će se koristiti\
> Koristite parametar `--sas-token` sa SAS tokenom za pristup putem SAS tokena

## Privilege Escalation

Isto kao i 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

Isto kao i storage persistence:

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

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