AWS - S3 Unauthenticated Enum

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Δημόσια Buckets S3

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

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

Μάθετε για την κακώς ρυθμισμένη AWS-S3 εδώ: http://flaws.cloud και http://flaws2.cloud/

Εύρεση AWS Buckets

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

Απαρίθμηση & OSINT:

  • Χρησιμοποιώντας το πρόσθετο προγράμματος περιήγησης wappalyzer

  • Χρησιμοποιώντας το burp (ανάρριψη του web) ή με τη χειροκίνητη περιήγηση στη σελίδα όλοι οι πόροι που φορτώνονται θα αποθηκευτούν στο Ιστορικό.

  • Ελέγξτε τους πόρους σε τομείς όπως:

http://s3.amazonaws.com/[όνομα_bucket]/
http://[όνομα_bucket].s3.amazonaws.com/
  • Ελέγξτε τα CNAMES καθώς το resources.domain.com ενδέχεται να έχει το CNAME bucket.s3.amazonaws.com

  • Ελέγξτε το https://buckets.grayhatwarfare.com, μια ιστοσελίδα με ήδη ανακαλυμμένα ανοικτά buckets.

  • Το όνομα bucket και το όνομα τομέα bucket πρέπει να είναι τα ίδια.

  • Το 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/.

Βίαιη Δύναμη

Μπορείτε να βρείτε buckets με το βίαιο δύναμη ονόματα που σχετίζονται με την εταιρεία που ελέγχετε:

# Δημιουργία λίστας λέξεων για τη δημιουργία περιπτώσεων
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

# Δημιουργία λίστας λέξεων βασισμένη στους τομείς και τους υποτομείς για δοκιμή
## Γράψτε αυτούς τους τομείς και τους υποτομείς στο 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

# Δημιουργία περιπτώσεων βασισμένη σε μια λίστα με τους τομείς και τους υποτομείς για επίθεση
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## Το προηγούμενο εργαλείο είναι εξειδικευμένο στη δημιουργία περιπτώσεων για υποτομές, ας φιλτράρουμε αυτήν τη λίστα
### Αφαιρέστε τις γραμμές που τελειώνουν με "."
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### Δημιουργία λίστας χωρίς TLD
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### Δημιουργία λίστας χωρίς τελείες
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Δημιουργία λίστας χωρίς παύλες
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5

## Δημιουργία τελικής λίστας λέξεων
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
## Καλέστε το s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists

Λείανση S3 Buckets

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

Βρείτε την Περιοχή

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

Μέσω 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". Μπορείτε να έχετε πρόσβαση στον στατικό ιστότοπο πηγαίνοντας στο: flaws.cloud.s3-website-us-west-2.amazonaws.com ή μπορείτε να έχετε πρόσβαση στον κάδο επισκεπτόμενοι: flaws.cloud.s3-us-west-2.amazonaws.com

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

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

Απαρίθμηση του κάδου

Για να δοκιμάσετε τον βαθμό προσβασιμότητας του κάδου, ένας χρήστης μπορεί απλά να εισάγει το URL στον περιηγητή του ιστού. Ένας ιδιωτικός κάδος θα απαντήσει με "Απαγορεύεται η πρόσβαση". Ένας δημόσιος κάδος θα εμφανίσει τα πρώτα 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]

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

Δημόσιο πρότυπο URL

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

Λήψη του Αναγνωριστικού Λογαριασμού από δημόσιο Bucket

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

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

# 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

Αυτή η τεχνική λειτουργεί επίσης με τα URL της API Gateway, τα URL των Lambda, τα σύνολα δεδομένων του Data Exchange και ακόμη και για να λάβετε την τιμή των ετικετών (εάν γνωρίζετε το κλειδί της ετικέτας). Μπορείτε να βρείτε περισσότερες πληροφορίες στην αρχική έρευνα και το εργαλείο conditional-love για να αυτοματοποιήσετε αυτήν την εκμετάλλευση.

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

Όπως εξηγείται στην ανάρτηση αυτού του ιστολογίου, εάν έχετε άδειες για να καταλογογραφήσετε έναν κάδο, είναι δυνατό να επιβεβαιώσετε τον αριθμό λογαριασμού (accountID) στον οποίο ανήκει ο κάδος, αποστέλλοντας ένα αίτημα όπως:

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>

Εάν το σφάλμα είναι "Απόρριψη πρόσβασης", σημαίνει ότι το αναγνωριστικό λογαριασμού ήταν λανθασμένο.

Χρήση Emails για απαρίθμηση λογαριασμών root

Όπως εξηγείται στην ανάρτηση αυτού του ιστολογίου, είναι δυνατόν να ελεγχθεί εάν μια διεύθυνση email σχετίζεται με οποιονδήποτε λογαριασμό AWS προσπαθώντας να χορηγήσετε δικαιώματα email σε ένα κάδο S3 μέσω των ACLs. Εάν αυτό δεν προκαλέσει σφάλμα, σημαίνει ότι η διεύθυνση email είναι ριζικός χρήστης κάποιου λογαριασμού 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'
}
}
)

Αναφορές

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated