Skip to content

Commit 1f6aebe

Browse files
author
Matthew Hall
committed
Move to using constant values.
This commit adds several constants for TRANS2, QUERY_PATH_INFO, MAX_DATA_COUNT, and NT2 FLAG2 Bits to smb/constants.rb, which have then been utilised in smb/server.rb to reduce the use of magic values.
1 parent 3110c7b commit 1f6aebe

File tree

2 files changed

+80
-34
lines changed

2 files changed

+80
-34
lines changed

lib/rex/proto/smb/constants.rb

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@ class Constants
113113
NT_TRANSACT_GET_USER_QUOTA = 7 # Get quota
114114
NT_TRANSACT_SET_USER_QUOTA = 8 # Set quota
115115

116+
# NT Flags2 bits - cifs6.txt section 3.1.2
117+
FLAGS2_LONG_PATH_COMPONENTS = 0x0001
118+
FLAGS2_EXTENDED_ATTRIBUTES = 0x0002
119+
FLAGS2_SMB_SECURITY_SIGNATURES = 0x0004
120+
FLAGS2_SMB_SECURITY_SIGNATURES_REQUIRED = 0x0010
121+
FLAGS2_IS_LONG_NAME = 0x0040
122+
FLAGS2_EXTENDED_SECURITY = 0x0800
123+
FLAGS2_DFS_PATHNAMES = 0x1000
124+
FLAGS2_READ_PERMIT_EXECUTE = 0x2000
125+
FLAGS2_32_BIT_ERROR_CODES = 0x4000
126+
FLAGS2_UNICODE_STRINGS = 0x8000
127+
FLAGS2_WIN2K_SIGNATURE = 0xC852
128+
116129
# Open Modes
117130
OPEN_MODE_CREAT = 0x10 # Create the file if file does not exists. Otherwise, operation fails.
118131
OPEN_MODE_EXCL = 0x00 # When used with SMB_O_CREAT, operation fails if file exists. Cannot be used with SMB_O_OPEN.
@@ -169,9 +182,11 @@ class Constants
169182
TRANS2_FIND_FIRST2 = 1
170183
TRANS2_FIND_NEXT2 = 2
171184
TRANS2_QUERY_FS_INFO = 3
185+
TRANS2_QUERY_PATH_INFO = 5
172186
TRANS2_SET_PATH_INFO = 6
173-
187+
TRANS2_QUERY_FILE_INFO_STANDARD = 7
174188
TRANS2_CREATE_DIRECTORY = 13
189+
TRANS2_QUERY_FILE_INFO_BASIC = 24
175190

176191
# SMB_COM_TRANSACTION2 QUERY_FS_INFO information levels
177192
SMB_INFO_ALLOCATION = 1
@@ -197,8 +212,23 @@ class Constants
197212
SMB_QUERY_FILE_COMPRESSION_INFO = 0x10B
198213
SMB_QUERY_FILE_UNIX_BASIC = 0x200
199214
SMB_QUERY_FILE_UNIX_LINK = 0x201
215+
SMB_QUERY_PATH_STANDARD_INFO = 0x03ed
200216
SMB_INFO_PASSTHROUGH = 0x1000
201217

218+
# SMB_COM_TRANSACTION2 MAX DATA COUNT information levels
219+
SMB_QUERY_BASIC_MDC = 0x0028
220+
SMB_QUERY_STANDARD_MDC1 = 0x0018
221+
SMB_QUERY_STANDARD_MDC2 = 0x0102
222+
SMB_QUERY_FILE_INTERNAL_INFO_MDC = 0x0008
223+
SMB_QUERY_FILE_NETWORK_INFO_MDC = 0x0038
224+
225+
# SMB_COM_TRANS2 FIND_FIRST information levels
226+
SMB_FIND_FILE_DIRECTORY_INFO = 0x101
227+
SMB_FIND_FILE_FULL_DIRECTORY_INFO = 0x102
228+
SMB_FIND_FILE_NAMES_INFO = 0x103
229+
SMB_FIND_FILE_BOTH_DIRECTORY_INFO = 0x104
230+
SMB_FIND_ID_FULL_DIRECTORY_INFO = 0x105
231+
SMB_FIND_ID_BOTH_DIRECTORY_INFO = 0x106
202232

203233
# Device Types
204234
FILE_DEVICE_BEEP = 0x00000001
@@ -261,6 +291,23 @@ class Constants
261291
FILE_VOLUME_QUOTAS = 0x00000010
262292
FILE_VOLUME_IS_COMPRESSED = 0x00008000
263293

294+
# SMB_EXT_FILE_ATTR
295+
# http://msdn.microsoft.com/en-us/library/ee878573(prot.20).aspx
296+
SMB_EXT_FILE_ATTR_READONLY = 0x00000001
297+
SMB_EXT_FILE_ATTR_HIDDEN = 0x00000002
298+
SMB_EXT_FILE_ATTR_SYSTEM = 0x00000004
299+
SMB_EXT_FILE_ATTR_DIRECTORY = 0x00000010
300+
SMB_EXT_FILE_ATTR_ARCHIVE = 0x00000020
301+
SMB_EXT_FILE_ATTR_NORMAL = 0x00000080
302+
SMB_EXT_FILE_ATTR_TEMPORARY = 0x00000100
303+
SMB_EXT_FILE_ATTR_COMPRESSED = 0x00000800
304+
SMB_EXT_FILE_POSIX_SEMANTICS = 0x01000000
305+
SMB_EXT_FILE_BACKUP_SEMANTICS = 0x02000000
306+
SMB_EXT_FILE_DELETE_ON_CLOSE = 0x04000000
307+
SMB_EXT_FILE_SEQUENTIAL_SCAN = 0x08000000
308+
SMB_EXT_FILE_RANDOM_ACCESS = 0x10000000
309+
SMB_EXT_FILE_NO_BUFFERING = 0x20000000
310+
SMB_EXT_FILE_WRITE_THROUGH = 0x80000000
264311

265312
# SMB Error Codes
266313
SMB_STATUS_SUCCESS = 0x00000000

lib/rex/proto/smb/server.rb

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ def register(unc, contents, file_name, hi, lo)
140140
@hi = hi
141141
@lo = lo
142142
@exe = contents
143-
@flags2 = 0xc807 # e807 or c807 or c001
143+
@flags2 = CONST::FLAGS2_UNICODE_STRINGS +
144+
CONST::FLAGS2_EXTENDED_SECURITY +
145+
CONST::FLAGS2_32_BIT_ERROR_CODES +
146+
CONST::FLAGS2_LONG_PATH_COMPONENTS
144147
end
145148

146149
protected
@@ -266,9 +269,11 @@ def smb_error(cmd, c, errorclass, esn = false)
266269
pkt['Payload']['SMB'].v['Command'] = cmd
267270
pkt['Payload']['SMB'].v['Flags1'] = 0x88
268271
if esn
269-
pkt['Payload']['SMB'].v['Flags2'] = 0xc801
272+
pkt['Payload']['SMB'].v['Flags2'] = @flags2
270273
else
271-
pkt['Payload']['SMB'].v['Flags2'] = 0xc001
274+
pkt['Payload']['SMB'].v['Flags2'] = CONST::FLAGS2_UNICODE_STRINGS +
275+
CONST::FLAGS2_32_BIT_ERROR_CODES +
276+
CONST::FLAGS2_LONG_PATH_COMPONENTS
272277
end
273278
pkt['Payload']['SMB'].v['ErrorClass'] = errorclass
274279
c.put(pkt.to_s)
@@ -354,66 +359,60 @@ def smb_cmd_trans(c, buff)
354359
sub_command = pkt['Payload'].v['SetupData'].unpack("v").first
355360
dprint("Command is: #{sub_command.to_s}")
356361
ar = Rex::Text.to_hex(buff, '').to_s
357-
mdc = ar[86..89]
362+
mdc = ar[86..89].unpack('n*').reverse.pack('n*').to_i(16)
358363

359364
case sub_command
360-
when 0x24 # QUERY_FILE_INFO
361-
dprint("[query_file_info_24]")
362-
# path info works here
365+
when CONST::TRANS2_QUERY_FILE_INFO_BASIC
366+
dprint("[query_file_info_basic]")
363367
smb_cmd_trans_query_path_info_standard(c, buff)
364-
when 0x7 # QUERY_FILE_INFO
365-
dprint("[query_file_info_7]")
366-
loi = ar[148..151]
368+
when CONST::TRANS2_QUERY_FILE_INFO_STANDARD
369+
dprint("[query_file_info_standard]")
370+
loi = ar[148..151].unpack('n*').reverse.pack('n*').to_i(16)
367371
dprint("LOI is: #{loi}")
368372
case loi
369-
when 'ed03' # Query Path Standard Info
373+
when CONST::SMB_QUERY_PATH_STANDARD_INFO
370374
smb_cmd_trans_query_path_info_standard(c, buff)
371375
else
372376
smb_cmd_trans_query_file_info_standard(c, buff)
373377
end
374-
when 0x5 # QUERY_PATH_INFO
378+
when CONST::TRANS2_QUERY_PATH_INFO
375379
dprint("[query_path_info]")
376380
dprint("MDC is: #{mdc}")
377-
loi = ar[144..147]
381+
loi = ar[144..147].unpack('n*').reverse.pack('n*').to_i(16)
378382
dprint("LOI is: #{loi}")
379383
case mdc # MAX DATA COUNT
380-
when '2800'
381-
# Basic is MDC = 40 / 2800 hex
384+
when CONST::SMB_QUERY_BASIC_MDC
382385
case loi
383-
when '0101' # Query File Basic Info
386+
when CONST::SMB_QUERY_FILE_BASIC_INFO
384387
dprint("[query_file_info_basic]")
385388
smb_cmd_trans_query_file_info_basic(c, buff)
386389
else
387390
dprint("[query_path_info_basic]")
388391
smb_cmd_trans_query_path_info_basic(c, buff)
389392
end
390-
when '1800', '0201'
391-
# Standard is MDC = 24 / 1800 hex or 258 / 0201 hex
393+
when CONST::SMB_QUERY_STANDARD_MDC1, CONST::SMB_QUERY_STANDARD_MDC2
392394
dprint("[query_path_info_standard]")
393395
smb_cmd_trans_query_path_info_standard(c, buff)
394-
when '0800'
395-
# Internal File info is MDC = 8 / 0800 hex
396+
when CONST::SMB_QUERY_FILE_INTERNAL_INFO_MDC
396397
dprint("[query_file_info_basic]")
397398
smb_cmd_trans_query_file_info_standard(c, buff)
398-
when '3800'
399-
# Query file network open info
399+
when CONST::SMB_QUERY_FILE_NETWORK_INFO_MDC
400400
dprint("[query_file_info_network]")
401401
smb_cmd_trans_query_file_info_network(c, buff)
402402
else
403403
dprint("Unknown MDC - Sending to [query_path_info_standard]: #{mdc.to_s}")
404404
smb_cmd_trans_query_path_info_standard(c, buff)
405405
end
406-
when 0x1 # FIND_FIRST2
406+
when CONST::TRANS2_FIND_FIRST2
407407
dprint("find_first2")
408-
loi = ar[156..159]
409-
dprint("MDC is: #{mdc}")
408+
loi = ar[156..159].unpack('n*').reverse.pack('n*').to_i(16)
410409
dprint("LOI is: #{loi}")
411410
case loi
412-
when '0301' # Find File Names Info # 259
411+
when CONST::SMB_FIND_FILE_NAMES_INFO
413412
smb_cmd_trans_find_first2_file(c, buff)
414-
when '0401' # Find File Both Directory Info # 260
413+
when CONST::SMB_FIND_FILE_BOTH_DIRECTORY_INFO
415414
smb_cmd_trans_find_first2(c, buff)
416-
when '0201' # Find File Full Directory Info # 258
415+
when CONST::SMB_FIND_FILE_FULL_DIRECTORY_INFO
417416
smb_cmd_trans_find_first2_full(c, buff)
418417
else
419418
smb_cmd_trans_find_first2(c, buff)
@@ -799,7 +798,7 @@ def smb_cmd_trans_query_path_info_standard(c, buff)
799798

800799
payload = pkt['Payload'].v['SetupData'].gsub(/\x00/, '').gsub(/.*\\/, '').chomp.strip
801800
ar = Rex::Text.to_hex(buff, '').to_s
802-
fid = ar[146..147] + ar[144..145]
801+
fid = ar[144..147].unpack('n*').reverse.pack('n*')
803802
dprint("[smb_cmd_trans_query_path_info_standard] fid is : #{fid.hex}, file_id is : " + self.file_id.to_s)
804803
dprint("[smb_cmd_trans_query_path_info_standard] Payload length: #{payload.length.to_s}")
805804

@@ -857,7 +856,7 @@ def smb_cmd_trans_query_file_info_basic(c, buff)
857856

858857
ar = Rex::Text.to_hex(buff, '').to_s
859858
dprint("[smb_cmd_trans_query_file_info_basic] ar is : #{ar}")
860-
fid = ar[146..147] + ar[144..145]
859+
fid = ar[144..147].unpack('n*').reverse.pack('n*')
861860
dprint("[smb_cmd_trans_query_file_info_basic] fid is : #{fid.hex}, file_id is : " + self.file_id.to_s)
862861
if ( fid.hex.eql?(self.file_id.to_i) )
863862
dprint("File match")
@@ -1037,7 +1036,7 @@ def smb_cmd_trans_find_first2(c, buff)
10371036

10381037
ar = Rex::Text.to_hex(buff, '').to_s
10391038
dprint("[smb_cmd_trans_find_first2] ar is : #{ar}")
1040-
fid = ar[146..147] + ar[144..145]
1039+
fid = ar[144..147].unpack('n*').reverse.pack('n*')
10411040
dprint("[smb_cmd_trans_find_first2] fid is : #{fid.hex}, file_id is : " + self.file_id.to_s)
10421041
if ( fid.hex.eql?(self.file_id.to_i) )
10431042
dprint("File match")
@@ -1144,7 +1143,7 @@ def smb_cmd_trans_find_first2_file(c, buff)
11441143

11451144
ar = Rex::Text.to_hex(buff, '').to_s
11461145
dprint("[smb_cmd_trans_find_first2_file] ar is : #{ar}")
1147-
fid = ar[146..147] + ar[144..145]
1146+
fid = ar[144..147].unpack('n*').reverse.pack('n*')
11481147
dprint("[smb_cmd_trans_find_first2_file] fid is : #{fid.hex}, file_id is : " + self.file_id.to_s)
11491148
if ( fid.hex.eql?(self.file_id.to_i) )
11501149
dprint("File match")
@@ -1232,7 +1231,7 @@ def smb_cmd_trans_find_first2_full(c, buff)
12321231

12331232
ar = Rex::Text.to_hex(buff, '').to_s
12341233
dprint("[smb_cmd_trans_find_first2_full] ar is : #{ar}")
1235-
fid = ar[146..147] + ar[144..145]
1234+
fid = ar[144..147].unpack('n*').reverse.pack('n*')
12361235
dprint("[smb_cmd_trans_find_first2_full] fid is : #{fid.hex}, file_id is : " + self.file_id.to_s)
12371236
if ( fid.hex.eql?(self.file_id.to_i) )
12381237
dprint("File match")

0 commit comments

Comments
 (0)