Identificación del sistema remoto

Técnicas clásicas

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 indentificación si la máquina 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. Sólo porque hay otras maneras de averiguar que SO se esta corriendo, no quiere decir que vamos a anunciar nuestro SO y arquitectura a todo tarugo que trate de conectarse.

El problema con depender de esta técnica es que un numero creciente de gente está quitando los letreros, muchos sistemas no dan mucha información, y es trivial que alguien "mienta" en sus letreros.

Aun si quitas los banners, muchas aplicaciones felizmente regalaran este tipo de información 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 nos dá detalles del sistema en su letrero por omision. Despues si le damos el comando 'SYST', felizmente nos regresa aun mas información.

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 información 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>

Otras tecnicas clásicas incluyen registros de información del anfitrión DNS (raramente efectivos) e ingenieria social. Si la maquina está escuchando 161/udp (snmp), casi se te garantiza muchísima información detallada usando 'snmpwalk' de la distribucion de herramientas de CMU SNMP y el nombre comunitario 'public'.

Programas de identificación 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.

Las tecnicas de identificacion son exactamente las mismas que las de SIRC, y aun el codigo es identico en muchos lugares. Checkos ya estaba disponible privadamente por mucho tiempo antes de su puesta al publico, asi que no se sabe quién copió código a quién. Pero ninguno parece darle crédito al otro. Algo que checkos añade, es el chequeo del letrero de telnet, que es útil, pero tiene los problemas descritos con anterioridad.

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.

Despues, está queso. Este programa es el mas nuevo y es una gran salto hacia delante sobre 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. En su lugar, queso pone la información sobre las pruebas a los OS 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" .

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. No sirven si queremos saber mas que solo 'esta máquina es OpenBSD, FreeBSD, NetBSD', si queremos saber exactamente cuál de esas és, así como una idea de el numero de versión de el programa. De éste modo, sería preferible ver 'Solaris 2.6' que simplemente 'Solaris'.

Para obtener esta granularidad en las respuestas se trabajó en un numero de tecnicas de identificación que se describen en la siguiente sección.

Metodología de identificación

Hay muchas, muchas técnicas que pueden ser usadas para identificar pilas TCP/IP. Básicamente, solo buscas cosas que difieran entre los sistemas operativos y escribes una prueba para la diferéncia. Si combinas suficientes pruebas, 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. También puede identificar el kernel de Linux 2.0.30 del 2.0.31-34 o 2.0.35.

Aquí hay algunas técnicas:

Implantación de nmap y resultados

nmap 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:

Fuentes:

http://www.insecure.org/nmap/