# Az - Comptes de stockage et blobs

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

## Informations de base

Les comptes de stockage Azure sont des services fondamentaux dans Microsoft Azure qui fournissent un **stockage cloud évolutif, sécurisé et hautement disponible pour divers types de données**, y compris les blobs (objets binaires volumineux), les fichiers, les files d'attente et les tables. Ils servent de conteneurs qui regroupent ces différents services de stockage sous un même espace de noms pour une gestion facile.

**Options de configuration principales** :

- Chaque compte de stockage doit avoir un **nom unique dans tous Azure**.
- Chaque compte de stockage est déployé dans une **région** ou dans une zone étendue Azure.
- Il est possible de sélectionner la version **premium** du compte de stockage pour de meilleures performances.
- Il est possible de choisir parmi **4 types de redondance pour se protéger** contre les pannes de rack, de disque et de centre de données.

**Options de configuration de sécurité** :

- **Exiger un transfert sécurisé pour les opérations de l'API REST** : Exiger TLS dans toute communication avec le stockage.
- **Permettre l'accès anonyme sur des conteneurs individuels** : Sinon, il ne sera pas possible d'activer l'accès anonyme à l'avenir.
- **Activer l'accès par clé de compte de stockage** : Sinon, l'accès avec des clés partagées sera interdit.
- **Version TLS minimale**.
- **Portée autorisée pour les opérations de copie** : Autoriser depuis n'importe quel compte de stockage, depuis n'importe quel compte de stockage du même locataire Entra ou depuis un compte de stockage avec des points de terminaison privés dans le même réseau virtuel.

**Options de stockage de blobs** :

- **Autoriser la réplication inter-locataires**.
- **Niveau d'accès** : Chaud (données fréquemment accessibles), Froid et Très Froid (données rarement accessibles).

**Options de mise en réseau** :

- **Accès réseau** :
- Autoriser depuis tous les réseaux.
- Autoriser depuis des réseaux virtuels et des adresses IP sélectionnés.
- Désactiver l'accès public et utiliser l'accès privé.
- **Points de terminaison privés** : Permet une connexion privée au compte de stockage depuis un réseau virtuel.

**Options de protection des données** :

- **Restauration à un instant donné pour les conteneurs** : Permet de restaurer les conteneurs à un état antérieur.
- Cela nécessite que la version, le flux de modifications et la suppression douce des blobs soient activés.
- **Activer la suppression douce pour les blobs** : Cela active une période de conservation en jours pour les blobs supprimés (même écrasés).
- **Activer la suppression douce pour les conteneurs** : Cela active une période de conservation en jours pour les conteneurs supprimés.
- **Activer la suppression douce pour les partages de fichiers** : Cela active une période de conservation en jours pour les partages de fichiers supprimés.
- **Activer la version pour les blobs** : Maintenir les versions précédentes de vos blobs.
- **Activer le flux de modifications des blobs** : Conserver des journaux des créations, modifications et suppressions des blobs.
- **Activer le support d'immuabilité au niveau de la version** : Vous permet de définir une politique de conservation basée sur le temps au niveau du compte qui s'appliquera à toutes les versions de blobs.
- Le support d'immuabilité au niveau de la version et la restauration à un instant donné pour les conteneurs ne peuvent pas être activés simultanément.

**Options de configuration de chiffrement** :

- **Type de chiffrement** : Il est possible d'utiliser des clés gérées par Microsoft (MMK) ou des clés gérées par le client (CMK).
- **Activer le chiffrement de l'infrastructure** : Permet de chiffrer les données deux fois "pour plus de sécurité".

### Points de terminaison de stockage

<table data-header-hidden><thead><tr><th width="197">Service de stockage</th><th>Point de terminaison</th></tr></thead><tbody><tr><td><strong>Stockage de blobs</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Stockage de Data Lake</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Stockage de files d'attente</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Stockage de tables</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>

### Exposition publique

Si "Autoriser l'accès public aux blobs" est **activé** (désactivé par défaut), lors de la création d'un conteneur, il est possible de :

- Donner **un accès public pour lire les blobs** (vous devez connaître le nom).
- **Lister les blobs du conteneur** et **les lire**.
- Le rendre entièrement **privé**.

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>

### Connexion au stockage

Si vous trouvez un **stockage** auquel vous pouvez vous connecter, vous pouvez utiliser l'outil [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) pour le faire.

## Accès au stockage <a href="#about-blob-storage" id="about-blob-storage"></a>

### RBAC

Il est possible d'utiliser des identifiants Entra ID avec des **rôles RBAC** pour accéder aux comptes de stockage et c'est la méthode recommandée.

### Clés d'accès

Les comptes de stockage ont des clés d'accès qui peuvent être utilisées pour y accéder. Cela fournit un **accès complet au compte de stockage.**

<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>

### **Clés partagées et clés partagées légères**

Il est possible de [**générer des clés partagées**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) signées avec les clés d'accès pour autoriser l'accès à certaines ressources via une URL signée.

> [!NOTE]
> Notez que la partie `CanonicalizedResource` représente la ressource des services de stockage (URI). Et si une partie de l'URL est encodée, elle doit également être encodée à l'intérieur de `CanonicalizedResource`.

> [!NOTE]
> Ceci est **utilisé par défaut par `az` cli** pour authentifier les demandes. Pour qu'il utilise les identifiants de l'identifiant Entra, indiquez le paramètre `--auth-mode login`.

- Il est possible de générer une **clé partagée pour les services de blobs, de files d'attente et de fichiers** en signant les informations suivantes :
```bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Il est possible de générer une **clé partagée pour les services de table** en signant les informations suivantes :
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
```
- Il est possible de générer une **clé partagée légère pour les services blob, queue et file** en signant les informations suivantes :
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Il est possible de générer une **lite shared key for table services** en signant les informations suivantes :
```bash
StringToSign = Date + "\n"
CanonicalizedResource
```
Ensuite, pour utiliser la clé, cela peut se faire dans l'en-tête Authorization en suivant la syntaxe :
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=

PUT http://myaccount/mycontainer?restype=container&timeout=30 HTTP/1.1
x-ms-version: 2014-02-14
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0
```
### **Signature d'accès partagé** (SAS)

Les signatures d'accès partagé (SAS) sont des URL sécurisées et temporisées qui **accordent des autorisations spécifiques pour accéder aux ressources** dans un compte de stockage Azure sans exposer les clés d'accès du compte. Alors que les clés d'accès fournissent un accès administratif complet à toutes les ressources, le SAS permet un contrôle granulaire en spécifiant des autorisations (comme lire ou écrire) et en définissant une durée d'expiration.

#### Types de SAS

- **SAS de délégation utilisateur** : Cela est créé à partir d'un **principal Entra ID** qui signera le SAS et délèguera les autorisations de l'utilisateur au SAS. Il ne peut être utilisé qu'avec **blob et stockage de lac de données** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Il est possible de **révoquer** tous les SAS délégués par l'utilisateur générés.
- Même s'il est possible de générer un SAS de délégation avec "plus" d'autorisations que celles dont dispose l'utilisateur. Cependant, si le principal ne les a pas, cela ne fonctionnera pas (pas de privesc).
- **SAS de service** : Cela est signé en utilisant l'une des **clés d'accès** du compte de stockage. Il peut être utilisé pour accorder l'accès à des ressources spécifiques dans un seul service de stockage. Si la clé est renouvelée, le SAS cessera de fonctionner.
- **SAS de compte** : Il est également signé avec l'une des **clés d'accès** du compte de stockage. Il accorde l'accès aux ressources à travers les services d'un compte de stockage (Blob, Queue, Table, File) et peut inclure des opérations au niveau du service.

Une URL SAS signée par une **clé d'accès** ressemble à ceci :

- `https://<container_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`

Une URL SAS signée en tant que **délégation utilisateur** ressemble à ceci :

- `https://<container_name>.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D`

Notez quelques **params http** :

- Le paramètre **`se`** indique la **date d'expiration** du SAS
- Le paramètre **`sp`** indique les **autorisations** du SAS
- Le **`sig`** est la **signature** validant le SAS

#### Autorisations SAS

Lors de la génération d'un SAS, il est nécessaire d'indiquer les autorisations qu'il doit accorder. Selon l'objet sur lequel le SAS est généré, différentes autorisations peuvent être incluses. Par exemple :

- (a)jouter, (c)réer, (d)élete, (e)xécuter, (f)iltrer_par_tags, (i)ndiquer_politique_d'immuabilité, (l)ister, (m)ouvoir, (r)ead, (t)ag, (w)riter, (x)supprimer_version_précédente, (y)suppression_permanente

## Support SFTP pour Azure Blob Storage

Azure Blob Storage prend désormais en charge le protocole de transfert de fichiers SSH (SFTP), permettant un transfert et une gestion de fichiers sécurisés directement vers Blob Storage sans nécessiter de solutions personnalisées ou de produits tiers.

### Caractéristiques clés

- Support de protocole : SFTP fonctionne avec des comptes de stockage Blob configurés avec un espace de noms hiérarchique (HNS). Cela organise les blobs en répertoires et sous-répertoires pour une navigation plus facile.
- Sécurité : SFTP utilise des identités d'utilisateur local pour l'authentification et ne s'intègre pas avec RBAC ou ABAC. Chaque utilisateur local peut s'authentifier via :
- Mots de passe générés par Azure
- Paires de clés SSH publiques-privées
- Autorisations granulaires : Des autorisations telles que Lire, Écrire, Supprimer et Lister peuvent être attribuées aux utilisateurs locaux pour jusqu'à 100 conteneurs.
- Considérations réseau : Les connexions SFTP se font par le port 22. Azure prend en charge des configurations réseau telles que des pare-feu, des points de terminaison privés ou des réseaux virtuels pour sécuriser le trafic SFTP.

### Exigences de configuration

- Espace de noms hiérarchique : HNS doit être activé lors de la création du compte de stockage.
- Chiffrement pris en charge : Nécessite des algorithmes cryptographiques approuvés par le cycle de développement de sécurité de Microsoft (SDL) (par exemple, rsa-sha2-256, ecdsa-sha2-nistp256).
- Configuration SFTP :
- Activer SFTP sur le compte de stockage.
- Créer des identités d'utilisateur local avec les autorisations appropriées.
- Configurer des répertoires personnels pour les utilisateurs afin de définir leur emplacement de départ dans le conteneur.

### Autorisations

| Autorisation           | Symbole | Description                          |
| ---------------------- | ------ | ------------------------------------ |
| **Lire**               | `r`    | Lire le contenu du fichier.          |
| **Écrire**             | `w`    | Télécharger des fichiers et créer des répertoires. |
| **Lister**             | `l`    | Lister le contenu des répertoires.   |
| **Supprimer**          | `d`    | Supprimer des fichiers ou des répertoires. |
| **Créer**              | `c`    | Créer des fichiers ou des répertoires. |
| **Modifier la propriété** | `o`    | Changer l'utilisateur ou le groupe propriétaire. |
| **Modifier les autorisations** | `p`    | Changer les ACL sur les fichiers ou répertoires. |

## Énumération

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

# BLOB STORAGE
## List containers
az storage container list --account-name <name>
## Check if public access is allowed
az storage container show-permission \
--account-name <acc-name> \
-n <container-name>
## Make a container public
az storage container set-permission \
--public-access container \
--account-name <acc-name> \
-n <container-name>
## List blobs in a container
az storage blob list \
--container-name <container name> \
--account-name <account name>
## Download blob
az storage blob download \
--account-name <account name> \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Create container policy
az storage container policy create \
--account-name mystorageaccount \
--container-name mycontainer \
--name fullaccesspolicy \
--permissions racwdl \
--start 2023-11-22T00:00Z \
--expiry 2024-11-22T00:00Z

# QUEUE
az storage queue list --account-name <name>
az storage message peek --account-name <name> --queue-name <queue-name>

# ACCESS KEYS
az storage account keys list --account-name <name>
## Check key policies (expiration time?)
az storage account show -n <name> --query "{KeyPolicy:keyPolicy}"
## Once having the key, it's possible to use it with the argument --account-key
## Enum blobs with account key
az storage blob list \
--container-name <container name> \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw=="
## Download a file using an account key
az storage blob download \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Upload a file using an account key
az storage blob upload \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--file </path/to/local/file>

# SAS
## List access policies
az storage <container|queue|share|table> policy list \
--account-name <acc name> \
--container-name <container name>

## Generate SAS with all permissions using an access key
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
-n <container-name>

## Generate SAS with all permissions using via user delegation
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
--as-user --auth-mode login \
-n <container-name>

## Generate account SAS
az storage account generate-sas \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name>  \
--services qt \
--resource-types sco \
--permissions acdfilrtuwxy

## Use the returned SAS key with the param --sas-token
## e.g.
az storage blob show \
--account-name <account name> \
--container-name <container name> \
--sas-token 'se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D' \
--name 'asd.txt'

#Local-Users
## List users
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>
## Get user
az storage account local-user show \
--account-name <storage-account-name> \
--resource-group <resource-group-name> \
--name <local-user-name>

## List keys
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>
```
{{#endtab }}

{{#tab name="Az PowerShell" }}
```bash
# Get storage accounts
Get-AzStorageAccount | fl
# Get rules to access the storage account
Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet
# Get IPs
(Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet).IPRules
# Get containers of a storage account
Get-AzStorageContainer -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).context
# Get blobs inside container
Get-AzStorageBlob -Container epbackup-planetary -Context (Get-AzStorageAccount -name <name> -ResourceGroupName <name>).context
# Get a blob from a container
Get-AzStorageBlobContent -Container <NAME> -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).context -Blob <blob_name> -Destination .\Desktop\filename.txt

# Create a Container Policy
New-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container <container-name> `
-Policy <policy-name> `
-Permission racwdl `
-StartTime (Get-Date "2023-11-22T00:00Z") `
-ExpiryTime (Get-Date "2024-11-22T00:00Z")
#Get Container policy
Get-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container "storageaccount1994container"

# Queue Management
Get-AzStorageQueue -Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context
(Get-AzStorageQueue -Name <NAME> -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).Context).QueueClient.PeekMessage().Value

#Blob Container
Get-AzStorageBlob -Container <container-name> -Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
Get-AzStorageBlobContent `
-Container <container-name> `
-Blob <blob-name> `
-Destination <local-path> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context

Set-AzStorageBlobContent `
-Container <container-name> `
-File <local-file-path> `
-Blob <blob-name> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context

# Shared Access Signatures (SAS)
Get-AzStorageContainerAcl `
-Container <container-name> `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context

New-AzStorageBlobSASToken `
-Context $ctx `
-Container <container-name> `
-Blob <blob-name> `
-Permission racwdl `
-ExpiryTime (Get-Date "2024-12-31T23:59:00Z")
```
{{#endtab }}
{{#endtabs }}

### Partages de fichiers

{{#ref}}
az-file-shares.md
{{#endref}}

## Escalade de privilèges

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

## Post-exploitation

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

## Persistance

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

## Références

- [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)

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