AWS - S3 Unauthenticated Enum
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
S3 Public Buckets
Un bucket est considĂ©rĂ© âpublicâ si nâimporte quel utilisateur peut lister le contenu du bucket, et âprivateâ si le contenu du bucket ne peut ĂȘtre listĂ© ou Ă©crit que par certains utilisateurs.
Les entreprises peuvent avoir des permissions des buckets mal configurĂ©es donnant accĂšs soit Ă tout, soit Ă toute personne authentifiĂ©e dans AWS dans nâimporte quel compte (donc Ă nâimporte qui). Notez que mĂȘme avec de telles mauvaises configurations certaines actions peuvent ne pas ĂȘtre rĂ©alisables car les buckets peuvent avoir leurs propres listes de contrĂŽle dâaccĂšs (ACLs).
En savoir plus sur les misconfigurations AWS-S3 ici : http://flaws.cloud et http://flaws2.cloud/
Finding AWS Buckets
Différentes méthodes pour détecter quand une page web utilise AWS pour stocker des ressources :
Enumeration & OSINT:
- Utiliser le plugin navigateur wappalyzer
- En utilisant burp (spidering le web) ou en naviguant manuellement sur la page toutes les ressources chargĂ©es seront sauvegardĂ©es dans lâHistory.
- Vérifier la présence de ressources dans des domaines tels que :
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
- Vérifier les CNAMES car
resources.domain.compeut avoir le CNAMEbucket.s3.amazonaws.com - s3dns â Un serveur DNS lĂ©ger qui identifie passivement les cloud storage buckets (S3, GCP, Azure) en analysant le trafic DNS. Il dĂ©tecte les CNAMEs, suit les chaĂźnes de rĂ©solution et matche les motifs de bucket, offrant une alternative tranquille au brute-force ou Ă la dĂ©couverte via API. Parfait pour les workflows de recon et OSINT.
- Vérifier https://buckets.grayhatwarfare.com, un site listant des buckets ouverts déjà découverts.
- Le bucket name et le bucket domain name doivent ĂȘtre les mĂȘmes.
- flaws.cloud est Ă lâIP 52.92.181.107 et si vous y allez il redirige vers https://aws.amazon.com/s3/. De plus,
dig -x 52.92.181.107renvoies3-website-us-west-2.amazonaws.com. - Pour vĂ©rifier que câest un bucket vous pouvez aussi visiter https://flaws.cloud.s3.amazonaws.com/.
Brute-Force
Vous pouvez trouver des buckets en brute-forçant des noms liĂ©s Ă lâentreprise ciblĂ©e lors du 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
Pour des buckets S3 ouverts, BucketLoot peut automatiquement chercher des informations intéressantes.
Find the Region
Vous pouvez trouver toutes les régions supportées par AWS sur https://docs.aws.amazon.com/general/latest/gr/s3.html
By DNS
Vous pouvez obtenir la rĂ©gion dâun bucket avec un dig et nslookup en faisant une requĂȘte DNS sur lâIP dĂ©couverte :
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.
VĂ©rifiez que le domaine rĂ©solu contient le mot âwebsiteâ.
Vous pouvez accéder au site statique en allant sur : flaws.cloud.s3-website-us-west-2.amazonaws.com
ou vous pouvez accéder au bucket en visitant : flaws.cloud.s3-us-west-2.amazonaws.com
En essayant
Si vous essayez dâaccĂ©der Ă un bucket, mais que dans le nom de domaine vous spĂ©cifiez une autre rĂ©gion (par exemple le bucket est dans bucket.s3.amazonaws.com mais vous essayez dâaccĂ©der Ă bucket.s3-website-us-west-2.amazonaws.com), alors il vous sera indiquĂ© lâemplacement correct :
.png)
ĂnumĂ©ration du bucket
Pour tester lâouverture du bucket, un utilisateur peut simplement entrer lâURL dans son navigateur web. Un bucket privĂ© rĂ©pondra par âAccess Deniedâ. Un bucket public listera les 1,000 premiers objets qui ont Ă©tĂ© stockĂ©s.
Accessible Ă tous:
.png)
Privé:
.png)
Vous pouvez aussi vérifier cela avec le 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]
Si le bucket nâa pas de nom de domaine, lorsque vous essayez de lâĂ©numĂ©rer, mettez uniquement le nom du bucket et pas lâintĂ©gralitĂ© du domaine AWSs3. Exemple : s3://<BUCKETNAME>
ModĂšle dâURL publique
https://{user_provided}.s3.amazonaws.com
Obtenir lâID de compte depuis un Bucket public
Il est possible de dĂ©terminer un compte AWS en tirant parti du nouveau S3:ResourceAccount Policy Condition Key. Cette condition restreint lâaccĂšs en fonction du S3 bucket dans lequel se trouve un compte (dâautres policies basĂ©es sur le compte restreignent en fonction du compte dans lequel se trouve le principal demandant).
Et parce que la policy peut contenir des wildcards, il est possible de trouver le numéro de compte un seul chiffre à la fois.
Cet outil automatise le processus:
# 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
Cette technique fonctionne Ă©galement avec API Gateway URLs, Lambda URLs, Data Exchange data sets et mĂȘme pour obtenir la valeur des tags (si vous connaissez la clĂ© du tag). Vous pouvez trouver plus dâinformations dans le original research et lâoutil conditional-love pour automatiser cette exploitation.
Confirmer quâun bucket appartient Ă un compte AWS
Comme expliquĂ© dans this blog post, si vous avez les permissions pour lister un bucket il est possible de confirmer lâaccountID auquel le bucket appartient en envoyant une requĂȘte comme :
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>
If the error is an âAccess Deniedâ it means that the account ID was wrong.
Utilisation des e-mails pour lâĂ©numĂ©ration des comptes root
Comme expliquĂ© dans this blog post, il est possible de vĂ©rifier si une adresse e-mail est liĂ©e Ă un compte AWS en essayant dâaccorder des permissions Ă une adresse e-mail sur un bucket S3 via les ACLs. Si cela ne dĂ©clenche pas dâerreur, cela signifie que lâadresse e-mail est un root user dâun compte 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éférences
- https://www.youtube.com/watch?v=8ZXRw4Ry3mQ
- https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

