Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

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 тоже работает :)). В этом коде придется разбираться самому, благо это не трудно (см. листинг на нашем диске).

Назад на стр. 091-128-1  Содержание  Вперед на стр. 091-128-3