• Jueves 28 de Marzo de 2024, 17:45

Autor Tema:  Escaneo de puertos  (Leído 4430 veces)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Escaneo de puertos
« en: Martes 30 de Septiembre de 2008, 13:22 »
0
Primero, aclarar que es necesario un conocimiento medio del protocolo TCP/IP. Aquí van unos enlaces para los interesados:

Introducción:
http://infase.es/FORMACION/INTERNET/tcpip.html
http://es.wikipedia.org/wiki/TCP/IP
http://www4.uji.es/~al019803/tcpip/
http://www.geocities.com/SiliconValley/ ... enido.html

Avanzado:
http://www.rfc-es.org/

¿Qué es el escaneo de puertos?

Es una técnica que nos permite saber qué puertos TCP/IP están a la escucha (estado LISTEN) en un determinado host. Un puerto TCP/IP en escucha (abierto) acepta conexiones entrantes, lo cual significa que hay un servicio que procesa dichas conexiones y sus datos, por lo tanto una posible vulnerabilidad y puerta de acceso a posibles atacantes.

Como ya sabréis, TCP/IP provee de 2 protocolos para el nivel de transporte: TCP (orientado a conexión) y UDP (no orientado a conexión). TCP establece primero una conexión entre ambos hosts, usando la siguiente secuencia:

Código: Text
  1.  
  2. Puerto Abierto
  3.  
  4. Host1 ->     SYN     -> Host2
  5. Host1 <-   SYN/ACK   <- Host2
  6. Host1 ->     ACK    -> Host2
  7.  
  8.  

Una vez completado este paso, la conexión pasa a estar establecida (estado ESTABLISHED). Para que esto ocurra, Host2 tiene que tener el puerto abierto (en escucha). Si esto no ocurre, Host2 envía un paquete TCP RST a Host1 en respuesta al paquete SYN.

Código: Text
  1.  
  2. Host1 -> SYN -> Host2
  3. Host1 <- RST <- Host2
  4.  
  5.  

Con esto podemos averiguar si un puerto TCP está abierto o cerrado.

En el caso de un puerto UDP, el tema es más complicado. UDP no está orientado a conexión, por lo tanto non establece ningún contacto previo. Simplemente se envían los datos. En este caso, si recibimos una respuesta a nuestro paquete, podemos asegurar que el puerto está abierto. Pero si no recibimos ninguna, no podemos estar seguros. ¿Llegó el paquete a su destino? ¿Eran correctos los datos para que el servicio del puerto nos responda? ¿Está el puerto cerrado? No podemos responder con certeza a estas preguntas. Por lo tanto, el uso de UDP para averiguar si un puerto está abierto es menos eficaz que el uso de TCP.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Escaneo de puertos
« Respuesta #1 en: Viernes 3 de Octubre de 2008, 13:39 »
0
¿Cómo escanear puertos?

En mi humilde opinión el mejor escaneador de puertos es sin duda nmap de Fyodor, una utilidad imprescindible para aquellos que os interese la seguridad informática. Ahora viene con interfaz gráfica en la versión Windows, pero yo siempre he sido gran fan de Linux y su consola  ^_^

En la ayuda nos indican que la sintaxis del programa sigue la siguiente regla:

nmap [Scan Type(s)] [Options] {target specification}

En los tipos de escaneos, nmap ofrece una variedad insuperable. Veamoslo paso a paso:

  • TCP SYN: se manda un paquete TCP SYN a los host y puerto de destino y se espera una respuesta. Si se recibe un paquete TCP SYN/ACK, sabemos que el puerto está abierto. Si recibimos un TCP RST es que el puerto está cerrado. Si después de varios paquetes enviados no recibimos ninguna respuesta, podemos decidir que el puerto está filtrado (hay un firewall que no permite el acceso al host). Este escaneo es rápido, fiable y bastante camuflado, ya que nunca llega a iniciarse una conexión TCP completa puesto que no enviamos el paquete TCP ACK final.
  • Conexión TCP: con este tipo se establece una conexión TCP completa para averiguar el estado del puerto en el host de destino. Es una opción poco recomendable teniendo el escaneo SYN.
  • UDP: se envía un paquete UDP sin datos al host-puerto destino. Si se recibe un paquete ICMP de "puerto no accesible", el puerto está cerrado. Si se recibe otro tipo de ICMP, se asume el puerto como protegido por firewall. Si se recibe una respuesta, está abierto. Si después de varias retransmisiones no se recibe nada, no sabemos en qué estado está el puerto, así que lo catalogamos como abierto/filtrado.
  • Otras banderas TCP: en este caso se activan otras (o ninguna) banderas del paquete TCP que no sean SYN ni ACK ni RST. Acorde al RFC 793, cualquier paquete TCP que llegue sin SYN, RST o ACK no se responde si el puerto está abierto, y se manda un RST si el puerto está cerrado. Mientras no esté activada ninguna de estas tres banderas, podemos usar cualquier combinación de las 3 restantes (FIN, PSH, URG). Las ventajas de este escaneo son que es más silencioso que el escaneo SYN y que puede atravesar los firewalls y routers más sencillos. La gran desventaja es que muchos sistemas operativos (Windows) no siguen al pie de la letra la RFC 793 y mandan un RST esté abierto el puerto o no.
  • TCP ACK: este escaneo es especial puesto que en realidad no va encaminado a saber el estado de los puertos, sino determinar el comportamiento del firewall. Se mandan paquetes con la bandera ACK activada. Estos paquetes sólo se envían en caso de que la conexión ya haya sido establecida, por lo que nos permitirá saber si el firewall lleva la cuenta de las conexiones (es de estados) o sólo realiza comprobaciones más sencillas (no es de estados). Si recibimos un paquete RST quiere decir que el ACK traspasó el firewall (no es de estados) y obtenemos una respuesta del host (pero manda un RST tanto si el puerto está abierto como cerrado). Si no recibimos nada o recibimos un ICMP de error, sabemos que el puerto está siendo descartado por el firewall (por tanto, es de estados). Este escaneo se debe hacer en conjunción con otros para devolver resultados fiables.
  • TCP ACK con comprobación de ventana: igual que el anterior, sólo que se aprovecha de la implementación de algunos sistemas a la hora de asignarle el valor a la ventana en la respuesta RST. Si la ventana es cero, el puerto está cerrado; si la ventana tiene un valor, el puerto está abierto. Hay que tener en cuenta que esto depende de la implementación de algunos sistemas y no es siempre fiable.
  • IP Pasivo: este escaneo súper camuflado (de hecho el host objetivo jamás recibirá un paquete TCP con nuestra IP) hace uso de 3 técnicas conjuntamente. Dos de ellas ya las hemos explicado, pero la tercera no: todos los paquetes IP llevan un identificador de fragmento para el caso en que haya que trocear el paquete IP en varios. La mayoría de los sistemas operativos simplemente incrementan este identificador en 1 a cada nuevo paquete. Consiguiendo 2 paquetes, podemos por lo tanto saber cuántos han sido enviados entre el primero y el segundo comprobando este identificador. Ahora el proceso consta de 3 pasos:
    [list type=3]
    [li]Obtener el IP ID de un equipo tercero (llamado "zombi").
  • Mandar 1 escaneo SYN al host objetivo haciéndose pasar por el zombi
  • Obtener el nuevo IP ID del "zombi".
Una de las mayores ventajas de este escaneo es descubrir qué IPs están permitidas a través de un firewall.[/li][/list]

Como el escaneo IP pasivo es un poco complicado de entender, voy a mostrar un ejemplo más detallado. Supongamos que nuestra IP es 192.168.1.120, la del equipo que queremos escanear 10.1.1.1 y la del equipo tercero o "zombi" 128.0.0.1.

  • Caso 1: Puerto abierto
    [list type=3]
    [li]Se manda un SYN/ACK a 128.0.0.1, que responde con un RST, revelando su IP ID.
  • Se manda un SYN a 10.1.1.1 con IP de origen 128.0.0.1. El puerto está abierto, así que 10.1.1.1 responde con SYN/ACK, pero se la envía a 128.0.0.1 que, al no saber nada, responde con un RST, aumentando en 1 su IP ID
  • Se manda otro SYN/ACK a 128.0.0.1, que responde con RST revelando su nueva IP ID, que vemos que ha aumentado en 2, por tanto el puerto está abierto.
[/li]
[li]Caso 2: Puerto cerrado
[list type=3]
[li]Se manda un SYN/ACK a 128.0.0.1, que responde con un RST, revelando su IP ID.[/li]
[li]Se manda un SYN a 10.1.1.1 con IP de origen 128.0.0.1. El puerto está cerrado, así que 10.1.1.1 responde con RST a 128.0.0.1, que obviamente no hace nada.[/li]
[li]Se manda otro SYN/ACK a 128.0.0.1, que responde con RST revelando su nueva IP ID, que vemos que ha aumentado en 1 esta vez, por tanto el puerto no está abierto.[/li][/list][/li]
[li]Caso 3: Puerto filtrado
[list type=3]
[li]Se manda un SYN/ACK a 128.0.0.1, que responde con un RST, revelando su IP ID.[/li]
[li]Se manda un SYN a 10.1.1.1 con IP de origen 128.0.0.1. El puerto está filtrado, no hay respuesta[/li]
[li]Se manda otro SYN/ACK a 128.0.0.1, que responde con RST revelando su nueva IP ID, que vemos que ha aumentado en 1 esta vez, por tanto el puerto no está abierto.[/li][/list][/li][/list]

Como vemos, es imposible para el atacante distinguir entre un puerto cerrado y filtrado con este escaneo. Pero como hemos dicho, podemos descubrir que IPs tienen permiso para atravesar el firewall, simplemente probando IPs (de un rango concreto) y viendo si el puerto está abierto o no mediante el escaneo. Si para algunos está abierto y para otros no, entonces ya sabemos qué IPs están permitidas a través del firewall, ¿no?  :devil:

Los principales problemas del IP Pasivo es que hay que poder mandar paquetes con la IP suplantada, caso harto difícil si tenemos un router con NAT, y que hay que hallar un "zombi" pasivo, es decir, con tráfico casi nulo para no falsificar los resultados del IP ID.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Escaneo de puertos
« Respuesta #2 en: Sábado 18 de Octubre de 2008, 01:56 »
0
Vamos ahora con un ejemplo práctico a la par que sencillo:

nmap -sS -P0 -O -v http://www.######.es

  • -sS: escaneo SYN
  • -P0: no hacer ping previo al escaneo, asumir que existe el equipo remoto
  • -O: adivinar sistema operativo
  • -v: ¡sé elocuente!

y obtenemos:

Cita de: "nmap"
Starting Nmap 4.76 ( http://nmap.org ) at 2008-10-18 01:50 Hora estándar romance
Initiating Parallel DNS resolution of 1 host. at 01:50
Completed Parallel DNS resolution of 1 host. at 01:50, 0.03s elapsed
Initiating SYN Stealth Scan at 01:50
Scanning ###.###.###.### [1000 ports]
Discovered open port 80/tcp on ###.###.###.###
Discovered open port 22/tcp on ###.###.###.###
Discovered open port 443/tcp on ###.###.###.###
Discovered open port 9001/tcp on ###.###.###.###
Discovered open port 500/tcp on ###.###.###.###
Discovered open port 9050/tcp on ###.###.###.###
Discovered open port 9000/tcp on ###.###.###.###
Completed SYN Stealth Scan at 01:50, 4.45s elapsed (1000 total ports)
Initiating OS detection (try #1) against ###.###.###.###
Warning: Hostname http://www.######.es resolves to 2 IPs. Using ###.###.###.###
Retrying OS detection (try #2) against ###.###.###.###
Host ###.###.###.### appears to be up ... good.
Interesting ports on###.###.###.###:
Not shown: 993 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
443/tcp  open  https
500/tcp  open  isakmp
9000/tcp open  unknown
9001/tcp open  unknown
9050/tcp open  tor-socks
Aggressive OS guesses: Linux 2.6.5 - 2.6.9 (96%), Aladdin eSafe security gateway (runs Linux 2.4.21) (92%), Linux 2.6.5 - 2.6.8 (91%), Linux 2.6.5-7.283-smp (SuSE Enterprise Server 9, x86) (91%), Linux 2.4.21 - 2.4.33 (91%), Linux 2.4.31 w/grsec (x86) (91%), Linux 2.4.32 (x86) (91%), QLogic SANbox2-8 FC switch or Sharp Zaurus PDA (Linux 2.4.18) (91%), Linux 2.6.5 - 2.6.19 (90%), Linux 2.6.9 - 2.6.20 (90%)
No exact OS matches for host (test conditions non-ideal).
Uptime guess: 21.136 days (since Fri Sep 26 22:34:46 2008)
Network Distance: 6 hops
TCP Sequence Prediction: Difficulty=198 (Good luck!)
IP ID Sequence Generation: All zeros

Read data files from: K:Archivos de programaNmap
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.46 seconds
           Raw packets sent: 1143 (51.816KB) | Rcvd: 1146 (47.416KB)

Tenemos el listado de los puertos abiertos (sólo ha probado los puertos por defecto, los servicios más comunes, se pueden espcificar los puertos con -p) y la lista de posibles SOs con su correspondiente porcentaje de compatibilidad.  :good: