# Az - Partages de fichiers

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

## Informations de base

**Azure Files** est un service de stockage de fichiers cloud entièrement géré qui fournit un stockage de fichiers partagé accessible via les protocoles standard **SMB (Server Message Block)** et **NFS (Network File System)**. Bien que le protocole principal utilisé soit SMB, les partages de fichiers NFS Azure ne sont pas pris en charge pour Windows (selon les [**docs**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol)). Il vous permet de créer des partages de fichiers réseau hautement disponibles qui peuvent être accessibles simultanément par plusieurs machines virtuelles (VM) ou systèmes sur site, permettant un partage de fichiers fluide entre les environnements.

### Niveaux d'accès

- **Optimisé pour les transactions** : Optimisé pour les opérations lourdes en transactions.
- **Chaud** : Équilibré entre transactions et stockage.
- **Froid** : Rentable pour le stockage.
- **Premium :** Stockage de fichiers haute performance optimisé pour des charges de travail à faible latence et intensives en IOPS.

### Sauvegardes

- **Sauvegarde quotidienne** : Un point de sauvegarde est créé chaque jour à une heure indiquée (par exemple, 19h30 UTC) et stocké pendant 1 à 200 jours.
- **Sauvegarde hebdomadaire** : Un point de sauvegarde est créé chaque semaine à un jour et une heure indiqués (dimanche à 19h30) et stocké pendant 1 à 200 semaines.
- **Sauvegarde mensuelle** : Un point de sauvegarde est créé chaque mois à un jour et une heure indiqués (par exemple, le premier dimanche à 19h30) et stocké pendant 1 à 120 mois.
- **Sauvegarde annuelle** : Un point de sauvegarde est créé chaque année à un jour et une heure indiqués (par exemple, le premier dimanche de janvier à 19h30) et stocké pendant 1 à 10 ans.
- Il est également possible d'effectuer des **sauvegardes manuelles et des instantanés à tout moment**. Les sauvegardes et les instantanés sont en fait les mêmes dans ce contexte.

### Authentifications prises en charge via SMB

- **Authentification AD DS sur site** : Elle utilise des identifiants Active Directory sur site synchronisés avec Microsoft Entra ID pour un accès basé sur l'identité. Elle nécessite une connectivité réseau avec AD DS sur site.
- **Authentification des services de domaine Microsoft Entra** : Elle s'appuie sur les services de domaine Microsoft Entra (AD basé sur le cloud) pour fournir un accès en utilisant des identifiants Microsoft Entra.
- **Kerberos Microsoft Entra pour identités hybrides** : Il permet aux utilisateurs de Microsoft Entra d'authentifier les partages de fichiers Azure via Internet en utilisant Kerberos. Il prend en charge les VM jointes à Microsoft Entra hybrides ou jointes à Microsoft Entra sans nécessiter de connectivité avec les contrôleurs de domaine sur site. Mais il ne prend pas en charge les identités uniquement cloud.
- **Authentification Kerberos AD pour clients Linux** : Elle permet aux clients Linux d'utiliser Kerberos pour l'authentification SMB via AD DS sur site ou les services de domaine Microsoft Entra.

## Énumération

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

# List file shares
az storage share list --account-name <name>
az storage share-rm list --storage-account <name> # To see the deleted ones too --include-deleted
# Get dirs/files inside the share
az storage file list --account-name <name> --share-name <share-name>
## If type is "dir", you can continue enumerating files inside of it
az storage file list --account-name <name> --share-name <prev_dir/share-name>
# Download a complete share (with directories and files inside of them)
az storage file download-batch -d . --source <share-name> --account-name <name>
# List snapshots
az storage share snapshot --name <share-name>
# List file shares, including deleted ones
az rest --method GET \
--url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}/fileServices/default/shares?%24skipToken=&%24maxpagesize=20&%24filter=&%24expand=deleted&api-version=2019-06-01"

# Get snapshots/backups
az storage share list --account-name <name> --include-snapshots --query "[?snapshot != null]"
# List contents of a snapshot/backup
az storage file list --account-name <name> --share-name <share-name> --snapshot <snapshot-version> #e.g. "2024-11-25T11:26:59.0000000Z"
# Download snapshot/backup
az storage file download-batch -d . --account-name <name> --source <share-name> --snapshot <snapshot-version>
```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-AzStorageAccount

# List File Shares
Get-AzStorageShare -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context

# Get Directories/Files Inside the Share
Get-AzStorageFile -ShareName "<share-name>" -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context
Get-AzStorageFile -ShareName "<share-name>" -Path "<share-directory-path>" -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context

# Download a Complete Share
Get-AzStorageFileContent -ShareName "<share-name>" -Destination "C:\Download" -Path "<share-directory-path>" -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context

# Get Snapshots/Backups
Get-AzStorageShare -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context | Where-Object { $_.SnapshotTime -ne $null }

# List Contents of a Snapshot/Backup
Get-AzStorageFile -ShareName "<share-name>" -Context (New-AzStorageContext -StorageAccountName "<storage-account-name>" -StorageAccountKey (Get-AzStorageAccountKey -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>" | Select-Object -ExpandProperty Value) -SnapshotTime "<snapshot-version>")

```
{{#endtab }}
{{#endtabs }}

> [!NOTE]
> Par défaut, `az` cli utilisera une clé de compte pour signer une clé et effectuer l'action. Pour utiliser les privilèges du principal Entra ID, utilisez les paramètres `--auth-mode login --enable-file-backup-request-intent`.

> [!TIP]
> Utilisez le paramètre `--account-key` pour indiquer la clé de compte à utiliser\
> Utilisez le paramètre `--sas-token` avec le token SAS pour accéder via un token SAS

### Connexion

Ce sont les scripts proposés par Azure au moment de l'écriture pour se connecter à un File Share :

Vous devez remplacer les espaces réservés `<STORAGE-ACCOUNT>`, `<ACCESS-KEY>` et `<FILE-SHARE-NAME>`.

{{#tabs}}
{{#tab name="Windows"}}
```bash
$connectTestResult = Test-NetConnection -ComputerName filescontainersrdtfgvhb.file.core.windows.net -Port 445
if ($connectTestResult.TcpTestSucceeded) {
# Save the password so the drive will persist on reboot
cmd.exe /C "cmdkey /add:`"<STORAGE-ACCOUNT>.file.core.windows.net`" /user:`"localhost\<STORAGE-ACCOUNT>`" /pass:`"<ACCESS-KEY>`""
# Mount the drive
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<STORAGE-ACCOUNT>.file.core.windows.net\<FILE-SHARE-NAME>" -Persist
} else {
Write-Error -Message "Unable to reach the Azure storage account via port 445. Check to make sure your organization or ISP is not blocking port 445, or use Azure P2S VPN, Azure S2S VPN, or Express Route to tunnel SMB traffic over a different port."
}
```
{{#endtab}}

{{#tab name="Linux"}}
```bash
sudo mkdir /mnt/disk-shareeifrube
if [ ! -d "/etc/smbcredentials" ]; then
sudo mkdir /etc/smbcredentials
fi
if [ ! -f "/etc/smbcredentials/<STORAGE-ACCOUNT>.cred" ]; then
sudo bash -c 'echo "username=<STORAGE-ACCOUNT>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
sudo bash -c 'echo "password=<ACCESS-KEY>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
fi
sudo chmod 600 /etc/smbcredentials/<STORAGE-ACCOUNT>.cred

sudo bash -c 'echo "//<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME> /mnt/<FILE-SHARE-NAME> cifs nofail,credentials=/etc/smbcredentials/<STORAGE-ACCOUNT>.cred,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30" >> /etc/fstab'
sudo mount -t cifs //<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME> /mnt/<FILE-SHARE-NAME> -o credentials=/etc/smbcredentials/<STORAGE-ACCOUNT>.cred,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30
```
{{#endtab}}

{{#tab name="macOS"}}
```bash
open smb://<STORAGE-ACCOUNT>:<ACCESS-KEY>@<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>
```
{{#endtab}}
{{#endtabs}}

### Énumération de stockage régulier (clés d'accès, SAS...)

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

## Escalade de privilèges

Identique à la privesc de stockage :

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

## Post-exploitation

{{#ref}}
../az-post-exploitation/az-file-share-post-exploitation.md
{{#endref}}

## Persistance

Identique à la persistance de stockage :

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

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