# Az - File Shares

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

## Informazioni di Base

**Azure Files** è un servizio di archiviazione file cloud completamente gestito che fornisce archiviazione file condivisa accessibile tramite i protocolli standard **SMB (Server Message Block)** e **NFS (Network File System)**. Sebbene il protocollo principale utilizzato sia SMB, le condivisioni di file NFS di Azure non sono supportate per Windows (secondo la [**documentazione**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol)). Consente di creare condivisioni di file di rete altamente disponibili che possono essere accessibili simultaneamente da più macchine virtuali (VM) o sistemi on-premises, consentendo una condivisione di file senza soluzione di continuità tra gli ambienti.

### Livelli di Accesso

- **Ottimizzato per Transazioni**: Ottimizzato per operazioni ad alta intensità di transazione.
- **Hot**: Bilanciato tra transazioni e archiviazione.
- **Cool**: Economico per l'archiviazione.
- **Premium:** Archiviazione file ad alte prestazioni ottimizzata per carichi di lavoro a bassa latenza e intensivi in IOPS.

### Backup

- **Backup Giornaliero**: Un punto di backup viene creato ogni giorno a un orario indicato (ad es. 19.30 UTC) e conservato da 1 a 200 giorni.
- **Backup Settimanale**: Un punto di backup viene creato ogni settimana in un giorno e orario indicati (domenica alle 19.30) e conservato da 1 a 200 settimane.
- **Backup Mensile**: Un punto di backup viene creato ogni mese in un giorno e orario indicati (ad es. prima domenica alle 19.30) e conservato da 1 a 120 mesi.
- **Backup Annuale**: Un punto di backup viene creato ogni anno in un giorno e orario indicati (ad es. prima domenica di gennaio alle 19.30) e conservato da 1 a 10 anni.
- È anche possibile eseguire **backup manuali e snapshot in qualsiasi momento**. I backup e gli snapshot sono in realtà la stessa cosa in questo contesto.

### Autenticazioni Supportate tramite SMB

- **Autenticazione AD DS On-premises**: Utilizza le credenziali di Active Directory on-premises sincronizzate con Microsoft Entra ID per l'accesso basato su identità. Richiede connettività di rete con AD DS on-premises.
- **Autenticazione Microsoft Entra Domain Services**: Sfrutta i Microsoft Entra Domain Services (AD basato su cloud) per fornire accesso utilizzando le credenziali di Microsoft Entra.
- **Microsoft Entra Kerberos per Identità Ibride**: Consente agli utenti di Microsoft Entra di autenticarsi alle condivisioni di file Azure su Internet utilizzando Kerberos. Supporta VM unite a Microsoft Entra ibride o unite a Microsoft Entra senza richiedere connettività con i controller di dominio on-premises. Ma non supporta identità solo cloud.
- **Autenticazione AD Kerberos per Client Linux**: Consente ai client Linux di utilizzare Kerberos per l'autenticazione SMB tramite AD DS on-premises o Microsoft Entra Domain Services.

## Enumerazione

{{#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]
> 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 --enable-file-backup-request-intent`.

> [!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

### Connessione

Questi sono gli script proposti da Azure al momento della scrittura per connettersi a un File Share:

È necessario sostituire i segnaposto `<STORAGE-ACCOUNT>`, `<ACCESS-KEY>` e `<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}}

### Enumerazione dello storage regolare (chiavi di accesso, SAS...)

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

## Escalation dei privilegi

Stesso metodo per la privesc dello storage:

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

## Post Exploitation

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

## Persistenza

Stesso metodo per la persistenza dello storage:

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

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