AWS - S3 Μη αυθεντικοποιημένη απαρίθμηση

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

S3 Δημόσια Buckets

Ένα bucket θεωρείται «public» αν οποιοσδήποτε χρήστης μπορεί να απαριθμήσει τα περιεχόμενα του bucket, και «private» αν τα περιεχόμενα του bucket μπορούν να απαριθμηθούν ή να γραφτούν μόνο από συγκεκριμένους χρήστες.

Οι εταιρείες ενδέχεται να έχουν λανθασμένες ρυθμίσεις δικαιωμάτων στα buckets, δίνοντας πρόσβαση είτε σε όλα είτε σε όλους τους αυθεντικοποιημένους χρήστες στο AWS από οποιονδήποτε λογαριασμό (επομένως σε οποιονδήποτε). Σημειώστε ότι ακόμη και με τέτοιες λανθασμένες ρυθμίσεις, ορισμένες ενέργειες ίσως να μην είναι δυνατές επειδή τα buckets μπορεί να έχουν τους δικούς τους access control lists (ACLs).

Μάθετε για AWS-S3 misconfiguration εδώ: http://flaws.cloud και http://flaws2.cloud/

Finding AWS Buckets

Διάφορες μέθοδοι για να βρείτε πότε μια ιστοσελίδα χρησιμοποιεί AWS για την αποθήκευση κάποιων πόρων:

Enumeration & OSINT:

  • Χρήση του plugin προγράμματος περιήγησης wappalyzer
  • Χρήση burp (spidering the web) ή με χειροκίνητη πλοήγηση στη σελίδα — όλοι οι resources που φορτώνονται θα αποθηκευτούν στο History.
  • Ελέγξτε για resources σε domains όπως:
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
  • Ελέγξτε για CNAMES καθώς resources.domain.com μπορεί να έχει το CNAME bucket.s3.amazonaws.com
  • s3dns – Ένας ελαφρύς DNS server που εντοπίζει παθητικά cloud storage buckets (S3, GCP, Azure) αναλύοντας την DNS κίνηση. Εντοπίζει CNAMEs, ακολουθεί αλυσίδες ανάλυσης και ταιριάζει μοτίβα buckets, προσφέροντας μια αθόρυβη εναλλακτική στο brute-force ή στην ανακάλυψη μέσω API. Ιδανικό για recon και OSINT workflows.
  • Ελέγξτε https://buckets.grayhatwarfare.com, έναν ιστότοπο με ήδη ανακαλυφθέντα open buckets.
  • Το bucket name και το bucket domain name πρέπει να είναι ίδια.
  • Το flaws.cloud βρίσκεται στην IP 52.92.181.107 και αν το επισκεφθείτε σας ανακατευθύνει σε https://aws.amazon.com/s3/. Επίσης, dig -x 52.92.181.107 επιστρέφει s3-website-us-west-2.amazonaws.com.
  • Για να ελέγξετε ότι είναι bucket μπορείτε επίσης να επισκεφθείτε https://flaws.cloud.s3.amazonaws.com/.

Brute-Force

Μπορείτε να βρείτε buckets κάνοντας brute-forcing names σχετικών με την εταιρεία που πραγματοποιείτε pentesting:

# 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

Δεδομένων των S3 open buckets, το BucketLoot μπορεί αυτοματοποιημένα να αναζητήσει ενδιαφέρουσες πληροφορίες.

Find the Region

Μπορείτε να βρείτε όλες τις υποστηριζόμενες περιοχές από το AWS στη σελίδα https://docs.aws.amazon.com/general/latest/gr/s3.html

By DNS

Μπορείτε να πάρετε την περιοχή ενός bucket με dig και nslookup κάνοντας ένα DNS request της εντοπισμένης 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.

Ελέγξτε ότι το επιλυμένο domain περιέχει τη λέξη “website”.
Μπορείτε να αποκτήσετε πρόσβαση στον στατικό website πηγαίνοντας στο: flaws.cloud.s3-website-us-west-2.amazonaws.com
ή μπορείτε να αποκτήσετε πρόσβαση στο bucket επισκεπτόμενοι: flaws.cloud.s3-us-west-2.amazonaws.com

Δοκιμάζοντας

Αν προσπαθήσετε να αποκτήσετε πρόσβαση σε ένα bucket, αλλά στο όνομα domain καθορίζετε άλλη περιοχή (για παράδειγμα το bucket είναι σε bucket.s3.amazonaws.com αλλά προσπαθείτε να αποκτήσετε πρόσβαση σε bucket.s3-website-us-west-2.amazonaws.com), τότε θα σας υποδειχθεί η σωστή τοποθεσία:

Καταγραφή του bucket

Για να δοκιμάσετε το πόσο ανοιχτό είναι το bucket, ένας χρήστης μπορεί απλά να εισάγει το URL στον web browser του. Ένα ιδιωτικό bucket θα απαντήσει με “Access Denied”. Ένα δημόσιο bucket θα εμφανίσει τα πρώτα 1.000 αντικείμενα που έχουν αποθηκευτεί.

Προσβάσιμο από όλους:

Ιδιωτικό:

Μπορείτε επίσης να το ελέγξετε αυτό με το 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]

Πρότυπο δημόσιου URL

Αν το bucket δεν έχει domain name, όταν προσπαθείτε να το enumerate, βάλτε μόνο το όνομα του bucket και όχι ολόκληρο το AWSs3 domain. Παράδειγμα: s3://<BUCKETNAME>

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

Ανάκτηση ID λογαριασμού από δημόσιο Bucket

Είναι δυνατόν να προσδιοριστεί ένας λογαριασμός AWS εκμεταλλευόμενοι το νέο S3:ResourceAccount Policy Condition Key. Αυτή η συνθήκη περιορίζει την πρόσβαση με βάση το S3 bucket στο οποίο βρίσκεται ο λογαριασμός (άλλες πολιτικές βάσει λογαριασμού περιορίζουν με βάση τον λογαριασμό στον οποίο ανήκει ο principal που αιτείται).
Και επειδή η πολιτική μπορεί να περιέχει χαρακτήρες μπαλαντέρ είναι δυνατόν να βρεθεί ο αριθμός λογαριασμού μόνο ένας αριθμός κάθε φορά.

Αυτό το εργαλείο αυτοματοποιεί τη διαδικασία:

# 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

Αυτή η τεχνική λειτουργεί επίσης με API Gateway URLs, Lambda URLs, Data Exchange data sets και ακόμη και για να λάβεις την τιμή των tags (αν γνωρίζεις το tag key). Μπορείς να βρεις περισσότερες πληροφορίες στην original research και στο εργαλείο conditional-love για την αυτοματοποίηση αυτής της εκμετάλλευσης.

Επιβεβαίωση ότι ένα bucket ανήκει σε έναν λογαριασμό AWS

Όπως εξηγείται στο this blog post, αν έχεις δικαιώματα για να κάνεις list ένα bucket είναι δυνατό να επιβεβαιώσεις το accountID στο οποίο ανήκει το bucket στέλνοντας ένα αίτημα όπως:

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>

Αν το σφάλμα είναι “Access Denied” σημαίνει ότι το account ID ήταν λανθασμένο.

Χρησιμοποιημένα Emails ως root account enumeration

Όπως εξηγείται στο this blog post, είναι δυνατό να ελεγχθεί αν μια διεύθυνση email σχετίζεται με οποιονδήποτε AWS account με το προσπαθώντας να παραχωρήσετε δικαιώματα σε μια διεύθυνση email πάνω σε έναν S3 bucket μέσω ACLs. Αν αυτό δεν προκαλέσει σφάλμα, σημαίνει ότι το email είναι root user κάποιου AWS account:

s3_client.put_bucket_acl(
Bucket=bucket_name,
AccessControlPolicy={
'Grants': [
{
'Grantee': {
'EmailAddress': 'some@emailtotest.com',
'Type': 'AmazonCustomerByEmail',
},
'Permission': 'READ'
},
],
'Owner': {
'DisplayName': 'Whatever',
'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef'
}
}
)

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks