Mensajes de intercambio de versión de clasificación de protocolo SSH

2

Estoy tratando de clasificar los protocolos de red sobre el tráfico de red. Ahora mi tarea es el protocolo SSH. Leí el RFC y sé que SSH comienza con un mensaje de intercambio de protocolo tanto del cliente como del servidor.

El formato es: SSH-protoversion-softwareversion SP comenta CR LF

También encontré un proyecto de código abierto llamado "ndpi" que ya implementó esto

if (flow->l4.tcp.ssh_stage == 0) {
    if (packet->payload_packet_len > 7 && packet->payload_packet_len < 100
        && memcmp(packet->payload, "SSH-", 4) == 0) {
        flow->l4.tcp.ssh_stage = 1 + packet->packet_direction;
        return;
    }
} else if (flow->l4.tcp.ssh_stage == (2 - packet->packet_direction)) {
    if (packet->payload_packet_len > 7 && packet->payload_packet_len < 100
        && memcmp(packet->payload, "SSH-", 4) == 0) {
        ndpi_int_ssh_add_connection(ndpi_struct, flow);
        return;
    }
}

Está comprobando si la carga útil contiene la cadena "ssh-". Pero no puedo entender la conexión con "packet_direction". Creo que simplemente comprobar si 2 cargas útiles en un flujo contiene "ssh-" cadena sería suficiente. Quiero preguntar si debo tener en cuenta packet_direction y, en caso afirmativo, ¿por qué?

    
pregunta Kadir Erdem Demir 19.04.2013 - 09:08
fuente

1 respuesta

1

El fragmento de código que muestra está haciendo exactamente eso: está comprobando que hay un paquete (de tamaño de 8 a 99 bytes, que comienza con "SSH-") en ambas direcciones . Dado que se supone que el cliente y el servidor deben hablar de forma simultánea, el motor de detección no puede asumir que verá primero el paquete del cliente o el paquete del servidor; y saber de qué lado de la conexión está el "cliente" puede ser difícil de todos modos en el contexto del procesamiento paquete por paquete.

Por lo tanto, el código que muestra usa una marca llamada packet_direction que tiene un valor de 0 o 1, para las dos posibles direcciones. Más adelante, llamaré a la dirección 0 "AtoB" y a la dirección 1 "BtoA" (no importa si A o B es el cliente en el nivel TCP). El código también utiliza un indicador interno ssh_stage , inicialmente en 0. Cuando se detecta un primer paquete que coincide con las condiciones (tamaño 8 a 99 bytes, comienza con "SSH-"), se usa la primera mitad del código (ya que ssh_stage es 0 en ese punto), y ssh_stage se establece en 1 si este primer paquete está en la dirección "AtoB", 2 si está en la dirección "BtoA".

Cuando llega un segundo paquete coincidente, packet_direction ahora está configurado en la dirección de ese paquete segundo . Si ese segundo paquete está en la misma dirección que el primer paquete, entonces el valor actual de ssh_stage no coincidirá con la expresión 2 - packet->packet_direction ; sin embargo, coincidirá si el segundo paquete viene de la otra dirección (por ejemplo, el segundo paquete está en "BtoA", mientras que el primer paquete estaba en "AtoB").

Para resumir , el código verifica que en realidad hay dos paquetes de "aspecto SSH" en direcciones opuestas , a diferencia de dos paquetes sucesivos en la misma dirección de flujo .

Lo que debes hacer depende de qué tan confiable quieres que sea tu motor. Si solo necesita dos paquetes de aspecto SSH sin considerar la dirección, puede obtener algunos falsos positivos, en caso de que un cliente que no sea SSH envíe dos paquetes de este tipo a un servidor que no sea SSH. Requerir que los dos paquetes fluyan en direcciones opuestas activará menos falsos positivos. Tenga en cuenta que el código ndpi ya no es 100% confiable.

De hecho, si observa RFC 4253 :

  • Las cadenas iniciales enviadas por el cliente y el servidor pueden tener una longitud de hasta 255 caracteres, no 99.
  • Después del intercambio de las cadenas de versión, el cuadro de diálogo de configuración de la conexión continúa con algunos datos adicionales del cliente, que el cliente puede enviar inmediatamente , posiblemente en el mismo paquete que su cadena de versión, por lo tanto, la longitud de la carga útil del cliente podría ser superior a 255 bytes.
  • El servidor puede enviar algunas líneas adicionales de caracteres antes de su cadena de versión, por lo que la longitud de la carga útil del paquete del servidor también puede exceder de 255, y no necesariamente comienza con "SSH-".

Por lo tanto, el código ndpi puede perder algunas conexiones SSH perfectamente estándar. Depende de usted decidir si desea perder más o menos tales conexiones. Por supuesto, cuanto más confiable sea su código, más trabajo tendrá que hacer ...

    
respondido por el Thomas Pornin 19.04.2013 - 13:28
fuente

Lea otras preguntas en las etiquetas