]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb1: add parsing for RENAME command
authorVictor Julien <victor@inliniac.net>
Thu, 15 Mar 2018 13:17:19 +0000 (14:17 +0100)
committerVictor Julien <victor@inliniac.net>
Thu, 15 Mar 2018 16:20:30 +0000 (17:20 +0100)
rust/src/smb/log.rs
rust/src/smb/smb1.rs
rust/src/smb/smb1_records.rs

index e3d9aa0cee3512964aa881bafaf27a26aba92964..fe3f901826465082b3bdf4194267d25e86c33efe 100644 (file)
@@ -330,14 +330,19 @@ fn smb_common_header(state: &SMBState, tx: &SMBTransaction) -> Json
             js.set_string("fuid", &gs);
         },
         Some(SMBTransactionTypeData::RENAME(ref x)) => {
+            if tx.vercmd.get_version() == 2 {
+                let jsd = Json::object();
+                jsd.set_string("class", "FILE_INFO");
+                jsd.set_string("info_level", "SMB2_FILE_RENAME_INFO");
+                js.set("set_info", jsd);
+            }
+
             let jsd = Json::object();
-            jsd.set_string("class", "FILE_INFO");
-            jsd.set_string("info_level", "SMB2_FILE_RENAME_INFO");
             let file_name = String::from_utf8_lossy(&x.oldname);
             jsd.set_string("from", &file_name);
             let file_name = String::from_utf8_lossy(&x.newname);
             jsd.set_string("to", &file_name);
-            js.set("set_info", jsd);
+            js.set("rename", jsd);
             let gs = fuid_to_string(&x.fuid);
             js.set_string("fuid", &gs);
         },
index a2044728dd850567b1c951efba662ae923867243..f39c2e6baddfd79720b5a3ec44100df88a572822 100644 (file)
@@ -176,6 +176,30 @@ pub fn smb1_request_record<'b>(state: &mut SMBState, r: &SmbRecord<'b>) -> u32 {
     let mut no_response_expected = false;
 
     let have_tx = match r.command {
+        SMB1_COMMAND_RENAME => {
+            match parse_smb_rename_request_record(r.data) {
+                IResult::Done(_, rd) => {
+                    SCLogDebug!("RENAME {:?}", rd);
+
+                    let tx_hdr = SMBCommonHdr::from1(r, SMBHDR_TYPE_GENERICTX);
+                    let mut newname = rd.newname;
+                    newname.retain(|&i|i != 0x00);
+                    let mut oldname = rd.oldname;
+                    oldname.retain(|&i|i != 0x00);
+
+                    let tx = state.new_rename_tx(Vec::new(), oldname, newname);
+                    tx.hdr = tx_hdr;
+                    tx.request_done = true;
+                    tx.vercmd.set_smb1_cmd(SMB1_COMMAND_RENAME);
+                    true
+                },
+                _ => {
+                    events.push(SMBEvent::MalformedData);
+                    false
+                },
+            }
+        },
+
         SMB1_COMMAND_READ_ANDX => {
             match parse_smb_read_andx_request_record(r.data) {
                 IResult::Done(_, rr) => {
index 6e4def7c3cdf51466f0954489a9c8c2bc90cccf9..ed37ff481cd9e26affb8d45171f9e4081fb363c0 100644 (file)
@@ -519,6 +519,27 @@ named!(pub parse_smb_read_andx_response_record<SmbResponseReadAndXRecord>,
            }))
 );
 
+#[derive(Debug,PartialEq)]
+pub struct SmbRequestRenameRecord {
+    pub oldname: Vec<u8>,
+    pub newname: Vec<u8>,
+}
+
+named!(pub parse_smb_rename_request_record<SmbRequestRenameRecord>,
+    do_parse!(
+            wct: le_u8
+        >>  search_attr: le_u16
+        >>  bcc: le_u16
+        >>  oldtype: le_u8
+        >>  oldname: smb_get_unicode_string
+        >>  newtype: le_u8
+        >>  newname: apply!(smb_get_unicode_string_with_offset, 1) // HACK if we assume oldname is a series of utf16 chars offset would be 1
+        >> (SmbRequestRenameRecord {
+                oldname: oldname,
+                newname: newname,
+           }))
+);
+
 #[derive(Debug,PartialEq)]
 pub struct SmbRequestCreateAndXRecord<'a> {
     pub disposition: u32,