La explicación de como se realiza un secuestro de sesión o hijacking es algo complicada pero de manera muy básica se parece a como lo contais.
Un paquetes pueden falsificarse em cualquiera de sus camplos... IP de origen, destino, puertos,...., todo es falsificable y para ello hay muchas herramientas.
Para entender bien como funciona un secuestro de sesión es necesario saber antes y comprender bien como se establce una conexión TCP, como se cierra, etc. y los errores asociados a los números de secuencias y acuses de recibo. algo de esto cuento en los capítulos de análsis y monitorización de redes usando TCPdump.
Supongamos que estamos en una red Ethernet, donde varias estaciones de trabajo realizan conexiones TCP a un servidor que se encuentra en nuestro mismo segmento......Si tenemos suficientes privilegios en nuestra máquina, podríamos utilizar un programa sniffer y escuchar todo lo que circula por este tramo, por ejemplo, una sesión telnet de una estación de trabajo con el servidor. En nuestra escucha pasiva, hemos puesto la interface de red en modo promíscuo, a nivel de transporte podremos conocer el número de puerto y de secuencia en ambas partes con tan solo fijarnos en un segmento TCP. Esto es así porque en un solo segmento viajan los puertos origen y destino, el número de secuencia del emisor y el siguiente número de secuencia que se esperaba de la otra parte. Veamos el siguiente ejemplo :
Supongamos que somos el atacante y usamos como sniffer
tcpdump o windump . Estamos escuchando una conexión telnet entre una estación de trabajo con dirección IP 192.168.2.1, y un servidor con 192.168.2.10. Aparecen entonces dos paquetes :
192.168.2.1.1140 > 192.168.2.10.telnet: P 1320825536:1320825537(1) ack 1036160984 win 5840 <nop,nop,timestamp 4356776 390625> (DF)
192.168.2.1.telnet > 192.168.2.10.1140: P 1036160984:1036160985(1) ack 1320825537 win 5840 <nop,nop,timestamp 390646 4356776> (DF)
Esta sintaxis, que se explica en los
artículos que a tal efecto tengo en Seguridad y Redes, es la que utiliza el programa tcpdump/windump. Los campos que nos interesan son los siguientes :
dirección_origen.puerto > dirección_destino.puerto : flags_TCP num_de_secuencia_inicial : num_de_secuencia_final ( tamaño_del_los_datos_TCP ) num_de_ack opciones
Vemos como el primer segmento va del cliente al servidor y es, seguramente, una tecla pulsada. El segundo es la respuesta del servidor reconociendo al cliente su último envío y enviándole la misma tecla para que pueda hacer el eco, tal y como lo establece el protocolo telnet.
Es entonces cuando el atacante, en este caso nosotros, podríamos entrar en juego: podríamos enviar un paquete IP con la dirección origen de la estación de trabajo, dirección destino del servidor, puerto origen y destino el que corresponda, y número de secuencia y ACK el calculado a partir de lo que escuchamos. De esta forma, el servidor reconocería este paquete como válido y lo aceptaría aumentando el número de secuencia que espera de la estación de trabajo:
192.168.2.1.1140 > 192.168.2.10.telnet: P 1320825537:1320825560(23) ack 1036160985 win 5840 <nop,nop,timestamp 286213 6365981> (DF)
192.168.2.1.telnet > 192.168.2.10.1140: P 1036160985:1036161018(23) ack 1320825560 win 5840 <nop,nop,timestamp 6412341 286245> (DF)
¿ Qué ocurrirá con la estación de trabajo ?. Simplemente, que cuando envíe paquetes al servidor, éstos serán rechazados, ya que sus números de secuencia no corresponderán con el esperado; el servidor pensará que son paquetes duplicados. El propietario legítimo de esa conexión verá como, sin causa aparente, su sesión se ha colgado, y normalmente iniciará una nueva sin darle mayor importancia. Al fin y al cabo esas cosas ocurren.
Mientras tanto podríamos, como atacantes, enviar un paquete que contuviese un comando a nuestra elección, con el consiguiente riesgo para el usuario legítimo.
Eso del robo o secuestro de ssisiones pondemos evitarlo pot ejemplo usando conexiones cifradas o encriptadas, usando SSH o (no siempre es efectivo al 100%) usando redes conmutadas.
Sacado del manual de IPTAbles y de un HOWTO...: Cita: "El iptables tiene varios modulos de funciones que se pueden agregar para hacer una seleccion mas especifica de los paquetes. Uno de estos módulos es el módulo de estado, que lee (entre otros) el bit ACK de cada paquete e indica si es un intento de conexión o parte de una conexión ya establecida. De esta manera, si se filtran todos los intentos de conexión y solamente se aceptan los deseados, no será necesario revisar el resto de los paquetes, ya que se podrá suponerlos confiables. La sintaxis del uso del módulo es:
iptables -m state --state <estado> --resto-de-las-opciones...
Un ejemplo:
Para aliviar la tarea del firewall, todos los paquetes que pertenezcan a una conexión ya establecida serán aceptados en la primera regla; solamente los intentos de conexión serán seleccionados por las reglas subsiguientes:
iptables -F INPUT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP
iptables -F FORWARD
iptables -P FORWARD DROP
iptables -F OUTPUT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state NEW -o lo -j ACCEPT
iptables -A OUTPUT -m state --state NEW -p tcp --sport 80 -j ACCEPT
iptables -P OUTPUT DROP"
NOTAS:
NEW: paquete que incicia la conexión
ESTABLISHED: aaquete que pertenece a una conexión existente (esto es, que tuvo paquetes de respuesta).