.table.core.windows.net
Si âAllow Blob public accessâ est activĂ© (dĂ©sactivĂ© par dĂ©faut), lors de la crĂ©ation dâun container il est possible de :
Donner un accĂšs public en lecture aux blobs (il faut connaĂźtre le nom).
Lister les blobs du container et les lire .
Le rendre complÚtement privé .
Static websites sont servies depuis le container spécial $web via un endpoint spécifique à la région, par exemple https://<account>.z13.web.core.windows.net/.
Le container $web peut renvoyer publicAccess: null via lâAPI blob, mais les fichiers restent accessibles via lâendpoint du site statique, donc dĂ©poser des artefacts de config/IaC lĂ -bas peut leak des secrets.
Flux de travail dâaudit rapide:
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
# Enumerate containers (including $web) and their public flags
az storage container list --account-name <acc-name> --auth-mode login
# List files served by the static site even when publicAccess is null
az storage blob list --container-name '$web' --account-name <acc-name> --auth-mode login
# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name <acc-name> --auth-mode login
Localisez les storage accounts pouvant exposer des données : az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'. Si allowBlobPublicAccess est false vous ne pouvez pas rendre les containers publics.
Inspectez les comptes risquĂ©s pour confirmer le flag et dâautres paramĂštres faibles : az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'.
ĂnumĂ©rez lâexposition au niveau du container lorsque le flag est activĂ©:
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
"Blob": accÚs en lecture anonyme autorisé uniquement lorsque le nom du blob est connu (sans possibilité de lister).
"Container": liste + lecture anonymes de chaque blob.
null: privé ; authentification requise.
Prouver lâaccĂšs sans identifiants :
Si publicAccess est Container, le listing anonyme fonctionne : curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list".
Pour Blob et Container, le tĂ©lĂ©chargement anonyme dâun blob fonctionne lorsque son nom est connu :
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
Si vous trouvez un compte de stockage auquel vous pouvez vous connecter, vous pouvez utiliser lâoutil Microsoft Azure Storage Explorer pour ce faire.
Il est possible dâutiliser des principals Entra ID avec des RBAC roles pour accĂ©der aux comptes de stockage ; câest la mĂ©thode recommandĂ©e.
Les comptes de stockage disposent de clĂ©s dâaccĂšs qui peuvent ĂȘtre utilisĂ©es pour y accĂ©der. Cela fournit un accĂšs complet au compte de stockage.
Il est possible de gĂ©nĂ©rer des Shared Keys 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 du service de stockage (URI). Et si une partie de lâURL est encodĂ©e, elle doit Ă©galement ĂȘtre encodĂ©e Ă lâintĂ©rieur de la CanonicalizedResource.
Note
Ceci est utilisĂ© par dĂ©faut par az cli pour authentifier les requĂȘtes. Pour quâil utilise les identifiants du principal Entra ID, prĂ©cisez le paramĂštre --auth-mode login.
Il est possible de générer une shared key for blob, queue and file services en signant les informations suivantes :
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 Table en signant les informations suivantes :
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
Il est possible de générer une lite shared key for blob, queue and file services en signant les informations suivantes :
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 :
StringToSign = Date + "\n"
CanonicalizedResource
Ensuite, pour utiliser la clĂ©, cela peut se faire dans lâen-tĂȘte Authorization en suivant la syntaxe :
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
Les Shared Access Signatures (SAS) sont des URL sĂ©curisĂ©es et limitĂ©es dans le temps qui accordent des autorisations spĂ©cifiques dâaccĂšs aux ressources dans un compte Azure Storage 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, les SAS permettent un contrĂŽle granulaire en spĂ©cifiant des permissions (comme lecture ou Ă©criture) et en dĂ©finissant une date dâexpiration.
User delegation SAS : Ceci est créé Ă partir dâun principal Entra ID qui signera le SAS et dĂ©lĂšguera les permissions de lâutilisateur au SAS. Il ne peut ĂȘtre utilisĂ© quâavec blob and data lake storage (docs ). Il est possible de rĂ©voquer tous les SAS dĂ©lĂ©guĂ©s gĂ©nĂ©rĂ©s.
MĂȘme sâil est possible de gĂ©nĂ©rer un User delegation SAS avec des permissions « plus » que celles de lâutilisateur. Cependant, si le principal ne les possĂšde pas, cela ne fonctionnera pas (pas de privesc).
Service SAS : Celui-ci 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.
Account SAS : Il est aussi 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 via user delegation 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 paramĂštres http :
Le paramĂštre se indique la date dâexpiration du SAS
Le paramĂštre sp indique les permissions du SAS
Le sig est la signature validant le SAS
Lors de la gĂ©nĂ©ration dâun SAS, il est nĂ©cessaire dâindiquer les permissions quâil doit accorder. Selon lâobjet sur lequel le SAS est gĂ©nĂ©rĂ©, diffĂ©rentes permissions peuvent ĂȘtre incluses. Par exemple :
(a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete
Azure Blob Storage supporte désormais le SSH File Transfer Protocol (SFTP), permettant le transfert et la gestion sécurisés de fichiers directement vers Blob Storage sans nécessiter de solutions personnalisées ou de produits tiers.
Protocol Support : SFTP fonctionne avec les comptes Blob Storage configurés avec hierarchical namespace (HNS). Cela organise les blobs en répertoires et sous-répertoires pour une navigation facilitée.
Security : SFTP utilise des identitĂ©s dâutilisateurs locaux pour lâauthentification et ne sâintĂšgre pas Ă RBAC ou ABAC. Chaque utilisateur local peut sâauthentifier via :
Azure-generated passwords
Public-private SSH key pairs
Granular Permissions : Des permissions telles que Read, Write, Delete et List peuvent ĂȘtre assignĂ©es aux utilisateurs locaux pour jusquâĂ 100 containers.
Networking Considerations : Les connexions SFTP sâeffectuent via le port 22. Azure prend en charge des configurations rĂ©seau comme les firewalls, private endpoints ou virtual networks pour sĂ©curiser le trafic SFTP.
Hierarchical Namespace : HNS doit ĂȘtre activĂ© lors de la crĂ©ation du compte de stockage.
Supported Encryption : Nécessite des algorithmes cryptographiques approuvés par Microsoft Security Development Lifecycle (SDL) (ex. rsa-sha2-256, ecdsa-sha2-nistp256).
SFTP Configuration :
Enable SFTP on the storage account.
Create local user identities with appropriate permissions.
Configure home directories for users to define their starting location within the container.
Permission Symbole Description
Read rLire le contenu du fichier.
Write wTélécharger des fichiers et créer des répertoires.
List lLister le contenu des répertoires.
Delete dSupprimer des fichiers ou des répertoires.
Create cCréer des fichiers ou des répertoires.
Modify Ownership oChanger lâutilisateur ou le groupe propriĂ©taire.
Modify Permissions pModifier les ACL des fichiers ou des répertoires.
az cli
az cli enumeration
```bash
# Get storage accounts
az storage account list #Get the account name from here
az storage container list âaccount-name
az storage container show-permission âaccount-name -n
az storage container set-permission âpublic-access container âaccount-name -n
az storage blob list âcontainer-name âaccount-name
az storage blob download âaccount-name âcontainer-name âname âfile </path/to/local/file>
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
az storage queue list âaccount-name
az storage message peek âaccount-name âqueue-name
az storage account keys list âaccount-name
az storage account show -n âquery â{KeyPolicy:keyPolicy}â
az storage blob list âcontainer-name âaccount-name âaccount-key âZrF40pkVKvWPUr[âŠ]v7LZw==â
az storage blob download âaccount-name âaccount-key âZrF40pkVKvWPUr[âŠ]v7LZw==â âcontainer-name âname âfile </path/to/local/file>
az storage blob upload âaccount-name âaccount-key âZrF40pkVKvWPUr[âŠ]v7LZw==â âcontainer-name âfile </path/to/local/file>
az storage <container|queue|share|table> policy list âaccount-name âcontainer-name
az storage <container|queue|share|table|blob> generate-sas âpermissions acdefilmrtwxy âexpiry 2024-12-31T23:59:00Z âaccount-name -n
az storage <container|queue|share|table|blob> generate-sas âpermissions acdefilmrtwxy âexpiry 2024-12-31T23:59:00Z âaccount-name âas-user âauth-mode login -n
az storage account generate-sas âexpiry 2024-12-31T23:59:00Z âaccount-name âservices qt âresource-types sco âpermissions acdfilrtuwxy
az storage blob show âaccount-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
az storage account local-user list âaccount-name âresource-group
az storage account local-user show âaccount-name âresource-group âname
az storage account local-user list âaccount-name âresource-group
</details>
{{#endtab }}
{{#tab name="Az PowerShell" }}
<details>
<summary>ĂnumĂ©ration Az PowerShell</summary>
```powershell
# 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")
Az - File Shares
Az - Storage Privesc
Az - Blob Storage Post Exploitation
Az - Storage Persistence
Tip
Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks