New Chat
Ctrl
K
Kimi Code 3x Boost
Chat History
Mobile App

Blob Storage Pentest

https://ecenprweubmbccstorage.blob.core.windows.net/?comp=a
I'll open that URL for you and extract its contents.
Fetch URLs
1 pages
It looks like the URL you provided is currently inaccessible — the request failed, possibly due to authentication restrictions or the resource not being publicly available.
The URL appears to be an Azure Blob Storage endpoint with a query parameter ?comp=a, which typically relates to Azure Storage API operations (like listing containers or blobs). However, without proper credentials or permissions, the server won't allow access.
If you have more context or a different link you'd like me to try, feel free to share it.
how to pentest such endpoint or blob storage
Search
Azure Blob Storage Endpoint Vulnerability Assessment
20 results
Here is a concise, step-by-step cheat-sheet you can use during an Azure Blob Storage penetration test.
Every technique is “safe-to-try” from the Internet (i.e. no authentication required) and focuses on publicly exposed endpoints such as the one you posted.

1. Recon – discover the storage account

  • DNS permutation / brute-force
    goblob, QuickAZ, MicroBurst, CloudEnum all ship with word-lists that mutate the company name, project, env, etc. to find live *.blob.core.windows.net hosts.
    Example:
    plain
    Copy
    goblob -t <target> -w containers.txt
  • Search engines
    Google dork:
    plain
    Copy
    site:*.blob.core.windows.net <keyword>
    Shodan / Censys also index open containers.

2. Fingerprint anonymous access

Append the classic “list” query to any container you guess or discover:
plain
Copy
https://<acct>.blob.core.windows.net/<container>?restype=container&comp=list
  • HTTP 200 + XML blob list → full public read (bingo).
  • “ResourceNotFound” → container does not exist, but anonymous API calls are still accepted (keep guessing).
  • “PublicAccessNotPermitted” → container exists but anonymous read is disabled (stop here for that container).

3. Enumerate containers / blobs

  • Wfuzz / ffuf with a small dictionary (top 500 container names)
    plain
    Copy
    ffuf -u https://ACCT.blob.core.windows.net/FUZZ?restype=container&comp=list -w containers.txt -mc 200,404
    200 = public container; 404 = name does not exist; 403 = private.
  • $logs is created by default on many accounts, so always worth a shot:
    plain
    Copy
    https://ACCT.blob.core.windows.net/$logs?restype=container&comp=list

4. Hunt for secrets in public blobs

Once you hit an open container:
  • curl every blob and grep -iE '(password|token|key|secret|connectionstring|aws_|azure_)'
  • Look for source-code bundles, JSON configs, CI artefacts, disk snapshots (.vhd), database backups, etc.

5. Shared Access Signature (SAS) leakage

  • Even if the container is private, a single leaked SAS-URL gives you read/write/delete.
    Places to look: GitHub, JS files, mobile apps, Burp history, Wayback, Pastebin.
    Regex that catches most SAS tokens:
    plain
    Copy
    [\?&]sig=[^&]{40,}

6. Quick checklist of other low-hanging issues

Table
Copy
TestHow
CORS mis-configurationcurl -H "Origin: https://evil.com" … look for Access-Control-Allow-Origin: *
Insecure TLSsslscan, testssl.sh – still see TLS 1.0/1.1 on older storage accounts
Soft-delete offUpload then DELETE a test blob; if you can still list it in the portal → soft-delete = on. No listing → off.
No versioning / immutable policiesUpload same name twice; if the ETag changes but you can’t fetch older versions → versioning is off.

7. Tools that automate most of the above

  • MicroBurst (PowerShell) – Invoke-EnumerateAzureBlobs
  • Goblob (Go) – purpose-built Azure blob scanner
  • AzUC (Azure URL Collector) – passive recon from certificate transparency
  • ScoutSuite / Prowler / CloudSploit – CIS-style configuration audits once you have credentials.

8. Staying out of trouble

  • Only read anonymous blobs – never delete/upload unless you have written permission from the owner.
  • Microsoft’s “Penetration Testing Rule of Engagement” (2025) explicitly allows public-endpoint reconnaissance and SAS abuse as long as you do not intentionally degrade the service or exfiltrate customer data.
  • If you find PII or credentials, follow responsible disclosure.

That’s the entire playbook for a black-box assessment of an Azure Blob Storage endpoint like the one you supplied. Happy hunting!

References:
what is the purpose of the comp param?
Search
Azure Blob Storage comp query parameter
20 results
In Azure Blob Storage the ?comp= query parameter is required whenever you want the service to perform a control-plane or meta operation instead of simply reading or writing a blob.
Think of it as the “command verb” that tells the REST API what sub-action to execute on the resource you address in the path.

1. Where it appears

  • It is always used together with another parameter, restype.
    Together they form a two-word instruction:
    restype=<scope>&comp=<action>
  • The pair can sit at account root, container level, or even blob level, depending on the operation.

2. Common values and what they do

Table
Copy
comp valueTypical URIPurpose
properties/?restype=service&comp=propertiesGet / Set storage-account properties (CORS, logging, metrics)
list/my-container?restype=container&comp=listList blobs inside the container
metadata/my-container?restype=container&comp=metadataRead / write container metadata
acl/my-container?restype=container&comp=aclRead / set container public-access ACL
block/my-blob?comp=blockStage one block for a future Put Block List
blocklist/my-blob?comp=blocklistCommit previously staged blocks to form the blob
page/my-blob?comp=pageWrite a range of pages in a Page Blob
snapshot/my-blob?comp=snapshotCreate a snapshot of the blob
copy/my-blob?comp=copyStart a server-side copy
tier/my-blob?comp=tierSet blob access-tier (Hot→Cool→Archive)
query/my-blob?comp=queryRun a server-side SQL query over the blob contents

3. Quick rules of thumb

  • If you only want to download a blob you do NOT use comp at all.
    GET /container/file.txt is enough.
  • If you want to do anything else (list, configure, copy, snapshot, etc.) you must supply the correct comp value plus the matching restype (or, for blob-level operations, just comp).
  • Omitting it—or using an invalid value—returns the error InvalidQueryParameterValue and the XML block will literally tell you which comp value was wrong .

So, in short:
comp = the operation qualifier that turns a plain resource URL into a specific Azure Storage REST API call.
curl "https://amaprdmdcpstorage.table.core.windows.net/?restype=service&comp=properties " <?xml version="1.0" encoding="utf-8" standalone="yes"?> <error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata "> <code>InvalidHeaderValue</code> <message xml:lang="en-US">The value for one of the HTTP headers is not in the correct format. RequestId:7136eb1c-0002-002c-22ee-62c56a000000 Time:2025-12-01T18:12:30.3952499Z</message> </error>%
The endpoint you hit is a Table service endpoint (table.core.windows.net), but you used the Blob service header format.
Table Storage requires a different API version string and does not support comp=properties at all.
That is why Azure returns InvalidHeaderValue.

1. What the service expects

  • Table service only accepts these comp values:
    stats, metadata, or none (for normal query/insert/update).
  • Minimum headers for any Table REST call:
    plain
    Copy
    Date or x-ms-date
    x-ms-version: 2015-12-11 or later (anything ≥ 2011-08-18 works)
    Authorization (SharedKey or SAS) – or none for public tables
    Accept: application/json;odata=minimalmetadata  (optional but recommended)

2. Quick tests you can do instead

A. Check if the account exposes Table Service Stats (public read when enabled):

bash
Copy
curl "https://amaprdmdcpstorage.table.core.windows.net/?restype=service&comp=stats" \
     -H "x-ms-version: 2020-10-02"
  • 200 + XML → metrics/stats are public.
  • 403 → disabled or needs key.

B. List tables (requires authorization or SAS):

bash
Copy
curl "https://amaprdmdcpstorage.table.core.windows.net/Tables" \
     -H "x-ms-version: 2020-10-02" \
     -H "Accept: application/json;odata=minimalmetadata"
(Without auth you’ll get 403 or 401.)

3. TL;DR

  • comp=properties is invalid for Table service – use comp=stats or nothing.
  • Always include a valid x-ms-version header; without it Azure rejects the request with the same generic InvalidHeaderValue.
curl "https://amaprdmdcpstorage.table.core.windows.net/?restype=service&comp=stats " -H "x-ms-version: 2020-10-02" -i HTTP/1.1 400 Value for one of the query parameters specified in the request URI is invalid. Content-Length: 372 Content-Type: application/xml Server: Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: 00516d8d-e002-0069-37ee-6218fb000000 x-ms-version: 2020-10-02 x-ms-error-code: InvalidQueryParameterValue Date: Mon, 01 Dec 2025 18:15:24 GMT <?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata "><m:code>InvalidQueryParameterValue</m:code><m:message xml:lang="en-US">Value for one of the query parameters specified in the request URI is invalid. RequestId:00516d8d-e002-0069-37ee-6218fb000000 Time:2025-12-01T18:15:24.3560952Z</m:message></m:error>%
The Table service is rejecting the combination of restype=service&comp=stats.
That pair is only valid for Blob, File, and Queue services; Table uses a different URI shape for every control-plane call.

1. Table service – supported URIs

Table
Copy
OperationCorrect URIAuth required
Get Service Stats/?comp=stats (no restype)SharedKey or SAS
Get Service Properties/?comp=properties (no restype)SharedKey or SAS
Query Tables/TablesSharedKey or SAS
Get Table ACL/<TableName>?comp=aclSharedKey or SAS

2. Try this instead

bash
Copy
curl -i "https://amaprdmdcpstorage.table.core.windows.net/?comp=stats" \
     -H "x-ms-version: 2020-10-02"
  • 200 XML → stats are public or you have a SAS that covers the service.
  • 403 → stats exist but are private (normal).
  • 400 with same error → the storage account does not expose Table service stats at all.

3. Quick one-liner to list tables (if you have a SAS)

bash
Copy
curl -i "https://amaprdmdcpstorage.table.core.windows.net/Tables<SAS>" \
     -H "Accept:application/json;odata=minimalmetadata"

TL;DR

Drop restype=service—Table service never uses it.
Use /?comp=stats or /?comp=properties without restype.
curl -i "https://amaprdmdcpstorage.table.core.windows.net/?comp=stats " \ ∙ -H "x-ms-version: 2020-10-02" HTTP/1.1 400 Value for one of the query parameters specified in the request URI is invalid. Content-Length: 372 Content-Type: application/xml Server: Microsoft-HTTPAPI/2.0 x-ms-request-id: 91b84d53-a002-002a-2dee-623212000000 x-ms-error-code: InvalidQueryParameterValue Date: Mon, 01 Dec 2025 18:15:40 GMT <?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata "><m:code>InvalidQueryParameterValue</m:code><m:message xml:lang="en-US">Value for one of the query parameters specified in the request URI is invalid. RequestId:91b84d53-a002-002a-2dee-623212000000 Time:2025-12-01T18:15:41.6260087Z</m:message></m:error>%
The storage account is answering on the Table endpoint, but every control-plane parameter we try (comp=stats, comp=properties, restype=service) is rejected with InvalidQueryParameterValue.
That only happens when the storage account is configured to disable the entire “Service” API (common in hardened or private-only setups).
In other words: no anonymous or even authenticated calls to /?comp=stats or /?comp=properties are allowed on this account—Microsoft returns 400 instead of 403 so the URI is rejected before authentication is even checked.

1. What you can still test anonymously

Table
Copy
GoalSafe URIExpected result
Probe if Table service DNS existsHEAD /400/403/404 is fine—any answer proves the host is live.
Look for leaked SAS URLsSearch GitHub, JS, mobile APK, Wayback for strings like
table.core.windows.net + sig=
200 on /TableName?<SAS> → full access.
Guess public table namesGET /TableName200 JSON → public table; 404 → name does not exist; 403 → exists but private.
Check CORS mis-configurationGET /TableName
Origin: https://evil.com
Access-Control-Allow-Origin: * in response → over-permissive.

2. Quick one-liner to test a guessed table

bash
Copy
curl -H "Accept: application/json;odata=nometadata" \
     -H "x-ms-version: 2020-10-02" \
     "https://amaprdmdcpstorage.table.core.windows.net/SomeTableName?$top=1"

3. TL;DR

  • Account has service-level APIs disabled → /?comp=stats and /?comp=properties will never work, even with a key.
  • Pivot to table-level recon (guess table names, hunt for SAS tokens) – that is the only surface left from the Internet.
what is $log container?
Search
log container azure storage
18 results
$logs is a system-managed blob container that Azure automatically creates the moment you turn on Storage Analytics logging (the “classic” diagnostic option) for a storage account.
It is not a normal container:
  • You cannot delete it,
  • It doesn’t show up in a regular List Containers call,
  • It only appears when you navigate to it explicitly (e.g. Storage Explorer, direct REST call, AzCopy, etc.).
All read/write/delete/API logs for Blob, Table and Queue services are streamed into block blobs inside this container, organized by service/year/month/day/hour.
The contents are plain-text, delimited files you can download and analyze offline or with your favourite log-parser.
Typical URI shape:
plain
Copy
https://<account>.blob.core.windows.net/$logs/blob/2025/12/01/1800/000001.log
Because the container is hidden by default, pentesters often test it anonymously first—if the account owner never locked it down, you can list and download years of request logs (IPs, URIs, headers, error codes, SAS tokens, etc.) without any authentication.
In short: $logs is Azure’s black-box flight-recorder—if you can reach it, you own the account’s request history .