Funcionamiento del Protocolo TCP/IP
Antes de comenzar con la enumeración de servicios, se describirá brevemente el funcionamiento de varios protocolos que serán especialmente útiles a la hora de abordar esta fase del pentesting. Además, trataremos de enmarcar dichos protocolos, tanto en la pila de protocolos TCP/IP como en el modelo de referencia OSI.
Resumiendo mucho, la pila de protocolos TCP/IP es un estándar de facto que agrupa los múltiples protocolos que intervienen en una comunicación en red, en niveles o capas para favorecer la interoperabilidad de estos y facilitar la labor a los desarrolladores de hardware, de servicios y de protocolos. Es una forma de compartimentar los problemas para abordarlos por separado.
Por su parte, el modelo de referencia OSI (Open Systems Interconnection o Modelo Interconexión de Sistemas Abiertos) es un estándar (ISO/IEC 7498-1) creado en 1980 por la ISO que parte del sistema de capas de TCP/IP y trata de formalizarlo. Para ello, define 7 niveles o capas, describiendo de forma exhaustiva cuáles son las funciones de cada una y cómo se relaciona con sus capas adyacentes.
La capa de red
El objetivo de la capa de red o nivel 3 es conseguir mover los datos de las capas superiores a través de la red. Ofrece un conjunto de servicios realizados por distintos protocolos cuyo objetivo es conseguir que los datos lleguen desde un host origen A a un host destino B ubicado en otra red. Estos servicios pueden sintetizarse en los siguientes:
- Direccionamiento de dispositivos: permite identificar a cada dispositivo en la red con una dirección globalmente única: la dirección IP.
- Encapsulamiento / desencapsulamiento: empaqueta los datos de niveles superior en una unidad llamada paquete, que contiene una cabecera con información suficiente para encaminarse por la red de forma independiente.
- Enrutamiento: consiste en seleccionar la mejor ruta en cada momento para un determinado paquete. Es llevado a cabo por routers.
- Orientado al mejor esfuerzo: en términos de redes, esto significa que el protocolo carece de mecanismos que garanticen la entrega de los paquetes.
- Es un protocolo sin conexión: no se establece una sesión previa entre hosts: los paquetes simplemente se envían.
- Independiente del medio físico que transporte los datos (transmisión inalámbrica, fibra óptica, cobre...).
- IPv4 usa direcciones IP de 32 bits. Esto limita el espacio total de direcciones a unos 4200 millones aproximadamente. Esta cantidad podría parecer suficiente en la década de los 80. Sin embargo, en un mundo cada vez más conectado, con la irrupción de IoT, dispositivos móviles, etc., resultan insuficientes.
- Como medida para ahorrar direcciones, surge NAT (Network Address Translation), que permite que múltiples dispositivos en una red usen direcciones IP privadas para la comunicación interna y salgan a Internet usando todos la misma IPv4 pública. Hoy en día es muy común en redes locales. Sin embargo, lo que a priori puede parecer una ventaja, puede suponer inconvenientes:
- Falta de conectividad de extremo a extremo: NAT oculta la IP de los dispositivos finales. Esto, que puede suponer una primera y básica barrera de seguridad (ya que, a priori, no se puede iniciar una conexión desde fuera a un dispositivo interno), puede ser engorroso para dispositivos que requieran una conectividad completa. En estos casos, hay que recurrir a técnicas como Port Forwarding.
- Complejidad adicional: NAT introduce también cierto overhead que se traduce en mayor complejidad y latencia.
- Una parte fija de 20 bytes.
- Un conjunto de opciones que pueden o no añadirse.
- Versión: 4 bits que indican la versión del protocolo IP usada: 4 o 6.
- Tamaño de la cabecera o IHL: longitud de la cabecera en palabras de 32 bits. Es consecuencia de no tener una cabecera fija. El mínimo es 5 (5 × 32 = 160 bits o 20 bytes)
- Longitud total: tamaño del encabezado junto con la carga útil, expresada en bytes.
- Tiempo de vida o TTL (Time-to-Live): 8 bits. Número de saltos entre routers que puede dar un paquete antes de ser descartado. Cada vez que el paquete es enrutado por un router, este disminuye su TTL en una unidad.
- Suma de control de la cabecera: checksum de los datos de la cabecera para comprobar si hay errores. Se debe recalcular cada vez que se cambia el TTL.
- Dirección IP de Origen: 32 bits. IP del host origen del paquete.
- Dirección IP de Destino: 32 bits. IP del host destino del paquete.
- Relleno: usado para que el tamaño de la cabecera sea múltiplo de 32. Se rellena con 0.
- Mayor espacio de direcciones: las direcciones IPv6 tienen 128 bits, lo que supone alrededor de 1 sextillón. Esto permite, además, prescindir de NAT.
- Encabezado de paquete simplificado: lo que redunda en un procesamiento más eficiente por parte de los routers y, por tanto, mejor rendimiento.
- Segmentación y reensamblado de los datos: en el host origen, divide los datos de la aplicación en bloques de tamaño adecuado para ser enviados (segmentación), y se encarga de su reensamblado en el host destino para servirlos a la capa de aplicación.
- Multiplexación de conversaciones: se encarga de la transmisión de múltiples conversaciones entre aplicaciones en distintos hosts de manera simultánea a través de un único canal. Esto se consigue a través del número de puerto, que describiremos en detalle a continuación.
- Seguimiento de las conversaciones individuales: denominamos conversación a cada flujo de datos mantenido entre una aplicación origen y una aplicación destino. Cada una de ellas está identificada por un socket origen y un socket destino, siendo un socket una combinación de IP + puerto. La capa de transporte se encarga del seguimiento de estas
- TCP se usará cuando se requiera un servicio confiable: es decir, que los datos lleguen sin errores y en el mismo orden en que fueron enviados.
- UDP se usa cuando se requiere baja latencia en las transferencias (como DNS), y no es un problema excesivo que algunos paquetes no lleguen en orden (VoIP).
- Puertos bien conocidos: del 0 al 1023. Se trata de puertos asignados a servicios comunes como http, ftp… Por ejemplo, ftp (21 TCP), ssh (22 TCP), dns (53 udp/tcp), http (80), https (443)…
- Puertos registrados: del 1024 al 4951. Usados por aplicaciones servidoras para conectarnos a ellas. Por ejemplo, OpenVPN (1194 UDP), Oracle DB (1521 TCP), Xbox Live (3074 TCP/UDP)…
- Puertos privados o dinámicos: del 49152 al 65535. Se asignan dinámicamente a clientes según se necesiten.
- Garantiza la entrega confiable de los datos: es capaz de detectar segmentos perdidos o corruptos y volver a reenviarlos. Además, garantiza que los datos llegarán en orden al destinatario.
- Proporciona control de flujo: tiene capacidad de regular el flujo de datos para que un servidor rápido no sobrecargue la capacidad de procesamiento de un servidor más lento.
- Control de la congestión: los extremos en una conversación usando TCP son capaces de detectar la existencia de congestión en la red basándose en datos como paquetes perdidos o retrasos en las entregas. En estos casos, realizar retransmisiones de los datos perdidos puede incluso empeorar el problema, así que, ambos extremos pueden acordar bajar la tasa de transferencia.
- Puerto de origen: de 16 bits. Es el número de puerto del proceso que genera el segmento.
- Puerto de destino: puerto del proceso destino al que va dirigido el segmento.
- N.º de secuencia: campo de 32 bits con el que el emisor indica el byte por el que va transmitiendo.
- N.º de reconocimiento: confirmación por parte del proceso receptor de datos recibidos correctamente. Se trata del número de byte + 1 que el receptor ha recibido con éxito.
- Longitud del encabezado: necesario, ya que el encabezado puede contener opciones. El tamaño mínimo (sin opciones) son 20 bytes o 160 bits.
- Bits de control: se trata de un campo de 6 bits, donde cada uno de ellos representa un flag que puede valer 0 o 1, y sirve para señalizar distintos momentos de la sesión. Estos bits son, en orden:
- URG: indica al receptor que algunos datos del segmento son urgentes.
- ACK: para reconocer la recepción de datos.
- PSH: ordena enviar todos los datos almacenados en el buffer.
- RST: para resetear y terminar la conexión.
- SYN: para iniciar la conexión.
- FIN: para cerrar la conexión.
- Ventana: negociado entre el cliente y el servidor para el control de flujo y de la congestión. Básicamente, indica al servidor cuántos bytes puede enviar antes de que el cliente le mande un ACK de confirmación. Si la red presenta congestión o el cliente tiene baja capacidad de procesamiento, tendrá un valor bajo. Si la red va bien y el cliente acepta los datos sin problemas, su valor va incrementando.
- Suma de comprobación: valor calculado para comprobar la integridad del segmento.
- No se establece una sesión previa.
- El receptor reconstruye los datos en el orden en que se reciben (no en el orden de envío como en TCP).
- No se reenvían los segmentos perdidos.
- No hay control de flujo ni congestión.
- VoIP y transmisión de vídeo en directo, ya que son aplicaciones en las que el retraso es más crítico que la pérdida de datos puntuales y en los que la retransmisión de errores no procede.
- Aplicaciones con solicitudes y respuestas simples: como DHCP o DNS.
- Aplicaciones que no requieren control de errores ni flujo, ya que lo implementan ellas mismas. Por ejemplo, SNMP o TFTP.
- El host origen envía a la red una solicitud ARP a la red. Esta tiene un formato similar al siguiente. En este caso, especifica en el campo MAC Origen, su propia MAC, en IP Origen su propia IP, y en el campo IP Destino, la IP del dispositivo cuya MAC desea conocer. Este mensaje se encapsula en una trama de la capa de enlace (por ejemplo, Ethernet) y se envía a todos los dispositivos de la red. Para ello, se pone como dirección física de destino la dirección física de broadcast. La MAC destino la rellena con ceros.
- Este mensaje llega al resto de nodos de la red, en nuestro ejemplo, al PC con la IP 192.168.1.20 y a la interfaz 192.168.1.1 del router. Solo el equipo con la IP indicada en el campo IP Destino del mensaje ARP de petición lo procesa, el resto de equipos lo descarta.
- El host destinatario del mensaje, en nuestro caso, 192.168.1.20, envía un mensaje de respuesta ARP dirigido solo al emisor de la petición. Este mensaje de respuesta es similar al de petición: el tipo de operación ahora es respuesta, MAC Origen pone ahora su propia MAC e IP Origen su propia IP. Esto se encapsula en una trama MAC unicast, enviada directamente al host origen de la petición (en nuestro ejemplo, el de la IP 192.168.1.10).