Abuser Cloudflare Workers en tant que proxies pass-through (rotation dâIP, FireProx-style)
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Cloudflare Workers peuvent ĂȘtre dĂ©ployĂ©s comme des proxies HTTP transparents pass-through oĂč lâURL cible upstream est fournie par le client. Les requĂȘtes sortent du rĂ©seau Cloudflare, donc la cible voit les IPs de Cloudflare au lieu de celles du client. Cela reflĂšte la technique bien connue FireProx sur AWS API Gateway, mais utilise Cloudflare Workers.
Fonctionnalités clés
- Prise en charge de toutes les méthodes HTTP (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD)
- La cible peut ĂȘtre fournie via un paramĂštre de requĂȘte (?url=âŠ), un header (X-Target-URL), ou mĂȘme encodĂ©e dans le chemin (par ex. /https://target)
- Les headers et le corps sont relayés via le proxy avec filtrage des headers hop-by-hop si nécessaire
- Les réponses sont renvoyées en conservant le code de statut et la plupart des headers
- Usurpation optionnelle de X-Forwarded-For (si le Worker le dĂ©finit Ă partir dâun header contrĂŽlĂ© par lâutilisateur)
- Rotation trĂšs rapide/facile en dĂ©ployant plusieurs endpoints Worker et en rĂ©partissant les requĂȘtes
Comment ça marche (flux)
- Le client envoie une requĂȘte HTTP vers une URL Worker (
<name>.<account>.workers.devou un route de domaine personnalisĂ©). - Le Worker extrait la cible soit dâun paramĂštre de requĂȘte (?url=âŠ), soit du header X-Target-URL, ou dâun segment de chemin si implĂ©mentĂ©.
- Le Worker transfĂšre la mĂ©thode, les headers et le corps entrants vers lâURL upstream spĂ©cifiĂ©e (en filtrant les headers problĂ©matiques).
- La rĂ©ponse upstream est streamĂ©e vers le client via Cloudflare ; lâorigine voit les IPs de sortie de Cloudflare.
Exemple dâimplĂ©mentation du Worker
- Lit lâURL cible depuis un paramĂštre de requĂȘte, un header ou le chemin
- Copie un sous-ensemble sûr de headers et transmet la méthode/le corps originaux
- DĂ©finit optionnellement X-Forwarded-For en utilisant un header contrĂŽlĂ© par lâutilisateur (X-My-X-Forwarded-For) ou une IP alĂ©atoire
- Ajoute un CORS permissif et gĂšre les preflight
Exemple de Worker (JavaScript) pour le proxy pass-through
```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>
### Automatisation du déploiement et de la rotation avec FlareProx
FlareProx est un outil Python qui utilise l'API Cloudflare pour déployer plusieurs endpoints Worker et effectuer la rotation entre eux. Cela fournit une rotation d'IP de type FireProx depuis le réseau de Cloudflare.
Setup
1) CrĂ©ez un Cloudflare API Token en utilisant le template âEdit Cloudflare Workersâ et rĂ©cupĂ©rez votre Account ID depuis le tableau de bord.
2) Configurez FlareProx:
```bash
git clone https://github.com/MrTurvey/flareprox
cd flareprox
pip install -r requirements.txt
Créer le fichier de configuration flareprox.json :
{
"cloudflare": {
"api_token": "your_cloudflare_api_token",
"account_id": "your_cloudflare_account_id"
}
}
Utilisation de la CLI
- Créer N proxies Worker :
python3 flareprox.py create --count 2
- Lister les endpoints :
python3 flareprox.py list
- Points de terminaison de vérification de santé :
python3 flareprox.py test
- Supprimer tous les endpoints:
python3 flareprox.py cleanup
Acheminer le trafic via un Worker
- Forme de paramĂštre de requĂȘte :
curl "https://your-worker.account.workers.dev?url=https://httpbin.org/ip"
- Formulaire dâen-tĂȘte:
curl -H "X-Target-URL: https://httpbin.org/ip" https://your-worker.account.workers.dev
- Format de chemin (si implémenté):
curl https://your-worker.account.workers.dev/https://httpbin.org/ip
- Exemples de méthodes:
# 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"
contrĂŽle de X-Forwarded-For
Si le Worker honore X-My-X-Forwarded-For, vous pouvez influencer la valeur en amont de X-Forwarded-For :
curl -H "X-My-X-Forwarded-For: 203.0.113.10" \
"https://your-worker.account.workers.dev?url=https://httpbin.org/headers"
Utilisation programmatique
Utilisez la bibliothĂšque FlareProx pour crĂ©er/lister/tester des endpoints et acheminer des requĂȘtes depuis Python.
Exemple Python : Envoyer un POST via un endpoint Worker aléatoire
```python #!/usr/bin/env python3 from flareprox import FlareProx, FlareProxError import jsonInitialize
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>
**Intégration Burp/Scanner**
- Redirigez vos outils (par exemple, Burp Suite) vers l'URL du Worker.
- Fournissez l'upstream réel en utilisant ?url= ou X-Target-URL.
- La sémantique HTTP (methods/headers/body) est préservée tout en masquant votre IP source derriÚre Cloudflare.
**Notes opérationnelles et limites**
- Le plan Free de Cloudflare Workers permet environ 100 000 requĂȘtes/jour par compte ; utilisez plusieurs endpoints pour rĂ©partir le trafic si nĂ©cessaire.
- Les Workers s'exécutent sur le réseau Cloudflare ; de nombreuses cibles ne verront que les IPs/ASN de Cloudflare, ce qui peut contourner des listes d'autorisation/refus IP naïves ou des heuristiques géographiques.
- Utilisez de maniĂšre responsable et seulement avec autorisation. Respectez les ToS et robots.txt.
## Références
- [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)
> [!TIP]
> Apprenez & pratiquez AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenez HackTricks</summary>
>
> - Consultez les [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Rejoignez le** đŹ [**Discord group**](https://discord.gg/hRep4RUj7f) ou le [**telegram group**](https://t.me/peass) ou **suivez-nous** sur **Twitter** đŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des hacking tricks en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>
HackTricks Cloud

