AWS - S3 Unauthenticated Enum

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Bacs publics S3

Un bac est considéré comme "public" si n'importe quel utilisateur peut lister le contenu du bac, et "privé" si le contenu du bac ne peut être listé ou écrit que par certains utilisateurs.

Les entreprises peuvent avoir des permissions de bac mal configurées donnant accès soit à tout ou à tout le monde authentifié dans AWS dans n'importe quel compte (donc à n'importe qui). Notez que même avec de telles mauvaises configurations, certaines actions pourraient ne pas pouvoir être effectuées car les bacs pourraient avoir leurs propres listes de contrôle d'accès (ACL).

Apprenez-en davantage sur la mauvaise configuration AWS-S3 ici : http://flaws.cloud et http://flaws2.cloud/

Recherche de bacs AWS

Différentes méthodes pour trouver quand une page web utilise AWS pour stocker des ressources :

Énumération & OSINT :

  • Utilisation du plugin de navigateur wappalyzer

  • En utilisant burp (spidering le web) ou en naviguant manuellement sur la page, toutes les ressources chargées seront enregistrées dans l'historique.

  • Vérifiez les ressources dans des domaines comme :

http://s3.amazonaws.com/[nom_du_bac]/
http://[nom_du_bac].s3.amazonaws.com/
  • Vérifiez les CNAMES car resources.domain.com pourrait avoir le CNAME bucket.s3.amazonaws.com

  • Consultez https://buckets.grayhatwarfare.com, un site web avec des bacs ouverts déjà découverts.

  • Le nom du bac et le nom de domaine du bac doivent être les mêmes.

  • flaws.cloud est à l'IP 52.92.181.107 et si vous y allez, il vous redirige vers https://aws.amazon.com/s3/. De plus, dig -x 52.92.181.107 donne s3-website-us-west-2.amazonaws.com.

  • Pour vérifier s'il s'agit d'un bac, vous pouvez également visiter https://flaws.cloud.s3.amazonaws.com/.

Brute-Force

Vous pouvez trouver des bacs en forcant le nom lié à l'entreprise que vous testez :

# Générer une liste de mots pour créer des 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

# Générer une liste de mots basée sur les domaines et sous-domaines à tester
## Écrivez ces domaines et sous-domaines dans 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

# Créer des permutations basées sur une liste avec les domaines et sous-domaines à attaquer
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## L'outil précédent est spécialisé dans la création de permutations pour les sous-domaines, filtrons cette liste
### Supprimer les lignes se terminant par "."
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### Créer une liste sans TLD
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### Créer une liste sans points
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Créer une liste sans tirets
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5

## Générer la liste de mots finale
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
## Appeler s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists

Butin des seaux S3

Pour les seaux S3 ouverts, BucketLoot peut automatiquement rechercher des informations intéressantes.

Trouver la région

Vous pouvez trouver toutes les régions prises en charge par AWS dans https://docs.aws.amazon.com/general/latest/gr/s3.html

Par DNS

Vous pouvez obtenir la région d'un seau avec un dig et nslookup en effectuant une requête DNS de 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 web 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 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 vous serez redirigé vers l'emplacement correct :

É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 "Accès refusé". Un bucket public listera les premiers 1 000 objets qui ont été stockés.

Ouvert à tous :

Privé :

Vous pouvez également vérifier cela avec la 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, lors de la tentative d'énumération, ne mettre que le nom du bucket et non le domaine complet d'AWSs3. Exemple : s3://<NOMDUBUCKET>

Modèle d'URL publique

https://{user_provided}.s3.amazonaws.com

Obtenir l'identifiant du compte à partir du Bucket public

Il est possible de déterminer un compte AWS en exploitant la nouvelle clé de condition de politique S3:ResourceAccount. Cette condition restreint l'accès en fonction du Bucket S3 dans lequel se trouve un compte (d'autres politiques basées sur les comptes restreignent en fonction du compte dans lequel se trouve le principal demandeur). Et comme la politique peut contenir des jokers, il est possible de trouver le numéro de compte un 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 les URL de la passerelle API, les URL de Lambda, les ensembles de données Data Exchange et même pour obtenir la valeur des tags (si vous connaissez la clé du tag). Vous pouvez trouver plus d'informations dans la recherche originale et l'outil conditional-love pour automatiser cette exploitation.

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Dernière mise à jour