예제 #1
0
        /// <summary>
        /// Check whether user can log on with the credential
        /// </summary>
        /// <param name="info">The detection information</param>
        public void CheckUsernamePassword(DetectionInfo info)
        {
            Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds));

            AddToClientList(client);
            ulong messageId;
            ulong sessionId;
            Guid  clientGuid;
            NEGOTIATE_Response negotiateResp;

            if (!UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp))
            {
                return;
            }

            try
            {
                Packet_Header   header;
                LOGOFF_Response logoffResponse;
                client.LogOff(1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, out header, out logoffResponse);

                if (header.Status != Smb2Status.STATUS_SUCCESS)
                {
                    LogFailedStatus("LOGOFF", header.Status);
                }
            }
            catch (Exception e)
            {
                // Swallow all exceptions when cleaning up.
                logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message);
            }
        }
예제 #2
0
        private void LogOffSession(Smb2Client client, Packet_Header_Flags_Values packetHeader, ulong messageId, ulong sessionId, uint treeId, FILEID fileId)
        {
            if (fileId.Persistent != 0 || fileId.Volatile != 0)
            {
                client.Close(
                    1,
                    1,
                    packetHeader,
                    messageId++,
                    sessionId,
                    treeId,
                    fileId,
                    Flags_Values.NONE,
                    out _,
                    out _);
            }

            client.TreeDisconnect(
                1,
                1,
                packetHeader,
                messageId++,
                sessionId,
                treeId,
                out _,
                out _);
            client.LogOff(
                1,
                1,
                packetHeader,
                messageId++,
                sessionId,
                out _,
                out _);
        }
        public uint LogOff(ushort creditRequest = 1)
        {
            Packet_Header   header;
            LOGOFF_Response logoffResponse;

            uint status = client.LogOff(
                1,
                creditRequest,
                Packet_Header_Flags_Values.NONE,
                messageId++,
                sessionId,
                out header,
                out logoffResponse);

            return(status);
        }
예제 #4
0
        public void CheckUsernamePassword(DetectionInfo info)
        {
            using (Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)))
            {
                ulong messageId;
                ulong sessionId;
                Guid  clientGuid;
                NEGOTIATE_Response negotiateResp;
                bool encryptionRequired;
                UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp, out encryptionRequired);

                try
                {
                    Packet_Header   header;
                    LOGOFF_Response logoffResponse;
                    client.LogOff(
                        1,
                        1,
                        info.smb2Info.IsRequireMessageSigning ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE,
                        messageId++,
                        sessionId,
                        out header,
                        out logoffResponse);

                    if (header.Status != Smb2Status.STATUS_SUCCESS)
                    {
                        LogFailedStatus("LOGOFF", header.Status);
                    }
                }
                catch (Exception e)
                {
                    // Swallow all exceptions when cleaning up.
                    logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message);
                }
            }
        }
예제 #5
0
        private ShareInfo[] RetrieveShareProperties(string[] shareList, DetectionInfo info)
        {
            List <ShareInfo> shareInfoList = new List <ShareInfo>();
            string           uncShare;

            foreach (var share in shareList)
            {
                using (Smb2Client smb2Client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)))
                {
                    Packet_Header header;
                    ulong         messageId;
                    ulong         sessionId;
                    Guid          clientGuid;
                    uncShare = string.Format(@"\\{0}\{1}", SUTName, share);
                    try
                    {
                        NEGOTIATE_Response negotiateResp;
                        bool encryptionRequired = false;
                        UserLogon(info, smb2Client, out messageId, out sessionId, out clientGuid, out negotiateResp, out encryptionRequired);
                        uint treeId;
                        TREE_CONNECT_Response treeConnectResp;

                        if (info.smb2Info.MaxSupportedDialectRevision == DialectRevision.Smb311) // When dialect is 3.11, TreeConnect must be signed or encrypted.
                        {
                            smb2Client.EnableSessionSigningAndEncryption(sessionId, true, encryptionRequired);
                        }

                        logWriter.AddLog(LogLevel.Information, string.Format("Client sends TreeConnect to {0} to retrieve the share properties.", uncShare));
                        smb2Client.TreeConnect(
                            1,
                            1,
                            (info.smb2Info.IsRequireMessageSigning || info.smb2Info.MaxSupportedDialectRevision == DialectRevision.Smb311) ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE,
                            messageId++,
                            sessionId,
                            uncShare,
                            out treeId,
                            out header,
                            out treeConnectResp);

                        if (header.Status != Smb2Status.STATUS_SUCCESS)
                        {
                            continue;
                        }

                        // When dialect is 3.11, for the messages other than TreeConnect, signing is not required.
                        // Set it back to the configuration of the SUT.
                        if (info.smb2Info.MaxSupportedDialectRevision == DialectRevision.Smb311)
                        {
                            smb2Client.EnableSessionSigningAndEncryption(sessionId, info.smb2Info.IsRequireMessageSigning, encryptionRequired);
                        }

                        ShareInfo shareInfo = new ShareInfo();

                        shareInfo.ShareName         = share;
                        shareInfo.ShareCapabilities = treeConnectResp.Capabilities;
                        shareInfo.ShareFlags        = treeConnectResp.ShareFlags;
                        shareInfo.ShareType         = treeConnectResp.ShareType;

                        shareInfoList.Add(shareInfo);

                        TREE_DISCONNECT_Response treeDisconnectResponse;
                        smb2Client.TreeDisconnect(
                            1,
                            1,
                            info.smb2Info.IsRequireMessageSigning ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE,
                            messageId++,
                            sessionId,
                            treeId,
                            out header,
                            out treeDisconnectResponse);

                        LOGOFF_Response logoffResponse;
                        smb2Client.LogOff(1, 1, Packet_Header_Flags_Values.NONE, messageId++, sessionId, out header, out logoffResponse);
                    }
                    catch (Exception ex)
                    {
                        logWriter.AddLog(LogLevel.Information, string.Format("Exception when retrieving share properties: " + ex.Message));
                        // Swallow all exceptions when cleaning up.
                    }
                }
            }

            return(shareInfoList.ToArray());
        }
        public void CheckUsernamePassword(DetectionInfo info)
        {
            using (Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)))
            {
                ulong messageId;
                ulong sessionId;
                Guid clientGuid;
                NEGOTIATE_Response negotiateResp;
                bool encryptionRequired;
                UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp, out encryptionRequired);

                try
                {
                    Packet_Header header;
                    LOGOFF_Response logoffResponse;
                    client.LogOff(
                        1,
                        1,
                        info.smb2Info.IsRequireMessageSigning ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE,
                        messageId++,
                        sessionId,
                        out header,
                        out logoffResponse);

                    if (header.Status != Smb2Status.STATUS_SUCCESS)
                    {
                        LogFailedStatus("LOGOFF", header.Status);
                    }
                }
                catch (Exception e)
                {
                    // Swallow all exceptions when cleaning up.
                    logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message);
                }
            }
        }
        private ShareInfo[] RetrieveShareProperties(string[] shareList, DetectionInfo info)
        {
            List<ShareInfo> shareInfoList = new List<ShareInfo>();
            string uncShare;

            foreach (var share in shareList)
            {
                using (Smb2Client smb2Client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds)))
                {
                    Packet_Header header;
                    ulong messageId;
                    ulong sessionId;
                    Guid clientGuid;
                    uncShare = string.Format(@"\\{0}\{1}", SUTName, share);
                    try
                    {
                        NEGOTIATE_Response negotiateResp;
                        bool encryptionRequired = false;
                        UserLogon(info, smb2Client, out messageId, out sessionId, out clientGuid, out negotiateResp, out encryptionRequired);
                        uint treeId;
                        TREE_CONNECT_Response treeConnectResp;

                        if (info.smb2Info.MaxSupportedDialectRevision == DialectRevision.Smb311) // When dialect is 3.11, TreeConnect must be signed or encrypted.
                        {
                            smb2Client.EnableSessionSigningAndEncryption(sessionId, true, encryptionRequired);
                        }

                        logWriter.AddLog(LogLevel.Information, string.Format("Client sends TreeConnect to {0} to retrieve the share properties.", uncShare));
                        smb2Client.TreeConnect(
                            1,
                            1,
                            (info.smb2Info.IsRequireMessageSigning || info.smb2Info.MaxSupportedDialectRevision == DialectRevision.Smb311) ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE,
                            messageId++,
                            sessionId,
                            uncShare,
                            out treeId,
                            out header,
                            out treeConnectResp);

                        if (header.Status != Smb2Status.STATUS_SUCCESS)
                            continue;

                        // When dialect is 3.11, for the messages other than TreeConnect, signing is not required.
                        // Set it back to the configuration of the SUT.
                        if (info.smb2Info.MaxSupportedDialectRevision == DialectRevision.Smb311)
                        {
                            smb2Client.EnableSessionSigningAndEncryption(sessionId, info.smb2Info.IsRequireMessageSigning, encryptionRequired);
                        }

                        ShareInfo shareInfo = new ShareInfo();

                        shareInfo.ShareName = share;
                        shareInfo.ShareCapabilities = treeConnectResp.Capabilities;
                        shareInfo.ShareFlags = treeConnectResp.ShareFlags;
                        shareInfo.ShareType = treeConnectResp.ShareType;

                        shareInfoList.Add(shareInfo);

                        TREE_DISCONNECT_Response treeDisconnectResponse;
                        smb2Client.TreeDisconnect(
                            1,
                            1,
                            info.smb2Info.IsRequireMessageSigning ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE,
                            messageId++,
                            sessionId,
                            treeId,
                            out header,
                            out treeDisconnectResponse);

                        LOGOFF_Response logoffResponse;
                        smb2Client.LogOff(1, 1, Packet_Header_Flags_Values.NONE, messageId++, sessionId, out header, out logoffResponse);
                    }
                    catch (Exception ex)
                    {
                        logWriter.AddLog(LogLevel.Information, string.Format("Exception when retrieving share properties: " + ex.Message));
                        // Swallow all exceptions when cleaning up.
                    }
                }
            }

            return shareInfoList.ToArray();
        }
예제 #8
0
        /// <summary>
        /// Get branchcache version supported information, which version SUT supports depends on the IOCTL_READ_HASH response code
        /// </summary>
        /// <param name="info">The detection information</param>
        /// <returns></returns>
        public VersionInfo FetchVersionInfo(DetectionInfo info)
        {
            logWriter.AddLog(LogLevel.Information, "===== Detect Version Info =====");

            Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds));

            AddToClientList(client);
            Packet_Header      header;
            Guid               clientGuid;
            NEGOTIATE_Response negotiateResp;
            ulong              messageId = 1;
            ulong              sessionId = 0;
            uint               treeId    = 0;

            try
            {
                UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp);
            }
            catch (Exception ex)
            {
                logWriter.AddLog(LogLevel.Warning, "Failed", false, Detector.LogStyle.StepFailed);
                logWriter.AddLineToLog(LogLevel.Information);
                logWriter.AddLog(LogLevel.Error, string.Format("User log on failed: {0}", ex.Message));
            }

            detectionInfo.ResetDetectResult();

            #region TreeConnect

            TREE_CONNECT_Response treeConnectResp;
            string uncSharePath = Smb2Utility.GetUncPath(info.ContentServerName, defaultShare);
            client.TreeConnect(
                1,
                1,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId++,
                sessionId,
                uncSharePath,
                out treeId,
                out header,
                out treeConnectResp);

            if (header.Status != Smb2Status.STATUS_SUCCESS)
            {
                LogFailedStatus("TREECONNECT", header.Status);
                throw new Exception("TREECONNECT failed with " + Smb2Status.GetStatusCode(header.Status));
            }
            #endregion

            CREATE_Response             createResp;
            FILEID                      fileId;
            Smb2CreateContextResponse[] serverCreateContexts = null;
            VersionInfo                 versionInfo          = new VersionInfo();
            versionInfo.branchCacheVersion = BranchCacheVersion.NotSupported;
            string fileName = "MultipleBlocks.txt";
            client.Create(
                1,
                1,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId++,
                sessionId,
                treeId,
                fileName,
                AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE,
                ShareAccess_Values.NONE,
                CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                CreateDisposition_Values.FILE_OPEN_IF,
                File_Attributes.NONE,
                ImpersonationLevel_Values.Impersonation,
                SecurityFlags_Values.NONE,
                RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE,
                null,
                out fileId,
                out serverCreateContexts,
                out header,
                out createResp);

            HASH_HEADER hashHeader;
            byte[]      hashData = null;

            // Trigger to generate Content Information V1
            uint status = 0;
            status = ReadHash(
                client,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId++,
                treeId,
                sessionId,
                fileId,
                SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST,
                SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_1,
                SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_HASH_BASED,
                0,
                uint.MaxValue,
                out hashHeader,
                out hashData);

            // Retrieve Content Information V1
            status = ReadHash(
                client,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId++,
                treeId,
                sessionId,
                fileId,
                SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST,
                SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_1,
                SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_HASH_BASED,
                0,
                uint.MaxValue,
                out hashHeader,
                out hashData);

            if (status != Smb2Status.STATUS_SUCCESS)
            {
                LogFailedStatus("READ_HASH_V1", header.Status);
            }
            else
            {
                versionInfo.branchCacheVersion = BranchCacheVersion.BranchCacheVersion1;
            }

            // Trigger to generate Content Information V2
            status = ReadHash(
                client,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId++,
                treeId,
                sessionId,
                fileId,
                SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST,
                SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_2,
                SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_FILE_BASED,
                0,
                uint.MaxValue,
                out hashHeader,
                out hashData);

            status = ReadHash(
                client,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId++,
                treeId,
                sessionId,
                fileId,
                SRV_READ_HASH_Request_HashType_Values.SRV_HASH_TYPE_PEER_DIST,
                SRV_READ_HASH_Request_HashVersion_Values.SRV_HASH_VER_2,
                SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_FILE_BASED,
                0,
                uint.MaxValue,
                out hashHeader,
                out hashData);

            if (status != Smb2Status.STATUS_SUCCESS)
            {
                LogFailedStatus("READ_HASH_V2", header.Status);
            }
            else
            {
                versionInfo.branchCacheVersion |= BranchCacheVersion.BranchCacheVersion2;
            }

            try
            {
                LOGOFF_Response logoffResponse;
                client.LogOff(1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, out header, out logoffResponse);

                if (header.Status != Smb2Status.STATUS_SUCCESS)
                {
                    LogFailedStatus("LOGOFF", header.Status);
                }
            }
            catch (Exception e)
            {
                logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message);
            }

            return(versionInfo);
        }
예제 #9
0
        /// <summary>
        /// Get share information
        /// </summary>
        /// <param name="info">The detection information</param>
        /// <returns></returns>
        public ShareInfo FetchShareInfo(DetectionInfo info)
        {
            logWriter.AddLog(LogLevel.Information, "===== Detect Share Info =====");
            logWriter.AddLog(LogLevel.Information, "Share name: " + defaultShare);

            Smb2Client client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds));

            AddToClientList(client);
            Packet_Header      header;
            Guid               clientGuid;
            NEGOTIATE_Response negotiateResp;
            ulong              messageId = 0;
            ulong              sessionId = 0;
            uint               treeId    = 0;

            try
            {
                UserLogon(info, client, out messageId, out sessionId, out clientGuid, out negotiateResp);
            }
            catch (Exception ex)
            {
                logWriter.AddLog(LogLevel.Warning, "Failed", false, Detector.LogStyle.StepFailed);
                logWriter.AddLineToLog(LogLevel.Information);
                logWriter.AddLog(LogLevel.Error, string.Format("User log on failed: {0}", ex.Message));
            }

            detectionInfo.ResetDetectResult();

            #region TreeConnect

            TREE_CONNECT_Response treeConnectResp;
            string uncSharePath = Smb2Utility.GetUncPath(info.ContentServerName, defaultShare);
            client.TreeConnect(
                1,
                1,
                Packet_Header_Flags_Values.FLAGS_SIGNED,
                messageId++,
                sessionId,
                uncSharePath,
                out treeId,
                out header,
                out treeConnectResp);

            if (header.Status != Smb2Status.STATUS_SUCCESS)
            {
                LogFailedStatus("TREECONNECT", header.Status);
                throw new Exception("TREECONNECT failed with " + Smb2Status.GetStatusCode(header.Status));
            }

            ShareInfo shareInfo = new ShareInfo();
            shareInfo.ShareName           = uncSharePath;
            shareInfo.shareHashGeneration = ShareHashGeneration.NotEnabled;
            if (treeConnectResp.ShareFlags.HasFlag(ShareFlags_Values.SHAREFLAG_ENABLE_HASH_V1))
            {
                shareInfo.shareHashGeneration = ShareHashGeneration.V1Enabled;
            }
            if (treeConnectResp.ShareFlags.HasFlag(ShareFlags_Values.SHAREFLAG_ENABLE_HASH_V2))
            {
                shareInfo.shareHashGeneration |= ShareHashGeneration.V2Enabled;
            }
            #endregion

            try
            {
                LOGOFF_Response logoffResponse;
                client.LogOff(1, 1, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId++, sessionId, out header, out logoffResponse);

                if (header.Status != Smb2Status.STATUS_SUCCESS)
                {
                    LogFailedStatus("LOGOFF", header.Status);
                }
            }
            catch (Exception e)
            {
                logWriter.AddLog(LogLevel.Information, "Exception in Cleanup: " + e.Message);
            }

            return(shareInfo);
        }