Exploiting Cloud Misconfigurations, Part 2: How Attackers Discover Cloud Resources

The first thing an attacker needs is a target, so an attack naturally begins with resource discovery. During discovery, the attacker builds and expands a database of resource identifiers. These resources are then checked periodically for exploitable conditions. A resource may be discovered long before an opportunity to exploit it arises.

October 19, 2026
5 Minute Read

Cloud resource discovery is the first step in a cloud attack path: before an attacker can exploit a misconfiguration, they need to know that a resource exists and what it is called. For services such as Azure Storage and Amazon S3, discovery requires no credentials and no access to the victim's environment, only the ability to test candidate names against public DNS or HTTP endpoints.

The first thing an attacker needs is a target, so an attack naturally begins with resource discovery. During discovery, the attacker builds and expands a database of resource identifiers. These resources are then checked periodically for exploitable conditions. A resource may be discovered long before an opportunity to exploit it arises.

The usual approach to resource discovery involves two steps:

  1. Finding large pools of resource names that contain a high proportion of names in use.
  2. Checking each candidate name to determine whether the corresponding resource exists and, if it does, adding its identifier to the database.

In this section, we’ll focus on how attackers discover cloud resources such as Azure Storage Accounts and Amazon S3 buckets. This is Part 2 of our Exploiting Cloud Misconfigurations 101 series; Part 1 covers the basics.

How Does Network Access to PaaS Resources Work in Azure and AWS?

In Azure and AWS, the Shared Responsibility Model divides management duties between you and the CSP. The division of responsibilities varies across three common cloud service models:

IaaS - Infrastructure as a service

When using the IaaS model, the CSP manages the physical infrastructure and virtualization, while you retain control over the operating systems, networking, and application code (e.g. Virtual Machines).

PaaS - Platform as a service

Under the PaaS model, the CSP also manages the operating system, while you remain responsible for your applications, data, identities, and the access controls available to you.

SaaS - Software as a Service

Under the SaaS model, the CSP manages the application and its underlying infrastructure, while you remain responsible for your data, user access, and some security settings.

Networking controls of the different models differ.

In IaaS, network security relies on firewall rules, public and private IP addressing, and your control over networking components such as route tables and load balancers, much like in an on-premises environment. For example, you can create a Virtual Machine, connect it to a Virtual Network, and assign it a public IP address. Whether it can be reached over the internet depends on the routing and firewall rules you configure.

In most PaaS resources, network security works a bit differently. The cloud service provider (CSP) controls the resource’s underlying network. You can configure which networks can access your resource. The services Public endpoints share IP addresses across vast number of resources, from different tenants, so an IP address alone does not identify the target resource.

When traffic reaches the public service endpoint, the service identifies the target resource using the HTTP request’s Host header, which includes the resource identifier, and applies that resource’s network access restrictions. For example, a request sent to the public endpoint of a “private” Storage Account is rejected at the application level, with an HTTP 403 response, rather than blocked at the network level.

This breakdown reflects common networking patterns associated with the Shared Responsibility Model (SRM), but service classifications do not always align with these patterns. For clarity, we use IaaS-like and PaaS-like to describe the network access models discussed here: not every PaaS resource is identified through an HTTP Host header, and not every IaaS resource has its own IP address.

For example, Amazon S3 is variously described as IaaS or PaaS, yet its networking and access-control model resembles that of the PaaS services described above. Throughout this section, we group services by how they implement network access rather than by their formal service classification.

How Do Attackers Check Whether a Cloud Resource Exists?

In PaaS-like resources the resource names are globally unique. Resource creation will fail with descriptive error if the name is already in use. This leads to a clear and fundamental conclusion: there must be a way to check whether a resource name is taken!

The simplest way is to iterate over candidate names, for each create a new instance with the given name, and based on the response you can determine if taken or not.

This is quite slow and impractical at scale, so used a better way to run this check.

Azure Storage Accounts: checking existence with a DNS query

In Azure, a simple, lightweight approach is just to send a DNS query. Successful resolution generally indicates that the resource exists, and failure that it doesn’t, making it a useful heuristic for resource discovery.

Standard Blob Storage endpoints in Azure follow this FQDN pattern:

The public hostname remains resolvable even when public network access is disabled. The following simple Python script checks if a Storage Account exists for a given name.

AWS S3 buckets: checking existence with an HTTP HEAD request

AWS makes this a bit more difficult. For each candidate S3 bucket name you query you get a response pointing you to a regional S3 endpoint, whether the name is used or not, so checking names based on DNS responses will be pointless. To check whether a bucket name is in use, send a HEAD request to its endpoint. Receiving a 404 response means the resource doesn’t exist, while any other 4XX or 2XX response, heuristically means it does exist.

For this check, we use the following S3 endpoint format:

The following simple Python script checks if an S3 bucket exists for a given name.

‍Note on newer buckets: since March 12th, 2026, AWS lets customers create general purpose buckets in an account regional namespace, with names that end in -<account-id>-<region>-an.  Existing buckets stay in the global namespace and cannot be renamed, so the checks above still apply to them and to any new bucket created in the global namespace. For a bucket in the new namespace, an attacker needs the account ID as well as the prefix. The 3- and 4-character names tested below can only exist in the global namespace.

Sources of Resource Names

Resource names can come from leaks, enumeration, and other scanning methods.

Data leaks

Data leaks are often referenced as the source of leaked credentials, like in the example reviewed earlier: the Volkswagen and Cariad. But leaked data can range from keys and passwords to resource names or even entire Terraform state files that expose large portions of an organization’s infrastructure, including resource names. This information can be valuable when building name pools, either directly by revealing resource names or indirectly by uncovering the organization’s naming patterns.

Web indexing

Names can also come from publicly indexed content in search engines. Crawlers index publicly accessible pages and follow links, potentially revealing Storage Account or S3 bucket names along the way.

For example, you can search Google directly using the following queries:

  • site:blob.core.windows.net for Azure Storage Accounts
  • site:s3.amazonaws.com for AWS S3 buckets

These results can help build a large name pool.

Enumerating Name Pools

One way to build large, untargeted name pools is to generate candidate resource names systematically. The process is similar to building dictionaries for a password dictionary attack.

Start with understanding the constraints. A password has to satisfy a policy: minimum length, required character types and forbidden characters. A resource name has to satisfy the provider's naming rules. An Azure Storage Account name, for example, can only contain lowercase letters and digits, and must be 3 to 24 characters long. In both cases, the rules shrink the search space for us before we generate a single candidate.

So how do we build the name pool? The same three ways we'd build a password list.

‍Brute force

‍Enumerate and test every possible combination for a specific name length.

Dictionary

‍Generate likely names from common keywords and published naming conventions, combining and modifying them much like password-cracking tools mutate entries in a wordlist. This is how hashcat for example mutates known passwords from the rockyou.txt wordlist.

Targeted

‍Building custom candidate lists around a specific company's brand names, environments, regions, or known internal naming patterns, much like CeWL builds password dictionaries by scraping a target's website.

We can apply every one of these approaches for cloud resources and build a cloud resource name enumerator. It generates candidate names - whether by brute force, convention-driven dictionaries, or targeted lists and checks to see if a live resource sits behind each one.

How Effective Is Brute-Force Enumeration?

In the next part we are going to deep dive into different types of name pools, categorize them by quality and explain which conditions must be met for different type of attacks.

As a teaser, we compared Azure Storage Accounts and AWS S3 buckets using the simplest brute-force pools: names containing three and four characters, with an additional five-character pool tested for Azure. We used only lowercase letters and digits, the characters allowed in both Azure Storage and AWS s3 buckets, for a consistent comparison. This gives 36ⁿ possible names for each name length n.

For Storage Accounts with 3, 4 and 5 characters. Lets see the results:

In our experiment, exhaustive enumeration became substantially less efficient at five characters: testing roughly 60 million candidates took around 30 hours and produced a hit rate of just 0.072%. This suggests that finding smaller pools with higher hit rates may be a better use of scanning time.

Enumerating AWS S3 Buckets with brute force iteration shows a similar decline in hit rate as name length increases. We checked Buckets with 3 and 4 characters (we skipped the 5 chars this time).

Every discovered resource is a potentially valuable candidate worth saving for further assessment. But a name pool’s value for initial discovery does not necessarily determine whether it is worth checking repeatedly. Which pools justify ongoing monitoring? We will explore that question in the next part.

About
Tom Tsabar

Head of Research at Aryon, specializing in cloud security, preventive cloud security research & solution engineering,  and the development of advanced defensive solutions. Before joining Aryon, he held research and leadership roles within IDF’s MATZOV unit. He contributed to major national defense initiatives.

Read more articles by author →
About
Tair Lahayani

Tair Lahayani is a Security Researcher at Aryon Security with a background in cloud and on-premises security, risk assessment, and security engineering.

Read more articles by author →

Frequently Asked Questions

How do attackers find S3 buckets and Azure Storage Accounts?
Attackers build a pool of candidate resource names and test each one for existence. The names come from three main sources: leaked data (credentials, configuration files, even entire Terraform state files that reveal resource names or naming patterns), publicly indexed web content (for example Google queries such as site:s3.amazonaws.com and site:blob.core.windows.net), and systematic enumeration using brute-force, dictionary-based or targeted name lists. Every resource that turns out to exist is saved to a database and checked periodically for exploitable conditions.
How can an attacker check whether an S3 bucket or Azure Storage Account exists without credentials?
Because these resource names are globally unique, existence can be tested anonymously. For an Azure Storage Account, resolve <name>.blob.core.windows.net: a successful DNS resolution generally means the account exists, while NXDOMAIN means it probably does not. For S3, DNS cannot be used because every bucket name resolves to a regional S3 endpoint, so the attacker sends an HTTP HEAD request to <name>.s3.amazonaws.com: a 404 means the bucket does not exist, and any other 2XX or 4XX response heuristically means it does. This applies to buckets in S3's global namespace; buckets created since March 2026 in an account regional namespace carry the account ID and Region in their name, so a guessed prefix alone is not enough.
Does disabling public network access hide an Azure Storage Account from attackers?
No. Disabling public network access restricts who can reach the account; it does not remove the account from public DNS. The public hostname keeps resolving, and a request to the public endpoint of a “private” Storage Account is rejected at the application level with an HTTP 403 instead of being blocked at the network level. Private means privately accessible, not invisible (see Part 1). Because discovery cannot be prevented, the dependable control is making sure the exploitable condition (public or anonymous access, permissive network and identity rules) never exists in the first place.
How is network access to PaaS resources different from IaaS?
In IaaS, such as a virtual machine, you control the network: firewall rules, public and private IP addressing, route tables and load balancers, so reachability depends on the routing and firewall configuration you set. In most PaaS resources the cloud provider controls the underlying network, and the public endpoint's IP addresses are shared by many resources from different tenants, so an IP address alone does not identify the target. The service reads the resource identifier from the HTTP Host header and applies that resource's network restrictions at the application level. Some services do not fit these patterns neatly (Amazon S3, for example, is described as both IaaS and PaaS but behaves like a PaaS-like service), so it is more useful to group services by how they implement network access than by formal classification.
How effective is brute-force enumeration of cloud resource names?
It is effective for short names and inefficient beyond that. In Aryon's tests, which used only lowercase letters and digits (36ⁿ possible names), enumerating every 3-character name found 7,618 Azure Storage Accounts (a 16.33% hit rate) in about four minutes and 23,912 S3 buckets (51.25%) in about six. At four characters the hit rate fell to 1.70% for Azure and 1.24% for S3, and at five characters Azure's fell to 0.072% after roughly 30 hours of scanning. That suggests smaller, higher-yield name pools are a better use of scanning time than exhaustive enumeration.

Notes & Sources

Continue reading

October 12, 2026
Ron Arbel
Ariel Litmanovich

Ten Years Is a Long Time to Be Wrong

For nearly a decade, a cloud misconfiguration at Toyota left sensitive vehicle data belonging to approximately 2.15 million customers accessible from the internet. What began as a single configuration mistake in 2013 went undetected until 2023, exposing a fundamental weakness in traditional cloud security: detecting misconfigurations only works when someone is looking. And when Toyota finally investigated, it uncovered additional exposures. The incident raises a critical question for every organization operating in the cloud: Why wait to discover a security risk when you could prevent it from existing in the first place?

October 5, 2026
Ariel Litmanovich
Tom Tsabar
Vlad Babiuk

The Key That Should Not Have Worked

A leaked cloud credential is usually treated as a detection problem. Find it, revoke it, rotate it, and move on. But the Volkswagen and Cariad data exposure raises a more important question: why was there a long-lived credential worth stealing in the first place? When a single reusable key can unlock sensitive cloud data, the leak is only part of the problem - the configuration that allowed that key to exist is the other.

September 28, 2026
Yair Ladizhensky
Vlad Babiuk

The Role That Should Never Have Existed

On 29 July 2019, Capital One disclosed that an attacker had taken data relating to roughly 106 million people across the United States and Canada. The attacker was Paige Thompson, a former Amazon Web Services engineer, who was arrested the same day and convicted on computer fraud charges in June 2022. The company's settlements reached around $190 million.

September 21, 2026
Tom Tsabar

Exploiting Cloud Misconfigurations: How Attackers Find Cloud Attack Paths (Part 1 - The Basics)

Cloud attacks don’t always begin with a vulnerability. Often, they begin with a misconfiguration that gives an attacker a path in. In Part 1 of this series, we look at cloud environments from the attacker’s perspective and break down the three conditions behind many exploitable cloud attack paths: Resource DIscovery, Network Accessibility, and Identity-Based Access.

September 14, 2026
Ariel Litmanovich
Vlad Babiuk

Five Reasons Your Cloud Security Solution Is Failing You

Your cloud security tools may be working exactly as designed. That’s the problem.

Security teams are still finding and fixing the same misconfigurations over and over. The issue isn’t the tools-it’s a reactive model that detects risk after it already exists. Here are five signs that model has reached its limit.

‍

September 7, 2026
Tom Tsabar
Ariel Litmanovich

50 Ways to Break Production - Why Cloud Security Remediation Is Harder Than It Looks

Cloud remediation is rarely as simple as changing a setting. Fixes can break production, require architectural changes or migrations, and conflict with IaC ownership. Prevention takes a different path: enforce the right configuration before deployment, while the resource is still cheap and safe to change. This article explores the challenges of remediating issues safely and effectively, and highlights what teams need to consider when remediation is unavoidable.

Ready to take your first proactive step?