]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb1: extract server guid from negotiate
authorVictor Julien <victor@inliniac.net>
Mon, 12 Mar 2018 08:56:12 +0000 (09:56 +0100)
committerVictor Julien <victor@inliniac.net>
Mon, 12 Mar 2018 14:34:43 +0000 (15:34 +0100)
rust/src/smb/smb1.rs
rust/src/smb/smb1_records.rs

index 637a41454f960726566268105ce219ab77249421..8fafe0ea7de43b0b8c3749d68b4953da9a3b8628 100644 (file)
@@ -388,6 +388,8 @@ pub fn smb1_response_record<'b>(state: &mut SMBState, r: &SmbRecord<'b>) -> u32
                             SCLogDebug!("tx {} is done", tx.id);
                             let d = match tx.type_data {
                                 Some(SMBTransactionTypeData::NEGOTIATE(ref mut x)) => {
+                                    x.server_guid = pr.server_guid.to_vec();
+
                                     let dialect_idx = pr.dialect_idx as usize;
                                     if x.dialects.len() <= dialect_idx {
                                         None
index 4ec138d10cd7592cdd6d8c9885da77e3fee609b1..46e75020a92b57d7cc6f03798b70b297cd8c1bcb 100644 (file)
@@ -113,19 +113,45 @@ named!(pub parse_smb1_write_and_close_request_record<Smb1WriteRequestRecord>,
 );
 
 #[derive(Debug,PartialEq)]
-pub struct Smb1NegotiateProtocolResponseRecord<> {
+pub struct Smb1NegotiateProtocolResponseRecord<'a> {
     pub dialect_idx: u16,
+    pub server_guid: &'a[u8],
 }
 
-named!(pub parse_smb1_negotiate_protocol_response_record<Smb1NegotiateProtocolResponseRecord>,
+named!(pub parse_smb1_negotiate_protocol_response_record_error<Smb1NegotiateProtocolResponseRecord>,
+    do_parse!(
+            wct: le_u8
+         >> bcc: le_u16
+         >> ( Smb1NegotiateProtocolResponseRecord {
+                dialect_idx: 0,
+                server_guid: &[],
+            })
+));
+
+named!(pub parse_smb1_negotiate_protocol_response_record_ok<Smb1NegotiateProtocolResponseRecord>,
     do_parse!(
-            le_u8
+            wct: le_u8
         >>  dialect_idx: le_u16
+        >>  sec_mode: le_u8
+        >>  take!(16)
+        >>  caps: le_u32
+        >>  sys_time: le_u64
+        >>  server_tz: le_u16
+        >>  challenge_len: le_u8
+        >>  bcc: le_u16
+        >>  server_guid: cond!(bcc >= 16, take!(16))
         >> (Smb1NegotiateProtocolResponseRecord {
                 dialect_idx:dialect_idx,
+                server_guid: server_guid.unwrap_or(&[]),
             }))
 );
 
+named!(pub parse_smb1_negotiate_protocol_response_record<Smb1NegotiateProtocolResponseRecord>,
+    switch!(peek!(le_u8),
+        0 => call!(parse_smb1_negotiate_protocol_response_record_error) |
+        _ => call!(parse_smb1_negotiate_protocol_response_record_ok)
+    ));
+
 #[derive(Debug,PartialEq)]
 pub struct Smb1NegotiateProtocolRecord<'a> {
     pub dialects: Vec<&'a [u8]>,