Este proyecto implementa un sistema de chat cliente-servidor usando TCP y demuestra vulnerabilidades de seguridad a través de la falsificación de paquetes TCP (TCP spoofing). El objetivo es educativo: mostrar cómo funcionan las comunicaciones TCP y cómo pueden ser comprometidas mediante técnicas de spoofing.
- Maneja múltiples clientes simultáneamente usando
select()
- Retransmite mensajes entre todos los clientes conectados
- Muestra la IP del remitente en cada mensaje
- Escucha en el puerto 8080
- Se conecta al servidor usando TCP
- Permite enviar y recibir mensajes en tiempo real
- Usa
select()
para manejar entrada del usuario y mensajes del servidor
- Crea paquetes TCP falsificados usando libnet
- Simula mensajes como si vinieran de otra IP
- Demuestra vulnerabilidades en la validación de origen TCP
- Compilador: GCC
- Bibliotecas:
- Standard C libraries
- libnet (para tcp_faker)
- Permisos: Root/sudo (solo para tcp_faker)
- Sistema Operativo: Linux/Unix
sudo apt-get install libnet1-dev gcc
# Compilar servidor
gcc -o tcp_serve_chat tcp_serve_chat.c
# Compilar cliente
gcc -o tcp_client tcp_client.c
# Compilar falsificador
gcc -o tcp_faker tcp_faker.c -lnet
./tcp_serve_chat
El servidor comenzará a escuchar en el puerto 8080 y mostrará:
Binding to port 8080...
Listening...
Waiting for connections...
En máquinas separadas (o terminales diferentes):
./tcp_client <IP_SERVIDOR> 8080
Ejemplo:
./tcp_client 192.168.1.100 8080
- Escriba mensajes y presione Enter para enviar
- Los mensajes aparecerán en todos los clientes conectados
- Formato de mensaje:
[IP_remitente]: mensaje
sudo ./tcp_faker <IP_FALSA> <IP_SERVIDOR> "<mensaje>"
Ejemplo:
sudo ./tcp_faker 192.168.1.50 192.168.1.100 "Mensaje falsificado"
Servidor muestra:
New connection from 192.168.1.101 (socket 4). Total clients: 1
New connection from 192.168.1.102 (socket 5). Total clients: 2
Message from 192.168.1.101: Hola desde cliente 1
Message from 192.168.1.102: Hola desde cliente 2
Clientes reciben:
Connected. Type messages and press enter to send.
[192.168.1.102]: Hola desde cliente 2
[192.168.1.101]: Hola desde cliente 1
Al ejecutar tcp_faker:
Paquete TCP falsificado enviado desde 192.168.1.50:37024 a 192.168.1.100:8080
Mensaje: Mensaje falsificado
Servidor muestra:
Message from 192.168.1.50: Mensaje falsificado
Clientes reciben:
[192.168.1.50]: Mensaje falsificado
Para verificar el spoofing:
- Iniciar Wireshark en la interfaz de red
- Filtrar por:
tcp.port == 8080
- Ejecutar tcp_faker
- Observar que el paquete aparece con la IP falsificada como origen
Campos a verificar en Wireshark:
- Source IP: Debe mostrar la IP falsificada
- TCP Sequence Number: 1295486518 (hardcodeado)
- TCP Acknowledgment Number: 2134283679 (hardcodeado)
- TCP Flags: PSH, ACK
- El servidor acepta paquetes sin verificar la identidad real del remitente
- No hay validación de que la IP origen sea legítima
- El servidor confía en los headers TCP sin validación adicional
- Los campos de secuencia y acknowledgment pueden ser falsificados
- Los mensajes viajan en texto plano
- Un atacante puede interceptar y modificar el tráfico
- Autenticación: Implementar sistemas de autenticación robustos
- Cifrado: Usar TLS/SSL para cifrar comunicaciones
- Validación: Verificar integridad de mensajes con checksums/HMAC
- Rate Limiting: Limitar frecuencia de mensajes por IP
- Firewall: Configurar reglas estrictas de entrada/salida
- IDS/IPS: Implementar sistemas de detección de intrusos
- Monitoreo: Vigilar patrones de tráfico anómalos
- Segmentación: Aislar redes críticas
tcp_serve_chat.c
- Código fuente del servidortcp_client.c
- Código fuente del clientetcp_faker.c
- Código fuente del falsificador
Este proyecto demuestra efectivamente las vulnerabilidades inherentes en las comunicaciones TCP básicas y la importancia de implementar medidas de seguridad adicionales en aplicaciones de red. La facilidad con que se pueden falsificar paquetes TCP subraya la necesidad crítica de protocolos de seguridad robustos en sistemas de producción.