Example #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);
            }
        }
Example #2
0
        /// <summary>
        /// Get local network information
        /// </summary>
        /// <param name="info">The detection information</param>
        /// <returns></returns>
        public NetworkInfo FetchLocalNetworkInfo(DetectionInfo info)
        {
            LogIPConfig();

            NetworkInfo networkInfo = info.ContentServerNetworkInformation;

            #region Get local IP list

            networkInfo.LocalIpList = new List <IPAddress>();
            foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (adapter.OperationalStatus != OperationalStatus.Up)
                {
                    continue;
                }
                if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
                    adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 ||
                    adapter.NetworkInterfaceType == NetworkInterfaceType.GigabitEthernet)
                {
                    foreach (var ip in adapter.GetIPProperties().UnicastAddresses)
                    {
                        if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        {
                            Smb2Client smb2Client = new Smb2Client(new TimeSpan(0, 0, defaultTimeoutInSeconds));
                            AddToClientList(smb2Client);
                            try
                            {
                                smb2Client.ConnectOverTCP(SUTIpAddress, ip.Address);
                                networkInfo.LocalIpList.Add(ip.Address);
                            }
                            catch (Exception ex)
                            {
                                logWriter.AddLog(
                                    LogLevel.Information,
                                    string.Format("Connect from client IP {0} to SUT IP {1} failed, reason: {2}", ip.Address, SUTIpAddress, ex.Message));
                            }
                        }
                    }
                }
            }

            if (networkInfo.LocalIpList.Count == 0)
            {
                logWriter.AddLog(LogLevel.Error, "No available local IP address");
            }

            #endregion

            return(networkInfo);
        }
Example #3
0
        /// <summary>
        /// Load the detected information and bind to the data source
        /// </summary>
        /// <param name="detectionInfo"></param>
        public void LoadDetectionInfo(DetectionInfo detectionInfo)
        {
            this.info = detectionInfo;

            //Add/Update detected share hash generation supported info
            AddShareHashInfo(ShareHashGeneration.V1Enabled);
            AddShareHashInfo(ShareHashGeneration.V2Enabled);

            //Add/Update detected branch cache version supported info
            AddBranchCacheVersionInfo(BranchCacheVersion.BranchCacheVersion1);
            AddBranchCacheVersionInfo(BranchCacheVersion.BranchCacheVersion2);

            //Bind the data to the control
            resultItemMapList.Add(versionSupportedItems);
            resultItemMapList.Add(hashSuportedItems);
            ResultMapList.ItemsSource = resultItemMapList;
        }
Example #4
0
        /// <summary>
        /// Get platform information
        /// </summary>
        /// <param name="info">The detection information</param>
        public void FetchPlatform(DetectionInfo info)
        {
            // Set the default values
            info.SUTPlatform = Platform.NonWindows;

            try
            {
                ManagementObjectCollection resultCollection = QueryWmiObject(info.TargetSUT, "SELECT * FROM Win32_OperatingSystem");
                foreach (ManagementObject result in resultCollection)
                {
                    info.SUTPlatform = ConvertToPlatform(result["Caption"].ToString());
                    logWriter.AddLog(LogLevel.Information, "Platform: " + info.SUTPlatform);
                    break;
                }
            }
            catch (Exception ex)
            {
                logWriter.AddLog(LogLevel.Information, "Detect platform failure. Reason:" + ex.Message);
            }
        }
Example #5
0
        private bool UserLogon(DetectionInfo info, Smb2Client client, out ulong messageId, out ulong sessionId, out Guid clientGuid, out NEGOTIATE_Response negotiateResp)
        {
            messageId = 0;
            sessionId = 0;
            client.ConnectOverTCP(Dns.GetHostAddresses(info.ContentServerName)[0]);

            #region Negotiate

            DialectRevision selectedDialect;
            byte[]          gssToken;
            Packet_Header   header;
            clientGuid = Guid.NewGuid();

            client.Negotiate(
                1,
                1,
                Packet_Header_Flags_Values.NONE,
                messageId++,
                new DialectRevision[] { DialectRevision.Smb30 },
                SecurityMode_Values.NEGOTIATE_SIGNING_ENABLED,
                Capabilities_Values.GLOBAL_CAP_DFS | Capabilities_Values.GLOBAL_CAP_DIRECTORY_LEASING | Capabilities_Values.GLOBAL_CAP_LARGE_MTU | Capabilities_Values.GLOBAL_CAP_LEASING | Capabilities_Values.GLOBAL_CAP_MULTI_CHANNEL | Capabilities_Values.GLOBAL_CAP_PERSISTENT_HANDLES,
                clientGuid,
                out selectedDialect,
                out gssToken,
                out header,
                out negotiateResp);

            if (header.Status != Smb2Status.STATUS_SUCCESS)
            {
                LogFailedStatus("NEGOTIATE", header.Status);
                throw new Exception(string.Format("NEGOTIATE failed with {0}", Smb2Status.GetStatusCode(header.Status)));
            }

            #endregion

            #region Session Setup

            SESSION_SETUP_Response    sessionSetupResp;
            SspiClientSecurityContext sspiClientGss =
                new SspiClientSecurityContext(
                    SecurityPackageType,
                    Credential,
                    Smb2Utility.GetCifsServicePrincipalName(ContentServerName),
                    ClientSecurityContextAttribute.None,
                    SecurityTargetDataRepresentation.SecurityNativeDrep);

            // Server GSS token is used only for Negotiate authentication when enabled
            if (SecurityPackageType == SecurityPackageType.Negotiate)
            {
                sspiClientGss.Initialize(gssToken);
            }
            else
            {
                sspiClientGss.Initialize(null);
            }

            do
            {
                client.SessionSetup(
                    1,
                    64,
                    Packet_Header_Flags_Values.NONE,
                    messageId++,
                    sessionId,
                    SESSION_SETUP_Request_Flags.NONE,
                    SESSION_SETUP_Request_SecurityMode_Values.NEGOTIATE_SIGNING_ENABLED,
                    SESSION_SETUP_Request_Capabilities_Values.GLOBAL_CAP_DFS,
                    0,
                    sspiClientGss.Token,
                    out sessionId,
                    out gssToken,
                    out header,
                    out sessionSetupResp);

                if ((header.Status == Smb2Status.STATUS_MORE_PROCESSING_REQUIRED || header.Status == Smb2Status.STATUS_SUCCESS) && gssToken != null && gssToken.Length > 0)
                {
                    sspiClientGss.Initialize(gssToken);
                }
            } while (header.Status == Smb2Status.STATUS_MORE_PROCESSING_REQUIRED);

            if (header.Status != Smb2Status.STATUS_SUCCESS)
            {
                LogFailedStatus("SESSIONSETUP", header.Status);
                throw new Exception(string.Format("SESSIONSETUP failed with {0}", Smb2Status.GetStatusCode(header.Status)));
            }

            byte[] sessionKey;
            sessionKey = sspiClientGss.SessionKey;
            client.GenerateCryptoKeys(sessionId, sessionKey, true, false, null, false);

            #endregion

            return(true);
        }
Example #6
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);
        }
Example #7
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);
        }