Wireshark-dev: Re: [Wireshark-dev] There seems to be a problem with dissect_nt_create_andx_resp
From: Richard Sharpe <realrichardsharpe@xxxxxxxxx>
Date: Sun, 27 May 2012 07:47:07 -0700
On Sat, May 26, 2012 at 8:34 PM, Richard Sharpe <realrichardsharpe@xxxxxxxxx> wrote: > Hi folks, > > I have noticed that there are some undissected bytes when I look at > NTCreate&X response, and I guess I have to accept the blame for that. > However, when I look at the code in Samba > (source3/nttrans.c:reply_ntcreate_and_X I see the following: > > SOFF_T(p, 0, SMB_VFS_GET_ALLOC_SIZE(conn,fsp,&smb_fname->st)); > p += 8; > SOFF_T(p,0,file_len); > p += 8; > > This matches up with the following in the dissector: > > /* allocation size */ > proto_tree_add_item(tree, hf_smb_alloc_size64, tvb, offset, 8, > ENC_LITTLE_ENDIAN); > offset += 8; > > /* end of file */ > /* We store the end of file */ > if (fid_info) { > fid_info->end_of_file=tvb_get_letoh64(tvb, offset); > } > proto_tree_add_item(tree, hf_smb_end_of_file, tvb, offset, 8, > ENC_LITTLE_ENDIAN); > offset += 8; > > However, then Samba does: > > if (flags & EXTENDED_RESPONSE_REQUIRED) { > uint16_t file_status = (NO_EAS|NO_SUBSTREAMS|NO_REPARSETAG); > size_t num_names = 0; > unsigned int num_streams = 0; > struct stream_struct *streams = NULL; > > /* Do we have any EA's ? */ > status = get_ea_names_from_file(ctx, conn, fsp, > smb_fname->base_name, NULL, &num_names); > if (NT_STATUS_IS_OK(status) && num_names) { > file_status &= ~NO_EAS; > } > status = vfs_streaminfo(conn, NULL, smb_fname->base_name, ctx, > &num_streams, &streams); > /* There is always one stream, ::$DATA. */ > if (NT_STATUS_IS_OK(status) && num_streams > 1) { > file_status &= ~NO_SUBSTREAMS; > } > TALLOC_FREE(streams); > SSVAL(p,2,file_status); > } > p += 4; > SCVAL(p,0,fsp->is_directory ? 1 : 0); > > if (flags & EXTENDED_RESPONSE_REQUIRED) { > uint32 perms = 0; > p += 25; > if (fsp->is_directory || > can_write_to_file(conn, smb_fname)) { > perms = FILE_GENERIC_ALL; > } else { > perms = FILE_GENERIC_READ|FILE_EXECUTE; > } > SIVAL(p,0,perms); > } > > Which inserts an int and then a further 29 bytes if > EXTENDED_RESPONSE_REQUIRED is in the incoming flags, and sticks a one > byte is_directoy indicator in between. > > However, in the dissector we have (syncing up with the offset += 8 above): > > offset += 8; > > /* File Type */ > ftype=tvb_get_letohs(tvb, offset); > proto_tree_add_item(tree, hf_smb_file_type, tvb, offset, 2, > ENC_LITTLE_ENDIAN); > offset += 2; > > /* IPC State */ > offset = dissect_ipc_state(tvb, tree, offset, FALSE); > > /* is directory */ > isdir=tvb_get_guint8(tvb, offset); > proto_tree_add_item(tree, hf_smb_is_directory, tvb, offset, 1, > ENC_LITTLE_ENDIAN); > offset += 1; > > Which will be wrong if EXTENDED_RESPONSES_REQUIRED ... > > I will have a look at the MS documents on this and try to prepare an update :-) Having looked at [MS-SMB].pdf I find, at long last, that we can answer some questions embedded in the code (I am the RJS who put comments in there): 2.2.4.9.1 Client Request Extensions An SMB_COM_NT_CREATE_ANDX request is sent by a client to open a file or device on the server. This extension adds the following: �X�nAn additional flag bit is added to the Flags field of the SMB_COM_NT_CREATE_ANDX request. The additional flag, NT_CREATE_REQUEST_EXTENDED_RESPONSE, is used to request an extended response from the server. �X�nAn additional parameter value is added to the ImpersonationLevel field. SECURITY_DELEGATION is added to allow the server to call other servers while impersonating the original client. and ... 2.2.4.9.2 Server Response Extensions A successful response takes the following format. If the server receives more than one SMB_COM_NT_CREATE_ANDX request from a client before it sends back any response, then the server can respond to these requests in any order. When a client requests extended information, then the response takes the form described below. Aside from the WordCount, NMPipeStatus_or_FileStatusFlags, FileId, VolumeGUID, FileId, MaximalAccessRights, and GuestMaximalAccessRights fields, all other fields are as specified in [MS-CIFS] section 2.2.4.64.2. So, there is a bunch of extra info in the response if we saw bit 0x10 of the [Create] Flags field set. I suspect that this can be handled by adding to struct smb_info the following: gboolean extended_response; /* Did the client request extended responses */ What say ye? -- Regards, Richard Sharpe (何以解憂?唯有杜康。--曹操)
- References:
- Prev by Date: [Wireshark-dev] make a extension for packet-sctp.c, meet a problem.
- Next by Date: [Wireshark-dev] The incomplete potential changes for handling extended response on NTCreate&x
- Previous by thread: [Wireshark-dev] There seems to be a problem with dissect_nt_create_andx_response in epan/dissectors/packet_smb.c
- Next by thread: [Wireshark-dev] Reassemble of segmented packets
- Index(es):