Nota de la traduccion en al Español: Primero que nada, una traduccion de un documento es mucho muy dificil, ya que muchos terminos son dificiles de interpretar de un idioma a otro. Hay que notar que el idioma al que se tradujo este documento es Español Mexicano, de Baja California Norte (por si tienen algunas dudas de los modismos o chistes idiomaticos). Otro detalle son los acentos. Como es altamente tedioso hacer algo como eso, no lo hice. Si alguien lo quiere hacer por mi, o tiene algun comentario o mejora para este articulo, favor de contactarme a mabs&at&hotmail.com Esta traduccion se hizo por parrafos, por enunciados completos, asi que si tienen alguna duda de que significa algun termino, consultar la version en Ingles, parrafo por parrafo, enunciado por enunciado y veran los terminos originales que intente traducir. Aqui hay algunas de la palabras que fueron dificiles de traducir y mas bien se "interpretaron". fingerprinting: Esto se refiere a identificacion por medio de huellas digitales o de los dedos. Lo interprete como identificacion la mayor parte de las veces. fingerprint: la "huella" digital en si. snapshot: imagen de algo en un instante determinado. La traduje como imagen. puede tambien ser una "vista" o panorama. crash: se dice de cuando un programa deja de funcionar de manera anormal. Aqui lo interprete como "deternerse". download: bajar de la red. host: maquina, anfitrion, computadora que a la que se puede hacer una conexion. release: version por lo regular lo suficientemente estable como para que la use el publico en general. Traducido como programa algunas veces. banner: anuncio a gran escala de algo, generalmente un letrero que indica algun tipo de informacion. Traducido como "letrero". SO: sistema operativo. owned, own: dicese algunas veces del hecho de tener privilegios de root, o ganarlos. Se interpreta como "comer el mandado", "caminar". scratch space: generalment un espacio temporal para escribir y borrar cosas que no tienen importancia o mientras se genera una idea. se tradujo como "espacio para rayar". checksum: suma de control. No se si alguien lo maneje asi o si la mayoria de la gente en computacion lo use como checksum. dropped: cuando un paquete de datos se deja de transmitir por una red ya sea por que se le acabo su tiempo de vida o alguna otra causa. Lo traduje como "soltado" en la mayoria de los casos. lame: gacho, malo, en este caso lo interprete como "maleta". Deteccion Remota de SO via Reconocimiento de Pila TCP/IP por Fyodor <[email protected]> (insecure.org) Escrito: Octubre 18, 1998 Ultima Modificacion: Abril 10, 1999 [French Translation by Arhuman <arhuman&at&francemel.com>] [Portuguese Translation by Frank Ned <frank&at&absoluta.org>] [Italian Translation by Rige <rigel&at&penguinpowered.com>] [Russian Translation by Alex Volkov <alex&at&nmap.ru>] [Spanish Translation by Marco Barbosa <mabs&at&hotmail.com>] Este documento puede ser distribuido libremente. La copia mas reciente debe estar disponible en http://nmap.org/nmap-fingerprinting-article.html RESUMEN Este documento discute como obtener informacion valiosa sobre una maquina consultando su pila de TCP/IP. Primero presento algunos de los metodos "clasicos" para determinar el SO de una maquina, que no requieren identificacion de la pila. Despues describo las herramientas actuales mas novedosas para identificacion de pila. Despues viene una descripcion de muchas tecnicas para hacer hacer que la maquina remota gotee informacion sobre si misma. Finalmente, detallo mi (nmap) implantacion de esto, seguido de una imagen obtenido de nmap que nos dice que SO estan corriendo en muchos sitios populares de Internet. RAZONES Pienso que la utilidad de determinar que SO esta corriendo un sistema es bastante obvia, asi que hare esta seccion corta. Una de los ejemplos mas fuertes de esta utilidad es que muchos hoyos de seguridad son dependientes de la version del SO. Digamos que estas haciendo una prueba de penetracion y encuentras el puerto 53 abierto. Si esta es una version vulnerable del Bind, solo tienes una oportunidad de explotarlo ya que un intento fallido detendra el demonio. Con un buen identificador de TCP/IP, rapidamente sabras que esta maquina esta corriendo "Solaris 2.51" o "Linux 2.0.35" y puedes ajustar to codigo shell de acuerdo a esto. Una posibilidad aun peor, es alguien que desee escanear 500,000 maquinas con anticipacion para ver que SO's estan corriendo y que puertos estan abiertos. Despues cuando alguien publica (digamos) un hoyo para root en el demonio comsat de Sun, nuestro pequeño cracker podria hacer un grep a su lista para obtener "UDP/512" y "Solaris 2.6" e inmediatamente tiene paginas y paginas de maquinas root-ables. Debe notarse que esto es comportamiento de un MOCOSO SCRIPT. No se ha demostrado ninguna habilidad y nadie se impresionara por que haya encontrado algun .edu vulnerable que no haya parchado el hoyo a tiempo. Ademas, la gente estara aun menos impresionada si se utiliza su recien encontrado acceso para desacrar el sitio-web del departamento con un monumento anunciando lo cabron que es y lo estupidos que deben ser los administradores del sistema. Otro uso posible es para ingenieria social. Digamos que estas escaneando tu compañia objetivo y nmap reporta un 'Datavoice TxPORT PRISM 3000 T1 CSU/DSU 6.22/2.06'. El hacker puede llamar como 'Soporte de Datavoice' y discutir algunos asuntos sobre su PRISM 3000. "Vamos a anunciar un hoyo de seguridad pronto, pero primero queremos que todos nuestros clientes actuales instalen el parche -- se lo acabo de enviar por correo..." Algunos administradores ingenuos podrian asumir que solo un ingeniero autorizado de Datavoice podria sabar tanto de su CSU/DSU. Otro uso potencial para esta capacidad es evaluacion de compañias con las que podria hacer negocios. Despues de seleccionar un ISP, escanealos para ver que equipo usan. Esos tratos de "$99/año" no suena tan buenos cuando se entera que tienen enrutadores chafas y ofrecen servicios PPP de una bola de cajas Windows. TECNICAS CLASICAS La identificacion de pila resuelve el problema de identificar un SO de manera unica. Yo pienso que esta tecnica tiene el mayor futuro, pero hay en la actualidad muchas otras soluciones. Tristemente, esta es aun una de mas efectivas de estas tecnicas: playground~> telnet hpux.u-aizu.ac.jp Trying 163.143.103.12 ... Connected to hpux.u-aizu.ac.jp. Escape character is '^]'. HP-UX hpux B.10.01 A 9000/715 (ttyp2) login: No vale la pena pasar por todo el procedimiento de indentificacion si la maquina anunciara despreocupadamente al mundo exactamente que es lo que esta corriendo! Tristemente, muchos vendedores envian sistemas actuales con este tipo de letreros y muchos administradores no los quitan. Solo porque hay otras maneras de averiguar que SO se esta corriendo (como identificacion), no quiere decir que vamos a anunciar nuestro SO y arquitectura a todo tarugo que trate de conectarse. El problema con depender de esta tecnica es que un numero creciente de gente esta quitando los letreros, muchos systems no dan mucha informacion, y es trivial que alguien "mienta" en sus letreros. Sin embargo, lectura de letreros es todo lo que obtienes si gastas $miles en el escaner ISS comercial. Baja nmap o queso y ahorra tu dinero :). Aun si quitas los banners, muchas aplicaciones felizmente regalaran este tipo de informacion cuando se les pregunte. Por ejemplo veamos a un servidor FTP: payfonez> telnet ftp.netscape.com 21 Trying 207.200.74.26 ... Connected to ftp.netscape.com. Escape character is '^]'. 220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready. SYST 215 UNIX Type: L8 Version: SUNOS Primero que nada, nos da detalles del sistema en su letrero por omision. Despues si le damos el comando 'SYST', felizmente nos regresa aun mas informacion. Si soporta FTP anonimo, muchas veces podemos bajar /bin/ls u otros binarios y determinar para que arquitectura fueron construidos. Muchas otras aplicaciones tambien dan informacion gratis. Toma los servidores web por ejemplo: playground> echo 'GET / HTTP/1.0\n' | nc hotbot.com 80 | egrep '^Server:' Server: Microsoft-IIS/4.0 playground> Hmmm ... me pregunto que SO estan corriendo esos maletas. Otras tecnicas clasicas incluyen registros de informacion del anfitrion DNS (raramente efectivos) y ingenieria social. Si la maquina esta escuchando 161/udp (snmp), casi se te garantiza una bola de informacion detallada usando 'snmpwalk' de la distribucion de herramientas de CMU SNMP y el nombre comunitario 'public'. PROGRAMAS DE IDENTIFICACION ACTUALES Nmap no es el primer programa de reconocimiento de SO que usa identificacion de TCP/IP. El spoofer para IRC sirc de Johan ha incluido tecnicas de identificacion muy primitivas desde la version 3 (o anteriores). Intenta colocar un anfitrion en las classes "Linux", "4.4BSD", "Win95", o "Desconocido" usando una cuantas pruebas simples de banderas de TCP. Otro programa asi es checkos, hecho publico en Enero de este año por Shok en el numero 7 de Confidence Remains High. Las tecnicas de identificacion son exactamente las mismas que las de SIRC, y aun el codigo es identico en muchos lugares. Checkos ya era disponible privadamenta por mucho tiempo antes de su puesta al publico, asi que no tengo idea quien le copio codigo a quien. Pero ninguno parece darle credito al otro. Algo que checkos agrega, es el chequeo de letrero de telnet, que es util, pero tiene los problemas descritos con anterioridad. [Actualizacion: Shok escribio para decir que no se tenia la intencion de hacer checkos publico y por esto no se molesto en darle credito a SIRC por algunas partes del codigo.] Su1d tambien escribio un programa para checar SO's. El suyo se llama SS y a partir de la version 3.11 puede identificar 12 diferentes tipos de SO's. Yo soy un tanto parcial hacia este ya que le da credito a mi nmap por unas partes del codigo interconexion :). Despues, esta queso. Este programa es el mas nuevo y es una gran salto hacia enfrente de los otros programas. No solo introducen un par de pruebas novedosas, sino que fueron los primeros (que yo he visto) en mover las "huellas" fuera de el codigo. Los otros escaners incluyeron codigo como: /* from ss */ if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) && (flagsthree & TH_ACK)) reportos(argv[2],argv[3],"Livingston Portmaster ComOS"); En su lugar, queso pone esto en un archivo de configuracion, que obviamente es mejor para incrementar y hace que poner otro SO sea tan facil como agregar unas cuantas lineas a un archivo de "huellas" . Queso fue escrito for Savage, uno de los buenos tipos de Apostols.org . Un problema con todos los programas descritos arriba es que estan muy limitados en el numero de pruebas de identificacion que limita la granularidad de las respuestas. Yo quiero saber mas que solo 'esta maquina es OpenBSD, FreeBSD, NetBSD', yo deseo saber exactamente cual de esas es asi como una idea de el numero de version de el programa. De la misma manera, preferiria ver 'Solaris 2.6' que simplemente 'Solaris'. Para obtener esta granularidad en las respuestas, yo trabaje en un numero de tecnicas de identificacion que se describen en la siguiente seccion. METODOLOGIA DE IDENTIFICACION Hay muchas, muchas tecnicas que pueden ser usadas para identificar pilas de interconexion. Basicamente, solo buscas cosas que difieran entre los sistemas operativos y escribes una prueba para la diferencia. Si combinas suficientes de estas, puedes aislar el SO con gran exactitud. Por ejemplo nmap puede distinguir confiablemente Solaris 2.4 vs. Solaris 2.5-2.51 vs Solaris 2.6. Tambien puede identificar el kernel de Linux 2.0.30 del 2.0.31-34 o 2.0.35. Aqui hay algunas tecnicas: La prueba FIN -- Aqui mandamos un paquete FIN (o cualquier paquete sin una bandera ACK o SYN) a un puerto abierto y esperamos una respuesta. El comportamiento correcto del RFC793 es no responder, pero muchas implantaciones quebradas como MS Windows, BSDI, CISCO, HP/UX, MVS, e IRIX envian un RESET de regreso. Muchas de las herramientas actuales utilizan esta tecnica. La prueba de bandera MANIACA -- Queso es el primer escaner que he visto utilizar esta prueba inteligente. La idea es poner una "bandera" TCP (64 o 128) en el encabezado TCP de un paquete SYN. Las cajas Linux antes de 2.0.35 mantienen la bandera puesta en su respuesta. No he encontrado ningun otro SO que tenga este defecto. Sin embargo, algunos sistemas operativos parecen cancelar la conexion cuando reciben un paquete SYN+MANIACA. Este comportamiento podria ser util para identificarlos. Probar TCP ISN -- La idea aqui es encontrar patrones en los numeros de secuencia inicial seleccionados por las implantaciones de TCP al responder a solicitudes de conexion. Esto puede ser categorizado en muchos grupos como el tradicional 64K (muchos cajas UNIX viejas), incrementos aleatorios (nuevas versiones de Solaris, IRIX, FreeBSD, Digital UNIX, Cray, y muchas otras), "Aleatoriedad" verdadera (Linux 2.0.*, OpenVMS, AIX mas nuevos, etc). Cajas Windows (y unas cuantas mas) usan un modelo "dependiente del tiempo" donde el ISN se incrementa por una pequeña cantidad estatica cada periodo de tiempo. Sin necesidad de decirlo, esto se vence tan facilmente como el viejo comportamiento de 64K. Claro que mi tecnica favorita es la "constante". Las maquinas SIEMPRE usan exactamente el mismo ISN. :). He visto esto en algunos hubs 3com (usan 0x803) y en impresoras Apple LaserWriter (usan 0xC7001). Tambien puedes subdividir grupos tales como incremento aleatorio por varianzas computacionales, maximos comunes divisores, y otras funciones en el conjunto numeros de secuencia y las diferencias entre los numeros. Debe notarse que la generacion de ISN tiene implicaciones de seguridad importantes. Para mas informacion de esto, contactar al "experto en seguridad" Tsutomu "Shimmy" Shimomura en SDSC y preguntenle como se lo "caminaron". Nmap es el primer programa que he visto que usa esto para identificacion de SO. Bit de No-fragmentacion -- Muchos sistemas operativos estan empezando a poner el bit "no-fragmentacion" de IP en algunos paquetes que manda. Esto da varios beneficios de desempeño (aunque tambien puede se enfadoso -- por esto las exploraciones de fragmentacion de nmap no funcionan desde cajas Solaris). En cualquier caso, no todos los SO's hacen esto y algunos lo hacen en diferentes casos, asi que poniendo atencion a este bit podemos obtener aun mas informacion sobre el SO objetivo. Tampoco he visto esta antes. Ventana Inicial TCP -- Esto solo requiere checar el tamaño de la ventana de los paquetes regresados. Escaners mas viejos simplemente utilizan en una ventana no-zero un paquete RST para querer decir "derivado de BSD 4.4". Escaners mas nuevos como queso y nmap dan seguimiento a la ventana exacta, ya que es en realidad bastante constante segun el tipo de SO. De hecho esta prueba nos da mucha informacion, ya que algunos sistemas operativos pueden ser identificados de manera unica por la ventana en si (por ejemplo, AIX es el unico SO que he visto usa 0x3F25). En su pila TCP "completamente re-escrita" para NT5, Microsoft usa 0x402E. Interesantemente, ese es exactamente el numero usado por OpenBSD y FreeBSD. Valor ACK -- A pesar de que podria pensarse que esto seria completamente estandar, en algunos casos las implantaciones difieren en el valor que usan para el campo ACK. Por ejemplo, digamos que mandas un FIN|PSH|URG a un puerto TCP cerrado. La mayor parte de las implementaciones pondran el ACK igual que tu numero de sequencia inicial, pero Windows y algunas impresoras estupidas te mandaran tu secuencia + 1. Si mandas un SYN|FIN|URG|PSH a un puerto abierto, Windows es muy inconsistente. Algunas veces regresa tu secuencia, otras veces manda s++, aun otras veces regresa un valor aparentemente aleatorio. Uno tiene que preguntarse que tipo de codigo esta escribiendo MS que cambia su parecer de esta manera. Control de Error de Mensaje ICMP -- Algunos sistemas operativos (inteligentes) siguen la sugerencia RFC 1812 de limitar la cantidad en que diferentes mensjaes de error son mandados. Por Ejemplo, el kernel de Linux (en net/ipv4/icmp.h) limita la generacion de mensajes de destino inalcanzable a 80 en 4 segundos, con 1/4 de segundo de castigo si se sobrepasa ese limite. Una manera de probar esto es mandar una bola de paquetes a algun puerto UDP alto seleccionado al azar y contar el numero de inalcanzables recibidos. No he visto que esto se use antes, de hecho no he agregado esto a nmap (excepto para usarlo con escaneo de puertos UDP). Esta prueba haria la deteccion de SO un poco mas lenta ya que se necesita mandar un monton de paquetes y esperar a que regresen. Y tambien tomar en cuenta la posibilidad de que los paquetes sean "soltados" por la red seria una lata. Referenciacion de Mensaje ICMP -- Los RFCs especifican que los mensajes de error ICMP hacen referencia a una pequeña cantidad de un mensaje ICMP que provoca errores variados. Para un mensaje de puerto inalcanzable, casi todas las implementaciones mandan solo el encabezado IP requerido + 8 bytes de regreso. Sin embargo, Solaris regresa un poco mas y Linux regresa aun mas que eso. La belleza de esto es que permite a nmap identificar a maquinas Linux y Solaris aun cuando no tengan ningun puerto escuchando. Eco de Integridad de Mensajes de Error ICMP -- Obtuve esta idea de algo que Theo de Raadt (desarrollador principal de OpenBSD) publico en comp.security.unix. Como se ha mencionado antes, las maquinas tienen que regresar parte de tu mensaje original junto con un error de puerto inalcanzable. Y aun otras maquinas tienden a usar tus encabezados como 'espacio para rayar' durante su procesamiento inicial, asi que estan un tanto alterados cuando te los regresan. Por ejemplo, AIX y BSDI regresan un campo 'longitud total' de IP que es 20 bytes demasiado grande. Algunos BSDI, FreeBSD, OpenBSD, ULTRIX, y VAXen desmadran el ID del IP que les mandaste. Mientras la suma de control va a cambiar debido que se cambia el TTL de todas formas, hay algunas maquinas (AIX, FreeBSD, etc.) que regresan una suma de control inconsistente o de 0. Lo mismo sucede con el suma de control UDP. Al final, nmap hace nueve diferentes pruebas de errores ICMP para "oler" diferencias sutiles como estas. Tipo de Servicio -- Para los mensajes de inalcanzable del puerto ICMP me fijo al valor del tipo de servicio (TOS) en el paquete que regresan. Casi todas las implantaciones usan 0 para este error ICMP, aunque Linux usa 0xC0. Esto no indica uno de los valores TOS estandar, pero en vez de eso, es parte del campo de precedencia (AFAIK) que no es usado. No se porque se pone asi, pero si cambian a 0 podremos seguir identificando las versiones anteriores y podrems identificar entre anteriores y recientes. Manejo de Fragmentacion -- Esta es una tecnica favorita de Thomas H. Ptacek de Secure Networks, Inc (ahora propiedad de una bola de usuarios de Windows en NAI). Esto se aprovecha del hecho de que diferentes implantaciones seguido manejan fragmentos IP con translape de manera diferente. Algunos sobreescribiran las viejas porciones con las nuevas, y en otros casos las cosas viejas tiene precedencia. Hay muchas pruebas diferentes que se pueden usar para determinar como el paquete fue reensamblado. No agregue esta caracteristica ya que no conozco ninguna manera portable para mandar fragmentos de IP (esta particularmente perron en Solaris). Para mas informacion sobre fragmentos translapados, pueden leer este articulo IDS (www.secnet.com). Opciones TCP -- Estos son una verdadera mina de oro en terminos de fugas de informacion. La belleza de estas opciones es que: 1) son generalmente opcionales (Doh!) :) asi que no todas las maquinas las implantan. 2) Sabes si una maquina las implanta mandando una solicitud con una opcion definida. El objetivo generalmente muestra que soporta la opcion poniendola tambien en la respuesta. 3) Puedes retacar una bola de opciones en un paquete para probar todo al mismo tiempo. Nmap manda estas opciones en casi todos los paquetes de prueba: Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops; Cuando obtienes una respuesta, miras que opciones te regresaron y por lo tanto son soportadas. Algunos sistemas operativos como cajas FreeBSD recientes soportan todas las anteriores, mientras otras, como las Linux 2.0.X soportan muy pocas. Los kernels Linux 2.1.x mas recientes soportan todas la anteriores. Por otro lado, son mas vulnerables a prediccion de secuencia TCP. Imaginense. Aun si varios sistemas operativos soportan las mismas opciones, se pueden distinguir algunas veces por los valores de las opciones. Por ejemplo, si mandas un valor MSS pequeño a una caja Linux, generalmente te hara un eco con ese MSS de regreso. Otras maquinas te daran un valor diferente. Y aun si obtienes el mismo conjunto de opciones soportadas Y los mismos valores, aun puedes diferenciar por el orden en que las opciones son dadas, y donde se pone relleno. Por ejemplo Solaris regresa 'NNTNWME' que significa: <no op><no op><timestamp><no op><window scale><echoed MSS> Mientras que Linux 2.1.122 regresa MENNTNW. Mismas opciones, mismos valores, pero diferente orden! No he visto ningunas otras herramientas para deteccion de SO que utilice opciones TCP, pero es muy util. Hay otras cuantas opciones utiles para las que podria probar en algun momento, como aquellas que soportan T/TCP y reconocimientos selectivos. Cronologia de Explotacion -- Aun con todas la pruebas anteriores, nmap es incapaz de distinguir entre las pilas TCP de Win95, WinNT, o Win98. Esto es algo sorprendente, especialmente ya que Win98 salio como 4 años despues que Win95. Pensarias que se habrian preocupado en mejora la pila de alguna manera (como soportar mas opciones TCP) y de esta manera podriamos detectar el cambio y distinguir entre los sistemas operativos. Desafortunadamente este no es el caso. La pila NT es aparentemente la misma mugre pila que pusieron en el '95. Y no se molestaron en actualizarla para el '98. Pero no desesperes, ya que hay una solucion. Puedes simplemente empezar con antiguos ataques para Windows DOS (Ping of Death, WinNuke, etc) y despues cambiar un poco mas arriba a ataques como Teardrop y Land. Despues de cada ataque, hacer un ping para ver si tronaron. Cuando finalmente los truenes, ya habras deducido la la version que estan corriendo, e incluso hasta de paquete o parche. No he agregado esta funcion a nmap, aunque debo admitir que es muy tentador :). Resistencia a Inundacion de SYN -- Algunos sistemas operativos dejan de aceptar nuevas conexiones si les mandas demasiados paquetes SYN falsificados (falsificar los paquetes impide que tu kernel corte las conexiones). Muchos sistemas operativos pueden solo manejar 8 paquetes. Kernels recientes de Linux (entre otros sistemas operativos) permiten varios metodos, como cookies SYN para prevenir que esto se convierta en un problema serio. Asi que puedes aprender algo de tu SO objetivo al mandarle 8 paquetes de una fuentes falsificada a un puerto abierto y despues probando si puedes establecer una conexion a ese puerto tu mismo. Esto no fue implantado el nmap ya que algunas gentes se enojan cuando los inundas con SYN's. Aun explicando que solo tratabas de determinar que tipo de SO estan corriendo no ayudara a calmarlos. IMPLANTACION DE NMAP Y RESULTADOS He creado una implantacion de referencia para las tecnicas de deteccion de SO mencionadas arriba (excepto esas que dije estaban excluidas). He agregado esto a mi escaner Nmap que tiene la ventaja de que ya sabe que puertos estan abiertos y cerrados para identificacion asi que no tienes que decirle. Tambien es portable entre Linux, *BSD, y Solaris 2.51 y 2.6, y algunos otros sistemas operativos. La nueva version de nmap lee un archivo lleno con los esqueletos de las huellas que siguen una gramatica simple. Aqui hay un ejemplo: Huella IRIX 6.2 - 6.4 # Gracias a Lamont Granquist FingerPrint IRIX 6.2 - 6.4 # Thanks to Lamont Granquist TSeq(Class=i800) T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT) T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=) T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT) T4(DF=N%W=0%ACK=O%Flags=R%Ops=) T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=) T6(DF=N%W=0%ACK=O%Flags=R%Ops=) T7(DF=N%W=0%ACK=S%Flags=AR%Ops=) PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) Miremos la primera linea (Estoy agregando marcadores '>'): > Huella IRIX 6.2 - 6.3 # Gracias a Lamont Granquist Esto dice simplemente que la huella cubre las versiones 6.2 y 6.3 de IRIX y el comentario dice que Lamont Grandquist amablemente me mando la direccion IP o la huella de las cajas IRIX probadas. > TSeq(Class=i800) Esto significa que un muestreo ISN lo puso en la clase "i800". Esto significa que cada nueva secuencia de numeros es un multiplo de 800 mayor que el ultimo. > T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT) La prueba se llama T1 (por test1 en Ingles, listo eh?). En esta prueba mandamos un paquete SYN con una bola de opciones TCP a un puerto abierto. DF=N significa que el bit "no fragmentacion" de la respuesta debe estar puesto. W=C000|EF2A quiere decir que el anuncio de ventana que recibimos deber ser 0xC000 o EF2A. ACK=S++ quiere decir que el reconocimiento que recibimos debe ser nuestra secuencia inicial mas 1. Flags = AS quiere decir que las banderas ACK y SYN fueron mandadas en la respuesta. Ops= MNWNNT quiere decir que las opciones en la respuesta deben ser (en este orden): <MSS (not echoed)><NOP><Window scale><NOP><NOP><Timestamp> > T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=) La prueba 2 involucra a un NULL con las mismas opciones a un puerto abierto. Resp=Y significa que debemos obtener una respuesta. Ops= significa que no debe haber ningunas opciones incluidas en el paquete respuesta. Si quitaramos '%Ops=' completamente, entonces cualesquier opciones mandadas corresponderian. > T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M) La prueba 3 es un SYN|FIN|URG|PSH con opciones a un puerto abierto. > T4(DF=N%W=0%ACK=O%Flags=R%Ops=) Esta es un ACK a un puerto abierto. Notar que no tenemos un Resp= aqui. Esto significa que la falta de respuesta (como el paquete que haya sido "soltado" por la red o un firewall malevolo) no descalificara correspondecia mientras todas las otras pruebas correspondan. Hacemos esto porque virtualmente cualquier SO mandara una respuesta, asi que la falta de esta es generalmente un atributo de las condiciones de la red y no de el SO en si. Ponemos la etiqueta de Resp en las pruebas 2 y 3 porque algunos sistemas operativos si "suelta" esos sin responder. > T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=) > T6(DF=N%W=0%ACK=O%Flags=R%Ops=) > T7(DF=N%W=0%ACK=S%Flags=AR%Ops=) Estas pruebas son SYN, ACK, y FIN|PSH|URG, respectivamente, a un puerto cerrado. Las mismas opciones estan puestas, como siempre. Claro que esto es probablemente obvio dado los nombres descriptivos 'T5', 'T6' y 'T7' :). > PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) Este grandulon es la prueba de mensaje de 'puerto inalcanzable'. Ya deberias reconocer el DF=N a estas alturas. TOS=0 significa que el campo de tipo de servicio IP era 0. Los siguientes dos campos dan los valores (hex) del campo de longitud total de IP del encabezado IP del mensaje y la longitud total dada en el encabezado IP que nos regresan por eco a nosotros. RID=E significa que el valor RID que obtuvimos en la copia de nuestro paquete UDP original se esperaba (por ejemplo el mismo que mandamos). RIPCK=F significa que no fregaron la suma de control (si lo hicieron, diria RIPCK=F). UCK=E significa que la suma de control UDP tambien esta correcta. Despues viene la longitud UDP que era 0x134 y DAT=E significa que hicieron un eco de nuestro UDP correctamente. Ya que la mayoria de las implantaciones (incluyendo esta) no envian ninguno de nuestros datos UDP de regreso, obtienen DAT=E por omision. La version de nmap con esta funcionalidad esta actualmente en el 6to ciclo beta privado. Puede haber salido cuando lean esto en Phrack. Pero a lo mejor, tal vez no. Vean http ://insecure.org/nmap/ para la version mas reciente. VISTAS DE SITIOS POPULARES Aqui estan los divertidos resultados de nuestro esfuerzo. Ahora podemos tomar sitios de internet de manera aleatoria y determinar que tipo de SO estan usando. Mucha de esta gente ha eliminado los letreros telnet, etc. para tratar de mantener esta informacion privada. Pero esto no sirve de nada con nuestro nuevo identificador! Ademas esta es una buena manera de descubrir a los usuarios de <tu SO basura preferido> como los maletas que son :)! El comando usado en este ejemplo fue: nmap -sS -p 80 -O -v <host> Tambien noten que muchas de estas exploraciones fueron hechas el 18/10/98. Algunas de estas gentes pueden haber actualizado/cambiado sus servidores desde entonces. Notar que algunos sitios no me gustan. # sitios "Hacker" o (en un par de casos) sitios que piensan que son www.l0pht.com => OpenBSD 2.2 - 2.4 insecure.org => Linux 2.0.31-34 www.rhino9.ml.org => Windows 95/NT # sin comentario :) www.technotronic.com => Linux 2.0.31-34 www.nmrc.org => FreeBSD 2.2.6 - 3.0 www.cultdeadcow.com => OpenBSD 2.2 - 2.4 www.kevinmitnick.com => Linux 2.0.31-34 # liberen a Kevin! www.2600.com => FreeBSD 2.2.6 - 3.0 Beta www.antionline.com => FreeBSD 2.2.6 - 3.0 Beta www.rootshell.com => Linux 2.0.35 # Cambiaron a OpenBSD despues de que # se los caminaron. # Proveedores, consultores de seguridad, etc. www.repsec.com => Linux 2.0.35 www.iss.net => Linux 2.0.31-34 www.checkpoint.com => Solaris 2.5 - 2.51 www.infowar.com => Win95/NT # Lealtad de proveedores a su SO www.li.org => Linux 2.0.35 # Linux International www.redhat.com => Linux 2.0.31-34 # Me pregunto que distribucion:) www.debian.org => Linux 2.0.35 www.linux.org => Linux 2.1.122 - 2.1.126 www.sgi.com => IRIX 6.2 - 6.4 www.netbsd.org => NetBSD 1.3X www.openbsd.org => Solaris 2.6 # Ajem :) www.freebsd.org => FreeBSD 2.2.6-3.0 Beta # Ligas mayores www.harvard.edu => Solaris 2.6 www.yale.edu => Solaris 2.5 - 2.51 www.caltech.edu => SunOS 4.1.2-4.1.4 # Hola!! son los 90's :) www.stanford.edu => Solaris 2.6 www.mit.edu => Solaris 2.5 - 2.51 # Coincidencia que tantas buenas # escuelas parecen gustar de Sun? # Tal vez sea el 40 % # de descuento a .edu :) www.berkeley.edu => UNIX OSF1 V 4.0,4.0B,4.0D www.oxford.edu => Linux 2.0.33-34 # Rock on! # Sitios mas maletas www.aol.com => IRIX 6.2 - 6.4 # Ahora sabemos por que son tan inseguros :) www.happyhacker.org => OpenBSD 2.2-2.4 # Te cansaste de que te caminaran Carolyn? # hasta el SO mas seguro es # inutil en las manos de un # admin incompetente. # Misc www.lwn.net => Linux 2.0.31-34 # Este sitio de noticias Linux rocks! www.slashdot.org => Linux 2.1.122 www.whitehouse.gov => IRIX 5.3 sunsite.unc.edu => Solaris 2.6 Notas: En su articulo de seguridad, Microsoft dijo sobre su seguridad relajada: "esta suposicion ha cambiado con el paso de los años mientras Windows NT gana popularidad vastamente por sus caracteristicas de seguridad.". Hmm, desde donde yo estoy no parece que Windows sea muy popular con la comunidad de seguridad :). Solo veo dos cajas Windows de todo el grupo, y Windows es facil para nmap de distinguir ya que esta bien quebrado (en lo referente a estandares). Y desde luego, hay un sitio mas que debemos checar. Este es el sitio web de la corporacion ultra-secreta Transmeta. De manera interesante la compañia fue fundada en gran parte por Paul Allen de Microsoft, pero emplea a Linus Trovalds. Asi que se quedan con Paul y corren NT o se unen con los rebeldes y se hacen parte de la revolucion Linux? Veamos: Usamos el comando: nmap -sS -F -o transmeta.log -v -O www.transmeta.com//24 Esto dice se revise con SYN los puertos conocidos (de /etc/services), se guarden los resultados en 'transmeta.log', siendo verbosos al respecto, hacer un chequeo de SO, y revisar la subred clase 'C' donde www.transmeta.com reside. Aqui estan los resultados: neon-best.transmeta.com (206.184.214.10) => Linux 2.0.33-34 www.transmeta.com (206.184.214.11) => Linux 2.0.30 neosilicon.transmeta.com (206.184.214.14) => Linux 2.0.33-34 ssl.transmeta.com (206.184.214.15) => Linux unknown version linux.kernel.org (206.184.214.34) => Linux 2.0.35 www.linuxbase.org (206.184.214.35) => Linux 2.0.35 ( posiblemente la misma maquina de arriba ) Bueno, creo que esto contesta a nuestra pregunta de manera clara :). AGRADECIMIENTOS La unica razon por la que Nmap puede detectar tantos sistemas operativos actualmente es que mucha gente del equipo beta privado puso mucho esfuerzo para buscar nuevas y excitantes cajas para identificar! En particular, Jan Koum, van Hauser, Dmess0r, David O'Brien, James W. Abendschan, Solar Designer, Chris Wilson, Stuart Stock, Mea Culpa, Lamont Granquist, Dr. Who, Jordan Ritter, Brett Eldridge, y Pluvius mandaron toneladas de direcciones IP de cajas raras y/o huellas de maquinas no alcanzables desde la Internet. Gracias a Richard Stallman por escribir GNU Emacs. Este articulo no estaria tan bien acomodado si estuviera usando vi o cat y ^D. Preguntas o comentarios pueden ser mandados a [email protected] (en ingles!) (si eso no funciona por alguna razon, usar [email protected] ). Nmap puede ser obtenido de http://insecure.org/nmap .