AWS - DynamoDB Enum

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

DynamoDB

Temel Bilgiler

Amazon DynamoDB, AWS tarafından tamamen yönetilen, sunucusuz, anahtar-değer NoSQL veritabanı olarak sunulmaktadır ve boyutlarından bağımsız olarak yüksek performanslı uygulamaları desteklemek için tasarlanmıştır. Hizmet, yerleşik güvenlik önlemleri, kesintisiz yedeklemeler, birden fazla bölgede otomatik çoğaltma, entegre bellek içi önbellekleme ve kullanışlı veri dışa aktarma araçları gibi sağlam özellikler sunar.

DynamoDB bağlamında, geleneksel bir veritabanı kurmak yerine, tablolar oluşturulur. Her tablo, tablonun birincil anahtarının ayrılmaz bir bileşeni olarak bir bölüm anahtarının belirtilmesini zorunlu kılar. Bu bölüm anahtarı, esasen bir hash değeri olup, hem öğelerin alınmasında hem de verilerin çeşitli sunucular arasında dağıtımında kritik bir rol oynar. Bu dağıtım, veritabanının ölçeklenebilirliğini ve kullanılabilirliğini korumak için hayati öneme sahiptir. Ayrıca, veri organizasyonunu daha da geliştirmek için bir sıralama anahtarı ekleme seçeneği de bulunmaktadır.

Şifreleme

Varsayılan olarak, DynamoDB, Amazon DynamoDB’ye ait bir KMS anahtarı kullanır, bu anahtar, en azından hesabınıza ait olan AWS yönetilen anahtar bile değildir.

Yedeklemeler & S3’e Dışa Aktarma

Tablo yedeklemelerinin oluşturulmasını planlamak veya bunları talep üzerine oluşturmak mümkündür. Ayrıca, bir tablo için Zamanda Nokta Kurtarma (PITR) özelliğini etkinleştirmek de mümkündür. Zamanda nokta kurtarma, yanlışlıkla yazma veya silme işlemlerine karşı koruma sağlamak için DynamoDB verilerinizi 35 gün boyunca sürekli yedekler.

Ayrıca, bir tablonun verilerini S3’e dışa aktarmak da mümkündür, ancak tablonun PITR etkinleştirilmiş olması gerekir.

GUI

Local Dynamo hizmetleri için bir GUI bulunmaktadır, dynalite, localstack vb. gibi, bu da faydalı olabilir: https://github.com/aaronshaf/dynamodb-admin

Enumeration

# 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

Kimlik Doğrulama Olmadan Erişim

AWS - DynamoDB Unauthenticated Access

Yetki Yükseltme

AWS - DynamoDB Privesc

İstismar Sonrası

AWS - DynamoDB Post Exploitation

Süreklilik

AWS - DynamoDB Persistence

DynamoDB Enjeksiyonu

SQL Enjeksiyonu

DynamoDB verilerine SQL sözdizimi ile erişmenin yolları vardır, bu nedenle tipik SQL enjeksiyonları da mümkündür.

SQL Injection - HackTricks

NoSQL Enjeksiyonu

DynamoDB’de verileri almak için farklı koşullar kullanılabilir, eğer bir NoSQL Enjeksiyonu’nda verileri almak için daha fazla koşulu birleştirmek mümkünse, gizli verilere (veya tüm tabloyu dökme) ulaşabilirsiniz.
DynamoDB tarafından desteklenen koşulları burada bulabilirsiniz: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

Verilere query veya scan aracılığıyla erişiliyorsa, farklı koşulların desteklendiğini unutmayın.

Note

Aslında, Query işlemleri, çalışması için birincil anahtarda “EQ” (eşittir) koşulunu belirtmelidir, bu da onu NoSQL enjeksiyonlarına karşı daha az duyarlı hale getirir (ve ayrıca işlemi çok sınırlı hale getirir).

Eğer karşılaştırmayı değiştirebilir veya yenilerini ekleyebilirseniz, daha fazla veri alabilirsiniz.

# 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

NoSQL injection - HackTricks

Ham Json enjeksiyonu

[!DİKKAT] Bu güvenlik açığı, artık kullanımdan kaldırılmış olan dynamodb Scan Filter’a dayanmaktadır!

DynamoDB, DB içindeki verileri arama için Json nesnelerini kabul eder. Eğer arama için gönderilen json nesnesinde yazma yeteneğiniz olduğunu bulursanız, DB’yi dökebilir, tüm içeriklerini alabilirsiniz.

Örneğin, aşağıdaki gibi bir isteğe enjeksiyon yaparak:

'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'

bir saldırgan şunları enjekte edebilir:

1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0

ID 1000 için “EQ” koşulunu düzeltin ve ardından 0’dan büyük bir Id dizesi ile tüm verileri arayın, bu da hepsidir.

Başka bir gü vulnerable örnek bir giriş kullanarak olabilir:

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))

Bu, şuna karşı savunmasız olacaktır:

username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none

:property Injection

Bazı SDK’lar, gerçekleştirilecek filtrelemeyi belirten bir dize kullanmaya izin verir:

new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)

DynamoDB’de filtre ifadelerinde bir niteliğin değerini değiştirmek için öğeleri tararken, token’ların : karakteri ile başlaması gerektiğini bilmelisiniz. Bu token’lar, çalışma zamanında gerçek nitelik değeri ile değiştirilecektir.

Bu nedenle, önceki gibi bir giriş, şöyle bir şeyle atlatılabilir:

:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin