From 2616afa62584a2402f7fcdbbcf1149605e24461d Mon Sep 17 00:00:00 2001 From: Shivani Bhardwaj Date: Fri, 8 Oct 2021 06:05:29 +0530 Subject: [PATCH] ssh: fix match on ssh banner 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 | 130 ++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 73 deletions(-) diff --git a/rust/src/ssh/detect.rs b/rust/src/ssh/detect.rs index ed5341625b..f935651937 100644 --- a/rust/src/ssh/detect.rs +++ b/rust/src/ssh/detect.rs @@ -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(); -- 2.47.2