Wykorzystywanie Cloudflare Workers jako pass-through proxies (IP rotation, FireProx-style)

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Cloudflare Workers mogą być wdrożone jako przezroczyste HTTP pass-through proxies, gdzie docelowy upstream URL jest dostarczany przez klienta. Żądania wychodzą z sieci Cloudflare, więc cel widzi adresy IP Cloudflare zamiast klienta. To odzwierciedla dobrze znaną technikę FireProx na AWS API Gateway, ale wykorzystuje Cloudflare Workers.

Główne możliwości

  • Obsługa wszystkich metod HTTP (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD)
  • Adres docelowy może być przekazywany przez parametr zapytania (?url=…), nagłówek (X-Target-URL) lub nawet zakodowany w ścieżce (np. /https://target)
  • Nagłówki i ciało żądania są przekazywane przez proxy z filtrowaniem nagłówków hop-by-hop w razie potrzeby
  • Odpowiedzi są przekazywane z powrotem, zachowując kod statusu i większość nagłówków
  • Opcjonalne sfałszowanie X-Forwarded-For (jeśli Worker ustawia go na podstawie nagłówka kontrolowanego przez użytkownika)
  • Bardzo szybka/łatwa rotacja przez wdrożenie wielu endpointów Worker i rozsyłanie żądań

Jak to działa (przepływ)

  1. Klient wysyła żądanie HTTP do URL Worker (<name>.<account>.workers.dev lub trasy niestandardowej domeny).
  2. Worker wydobywa cel z parametru zapytania (?url=…), nagłówka X-Target-URL lub segmentu ścieżki, jeśli to zaimplementowano.
  3. Worker przekazuje metodę, nagłówki i ciało do wskazanego upstream URL (filtrując problematyczne nagłówki).
  4. Odpowiedź upstream jest przesyłana z powrotem do klienta przez Cloudflare; origin widzi adresy IP egress Cloudflare.

Przykład implementacji Workera

  • Odczytuje adres URL celu z parametru zapytania, nagłówka lub ścieżki
  • Kopiuje bezpieczny podzbiór nagłówków i przekazuje oryginalną metodę/ciało
  • Opcjonalnie ustawia X-Forwarded-For używając nagłówka kontrolowanego przez użytkownika (X-My-X-Forwarded-For) lub losowego IP
  • Dodaje liberalne CORS i obsługuje preflight
Przykładowy Worker (JavaScript) do pass-through proxying ```javascript /** * Minimal Worker pass-through proxy * - Target URL from ?url=, X-Target-URL, or /https://... * - Proxies method/headers/body to upstream; relays response */ addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) })

async function handleRequest(request) { try { const url = new URL(request.url) const targetUrl = getTargetUrl(url, request.headers)

if (!targetUrl) { return errorJSON(‘No target URL specified’, 400, { usage: { query_param: ‘?url=https://example.com’, header: ‘X-Target-URL: https://example.com’, path: ‘/https://example.com’ } }) }

let target try { target = new URL(targetUrl) } catch (e) { return errorJSON(‘Invalid target URL’, 400, { provided: targetUrl }) }

// Forward original query params except control ones const passthru = new URLSearchParams() for (const [k, v] of url.searchParams) { if (![‘url’, ‘_cb’, ‘_t’].includes(k)) passthru.append(k, v) } if (passthru.toString()) target.search = passthru.toString()

// Build proxied request const proxyReq = buildProxyRequest(request, target) const upstream = await fetch(proxyReq)

return buildProxyResponse(upstream, request.method) } catch (error) { return errorJSON(‘Proxy request failed’, 500, { message: error.message, timestamp: new Date().toISOString() }) } }

function getTargetUrl(url, headers) { let t = url.searchParams.get(‘url’) || headers.get(‘X-Target-URL’) if (!t && url.pathname !== ‘/’) { const p = url.pathname.slice(1) if (p.startsWith(‘http’)) t = p } return t }

function buildProxyRequest(request, target) { const h = new Headers() const allow = [ ‘accept’,‘accept-language’,‘accept-encoding’,‘authorization’, ‘cache-control’,‘content-type’,‘origin’,‘referer’,‘user-agent’ ] for (const [k, v] of request.headers) { if (allow.includes(k.toLowerCase())) h.set(k, v) } h.set(‘Host’, target.hostname)

// Optional: spoof X-Forwarded-For if provided const spoof = request.headers.get(‘X-My-X-Forwarded-For’) h.set(‘X-Forwarded-For’, spoof || randomIP())

return new Request(target.toString(), { method: request.method, headers: h, body: [‘GET’,‘HEAD’].includes(request.method) ? null : request.body }) }

function buildProxyResponse(resp, method) { const h = new Headers() for (const [k, v] of resp.headers) { if (![‘content-encoding’,‘content-length’,‘transfer-encoding’].includes(k.toLowerCase())) { h.set(k, v) } } // Permissive CORS for tooling convenience h.set(‘Access-Control-Allow-Origin’, ‘’) h.set(‘Access-Control-Allow-Methods’, ‘GET, POST, PUT, DELETE, OPTIONS, PATCH, HEAD’) h.set(‘Access-Control-Allow-Headers’, ‘’)

if (method === ‘OPTIONS’) return new Response(null, { status: 204, headers: h }) return new Response(resp.body, { status: resp.status, statusText: resp.statusText, headers: h }) }

function errorJSON(msg, status=400, extra={}) { return new Response(JSON.stringify({ error: msg, …extra }), { status, headers: { ‘Content-Type’: ‘application/json’ } }) }

function randomIP() { return [1,2,3,4].map(() => Math.floor(Math.random()*255)+1).join(‘.’) }

</details>

### Automatyzacja wdrażania i rotacji za pomocą FlareProx

FlareProx to narzędzie w Pythonie, które korzysta z Cloudflare API do wdrażania wielu Worker endpoints i rotowania pomiędzy nimi. Zapewnia to FireProx-like rotację adresów IP z sieci Cloudflare.

Konfiguracja
1) Utwórz Cloudflare API Token, używając szablonu “Edit Cloudflare Workers”, i pobierz swój Account ID z dashboardu.
2) Skonfiguruj FlareProx:
```bash
git clone https://github.com/MrTurvey/flareprox
cd flareprox
pip install -r requirements.txt

Utwórz plik konfiguracyjny flareprox.json:

{
"cloudflare": {
"api_token": "your_cloudflare_api_token",
"account_id": "your_cloudflare_account_id"
}
}

Użycie CLI

  • Utwórz N Worker proxies:
python3 flareprox.py create --count 2
  • Wypisz endpointy:
python3 flareprox.py list
  • Endpointy health-test:
python3 flareprox.py test
  • Usuń wszystkie endpoints:
python3 flareprox.py cleanup

Przekierowywanie ruchu przez Worker

  • Forma parametru zapytania:
curl "https://your-worker.account.workers.dev?url=https://httpbin.org/ip"

Proszę wklej zawartość pliku/sekcji, którą mam przetłumaczyć. Zachowam oryginalny markdown/HTML i nie będę tłumaczył kodu, linków, nazw technicznych ani ścieżek.

curl -H "X-Target-URL: https://httpbin.org/ip" https://your-worker.account.workers.dev
  • Forma ścieżki (jeśli zaimplementowano):
curl https://your-worker.account.workers.dev/https://httpbin.org/ip
  • Przykłady metod:
# GET
curl "https://your-worker.account.workers.dev?url=https://httpbin.org/get"

# POST (form)
curl -X POST -d "username=admin" \
"https://your-worker.account.workers.dev?url=https://httpbin.org/post"

# PUT (JSON)
curl -X PUT -d '{"username":"admin"}' -H "Content-Type: application/json" \
"https://your-worker.account.workers.dev?url=https://httpbin.org/put"

# DELETE
curl -X DELETE \
"https://your-worker.account.workers.dev?url=https://httpbin.org/delete"

X-Forwarded-For kontrola

Jeśli Worker honoruje X-My-X-Forwarded-For, możesz wpłynąć na wartość upstream 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"

Użycie programowe

Użyj biblioteki FlareProx do tworzenia, listowania i testowania endpointów oraz kierowania żądań z Pythona.

Przykład w Pythonie: Wyślij POST przez losowy Worker endpoint ```python #!/usr/bin/env python3 from flareprox import FlareProx, FlareProxError import json

Initialize

flareprox = FlareProx(config_file=“flareprox.json”) if not flareprox.is_configured: print(“FlareProx not configured. Run: python3 flareprox.py config”) exit(1)

Ensure endpoints exist

endpoints = flareprox.sync_endpoints() if not endpoints: print(“Creating proxy endpoints…”) flareprox.create_proxies(count=2)

Make a POST request through a random endpoint

try: post_data = json.dumps({ “username”: “testuser”, “message”: “Hello from FlareProx!”, “timestamp”: “2025-01-01T12:00:00Z” })

headers = { “Content-Type”: “application/json”, “User-Agent”: “FlareProx-Client/1.0” }

response = flareprox.redirect_request( target_url=“https://httpbin.org/post”, method=“POST”, headers=headers, data=post_data )

if response.status_code == 200: result = response.json() print(“✓ POST successful via FlareProx”) print(f“Origin IP: {result.get(‘origin’, ‘unknown’)}“) print(f“Posted data: {result.get(‘json’, {})}”) else: print(f“Request failed with status: {response.status_code}“)

except FlareProxError as e: print(f“FlareProx error: {e}“) except Exception as e: print(f“Request error: {e}”)

</details>

**Burp/Scanner integration**
- Wskaż narzędzia (np. Burp Suite) na Worker URL.
- Podaj rzeczywisty upstream za pomocą ?url= lub X-Target-URL.
- Semantyka HTTP (methods/headers/body) jest zachowana przy jednoczesnym maskowaniu twojego adresu IP źródłowego za Cloudflare.

**Operational notes and limits**
- Cloudflare Workers Free plan pozwala na około 100 000 żądań/dzień na konto; użyj wielu endpointów, aby rozłożyć ruch w razie potrzeby.
- Workers działają w sieci Cloudflare; wiele celów zobaczy jedynie Cloudflare IPs/ASN, co może obejść naiwną listę dozwolonych/odrzuconych IP lub heurystyki geolokalizacyjne.
- Używaj odpowiedzialnie i tylko za autoryzacją. Szanuj ToS i robots.txt.

## Referencje
- [FlareProx (Cloudflare Workers pass-through/rotation)](https://github.com/MrTurvey/flareprox)
- [Cloudflare Workers fetch() API](https://developers.cloudflare.com/workers/runtime-apis/fetch/)
- [Cloudflare Workers pricing and free tier](https://developers.cloudflare.com/workers/platform/pricing/)
- [FireProx (AWS API Gateway)](https://github.com/ustayready/fireprox)

> [!TIP]
> Ucz się & ćwicz 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;">\
> Ucz się & ćwicz 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;">\
> Ucz się & ćwicz 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>Wspieraj HackTricks</summary>
>
> - Sprawdź [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Dołącz do** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) lub [**telegram group**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Podziel się hacking tricks, zgłaszając PRy do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>