Professional Documents
Culture Documents
(Parte I)
alfonn 17-01-2008 GTM 1 @ 17:45
NOTA: Este artículo se encuentra actualizado, ampliado los conceptos y con nuevos contenidos aquí:
Wireshark / Windump. Analisis capturas tráfico red. Interpretación Datagrama IP. (Actualización).
-------------------------------------------------------------------------------
Una de las tareas habituales de un administrador de red es el análisis de los logs de tráfico de la red. Análisis que puede ser de rendimiento o seguridad. Tráfico de la LAN,
entrante y saliente a través de cortafuegos, análisis de Sistemas de Detección de Intrusos, etc.
Para ello contamos con variadas herramientas. Entre ellas Snort, TCPDump/Windump, Ethereal (ahora WireShark), etc. Destaco esta tres últimas por estar basadas en la
librería libpcap.
En este artículo vamos a analizar las capturas en hexadecimal de estas herramientas para obtener todos los datos posibles de las cabeceras IP, segmentos TCP, además de
comprender de forma más visual los conceptos TCP/IP.
Una de las tareas habituales de un administrador de red es el análisis de los logs de tráfico de la red. Análisis que puede ser de rendimiento o seguridad. Tráfico de la LAN,
entrante y saliente a través de cortafuegos, análisis de Sistemas de Detección de Intrusos, etc.
Para ello contamos con variadas herramientas. Entre ellas Snort, TCPDump/Windump, Ethereal (ahora WireShark), etc. Destaco estas tres últimas por estar basadas en
la librería libpcap.
Libpcap es una librería de código abierto que ofrece al programador una interfaz desde la que capturar paquetes en la capa de red. La implementación para windows
es Winpcap. Entre las utilidades más importantes de los analizadores de tráfico de red está la que nos proporciona la salida en hexadecimal de las capturas.
En este artículo vamos a analizar dichas capturas en hexadecimal para obtener todos los datos posibles de las cabeceras IP y segmentos TCP, además de comprender de forma
más visual los conceptos TCP/IP.
Para ello usaremos TCPDump (Linux/Unix) / Windump (Windows).
Antes que nada recordar un poco como funciona TCPDump / Windump:
http://es.wikipedia.org/wiki/TCP/IP
http://www.saulo.net/pub/tcpip/
Para las salidas en hexadecimal usaremos la opción -x de tcpdump/windump que captura por defecto 68 bytes.
Para capturar toda la información usamos el snaplen (-s0). A cero estamos cogiendo los paquetes completos.
Si hubiéramos puesto -s 512 se capturarían sólo los primeros 512 bytes de un determinado paquete.
Comenzamos.
8a01 (ID) Número de identificación único por cada datagrama que permitirá el reensamblaje posterior al ser dividido en fragmentos más pequeños. Longitud 16 bits. En este caso
Id=35329.
4 Bandera (Flag) Campo de 3 bits.
El primer bit esta reservado y es siempre 0.
El segundo es el el bit de indicación de no fragmentación (DF). (010)
El tercero (MF) es de verificación que el datagrama llega a su destino (001) completo, está activo en todos los datagramas enviados excepto en el último para
informar que ya no hay más fragmentos.
000 Fragment offset o Posición. Longitud de 13 bits. Posición del fragmento dentro del datagrama.
80 (TTL) Tiempo de vida. Longitud 8 bits. Impide que un paquete esté indefinidamente viajando por la red. En este caso 128 indica que cada vez que un datagrama atraviese un
router este numero se decrementa en 1. cuando el TTL llege a 0 el datagrama se descarta y se informa de ello al origen con un mensaje de tiempo excedido.
06 Protocolo. Longitud 8 bits. En este caso hex(06) (00000110) = TCP en decimal sería 6.
Valores para los protocolos
1 ICMP, 2 IGMP, 6 TCP, 9 IGRP, 17 UDP, 47 GRE, 50 ESP, 51 AH, 88 EIGRP, 89 OSPF, 115 L2TP.
ec4e Header Cheksum(CRC) o Suma de Control de la Cabecera. Longitud 16 bits. Es la suma de comprobación de errores de la cabecera del datagrama. Este número se calcula
nuevamente en cada salto del datagrama a través de los routers.
c0.a8 01.f0 dirección origen: 192.168.1.240 longitud 32 bits.
c0.a8 01.03 dirección destino: 192.168.1.3 longitud 32 bits.
Tenemos otro campo que es Options (Opciones) de longitud variable con información opcional para el datagrama. Puede tener 0 o más opciones. Y Padding (Relleno) también de
longitud variable. Asegura que la cabecera IP termine en múltiplo de 32 bits.
Según el RFC0791 Las opciones Options pueden o no aparecer en los datagramas. Deben ser implementadas por todos los módulos IP (host y pasarelas). Lo que es opcional es su
transmisión en cualquier datagrama en particular, no su implementación.
El último campo es Data, de longitud variable, conteniendo los datos a enviar. La longitud máxima es 64 Kbytes y comienza con el contenido de la cabecera del protocolo de
siguiente nivel, es decir TCP o UDP. Los datos y encabezamiento del segmento TCP van dentro del campo Data del datagrama IP, es lo que llamamos encapsulación.
En este caso el campo Data comienza con con los campos de la cabecera del segmento TCP puerto origen y puerto destino:
Análisis Capturas Tráfico De Red. Interpretacion Segmento TCP (II). Establecimento Conexión TCP.
alfonn 29-01-2008 GTM 1 @ 17:07
Ya vimos en la primera parte de este estudio sobre Análisis de capturas de tráfico de red la interpretación del datagrama IP, la interpretación de los valores hexadecimales de la
salida de TCPDump/WinDumpreferente al datagrama IP. Ahora vamos a estudiar e interpretar el segmento TCP. TCP es el protocolo delnivel de transporte orientado a
conexión. Veremos los mecanismos que implementa TCP para dar la mayor fiabilidad posible a dicha conexión. Mecanismos como los números de secuencia y las confirmaciones
de recepción. También veremos en modo de apéndice, para comprender mejor lo estudiado, el establecimento de una conexión TCP.
A continuación una salida TCPDump/WinDump de una conexión cualquiera. En este caso un update de informacion a una tabla de BD mysql desde el puesto STATION a traves del
puerto 1472 hacia INFO01 donde se ubica la base de datos mysql a la escucha en puerto 3306.
Vamos a distinguir las partes que nos interesan.
Cabecera IP:
Segmento TCP:
....U A P R S F
------------------
0 0 0 1 1 0 0 0 (en binario)
------------------
7 6 5 4 3 2 1 0
los bytes 7 y 6 son los reservados. Vemos entonces que tenemos activados con 1 los indicadores A y P que corresponden a SYN +PSH
NOTA: Esto último ya los estudiamos en el capítulo de filtros TCPDump/ WinDump
fd59 Window (ventana). (16 bits). Número de bytes que el emisor del segmento está dispuesto a aceptar por parte del
destino. En este caso 64857.
2def Checksum o suma de vdrificación (16 bits). Suma de comprobación de errores del segmento actual. Para su cálculo se utiliza una pseudo-cabecera que
también incluye las direcciones IP origen y destino.
0000 Urgent Pointer o Puntero urgente (16 bits). Se utiliza cuando se están enviando datos urgentes que tienen preferencia sobre todos los demás e indica el
siguiente byte del campo Datos que sigue a los datos urgentes. Esto le permite al destino identificar donde terminan los datos urgentes.
Nos quedan dos campos. Options y Padding o relleno
Opciones (variable). Si está presente únicamente se define una opción: el tamaño máximo de segmento que será aceptado.
Relleno. Se utiliza para que la longitud de la cabecera sea múltiplo de 32 bits.
Inmediatamente después nos encontramos con los datos. En este caso vemos las información delupdate de la base de datos mysql.
Hasta aquí el estudio del segmento TCP. En posteriores entregas estudiatremos UDP e ICMP.
Apéndice complementario.
Establecimiento de una conexión TCP.
Un ejercicio interesante puede ser analizar la salida en hexadecimal ttratando de comprender un establecimiento de conexión TCP. Para comprender como se realiza, a
continuación una breve explicación ya publicada por mi Nautopía.
En los ejemplos veremos los campos del segmento TCP que acabamos de estudias de una forma más práctica.
Veremos en este apéndice cómo se realiza una conexión TCP. Nos ayudará a interpretar logs, trazas ytécnicas de escaneo. Veremos también algunos componentes de
los paquetes TCP aparte de los puertos de la máquina origen y destino. Estos componentes importantes son los números de secuencia y de confirmación (SEQ y ACK) que se
utilizan para asegurar la integridad de la conexión y los flags o banderasque son los encargados de indicar la finalidad del paquete (para iniciar o finalizar una conexión, para
transmitir datos, etc).
Una conexión TCP se realiza en tres pasos. Es lo que técnicamente se llama three-way handshake:
1. En el sistema / host que inicia la conexión o cliente (TCP A), envía un paquete de SYN con un número de secuencia inicial asociado a esta conexión al sistema /
host destinatario o servidor (TCP B).
2. Este responde con un paquete SYN-ACK (acuse de recibo) confirmando la recepción del SYN inicial enviado por (TCP A) y enviándole a su vez su propio número
de secuencia.
3. Para finalizar, el cliente (TCP A) reconoce la recepción del SYN del servidor (TCP B) mediante el envío de un ACK. Este es el momento en que queda establecida
la conexión. Ya se puede iniciar la transferencia de datos entre (TCP A) y (TCP B).
Vamos a avanzar un poco más ya que ocurren algunas otras cosas. Lo vemos gráficamente:
Sean dos hosts pretenden inciciar una conexión TCP. TCP A y TCP B, siguiendo la analogía de la explicación anterior.
1. TCP A _SYN( SEQ=x ) -> y TCP B
2. TCP B _SYN( SEQ=y, ACK=x+1 ) -> TCP A,
3. TCP A _SYN( SEQ=x+1, ACK=y+1 ) -> TCP B.
Vemos como TCP A envía un paquete SYN con un número de secuencia inicial x que además es aleatorio aTCP B. El resto es fácil deducir.
Las letras x e y son los números de secuencia (SEQ). Se utilizan números de secuencia distintos para cadasentido de la comunicación. El primer número para cada sentido se
acuerda al establecer la comunicación. Cada extremo se inventa un número aleatorio y envía éste como inicio de secuencia.
Un paso más para terminar de comprender la conexión TCP totalmente imprescindible para entender muchas técnicas de escaneo.
Ejemplo:
Sean dos hosts (TCP A) y (TCP B) que pretenden iniciar una conexión. Veremos también que pasa con los números de secuencia (SEQ):
Todo esto es lo que ocurre cuando realizamos un escaneado de puerto TCP conect ().
Si la opción elegida es TCP SYN no dejamos que se establezca totalmente la conexión, esto significaría el envío por parte de TCP A de un RST (reset) cerrando así la conexión.
Ejercicios y ejemplos
1.- Como ejercicio podríamos descifrar esta traza capturada por Ethereal. Se trata de un escan Nmap TCP conect() al puerto 25.
La orden para escanear sería:
2.- Ahora vamos a ver un escaneo nmap tipo –sS al puerto 25 (smtp) desactivando el ping.
La orden para escanear sería:
Vemos claramente el RST (reset) enviado en la última línea de la traza, no completando o estableciendo la conexión.
NOTA: Observemos en ambos casos los incrementos y valores de números de secuencias, los indicadores oflags TCP que se intercambian en el diálogo, etc.
El campo Suma de Control (Checksum) es el complemento a uno de 16 bits de la suma de los complementos a uno de las palabras de la combinación de una pseudo-cabecera
construída con información de la cabecera IP, la cabecera UDP y los datos, y rellenada con octetos de valor cero en la parte final (si es necesario) hasta tener un múltiplo de
dos octetos.
Un valor 0 indica que no se requiere comprobación de los datos.
En las siguiente entrega veremos el protocolo ICMP.
Hemos marcado de color azul la zona que nos interesa. Ya lo hemos estudiado en el datagrama
IP, marcamos en verde la clave que nos dice el tipo de protocolo (ICMP). En amarillo el
campo Datos o Data.
Estudiamos primero el echo request (la primera traza)
Tipo 08 solicitud de eco
Código 0 tanto para echo reply como para echo request el codigo es siempre 0. Se utiliza
en algunos mensajes para distinguir, dentro de un tipo de mensaje, distintos subtipos.
Suma de control fc5b
Identificador, ID o PID 0300 (es el mismo para las dos trazas)
Número de secuencia 4e00 (19968) para el echo request y 4e00 (19968) echo
reply. Simula, en cierta manera, los números de secuencia que vimos en el segmento
TCP. Este número se va incrementando para un mismo identificador (0300) como ya hemos
visto. Si tenemos varias respuestas de eco (echo reply) para un mismo echo request, este
número se va incrementando, pero el Identificador sería el mismo. Lo vemos en la secuencia
de trazas de la captura (1) más arriba.
Aquí vemos de forma práctica los conceptos Identificador o ID y Número de secuencia.
Lanzamos un ping a la dirección de difución de la red (192.168.1.255). el identificador es el
mismo (768), elnúmero secuencia es distinto para cada grupo de echo reply que antiende a
un echo request, vemos además que se va incrementando:
Como curiosidad podemos decir que podemos generar con un constructor de paquetes
tipo nemesis o Engage packet builder un paquete ICMP del tipo echo request con el
contenido Data que queramos.
En nemesis lo haríamos con la opción -P fichero.txt con el contenido del campo data.
En Engage packet builder: