A través de una táctica denominada IP Spoofing un intruso puede aprovecharse de hosts "confiables" (cambiando su dirección IP por la dirección del host confiable) y obtener accesos no autorizados a sistemas.
El primer ataque que tomó estado público utilizando esta técnica tuvo lugar en un día de Navidad contra la red de un experto en seguridad de sistemas en el San Diego Supercomputer Center. Un individuo o un grupo de desconocidos tomo posesión de su computadora por más de un día y robó electrónicamente una gran cantidad de programas de seguridad que el experto había desarrollado. Desde entonces varios ataques han sido reportados y no hay forma de saber cuantos otros han ocurrido.
Como se mencionó anteriormente, en un ataque de IP spoofing el intruso toma la identidad de un host confiable. En una red Unix pueden configurarse hosts "confiables". Si en una máquina Unix crea en su directorio home, un archivo denominado .rhosts que contenga una lista de nombres de hosts luego cualquier usuario con el user id que usted posee puede logearse en su cuenta (con rlogin) y ejecutar comandos remotos (con rsh) desde aquellos hosts "confiables" (listados en .rhosts) sin suministrar una password .
Otra posibilidad es listar nombres de hosts en el archivo /etc/hosts.equiv. En este caso, cualquier usuario de las máquinas listadas puede logearse en el host local sin una password.
Cuando un host envía un mensaje a otro host, este puede ser particionado en un número de segmentos y reensamblado en el host destino por TCP. IP solo se encarga de rutearlos. Cuando una aplicación en un cliente quiere alcanzar a otra en un servidor debe conocer la dirección IP de la máquina destino y el número de puerto TCP asignado a la aplicación, es decir el socket destino (dirección socket = dirección IP + número de puerto TCP). Una conexión queda identificada por los sockets en cada extremo de la conexión.
Para establecer una conexión, TCP utiliza un procedimiento denominado 3-way handshake. En dicho proceso 3 mensajes (SYN, SYN/ACK y ACK) son requeridos para establecer la conexión. Entre la información intercambiada está la dirección de cada máquina involucrada y el número de secuencia inicial (#SI) que ambas utilizaron para establecer la comunicación. Dichos números son exclusivos para la conexión entre esas dos máquinas y se basan en la hora del reloj interno del sistema. Una vez abierta la conexión, las dos máquinas involucradas están listas para intercambiar datos.
En determinadas versiones del sistema operacional Unix los números de secuencia responden a un patrón muy previsible. Por ejemplo, en la versión BSD Unix (Berkeley Software Development) el #SI se incrementa en 128 cada segundo y en 64 por una nueva conexión. Así si se abre una conexión, se puede predecir que #SI será utilizado en una próxima conexión. Esta es la característica explotada en los ataques de spoofing.
Supongamos que el host A quiere comunicarse con el host B. A inicia el handshake pasando su #SI, llamémoslo a, en el campo de secuencia del primer segmento sincronizado (SYN) del 3-way handshake. Cuando el segundo host, B, recibe el SYN de A, memoriza el número de secuencia recibido y replica enviando un SYN con su #SI, llamémoslo b, así como un reconocimiento (ACK) indicándole a A que reconoce el primer SYN enviado y continúa con el handshake. Cuando A recibe el SYN/ACK desde B, le devuelve un ACK a B indicando que ambos acuerdan que la conexión ha sido establecida.
Opened connection
Esta técnica de conexión se aplica a todas las conexiones TCP: telnet, Web, email, etc..
La primer etapa de un ataque de spoofing es identificar las máquinas que van a ser víctimas del mismo, supongamos que sean los host A y B siendo A un host confiable de B. El atacante, llamémosle X, intentará establecer una conexión con B de forma que B acredite tener una conexión con A cuando en realidad tiene una conexión con la máquina del intruso. X en primer lugar abre una conexión legítima a su host objetivo B, respondiendo este último con un mensaje que reconoce la solicitación y establece el #SI=b1. Luego X toma el lugar de A enviando a B un SYN con la dirección origen de A. B responde con un SYN (#SI=b2) y un ACK que van al host legítimo A (ya que B cree estar comunicado con A). X nunca ve este mensaje, pero todavía puede enviar un ACK a B prediciendo b2 a partir del conocimiento de b1. Si logra esto, B creerá tener una conexión legítima con A, cuando en realidad lo es con X. Las salidas de esta sesión no pueden ser vista por X, pero este puede ejecutar comandos en B.
Además de predecir el #SI , el intruso deberá impedir que el mensaje de B llegue a A, ya que si el mensaje alcanzara a A, este se daría cuenta que B está reconociendo algo que él nunca envió, luego A enviaría en repuesta un reset (RST) a B para terminar la conexión y el ataque de spoofing fallaría. Una de las formas de evitar que el ataque falle es enviando una gran cantidad de SYNs al puerto 513 (login) para llenar completamente aquel puerto de forma tal que B no acepte ninguna otra conexión entrante, incluído RTSs (B se torna inoperativo).
Normalmente hay un time-out asociado con una conexión pendiente, luego las conexiones half-opened eventualmente expirarán y el host atacado se recuperará. Sin embargo el host atacante puede continuar enviando paquetes IP-spoofed requiriendo nuevas conexiones más rápido de lo que el sistema atacado puede dar de baja a las conexiones pendientes.
Una forma de detectar IP spoofing es monitoreando paquetes con algún software de monitoreo de redes tal como el netlog. El objetivo es hallar un paquete en la interface externa de la red que tenga direcciones IP de origen y destino pertenecientes al dominio local.
Con la actual tecnología de protocolo IP es imposible eliminar paquetes IP-spoofed. Sistemas proveedores de servicios a la Internet basados en TCP pueden verse inhabilitados de suministrar tales servicios cuando estén bajo un ataque y por algún tiempo después de que el mismo haya cesado. Sin embargo algunas medidas pueden tomarse para reducir el número de paquetes IP-spoofed que entran a su red
La mejor forma de prevenir el problema de IP spoofing y reducir la probabilidad de que un site sea objetivo de unos de estos ataques es instalando un router que filtre la entrada a la interfaz externa de la red (conocido como un filtro de entrada) no permitiendo que un paquete lo atraviese si el mismo tiene como dirección origen una que corresponde a la red interna. Esto prevendría que un atacante no perteneciente a su red le envíe paquetes pretendiendo ser una máquina de su red. Esto es una buena solución si únicamente confiamos en máquinas locales. Si se confía en máquinas externas, esta solución topológica falla. En este caso se deben bloquear todos los protocolos que usen TCP y autenticación basada en direcciones.
Si bien este ataque específico está dirigido a sistemas Unix, cualquier sistema que autentica hosts o usuarios basados en direcciones IP es vulnerable a un ataque de spoofing.