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 ...