# Az - PostgreSQL Privesc

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

## PostgreSQL Privesc
Za više informacija o SQL bazi podataka, proverite:

{{#ref}}
../az-services/az-postgresql.md
{{#endref}}

### `Microsoft.DBforPostgreSQL/flexibleServers/read` && `Microsoft.DBforPostgreSQL/flexibleServers/write`

Sa ovom dozvolom, možete kreirati, ažurirati ili brisati PostgreSQL Flexible Server instance na Azure-u. Ovo uključuje obezbeđivanje novih servera, modifikovanje postojećih konfiguracija servera ili ukidanje servera.
```bash
az postgres flexible-server create \
--name <ServerName> \
--resource-group <ResourceGroupName> \
--location <Location> \
--admin-user <AdminUsername> \
--admin-password <AdminPassword> \
--sku-name <SkuName> \
--storage-size <StorageSizeInGB> \
--tier <PricingTier> \
--version <PostgreSQLVersion>
```
Na primer, ova dozvola omogućava promenu PostgreSQL lozinke, što je korisno, naravno, u slučaju da je PostgreSQL autentifikacija omogućena.
```bash
az postgres flexible-server update \
--resource-group <resource_group_name> \
--name <server_name> \
--admin-password <password_to_update>
```
Pored toga, sa dozvolama možete omogućiti dodeljenu identitet, i raditi sa upravljanim identitetom koji je povezan sa serverom. Ovde možete pronaći sve ekstenzije koje Azure PostgreSQL fleksibilni server podržava [https://learn.microsoft.com/en-us/azure/cosmos-db/postgresql/reference-extensions](https://learn.microsoft.com/en-us/azure/cosmos-db/postgresql/reference-extensions). Da biste mogli da koristite ove ekstenzije, neki parametri servera (azure.extensions) treba da budu promenjeni. Na primer, ovde sa upravljanim identitetom koji može da pristupi Azure Storage:

Prvo menjamo parametre i osiguravamo da je dodeljeni identitet omogućen:
```bash
az postgres flexible-server parameter set \
--resource-group <YourResourceGroupName> \
--server-name <YourServerName> \
--name azure.extensions \
--value "AZURE_STORAGE"

az postgres flexible-server identity update \
--resource-group <YourResourceGroupName> \
--server-name <YourServerName> \
--system-assigned Enabled
```

```sql 

CREATE EXTENSION IF NOT EXISTS azure_storage;

CREATE EXTERNAL DATA SOURCE ManagedIdentity

SELECT azure_storage.account_add('<storage-account>', '<storage-key>');

SELECT *
FROM azure_storage.blob_get(
'<storage-account>',
'<container>',
'message.txt',
decoder := 'text'
) AS t(content text)
LIMIT 1;

```
Dodatno, potrebno je omogućiti javni pristup ako želite da pristupite sa neprivatnog krajnjeg tačke, da biste to omogućili:
```bash
az postgres flexible-server update --resource-group <resource_group_name> --server-name <server_name> --public-access Enabled
```
### `Microsoft.DBforPostgreSQL/flexibleServers/read`, `Microsoft.DBforPostgreSQL/flexibleServers/write`, `Microsoft.DBforPostgreSQL/flexibleServers/backups/read`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`

Sa ovim dozvolama možete obnoviti server iz rezervne kopije sa:
```bash
az postgres flexible-server restore \
--resource-group <RESOURCE_GROUP> \
--name <NEW_SERVER_NAME> \
--source-server <SOURCE_SERVER_NAME> \
--restore-time "<ISO8601_TIMESTAMP>" \
--yes

```
### `Microsoft.DBforPostgreSQL/flexibleServers/read`, `Microsoft.DBforPostgreSQL/flexibleServers/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.DBforPostgreSQL/flexibleServers/administrators/write` && `Microsoft.DBforPostgreSQL/flexibleServers/administrators/read`

Sa ovom dozvolom, možete konfigurisati Azure Active Directory (AD) administratore za PostgreSQL Flexible Server. Ovo se može iskoristiti postavljanjem sebe ili drugog naloga kao AD administratora, čime se dodeljuje potpuna administrativna kontrola nad PostgreSQL serverom. Ažuriranje postojećeg principala još nije podržano, tako da ako je jedan kreiran, morate ga prvo obrisati.

Važno je da fleksibilni server ima dodeljene korisničke upravljane identitete za korišćenje.
```bash
az postgres flexible-server ad-admin create \
--resource-group <ResourceGroupName> \
--server-name <ServerName> \
--display-name <ADAdminDisplayName> \
--identity <IdentityNameOrID> \
--object-id <ObjectID>
```
{{#include ../../../banners/hacktricks-training.md}}
