]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
ssh: fix match on ssh banner
authorShivani Bhardwaj <shivanib134@gmail.com>
Fri, 8 Oct 2021 00:35:29 +0000 (06:05 +0530)
committerShivani Bhardwaj <shivanib134@gmail.com>
Fri, 8 Oct 2021 15:08:26 +0000 (20:38 +0530)
Default detection handling of SSH should not be to pass in case the
direction was not a match but to treat it like it was meant to server.

rust/src/ssh/detect.rs

index ed5341625bad08528378bf83a454f03f1900332e..f935651937f94503ebb69f6f0987fac396125f78 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 use super::ssh::SSHTransaction;
-use crate::core::{STREAM_TOCLIENT, STREAM_TOSERVER};
+use crate::core::STREAM_TOCLIENT;
 use std::ptr;
 
 #[no_mangle]
@@ -24,28 +24,24 @@ pub extern "C" fn rs_ssh_tx_get_protocol(
     tx: *mut std::os::raw::c_void, buffer: *mut *const u8, buffer_len: *mut u32, direction: u8,
 ) -> u8 {
     let tx = cast_pointer!(tx, SSHTransaction);
-    match direction {
-        STREAM_TOSERVER => {
-            let m = &tx.cli_hdr.protover;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    if direction & STREAM_TOCLIENT != 0 {
+        let m = &tx.srv_hdr.protover;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        STREAM_TOCLIENT => {
-            let m = &tx.srv_hdr.protover;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    } else {
+        let m = &tx.cli_hdr.protover;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        _ => {}
     }
     unsafe {
         *buffer = ptr::null();
@@ -60,28 +56,24 @@ pub extern "C" fn rs_ssh_tx_get_software(
     tx: *mut std::os::raw::c_void, buffer: *mut *const u8, buffer_len: *mut u32, direction: u8,
 ) -> u8 {
     let tx = cast_pointer!(tx, SSHTransaction);
-    match direction {
-        STREAM_TOSERVER => {
-            let m = &tx.cli_hdr.swver;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    if direction & STREAM_TOCLIENT != 0 {
+        let m = &tx.srv_hdr.swver;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        STREAM_TOCLIENT => {
-            let m = &tx.srv_hdr.swver;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    } else {
+        let m = &tx.cli_hdr.swver;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        _ => {}
     }
     unsafe {
         *buffer = ptr::null();
@@ -99,28 +91,24 @@ pub extern "C" fn rs_ssh_tx_get_hassh(
     direction: u8,
 ) -> u8 {
     let tx = cast_pointer!(tx, SSHTransaction);
-    match direction {
-        STREAM_TOSERVER => {
-            let m = &tx.cli_hdr.hassh;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    if direction & STREAM_TOCLIENT != 0 {
+        let m = &tx.srv_hdr.hassh;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        STREAM_TOCLIENT => {
-            let m = &tx.srv_hdr.hassh;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    } else {
+        let m = &tx.cli_hdr.hassh;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        _ => {}
     }
     unsafe {
         *buffer = ptr::null();
@@ -138,28 +126,24 @@ pub extern "C" fn rs_ssh_tx_get_hassh_string(
     direction: u8,
 ) -> u8 {
     let tx = cast_pointer!(tx, SSHTransaction);
-    match direction {
-        STREAM_TOSERVER => {
-            let m = &tx.cli_hdr.hassh_string;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    if direction & STREAM_TOCLIENT != 0 {
+        let m = &tx.srv_hdr.hassh_string;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        STREAM_TOCLIENT => {
-            let m = &tx.srv_hdr.hassh_string;
-            if m.len() > 0 {
-                unsafe {
-                    *buffer = m.as_ptr();
-                    *buffer_len = m.len() as u32;
-                }
-                return 1;
+    } else {
+        let m = &tx.cli_hdr.hassh_string;
+        if m.len() > 0 {
+            unsafe {
+                *buffer = m.as_ptr();
+                *buffer_len = m.len() as u32;
             }
+            return 1;
         }
-        _ => {}
     }
     unsafe {
         *buffer = ptr::null();