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("