Nuestros últimos artículos

Reconstrucción de sesiones TCP

Para la reconstrucción de las sesiones TCP nos basamos en la utilización del número de secuencia para ordenar los segmentos TCP recibidos y detectar paquetes duplicados. Durante el establecimiento de conexión, los números iniciales de secuencia son intercambiados entre las dos entidades TCP. Estos números de secuencia son usados para identificar los datos dentro del flujo de bytes, y poder identificar (y contar) los bytes de los datos de la aplicación. Siempre hay un par de números de secuencia incluidos en todo segmento TCP, referidos al número de secuencia y al número de asentimiento.

Mecanismo:

  1. En la primera etapa, el cliente transmite un segmento donde el indicador SYN está fijado en 1 (para indicar que es un segmento de sincronización), con número de secuencia N llamado número de secuencia inicial del cliente.
  2. En la segunda etapa, el servidor recibe el segmento inicial que viene del cliente y luego le envía un acuse de recibo, que es un segmento en el que el indicador ACK está fijado en 1 y el indicador SYN está fijado en 1 (porque es nuevamente una sincronización). Este segmento incluye el número de secuencia de esta máquina (el servidor), que es el número de secuencia inicial para el cliente. El campo más importante en este segmento es el de acuse de recibo que contiene el número de secuencia inicial del cliente incrementado en 1.
  3. Por último, el cliente transmite un acuse de recibo, que es un segmento en el que el indicador ACK está fijado en 1 y el indicador SYN está fijado en 0 (ya no es un segmento de sincronización). Su número de secuencia está incrementado y el acuse de recibo representa el número de secuencia inicial del servidor incrementado en 1.

 

Implementación

  1. Comprobamos para cada conexión la pareja: [IP Origen + Puerto]
  2. Si es la primera vez que se realiza esta conexión para la pareja la agregamos a un index del tipo:
    src_addr[indice] = srcx;
    src_port[indice] = srcport;
    src_index = indice;
    first = true;
    

    Si no es la primera vez que se establece esta conexión la agregamos al índice:

    if (src_addr[j] == srcx && src_port[j] == srcport ) {
        src_index = j;
    }
    
  3. Una vez hemos llenado el índice de conexiones: [IP Origen + Puerto], vamos a comprobar el número de secuencia de la cabecera IP
    1. Si es la primera conexión first = true:
      seq[src_index] = sequence + length;
      if( synflag ) {
         seq[src_index]++;
      }
      
    2. Si no es la primera conexión (first = false)
      if( sequence < seq[src_index] ) {
          newseq = sequence + length;
          if( newseq > seq[src_index] ) {
              ulong new_len;
              new_len = seq[src_index] - sequence;
              if ( data_length <= new_len ) {
              data = null;
              data_length = 0;
              incomplete_tcp_stream = true;
          } else {
              data_length -= new_len;
              byte[] tmpData = new byte[data_length];
              for(ulong i=0; i<data_length; /> 0 &&
              sequence > seq[src_index] ) {
                  tmp_frag = new tcp_frag();
                  tmp_frag.data = data;
                  tmp_frag.seq = sequence;
                  tmp_frag.len = length;
                  tmp_frag.data_len = data_length;
                  if( frags[src_index] != null ) {
                      tmp_frag.next = frags[src_index];
                  } else {
                      tmp_frag.next = null;
                  }
                  frags[src_index] = tmp_frag;
              }
          }
      }
      
efloxReconstrucción de sesiones TCP

Related Posts