Seguridad en internet los puertos y comunicaciones - DetectViruS
Siempre que alguien me pide que explique qué es un puerto lo hago con un símil: imaginemos una casa; en una casa tenemos puertas y ventanas que solemos tener cerradas si no queremos que se nos cuelen ladrones. Ahora, imaginemos que en los bajos de nuestra casa tenemos una tienda. Necesitaremos, entonces, tener la puerta de la
calle abierta, para que entre gente y compre. Pues en informática, los puertos serían las ventanas y puertas nuestra casa, es decir, servicios que ofrecemos y que normalmente utilizamos para comunicarnos, bien internamente (localhost) o bien externamente. En informática localhost, se refiere habitualmente a nuestra propia maquina o sistema, es decir, y aunque suene paradójico, localhost se refiere a la red formado por un solo equipo, el nuestro y es que el Sistema Operativo suele crear puertos que habilitan la comunicación de procesos entre sí exclusivos para nuestro propio equipo
Alguien interesado en robar en nuestra casa lo primero que revisará son posibles entradas a través de puntos que estén abiertos. En un PC es lo mismo: lo primero que hará un intruso es revisar qué puertos tenemos y qué hay detrás de esos puertos.
En nuestro anterior ejemplo, teníamos una tienda abierta en los bajos de nuestra casa; un posible ladrón, se fijaría en las medidas de seguridad que tiene esa tienda y si encuentra alguna debilidad la explotará para intentar colarse y robarnos. En nuestro PC detrás de los puertos abiertos, siempre hay “tiendas” que solemos denominar servicios, y lo que haría nuestro posible intruso es lo mismo que en una casa: fijarse en los puntos débiles de ese servicio para intentar explotarlos y colarse en nuestro PC.
En todo Sistema Operativo se abren unos puertos por defecto que el sistema utiliza para intercomunicar los diferentes procesos entre sí, es decir, que si no utilizamos medidas tendremos las puertas de nuestra casa abiertas de par en par. ¿Y que hacemos para cerrar esos puertos? Es obvio que en nuestra casa las cerramos con llave y solucionado. Pues en un PC lo mismo, utilizamos un firewall o cortafuegos que impide que los diferentes procesos que están a la espera de establecer alguna conexión en esos puertos se comuniquen con procesos externos a nuestra máquina.
2. EL COMANDO NETSTAT
En este punto cabe preguntarse cómo saber los puertos que tienen algún proceso escuchando en nuestra máquina y si podemos determinar los servicios que se ejecutan detrás de ellos. Pues bien, todos los Sistemas Operativos, o al menos los que yo conozco, proveen un método para averiguar todo esto, y es el comando “netstat”.
Este comando quizás sea desconocido para muchos pero es una interesante herramienta para poder determinar nuestras conexiones tanto internas (localhost) como externas.
Para trabajar con esta herramienta utilizaremos, nuestro querido “símbolo de sistema”, es decir, iremos a inicio/ejecutar y teclearemos la orden cmd.exe, esto nos abrirá una pantalla negra, en nuestro WinXP
El comando netstat dispone de una completa ayuda que podremos obtener tecleando la orden netstat /?. Esto nos proporcionará un listado con todos los parámetros o modificadores disponibles con el que podremos lanzar la herramienta netstat,
Algunos de los modificadores más populares para trabajar con este comando en Sistemas Operativos con núcleo NT son:
a – que nos va a mostrar todas las conexiones que tenemos a nuestros diferentes puertos.
n – si omitimos este parámetro por defecto, netstat nos ofrecerá el resultado de traducir la dirección remota y el puerto de números a nombres, si lo incluimos nos mostrará esta misma información pero en formato númerico.
o – muestra el identificador númerico del proceso que esta ejecutándose en este puerto.
El parámetro “o” la verdad es que ha perdido algo de popularidad con la introducción del SP2 de Windows XP, ya que este muestra los procesos que se están ejecutando detrás de un determinado puerto de forma mucho más cómoda. Los parámetros añadidos por este Service Pack son:
b – que muestra el ejecutable que está escuchando en el puerto en cuestión.
v – que muestra todos los componentes que están implicados con el ejecutable que escucha en el puerto, es decir, que suele ser utilizado con el anterior parámetro.
Los modificadores de Netstat no suelen requerir ser escritos en un orden preciso, así que podemos teclearlos como más cómodo nos sean. La siguiente orden combinaría los parámetros A, O y N. Es decir nos mostraría todas las conexiones en formato numérico y agregaría el número de ID del proceso que está ejecutándose en ese puerto,
Netstat –noa
Pero en realidad, podemos combinar las letras de los modificadores como mejor nos venga en gana y su función será la misma, es decir que todas estas órdenes son equivalentes:
Netstat –ano (yo lo suelo teclear de esta forma, puesto que lo recuerdo mejor)
Nestat – ona
Nestat – oan
En fin, que podemos permutar las letras de los modificadores a nuestro gusto. Ahora toca interpretar los resultados de netstat, una sálida típica de este comando introduciendo los parámetro “-ano” sería Proto Dirección local Dirección remota Estado P
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1296
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:18350 0.0.0.0:0 LISTENING 596
TCP 127.0.0.1:1025 127.0.0.1:1026 ESTABLISHED 472
TCP 127.0.0.1:1026 127.0.0.1:1025 ESTABLISHED 472
TCP 127.0.0.1:1032 127.0.0.1:18350 ESTABLISHED 400
TCP 127.0.0.1:1038 0.0.0.0:0 LISTENING 136
TCP 127.0.0.1:1045 127.0.0.1:1046 ESTABLISHED 1864
TCP 127.0.0.1:1046 127.0.0.1:1045 ESTABLISHED 1864
TCP 127.0.0.1:18350 127.0.0.1:1032 ESTABLISHED 596
TCP 192.168.1.100:139 0.0.0.0:0 LISTENING 4
TCP 192.168.1.100:1047 80.32.98.223:143 ESTABLISHED 1864
TCP 192.168.1.100:1056 65.17.220.40:143 ESTABLISHED 1864
TCP 192.168.1.100:1288 80.32.98.223:143 ESTABLISHED 1864
TCP 192.168.1.100:1893 62.57.8.8:119 ESTABLISHED 1864
TCP 192.168.1.100:1894 62.57.8.8:119 CLOSE_WAIT 1864
TCP 192.168.1.100:1922 62.57.8.8:119 ESTABLISHED 1864
TCP 192.168.1.100:1924 62.57.8.8:119 CLOSE_WAIT 1864
TCP 192.168.1.100:1943 212.34.136.130:80 TIME_WAIT 0
TCP 192.168.1.100:1944 212.34.136.130:80 TIME_WAIT 0
UDP 0.0.0.0:445 *:* 4
UDP 0.0.0.0:500 *:* 1060
UDP 0.0.0.0:1029 *:* 1612
UDP 0.0.0.0:1030 *:* 1612
UDP 0.0.0.0:1345 *:* 1612
UDP 0.0.0.0:4500 *:* 1060
UDP 127.0.0.1:123 *:* 1440
UDP 127.0.0.1:1900 *:* 1684
UDP 192.168.1.100:123 *:* 1440
UDP 192.168.1.100:137 *:* 4
UDP 192.168.1.100:138 *:* 4
UDP 192.168.1.100:1900 *:* 1684
2.1. Análisis de la salida del comando netstat
Analicemos la salida del comando que como vemos nos ofrece información en varias columnas: en la columna de más a la izquierda vemos la columna Proto, es decir el protocolo establecido para establecer la comunicación. Aquí fundamentalmente veremos tres tipos de protocolos: ICMP, UDP y TCP, y ¿esto qué es?, nos preguntaremos. Pues bien, siguiendo con el símil de nuestra tienda, imaginemos que tenemos una clientela que es internacional y habla diferentes idiomas. Si tratamos de ofrecer un buen servicio, deberemos hablarles preferiblemente en su idioma o bien en una lengua que ambos dominemos, por ejemplo el inglés. Los protocolos indican lo mismo y nos sirven para comunicar procesos entre si, pero de diferente manera.
UDP, Protocolo de datagrama de usuario (UDP, User Datagram Protocol) es un estándar y está definido en la RFC 768. UDP nos sirve para comunicar procesos entre sí de una forma rápida ya que no verifica la entrega. Imaginemos que mandamos a alguien a por el periódico, pero después no verificamos si lo ha comprado; UDP hace lo mismo: manda paquetes pero no verifica su correcta recepción. Este protocolo consta de los mismos 65535 puertos que antes hemos explicados. Si tenemos curiosidad en conocer los puertos utilizados por este protocolo podemos consultar el siguiente documento en el que vienen todos definidos.
http://www.isi.edu/in-notes/iana/assignments/port-numbers
TCP, Este protocolo, a diferencia del anterior, sí que verifica la correcta entrega. Es como si llamáramos por teléfono a alguien: no podremos hablar nunca con nuestro interlocutor si éste no nos coge el telefono. El protocolo TCP permite entrega de paquetes más largos que UDP y es también más lento, además con UDP no se establece comunicación entre host. Esto último es similar a cuando enviamos una carta: no hace falta verificar si la persona a la que remitimos nuestro correo está disponible en ese momento o no, simplemente la mandamos.
Por último tenemos el protocolo ICMP. Protocolo de control de mensajes Internet (ICMP, Internet Control Message Protocol), establece rutinas que permiten verificar el estado de un host. A través del popular comando “ping” utilizamos este protocolo. Siguiendo con los símiles, sería como preguntarle a alguien por la salud. ICMP, permite preguntar por la salud de un host o PC y saber su estado
Dirección Local, Aquí nos aparece el número de IP local que establece una comunicación de salida. Esto es lo mismo que los móviles: todos los móviles precisan tener un número asignado que es utilizado para establecer comunicaciones con él. Cuando nosotros llamamos a alguien tenemos comunicaciones salientes, y si nos llaman tenemos comunicaciones entrantes.
En la columna dirección local aparecen, por tanto, nuestro número identificativo. En la salida que he puesto de ejemplo, vemos diferentes números o IPs que definen diferentes procesos de comunicación. Por un lado tenemos la IP número 127.0.0.1. Esta IP se utiliza para que nuestro ordenador se comunique consigo mismo, es decir son comunicaciones internas o lo que hemos dado antes en denominar localhost. También vemos una dirección IP, que nos puede resultar algo extraña, pero que es utilizada en cualquier Sistema Operativo, ya que la IP 0.0.0.0 es la dirección de encaminamiento por defecto. Cualquier comunicación establecida hacia una red no conocida pasará por esta IP. En este punto sólo nos interesa saber que esta dirección corresponde también a nuestro equipo local y que es normal que aparezca en ese estado de listening y por norma general sin ninguna conexión establecida.
La siguiente dirección IP que observamos es la 192.168.1.100, esta también es una dirección IP reservada para uso público, y es utilizada normalmente en comunicaciones entre equipos de nuestra propia RED. Para ser exactos esa es la IP de la tarjeta de red de mi equipo que tiene salida a Internet y que está conectada con mi router, si tuviéramos salida directa a Internet en lugar de ver ese número de IP veríamos la dirección IP asignada por nuestro proveedor de Internet para que la gente sepa dónde estamos y poder establecer comunicaciones con nosotros. Siguiendo con el ejemplo del móvil, lo que veríamos ahí sería nuestro número de móvil.
La direcciones IP reservadas para uso público y utilizadas para establecer comunicaciones dentro de nuestra red, pueden pertenecer a tres rangos:
A 10.0.0.0 hasta 10.255.255.255
B 172.16.0.0 hasta 172.31.0.0
C 192.168.0.0 hasta 192.168.255.0
La columna que hay a continuación de la que ya hemos comentado es la de dirección remota. En esta columna vemos la dirección IP remota a la que estamos conectados, y vemos también que aparece la direccion correspondiente a localhost, es decir a nuestro propio equipo. Y también es normal, puesto que como he dicho antes nuestro Sistema Operativo utiliza esa IP para establecer comunicaciones entre procesos internos. Digamos que nuestro ordenador está hablando consigo mismo.
Las comunicaciones que normalmente son interesantes son las que tengamos establecidas entre la tarjeta de red que esté configurada como salida a Internet, y las direcciones IP en la columna de “direcciones remotas” que no se correspondan con ninguna de las IP’s reservadas bien para uso público o bien para uso privado y que antes hemos listado.
La columna que tenemos a continuación nos indica en que estado se encuentra la comunicación entre procesos, y veremos diferentes tipos (en nuestro ejemplo no salen todos):
LISTENING, o escuchando, significa que detrás de ese puerto hay un proceso esperando que alguien hable con él, es decir, en disposición de aceptar comunicaciones.
ESTABLISHED, o establecidas, significa que el proceso que está detrás de ese puerto ya está hablando con algo o alguien; la columna de dirección remota nos indica con quién habla.
SYN_SEND, indica una solicitud de comunicación por nuestra parte, es decir, es como si estuviéramos llamando a alguien y esperando a que nos respondiera.
SYN_RECEIVED, indica que el servidor remoto ha aceptado nuestra solicitud de comunicación. Al que estábamos llamando por móvil ya nos ha descolgado, pero todavía no nos ha dicho nada.
FIN_WAIT_1, indica que hemos solicitado terminar la comunicación. A nuestro amigo el del móvil, le hemos dicho que vamos a colgar.
FIN_WAIT_2, no es muy habitual ver este estado en nuestra comunicaciones, entramos en él cuando hemos solicitado terminar la comunicación pero el servidor no se da por enterado.
TIMED_WAIT, estamos esperando a que el servidor acepte nuestra petición de cerrar comunicación. Nuestro amigo el del móvil, nos ha dicho que nos esperemos un momento antes de colgar.
CLOSE_WAIT, indica una solicitud de cierre pasiva entre cliente y servidor. Siguiendo con nuestro amigo el del móvil, digamos que aceptamos esperar hasta terminar la comunicación y le decimos que la cierre él cuando quiera, que nosotros dejamos el móvil encendido y nos vamos a hacer otras cosas.
LAST_ACK, aquí es nuestro amigo el del móvil el que nos dice que nos cuelga, es decir es el servidor el que nos dice que va a cerrar la comunicación.
CLOSED, comunicación entre cliente y servidor cerrada. ¡Por fin hemos conseguido colgar el móvil!
Las conexiones más interesantes son las LISTENING o ESTABLISHED.
Hay que recalcar en este punto que para que un puerto tenga posibilidad de escuchar o establecer conexiones, éste deberá tener un servicio corriendo detrás ya que de otro modo, ante posibles escaneos, el puerto se mostrará como cerrado. Si hubiera un servicio detrás escuchando se mostraría como abierto y finalmente si nuestro firewall corta las comunicaciones entre ese puerto y el exterior se mostrará como bloqueado.
Podéis haceros vosotros mismos vuestros propios escaneos para saber cómo ven los demás los puertos que tenéis, ya que en la red de redes, hay muchas herramientas online que hacen este tipo de escaneos. Como siempre, os recomendamos que echéis un vistazo a nuestra sección de enlaces.
O sea, que los hackers lo que buscan son vulnerabilidades en los procesos que escuchan en esos puertos. Si no hubiera procesos o servicios escuchando en esos puertos la presencia de un firewall no sería necesaria ya que no habría nada que explotar. Es como si intentaramos robar una tienda que todavía no está abierta al público y que no tiene mercancía dentro, ni dinero, ni mobiliario, es decir, que sólo estuviera el local; si fuera así, no habría nada que robar. Pero en la realidad esto nunca es así, ya que por defecto siempre tendremos determinados puertos escuchando al exterior de no utilizar un firewall. Los principales y los que han sido objeto de más antención por sus vulnerabilidades, por parte de los hackers son lo siguientes:
3. LOS PUERTOS MÁS HABITUALES
Puerto 135 – correspondiente al Proceso RPC Llamada a Procedimiento Remoto, o Remote Procedure Call. En realidad este proceso existe en otros sistemas operativos, y su función siempre suele ser la misma: habilitar conexiones entre Programas y Conexiones remotas sin tener que entender un protocolo de comunicación entre redes . En Windows XP, este puerto es imposible cerrarlo si no es mediante la presencia de un firewall que bloquee las comunicaciones a ese puerto ya que es un servicio esencial en el sistema, siendo imposible trabajar con Windows con él deshabilitado.
Puerto 445 - correspondiente al proceso LSASS, y que también es esencial para el correcto funcionamiento de nuestro Windows XP. LSASS (Local Security Authority Subsystem Service) está encargado de gestionar todos los procesos de autentificación en nuestro sistema y la seguridad local.
Ambos servicios han tenido vulnerabilidades que han sido explotadas con éxito por infinidad de virus, entre ellos el Blaster, para el servicio RPC de Windows con núcleo NT o el Sasser para el servicio Lsass. Ninguno de estos virus podría haber llevado a cabo su labor de haber estado ejecutándose un firewall que bloquease las comunicaciones externas con dichos procesos. De ahí la importancia de tener siempre un cortafuegos instalado, en ejecución y correctamente configurado en nuestro sistema operativo.
Hay otros puertos muy populares y que es importantísimo no tener nunca abiertos, entre ellos, los puertos 137, 138 y 139, correspondientes a protocolos que utilizan Netbios o el ya desfasado Netbeui que son protocolos de comunicación utilizados para comunicarse en redes de trabajo. La importancia de ternerlos cerrados, es que estos puertos son los que proporcionan información de los recursos compartidos en un nuestra red. Imaginemos que tenemos compartido todo el disco duro “C”. De tener abiertos estos puertos al exterior estariamos compartiendo todo nuestro disco duro con el resto del mundo, aparte de otra información, que es esencial tener a buen recaudo.
De todas formas, Netbios está en proceso de desaparición y Netbeui totalmente en desuso, ya que a partir de WinXP se introduce un nuevo protocolo de comunicaciones. La asignación directa de host a través del protocolo SMB (Server Message Block) que utiliza también el puerto 445, y que como hemos visto antes, es importantísimo tenerlo cerrado al exterior. En Sistemas Operativos WinXP y posteriores cobra mucha importancia utilizar este protocolo en lugar de Netbios ya que simplifica el transporte de red al no utilizar servidores de traducción de nombres ya desfasados como Wins, Pero todo esto es tema aparte… tenéis más información sobre este tema en el siguiente artículo de la KB:
Hay multitud de puertos más, que varían dependiendo de qué servicios tengamos habilitados. Esencialmente, los puertos más populares en Internet y su utilidad son los siguientes:
25 - protocolo smtp, permite el envio de correo siempre y cuando tengamos un
servidor de correo instalado MTA o Mail Transfer Agent. Este puerto es el que utilizamos para enviar correo, y los que utilizan también los servidores de correos para comunicarse entre sí.
110, 143 - protocolos pop3 e imap3, utilizados para la recepción y reparto
del correo en nuestro MTA. Viene a ser algo parecido a la oficina de correos.
80 - HTTP: Utilizado por los servidores de páginas web, habitualmente cuando
navegamos nuestro navegador se conecta a este puerto, por lo que es preciso que cualquier servidor web lo tenga abierto si pretende servir páginas. De cara al cliente se utiliza un puerto aleatorio por encima del 1024, por lo que no debemos abrir ningún puerto para navegar, únicamente debemos tener la precaución de no restringir las comunicaciones salientes a nuestro navegador.
443 - HTTPS, lo mismo que el anterior pero con comunicaciones encriptadas utilizadas habitualmente para compras online o en página bancarias.
21. FTP. para subir y bajar archivos (básicamente).
23 - Telnet, muy vulnerable, permite comunicaciones mediante texto en claro
entre ordenadores, es decir, que todo lo que viaja en esa comunicación puede ser interceptado e interpretado por una tercera persona ya que todo lo que escribamos, (contraseñas, ordenes, etc.) se transmite tal cual por la red.
8080 - para servidor proxy.
Hay muchísimos más, pero es casí imposible hacer una lista exhaustiva. Simplemente recalcar que no necesitamos ningún puerto abierto si no tenemos que ofrecer ningún servicio al exterior ya que nuestro sistema operativo elige puertos aleatorios por encima del 1024 (puertos conocidos) para establecer comunicaciones salientes con otros servidores. En caso de que queramos tener comunicaciones entrantes a un determinado servicio, por supuesto, tendríamos que habilitarle el puerto correspondiente.
Por ejemplo, en caso de un servidor de correo precisaríamos abrir, los puertos 25, 110 y 143. Y en caso de un servidor Web, el puerto 80, que es al que se conecta cualquier navegado por defecto cuando establecemos comunicaciones.
El programa esta desarrollado en el lenguaje bat existe una nueva versión que lo puedes encontrar en la descarga.