AWS - S3 Unauthenticated Enum
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
S3 Public Buckets
A bucket is considered “public” if any user can list the contents of the bucket, and “private” if the bucket’s contents can only be listed or written by certain users.
Companies might have buckets permissions miss-configured giving access either to everything or to everyone authenticated in AWS in any account (so to anyone). Note, that even with such misconfigurations some actions might not be able to be performed as buckets might have their own access control lists (ACLs).
Learn about AWS-S3 misconfiguration here: http://flaws.cloud and http://flaws2.cloud/
Finding AWS Buckets
Different methods to find when a webpage is using AWS to storage some resources:
Enumeration & OSINT:
- Using wappalyzer browser plugin
- Using burp (spidering the web) or by manually navigating through the page all resources loaded will be save in the History.
- Check for resources in domains like:
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
- Check for CNAMES as
resources.domain.commight have the CNAMEbucket.s3.amazonaws.com - s3dns – A lightweight DNS server that passively identifies cloud storage buckets (S3, GCP, Azure) by analyzing DNS traffic. It detects CNAMEs, follows resolution chains, and matches bucket patterns, offering a quiet alternative to brute-force or API-based discovery. Perfect for recon and OSINT workflows.
- Check https://buckets.grayhatwarfare.com, a web with already discovered open buckets.
- The bucket name and the bucket domain name needs to be the same.
- flaws.cloud is in IP 52.92.181.107 and if you go there it redirects you to https://aws.amazon.com/s3/. Also,
dig -x 52.92.181.107givess3-website-us-west-2.amazonaws.com. - To check it’s a bucket you can also visit https://flaws.cloud.s3.amazonaws.com/.
Brute-Force
You can find buckets by brute-forcing names related to the company you are pentesting:
- https://github.com/sa7mon/S3Scanner
- https://github.com/clario-tech/s3-inspector
- https://github.com/jordanpotti/AWSBucketDump (Contains a list with potential bucket names)
- https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets
- https://github.com/smaranchand/bucky
- https://github.com/tomdev/teh_s3_bucketeers
- https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3
- https://github.com/Eilonh/s3crets_scanner
- https://github.com/belane/CloudHunter
# Generate a wordlist to create permutations
curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt
# Generate a wordlist based on the domains and subdomains to test
## Write those domains and subdomains in subdomains.txt
cat subdomains.txt > /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
# Create permutations based in a list with the domains and subdomains to attack
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## The previous tool is specialized increating permutations for subdomains, lets filter that list
### Remove lines ending with "."
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### Create list without TLD
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### Create list without dots
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Create list without hyphens
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5
## Generate the final wordlist
cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt
## Call s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt | grep bucket_exists
Loot S3 Buckets
Given S3 open buckets, BucketLoot can automatically search for interesting information.
Find the Region
You can find all the supported regions by AWS in https://docs.aws.amazon.com/general/latest/gr/s3.html
By DNS
You can get the region of a bucket with a dig and nslookup by doing a DNS request of the discovered IP:
dig flaws.cloud
;; ANSWER SECTION:
flaws.cloud. 5 IN A 52.218.192.11
nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.
Sprawdź, czy rozwiązywana domena zawiera słowo “website”.
Możesz uzyskać dostęp do statycznej strony, przechodząc pod: flaws.cloud.s3-website-us-west-2.amazonaws.com
albo możesz uzyskać dostęp do bucketu, odwiedzając: flaws.cloud.s3-us-west-2.amazonaws.com
Próbując
Jeżeli spróbujesz uzyskać dostęp do bucketu, ale w nazwie domeny podasz inny region (na przykład bucket znajduje się pod bucket.s3.amazonaws.com, a ty próbujesz dostać się pod bucket.s3-website-us-west-2.amazonaws.com), zostaniesz skierowany do właściwej lokalizacji:
.png)
Enumerating the bucket
Aby sprawdzić dostępność bucketu użytkownik może po prostu wpisać URL w przeglądarce. Prywatny bucket zwróci komunikat “Access Denied”. Publiczny bucket wyświetli pierwsze 1 000 obiektów, które zostały w nim zapisane.
Open to everyone:
.png)
Private:
.png)
Możesz to także sprawdzić za pomocą cli:
#Use --no-sign-request for check Everyones permissions
#Use --profile <PROFILE_NAME> to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions
#--recursive if you want list recursivelyls
#Opcionally you can select the region if you now it
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]
Jeśli bucket nie ma nazwy domenowej, podczas próby enumerate, podaj tylko bucket name i nie całą domenę AWSs3. Przykład: s3://<BUCKETNAME>
Szablon publicznego URL
https://{user_provided}.s3.amazonaws.com
Uzyskaj ID konta z publicznego Bucket
Można określić konto AWS, wykorzystując nowy S3:ResourceAccount Policy Condition Key. Ten warunek ogranicza dostęp na podstawie S3 bucket konta, w którym się znajduje (inne polityki oparte na koncie ograniczają na podstawie konta, na którym znajduje się żądający principal).
I ponieważ polityka może zawierać wildcards, możliwe jest znalezienie numeru konta po jednej cyfrze na raz.
To narzędzie automatyzuje ten proces:
# Installation
pipx install s3-account-search
pip install s3-account-search
# With a bucket
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket
# With an object
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext
Ta technika działa również z API Gateway URLs, Lambda URLs, Data Exchange data sets i nawet umożliwia pobranie wartości tagów (jeśli znasz klucz tagu). Możesz znaleźć więcej informacji w original research i w narzędziu conditional-love, które automatyzuje tę eksploatację.
Potwierdzanie, że bucket należy do konta AWS
Jak wyjaśniono w this blog post, if you have permissions to list a bucket możliwe jest potwierdzenie accountID, do którego należy bucket, wysyłając żądanie takie jak:
curl -X GET "[bucketname].amazonaws.com/" \
-H "x-amz-expected-bucket-owner: [correct-account-id]"
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">...</ListBucketResult>
Jeżeli błąd to „Access Denied”, oznacza to, że ID konta było nieprawidłowe.
Used Emails as root account enumeration
Jak wyjaśniono w this blog post, można sprawdzić, czy adres e-mail jest powiązany z którymkolwiek kontem AWS, próbując nadać adresowi e-mail uprawnienia do S3 bucketu za pomocą ACLs. Jeśli to nie spowoduje błędu, oznacza to, że adres e-mail jest root userem jakiegoś konta AWS:
s3_client.put_bucket_acl(
Bucket=bucket_name,
AccessControlPolicy={
'Grants': [
{
'Grantee': {
'EmailAddress': 'some@emailtotest.com',
'Type': 'AmazonCustomerByEmail',
},
'Permission': 'READ'
},
],
'Owner': {
'DisplayName': 'Whatever',
'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef'
}
}
)
Źródła
- https://www.youtube.com/watch?v=8ZXRw4Ry3mQ
- https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

