コード例 #1
0
        /// <summary>
        /// Update SMB_COM_SESSION_SETUP response.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="sessionId">
        /// Set this value to 0 to request a new session setup, or set this value to a previously established session
        /// identifier to request the re-authentication of an existing session.
        /// </param>
        /// <param name="messageId">This is used to associate a response with a request.</param>
        public static void UpdateSessionSetupResponseAdditional(
            SmbConnection connection,
            int messageId,
            int sessionId)
        {
            SessionSetupRequestAdditional request = (SessionSetupRequestAdditional)connection.sentRequest[messageId];

            connection.sessionList.Add(sessionId, new SmbSession(sessionId, SessionState.Valid));
            connection.sessionId++;
            connection.SutNextReceiveSequenceNumber++;

            if (connection.isSignEnable(connection.clientSignState, connection.sutSignState))
            {
                if (request.accountType == AccountType.Admin)
                {
                    connection.isSigningActive = true;
                }
                else if (request.accountType == AccountType.Guest)
                {
                    connection.isSigningActive = false;
                }
            }

            connection.SutSendSequenceNumber.Remove(messageId);
            connection.sentRequest.Remove(messageId);
        }
コード例 #2
0
        /// <summary>
        /// Update SMB_COM_SESSION_SETUP request for non-extended security mode.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="smbRequest">It represents the SMB request.</param>
        public static void UpdateNonExtSessionSetupRequest(SmbConnection connection, SmbRequest smbRequest)
        {
            NonExtendedSessionSetupRequest req = smbRequest as NonExtendedSessionSetupRequest;

            connection.SutSendSequenceNumber.Add(smbRequest.messageId);
            connection.sentRequest.Add(smbRequest.messageId, smbRequest);
            connection.clientCapabilities = req.capabilities;
            connection.accountType        = req.accountType;
        }
コード例 #3
0
        /// <summary>
        /// Update SMB_COM_SESSION_SETUP request.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="smbRequest">It represents the SMB request.</param>
        public static void UpdateSessionSetupRequestAdditional(SmbConnection connection, SmbRequest smbRequest)
        {
            SessionSetupRequestAdditional req = smbRequest as SessionSetupRequestAdditional;

            connection.SutSendSequenceNumber.Add(smbRequest.messageId);
            connection.sentRequest.Add(smbRequest.messageId, smbRequest);
            connection.clientCapabilities = req.capabilities;
            connection.accountType        = req.accountType;
        }
コード例 #4
0
        /// <summary>
        /// Update SMB_COM_NEGOTIATE request.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="smbRequest">It represents the SMB request.</param>
        public static void UpdateNegotiateRequest(SmbConnection connection, SmbRequest smbRequest)
        {
            NegotiateRequest req = smbRequest as NegotiateRequest;

            connection.SutSendSequenceNumber.Add(smbRequest.messageId);
            connection.sentRequest.Add(smbRequest.messageId, smbRequest);
            connection.clientSignState            = req.signState;
            connection.isNegotiateSent            = true;
            connection.isClientSupportExtSecurity = req.isSupportExtSecurity;
        }
コード例 #5
0
 /// <summary>
 /// Update SMB_COM_NEGOTIATE response.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="messageId">This is used to associate a response with a request.</param>
 /// <param name="signState">It indicates whether the System Under Test (the SUT) has message signing enabled or required </param>
 /// <param name="serverCapabilities">
 /// It is used by the SUT to notify the client as to which features are supported by the SUT.
 /// </param>
 public static void UpdateNegotiateResponse(
     SmbConnection connection,
     int messageId,
     SignState signState,
     List <Capabilities> serverCapabilities)
 {
     connection.sutSignState = signState;
     connection.SutSendSequenceNumber.Remove(messageId);
     connection.sentRequest.Remove(messageId);
     connection.SutNextReceiveSequenceNumber++;
     connection.sutCapabilities = serverCapabilities;
 }
コード例 #6
0
        /// <summary>
        /// Update SMB_COM_TREE_CONNECT_ANDX response.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="messageId">This is used to associate a response with a request.</param>
        /// <param name="treeId">This is used to indicate the share that the client is accessing.</param>
        /// <param name="shareType">The type of resource the client intends to access.</param>
        /// <param name="sessionId">
        /// Set this value to 0 to request a new session setup, or set this value to a previously established session
        /// identifier to request the re-authentication of an existing session.
        /// </param>
        public static void UpdateTreeConnectResponse(
            SmbConnection connection,
            int messageId,
            int sessionId,
            int treeId,
            ShareType shareType)
        {
            TreeConnectRequest request = (TreeConnectRequest)connection.sentRequest[messageId];

            connection.treeConnectList.Add(
                treeId,
                new SmbTree(treeId, new SmbShare(request.shareName, shareType), sessionId));

            switch (shareType)
            {
            case ShareType.Disk:
                Parameter.shareFileNames.Remove(request.shareName);
                break;

            case ShareType.NamedPipe:
                Parameter.sharePipeNames.Remove(request.shareName);
                break;

            case ShareType.Printer:
                Parameter.sharePrinterNames.Remove(request.shareName);
                break;

            case ShareType.CommunicationDevice:
                Parameter.shareDeviceNames.Remove(request.shareName);
                break;

            default:
                break;
            }

            connection.SutSendSequenceNumber.Remove(messageId);
            connection.SutSendSequenceNumber.Remove(messageId);
            connection.sentRequest.Remove(messageId);
            connection.SutNextReceiveSequenceNumber++;
            connection.treeId++;
        }
コード例 #7
0
 /// <summary>
 /// Update NT_TRANSACT_CREATE response.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="messageId">This is used to associate a response with a request.</param>
 public static void UpdateNTTransactCreateResponse(SmbConnection connection, int messageId)
 {
     connection.SutSendSequenceNumber.Remove(messageId);
     connection.sentRequest.Remove(messageId);
     connection.SutNextReceiveSequenceNumber++;
 }
コード例 #8
0
 /// <summary>
 /// Update NT_TRANSACT_CREATE request.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="smbRequest">It represents the SMB request.</param>
 public static void UpdateNTTransactCreateRequest(SmbConnection connection, SmbRequest smbRequest)
 {
     connection.SutSendSequenceNumber.Add(smbRequest.messageId);
     connection.sentRequest.Add(smbRequest.messageId, smbRequest);
 }
コード例 #9
0
 /// <summary>
 /// Update request.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="request">It represents the SMB request.</param>
 public static void UpdateRequest(SmbConnection connection, SmbRequest request)
 {
     connection.SutSendSequenceNumber.Add(request.messageId);
     connection.sentRequest.Add(request.messageId, request);
 }
コード例 #10
0
        /// <summary>
        /// Update SMB_COM_NT_CREATE_ANDX response.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="messageId">This is used to associate a response with a request.</param>
        /// <param name="fId">The SMB file identifier of the target directory.</param>
        /// <param name="createAction">The action taken for the specified file.</param>
        public static void UpdateCreateResponse(
            SmbConnection connection,
            int messageId,
            int fId,
            List <CreateAction> createAction)
        {
            CreateRequest request  = (CreateRequest)connection.sentRequest[messageId];
            bool          isOpened = false;

            if (createAction.Contains(CreateAction.FileCreated) || createAction.Contains(CreateAction.FileSuperseded))
            {
                isOpened = false;
            }
            else if (createAction.Contains(CreateAction.FileOpened) ||
                     createAction.Contains(CreateAction.FileOverwritten))
            {
                isOpened = true;
            }

            switch (request.shareType)
            {
            case ShareType.Disk:
                SmbFile file = new SmbFile(
                    request.shareType,
                    request.name,
                    request.treeId,
                    request.desiredAccess,
                    isOpened);
                Console.WriteLine(fId);
                connection.openedFiles.Add(fId, file);
                break;

            case ShareType.NamedPipe:
                if (Parameter.pipeNames.Contains(request.name))
                {
                    SmbPipe pipe = new SmbPipe(
                        request.shareType,
                        request.name,
                        request.treeId,
                        request.desiredAccess,
                        isOpened);
                    connection.openedPipes.Add(fId, pipe);
                    connection.openedPipes[fId].isRequireReadModePipeState = Parameter.isMessageModePipe;
                }
                else if (Parameter.mailslotNames.Contains(request.name))
                {
                    SmbMailslot mailslot = new SmbMailslot(
                        request.shareType,
                        request.name,
                        request.treeId,
                        request.desiredAccess,
                        isOpened);
                    connection.openedMailslots.Add(fId, mailslot);
                }
                break;

            default:
                break;
            }

            connection.SutSendSequenceNumber.Remove(messageId);
            connection.sentRequest.Remove(messageId);
            connection.SutNextReceiveSequenceNumber++;
            connection.fId++;
        }
コード例 #11
0
 /// <summary>
 /// Update SMB_COM_SESSION_SETUP request.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="smbRequest">It represents the SMB request.</param>
 public static void UpdateSessionSetupRequestAdditional(SmbConnection connection, SmbRequest smbRequest)
 {
     SessionSetupRequestAdditional req = smbRequest as SessionSetupRequestAdditional;
     connection.SutSendSequenceNumber.Add(smbRequest.messageId);
     connection.sentRequest.Add(smbRequest.messageId, smbRequest);
     connection.clientCapabilities = req.capabilities;
     connection.accountType = req.accountType;
 }
コード例 #12
0
 /// <summary>
 /// Update SMB_COM_NEGOTIATE response.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="messageId">This is used to associate a response with a request.</param>
 /// <param name="signState">It indicates whether the System Under Test (the SUT) has message signing enabled or required </param>
 /// <param name="serverCapabilities">
 /// It is used by the SUT to notify the client as to which features are supported by the SUT.
 /// </param>
 public static void UpdateNegotiateResponse(
     SmbConnection connection, 
     int messageId,
     SignState signState, 
     Set<Capabilities> serverCapabilities)
 {
     connection.sutSignState = signState;
     connection.SutSendSequenceNumber.Remove(messageId);
     connection.sentRequest.Remove(messageId);
     connection.SutNextReceiveSequenceNumber++;
     connection.sutCapabilities = serverCapabilities;
 }
コード例 #13
0
        /// <summary>
        /// Update SMB_COM_NT_CREATE_ANDX response.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="messageId">This is used to associate a response with a request.</param>
        /// <param name="fId">The SMB file identifier of the target directory.</param>
        /// <param name="createAction">The action taken for the specified file.</param>
        public static void UpdateCreateResponse(
            SmbConnection connection, 
            int messageId, 
            int fId, 
            Set<CreateAction> createAction)
        {
            CreateRequest request = (CreateRequest)connection.sentRequest[messageId];
            bool isOpened = false;
            if(createAction.Contains(CreateAction.FileCreated) || createAction.Contains(CreateAction.FileSuperseded))
            {
                isOpened = false;
            }
            else if(createAction.Contains(CreateAction.FileOpened)
                        || createAction.Contains(CreateAction.FileOverwritten ))
            {
                isOpened = true;
            }

            switch (request.shareType)
            {
                case ShareType.Disk:
                    SmbFile file = new SmbFile(
                        request.shareType,
                        request.name,
                        request.treeId,
                        request.desiredAccess,
                        isOpened);
                    Console.WriteLine(fId);
                    connection.openedFiles.Add(fId, file);
                    break;
                case ShareType.NamedPipe:
                    if(Parameter.pipeNames.Contains(request.name))
                    {
                        SmbPipe pipe = new SmbPipe(
                            request.shareType,
                            request.name,
                            request.treeId,
                            request.desiredAccess,
                            isOpened);
                        connection.openedPipes.Add(fId, pipe);
                        connection.openedPipes[fId].isRequireReadModePipeState = Parameter.isMessageModePipe;
                    }
                    else if(Parameter.mailslotNames.Contains(request.name))
                    {
                        SmbMailslot mailslot = new SmbMailslot(
                            request.shareType,
                            request.name,
                            request.treeId,
                            request.desiredAccess,
                            isOpened);
                        connection.openedMailslots.Add(fId,mailslot);
                    }
                    break;
                default:
                    break;
            }

            connection.SutSendSequenceNumber.Remove(messageId);
            connection.sentRequest.Remove(messageId);
            connection.SutNextReceiveSequenceNumber++;
            connection.fId++;
        }
コード例 #14
0
 /// <summary>
 /// Update SMB_COM_WRITE_ANDX response.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="messageId">This is used to associate a response with a request.</param>
 public static void UpdateWriteResponse(SmbConnection connection, int messageId)
 {
     connection.SutSendSequenceNumber.Remove(messageId);
     connection.sentRequest.Remove(messageId);
     connection.SutNextReceiveSequenceNumber++;
 }
コード例 #15
0
 /// <summary>
 /// Update SMB_COM_WRITE_ANDX request.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="request">It represents the SMB request.</param>
 public static void UpdateWriteRequest(SmbConnection connection, SmbRequest request)
 {
     connection.SutSendSequenceNumber.Add(request.messageId);
     connection.sentRequest.Add(request.messageId, request);
 }
コード例 #16
0
        /// <summary>
        /// Update SMB_COM_TREE_CONNECT_ANDX response.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="messageId">This is used to associate a response with a request.</param>
        /// <param name="treeId">This is used to indicate the share that the client is accessing.</param>
        /// <param name="shareType">The type of resource the client intends to access.</param>
        /// <param name="sessionId">
        /// Set this value to 0 to request a new session setup, or set this value to a previously established session
        /// identifier to request the re-authentication of an existing session.
        /// </param>
        public static void UpdateTreeConnectResponse(
            SmbConnection connection,
            int messageId, 
            int sessionId,
            int treeId,
            ShareType shareType)
        {
            TreeConnectRequest request = (TreeConnectRequest)connection.sentRequest[messageId];
            connection.treeConnectList.Add(
                treeId,
                new SmbTree(treeId, new SmbShare(request.shareName, shareType), sessionId));

            switch (shareType)
            {
                case ShareType.Disk:
                    Parameter.shareFileNames.Remove(request.shareName);
                    break;
                case ShareType.NamedPipe:
                    Parameter.sharePipeNames.Remove(request.shareName);
                    break;
                case ShareType.Printer:
                    Parameter.sharePrinterNames.Remove(request.shareName);
                    break;
                case ShareType.CommunicationDevice:
                    Parameter.shareDeviceNames.Remove(request.shareName);
                    break;
                default:
                    break;
            }

            connection.SutSendSequenceNumber.Remove(messageId);
            connection.SutSendSequenceNumber.Remove(messageId);
            connection.sentRequest.Remove(messageId);
            connection.SutNextReceiveSequenceNumber++;
            connection.treeId++;
        }
コード例 #17
0
 /// <summary>
 /// Update SMB_COM_TREE_CONNECT_ANDX request.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="smbRequest">It represents the SMB request.</param>
 public static void UpdateTreeConnectRequest(SmbConnection connection, SmbRequest smbRequest)
 {
     connection.SutSendSequenceNumber.Add(smbRequest.messageId);
     connection.sentRequest.Add(smbRequest.messageId, smbRequest);
 }
コード例 #18
0
        /// <summary>
        /// Update SMB_COM_SESSION_SETUP response.
        /// </summary>
        /// <param name="connection">It represents the SMB connection.</param>
        /// <param name="sessionId">
        /// Set this value to 0 to request a new session setup, or set this value to a previously established session
        /// identifier to request the re-authentication of an existing session.
        /// </param>
        /// <param name="messageId">This is used to associate a response with a request.</param>
        public static void UpdateSessionSetupResponseAdditional(
            SmbConnection connection, 
            int messageId,
            int sessionId)
        {
            SessionSetupRequestAdditional request = (SessionSetupRequestAdditional)connection.sentRequest[messageId];
            connection.sessionList.Add(sessionId, new SmbSession(sessionId, SessionState.Valid));
            connection.sessionId++;
            connection.SutNextReceiveSequenceNumber++;

            if (connection.isSignEnable(connection.clientSignState, connection.sutSignState))
            {
                if (request.accountType == AccountType.Admin)
                {
                    connection.isSigningActive = true;
                }
                else if (request.accountType == AccountType.Guest)
                {
                    connection.isSigningActive = false;
                }
            }

            connection.SutSendSequenceNumber.Remove(messageId);
            connection.sentRequest.Remove(messageId);
        }
コード例 #19
0
 /// <summary>
 /// Update SMB_COM_NEGOTIATE request.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="smbRequest">It represents the SMB request.</param>
 public static void UpdateNegotiateRequest(SmbConnection connection, SmbRequest smbRequest)
 {
     NegotiateRequest req = smbRequest as NegotiateRequest;
     connection.SutSendSequenceNumber.Add(smbRequest.messageId);
     connection.sentRequest.Add(smbRequest.messageId, smbRequest);
     connection.clientSignState = req.signState;
     connection.isNegotiateSent = true;
     connection.isClientSupportExtSecurity = req.isSupportExtSecurity;
 }
コード例 #20
0
 /// <summary>
 /// Update SMB_COM_SESSION_SETUP request for non-extended security mode.
 /// </summary>
 /// <param name="connection">It represents the SMB connection.</param>
 /// <param name="smbRequest">It represents the SMB request.</param>
 public static void UpdateNonExtSessionSetupRequest(SmbConnection connection, SmbRequest smbRequest)
 {
     NonExtendedSessionSetupRequest req = smbRequest as NonExtendedSessionSetupRequest;
     connection.SutSendSequenceNumber.Add(smbRequest.messageId);
     connection.sentRequest.Add(smbRequest.messageId, smbRequest);
     connection.clientCapabilities = req.capabilities;
     connection.accountType = req.accountType;
 }