diff --git a/nselib/smb.lua b/nselib/smb.lua index 3a9869839..944206006 100644 --- a/nselib/smb.lua +++ b/nselib/smb.lua @@ -677,8 +677,11 @@ end -- --@param smb The smb state table. --@param command The command to use. +--@param overrides The overrides table. Keep in mind that overriding things like flags is generally a very bad idea, unless you know what you're doing. --@return A binary string containing the packed packet header. -local function smb_encode_header(smb, command) +local function smb_encode_header(smb, command, overrides) + -- Make sure we have an overrides array + overrides = overrides or {} -- Used for the header local sig = string.char(0xFF) .. "SMB" @@ -693,7 +696,7 @@ local function smb_encode_header(smb, command) if(nmap.registry.args.smbsign ~= "disable") then flags2 = bit.bor(flags2, 0x0004) -- SMB_FLAGS2_SECURITY_SIGNATURE end - + if(smb['extended_security'] == true) then flags2 = bit.bor(flags2, 0x0800) -- SMB_EXTENDED_SECURITY @@ -710,16 +713,16 @@ local function smb_encode_header(smb, command) sig:byte(3), -- Header sig:byte(4), -- Header command, -- Command - 0, -- status - flags, -- flags - flags2, -- flags2 - 0, -- extra (pid_high) - 0, -- extra (signature) - 0, -- extra (unused) - smb['tid'], -- tid - 12345, -- pid - smb['uid'], -- uid - 0 -- mid + (overrides['status'] or 0), -- status + (overrides['flags'] or flags), -- flags + (overrides['flags2'] or flags2), -- flags2 + (overrides['pid_high'] or 0), -- extra (pid_high) + (overrides['signature'] or 0), -- extra (signature) + (overrides['extra'] or 0), -- extra (unused) + (overrides['tid'] or smb['tid']), -- tid + (overrides['pid'] or 12345), -- pid + (overrides['uid'] or smb['uid']), -- uid + (overrides['uid'] or 0) -- mid ) return header @@ -732,9 +735,13 @@ end -- This is automatically done by smb_send. -- -- @param parameters The parameters section. +-- @param overrides The overrides table. The only thing possible to override here is the length. -- @return The encoded parameters. -local function smb_encode_parameters(parameters) - return bin.pack("smb_send. -- -- @param data The data section. +-- @param overrides The overrides table. The only thing possible to override here is the length. -- @return The encoded data. -local function smb_encode_data(data) - return bin.pack("smb_get_header. --@param parameters The parameters. --@param data The data. +--@param overrides Overrides table. --@return (result, err) If result is false, err is the error message. Otherwise, err is -- undefined -function smb_send(smb, header, parameters, data) - local encoded_parameters = smb_encode_parameters(parameters) - local encoded_data = smb_encode_data(data) +function smb_send(smb, header, parameters, data, overrides) + overrides = overrides or {} + + local encoded_parameters = smb_encode_parameters(parameters, overrides) + local encoded_data = smb_encode_data(data, overrides) local body = header .. encoded_parameters .. encoded_data local attempts = 5 local status, err @@ -996,7 +1010,7 @@ function negotiate_protocol(smb, overrides) local pos local header1, header2, header3, ehader4, command, status, flags, flags2, pid_high, signature, unused, pid, mid - header = smb_encode_header(smb, command_codes['SMB_COM_NEGOTIATE']) + header = smb_encode_header(smb, command_codes['SMB_COM_NEGOTIATE'], overrides) -- Make sure we have overrides overrides = overrides or {} @@ -1017,7 +1031,7 @@ function negotiate_protocol(smb, overrides) -- Send the negotiate request stdnse.print_debug(2, "SMB: Sending SMB_COM_NEGOTIATE") - local result, err = smb_send(smb, header, parameters, data) + local result, err = smb_send(smb, header, parameters, data, overrides) if(status == false) then return false, err end @@ -1147,7 +1161,7 @@ function start_session_basic(smb, log_errors, overrides) local os, lanmanager local username, domain, password, password_hash, hash_type - header = smb_encode_header(smb, command_codes['SMB_COM_SESSION_SETUP_ANDX']) + header = smb_encode_header(smb, command_codes['SMB_COM_SESSION_SETUP_ANDX'], overrides) -- Get the first account, unless they overrode it if(overrides ~= nil and overrides['username'] ~= nil) then @@ -1193,7 +1207,7 @@ function start_session_basic(smb, log_errors, overrides) -- Send the session setup request stdnse.print_debug(2, "SMB: Sending SMB_COM_SESSION_SETUP_ANDX") - result, err = smb_send(smb, header, parameters, data) + result, err = smb_send(smb, header, parameters, data, overrides) if(result == false) then return false, err end @@ -1313,7 +1327,7 @@ function start_session_extended(smb, log_errors, overrides) return false, string.format("SMB: ERROR: Security blob: %s", security_blob) end - header = smb_encode_header(smb, command_codes['SMB_COM_SESSION_SETUP_ANDX']) + header = smb_encode_header(smb, command_codes['SMB_COM_SESSION_SETUP_ANDX'], overrides) -- Parameters parameters = bin.pack("