AWS Penetration Testing

AWS Penetration Testing

Most AWS breaches are not exotic. They are an over-permissive IAM role, a public bucket, a metadata endpoint reachable from a compromised workload, or an application flaw in something running on EC2. Penetrify tests the half of the shared responsibility model that is actually yours.

In short

AWS penetration testing assesses the customer side of the shared responsibility model: IAM policies and escalation paths, exposed services, storage permissions, network reachability, and the applications you run. AWS permits customer-initiated testing of your own resources for common service types without prior approval; simulated denial of service and a short list of other activities still require authorisation.

Permission needed from AWS
Not for standard testing of your own resources; DoS-style testing needs authorisation
What is yours to test
IAM, S3, security groups, exposed services, workloads and applications
What is not
AWS-managed infrastructure, hypervisor, other tenants, physical facilities
Time to first findings
Minutes
Entry price
From $100/month
Read-only access option
Yes: a scoped role for configuration review, or test purely from outside

What gets tested

Test scope, by attack surface

Identity and access management

  • Privilege escalation paths: iam:PassRole, policy-version manipulation, role chaining
  • Over-permissive policies, wildcard actions and resources, unused administrative access
  • Cross-account trust relationships that widen the blast radius further than intended
  • Long-lived access keys where a role or OIDC federation would do
  • Federated and SSO configuration, including permission set drift

Storage and data exposure

  • S3 buckets public by policy, ACL or a permissive CloudFront distribution in front
  • Presigned URL generation with excessive lifetimes or scope
  • Unencrypted volumes and snapshots, and snapshots shared more widely than intended
  • RDS instances reachable from the internet or from workloads that should not see them
  • Secrets in environment variables, user data, task definitions or Lambda configuration

Network and exposure

  • Security groups permitting 0.0.0.0/0 on management or database ports
  • Instance metadata service reachable from a compromised workload (IMDSv1 vs IMDSv2)
  • Load balancer and API Gateway configuration exposing internal services
  • VPC peering and transit routes that connect environments that should stay separate
  • Egress unrestricted, enabling exfiltration from a compromised instance

Serverless and containers

  • Lambda execution roles broader than the function needs
  • Function URLs and API Gateway routes without authorisation
  • Event-source injection: SQS, SNS, S3 events treated as trusted input
  • ECS and EKS task roles, and whether one task can assume another's identity
  • Secrets pulled at runtime and then logged

The applications you run

  • Authorisation across roles and tenants in whatever runs on the infrastructure
  • Injection, SSRF (which in AWS reaches the metadata endpoint), and deserialisation
  • Business logic in payment, entitlement and workflow paths
  • Multi-step chains: an application flaw, then a role, then data

Not in scope

Simulated denial of service, volumetric testing and resource exhaustion (AWS requires authorisation and we do not do it)AWS-managed infrastructure: hypervisor, physical facilities, service control planesOther AWS tenants, or any account you are not authorised to testSocial engineering of AWS staff or your staffAnything on the AWS prohibited list, which is worth reading before any engagement

Methodology

How the test runs, step by step

01

Confirm scope and authorisation

Identify the accounts, regions and services in scope, and confirm you own them. AWS permits customer-initiated testing of your own resources for common service types without prior approval, so most engagements need no ticket — but DoS-style activity does, and we exclude it entirely.

Scope, account list, authorisation record
02

Enumerate the surface

From outside: exposed services, DNS, storage, endpoints. From a read-only role if you grant one: accounts, identities, policies, network configuration. Both views matter, because what is reachable and what is permitted are different questions.

Asset, identity and exposure inventory
03

Test identity and configuration

Attempt real escalation rather than listing policy warnings: can this role reach that role, can this function read that secret, does any path end at administrative access. Configuration findings are reported with the specific policy statement responsible.

IAM and configuration findings
04

Chain to impact

Combine what works into the path an attacker would take: an application flaw to SSRF, SSRF to the metadata endpoint, credentials to a role, role to data. A chain reported end to end changes how a finding gets prioritised.

Attack chains with data impact
05

Report and retest

Findings with severity, evidence, the exact policy or setting to change, and remediation guidance. Retest after each fix at no extra cost, so tightening a trust policy is verified rather than assumed.

Report, evidence, retest on demand

Straight answers

What buyers actually ask

Do we need permission from AWS to run a penetration test?

For standard testing of your own resources across the common service types, AWS permits customer-initiated penetration testing without prior approval, and has done for years. What still requires authorisation is a short list — simulated denial of service and similar disruptive activity — and there is a prohibited list worth reading before any engagement.

Practically: we do not perform DoS-style testing at all, so most Penetrify engagements need no ticket. What you do need is to be certain the accounts in scope are yours, which matters more in AWS than people expect once cross-account roles and shared services are involved.

What actually causes AWS breaches?

Rarely anything exotic. The recurring pattern is an application flaw that reaches the instance metadata service, credentials lifted from there, a role with more permissions than anyone remembers granting, and then data. Alongside that: storage made public by a policy nobody reviewed, and long-lived access keys in places they should not be.

Which is why testing IAM in isolation misses the point. The escalation only matters because something reachable let the attacker in, and the application flaw only matters because the role behind it was broad. Testing the chain is the difference between a list of warnings and knowing your blast radius.

Can you test without giving you access to our account?

Yes. External testing needs nothing: exposed services, applications and storage are assessed the way an attacker would, and that alone finds the classes that most often leak data.

Granting a read-only role adds the internal view — identities, policies, network configuration — which is where escalation paths become visible. It is read-only by design: nothing we do creates, modifies or deletes a resource. If you would rather not grant access at all, exported configuration works, with the caveat that a snapshot ages faster than a role.

How does this compare with Security Hub and GuardDuty?

They answer different questions and you should keep them. Config and Security Hub tell you whether your resources match rules; GuardDuty tells you when something suspicious is happening. Neither attempts an attack, so neither tells you whether a specific role can be escalated or whether your application can be used to reach it.

The useful division: native tools for continuous posture and detection, penetration testing for whether the posture actually holds. Teams that treat a green Security Hub as evidence of security are measuring compliance with rules, not resistance to attack.

Comparison

Four ways to get a web app tested

AWS-native toolsCSPM platformConsultancy engagementPenetrify
Misconfiguration detectionYes (Config, Security Hub)Yes, broadYesYes
IAM escalation attempted, not just flaggedNoRarelyYesYes
Application-layer testingNoNoYesYes
Chained attack pathsNoPartialYesYes
FrequencyContinuousContinuous1-2x per yearEvery deploy
Report an auditor acceptsEvidence, not a reportPlatform reportSigned reportReport with reproduction and history
Typical costIncluded / usage-basedPlatform pricingCommonly $15,000-$50,000From $100/month

Common findings

What these tests keep finding

CRITICALSSRF in an application reaches the instance metadata service and returns role credentials
CRITICALIAM role permits iam:PassRole with a wildcard, giving a straight path to administrative access
CRITICALS3 bucket holding customer data readable by anyone, via bucket policy or a permissive distribution in front of it
HIGHLong-lived access keys in a task definition, user data script or Lambda environment variable
HIGHSecurity group opens a database or management port to 0.0.0.0/0
HIGHIMDSv1 still enabled, making credential theft through SSRF materially easier
MEDIUMCross-account trust policy accepts a broader principal than the integration requires
MEDIUMRDS snapshot shared beyond the account, or volumes unencrypted
MEDIUMLambda function URL exposed without authorisation

Real teardowns of findings like these, with the request that proved them: read the case studies.

Deliverables

What you get

Findings report

Every finding with severity, the exact policy statement or resource setting responsible, reproduction, and the change that fixes it.

Escalation chains

The path from initial access to data, documented as a sequence rather than split across tickets that individually look minor.

Blast radius per identity

What each role and function can actually reach, which is the input to least-privilege work that would otherwise be guesswork.

Retest history

What closed, what regressed and when — evidence for auditors and enterprise security reviews.

Compliance

Frameworks that expect penetration testing

SOC 2 Type II

CC6.1: logical access controls, commonly evidenced with penetration testing of the cloud environment

ISO 27001

A.12.6: technical vulnerability management including cloud configuration

PCI DSS 4.0

Requirement 11.4.1: documented methodology, testing at least every 12 months and after significant change; segmentation testing where AWS hosts the cardholder data environment

HIPAA Security Rule

45 CFR §164.308(a)(8): regular evaluation, including workloads processing ePHI

AWS shared responsibility

Security *in* the cloud is yours: IAM, configuration, data and applications. AWS covers security *of* the cloud.

FAQ

AWS Penetration Testing questions

Does AWS allow penetration testing?

Yes, for your own resources across the common service types, without prior approval. Simulated denial of service and similar disruptive activity still require authorisation, and there is a prohibited list worth reading first. We exclude DoS-style testing entirely, so most engagements need no ticket.

What does an AWS penetration test cover?

The customer half of the shared responsibility model: IAM policies and escalation paths, storage and data exposure, network reachability and metadata access, serverless and container identity, and the applications you run. Not AWS-managed infrastructure, and never another tenant.

Do you need admin access to our AWS account?

Never. External testing needs no access. The internal view uses a read-only role, and nothing we run creates, modifies or deletes resources. Exported configuration is an alternative if you prefer, at the cost of it ageing.

Is a CSPM tool enough?

For continuous posture, it is valuable and you should keep it. It flags policies that look wrong; it does not attempt escalation, does not test your application, and does not chain an SSRF into role credentials into data. Those require testing rather than assessment.

How much does AWS penetration testing cost?

A consultancy engagement is commonly quoted at $15,000-$50,000 depending on account count and application scope. Penetrify runs continuously from $100 a month with retests included, which suits infrastructure that changes weekly; keep a human engagement where a contract or auditor names one.

Get started

Test your web application today

No scoping call, no statement of work, no testing window to wait for. Add a URL and credentials, and the first findings land in minutes.