Exemple #1
0
        /// <exception cref="System.IO.IOException"></exception>
        internal static void ResolveSids0(string authorityServerName, NtlmPasswordAuthentication
                                          auth, Sid[] sids)
        {
            DcerpcHandle    handle       = null;
            LsaPolicyHandle policyHandle = null;

            lock (SidCache)
            {
                try
                {
                    handle = DcerpcHandle.GetHandle("ncacn_np:" + authorityServerName + "[\\PIPE\\lsarpc]"
                                                    , auth);
                    string server = authorityServerName;
                    int    dot    = server.IndexOf('.');
                    if (dot > 0 && char.IsDigit(server[0]) == false)
                    {
                        server = Runtime.Substring(server, 0, dot);
                    }
                    policyHandle = new LsaPolicyHandle(handle, "\\\\" + server, unchecked (0x00000800));
                    ResolveSids(handle, policyHandle, sids);
                }
                finally
                {
                    if (handle != null)
                    {
                        if (policyHandle != null)
                        {
                            policyHandle.Close();
                        }
                        handle.Close();
                    }
                }
            }
        }
		/// <exception cref="System.IO.IOException"></exception>
		public SamrAliasHandle(DcerpcHandle handle, SamrDomainHandle domainHandle, int access
			, int rid)
		{
			MsrpcSamrOpenAlias rpc = new MsrpcSamrOpenAlias(domainHandle, access, rid, this);
			handle.Sendrecv(rpc);
			if (rpc.Retval != 0)
			{
				throw new SmbException(rpc.Retval, false);
			}
		}
Exemple #3
0
        /// <exception cref="System.IO.IOException"></exception>
        public SamrAliasHandle(DcerpcHandle handle, SamrDomainHandle domainHandle, int access
                               , int rid)
        {
            MsrpcSamrOpenAlias rpc = new MsrpcSamrOpenAlias(domainHandle, access, rid, this);

            handle.Sendrecv(rpc);
            if (rpc.Retval != 0)
            {
                throw new SmbException(rpc.Retval, false);
            }
        }
		/// <exception cref="System.IO.IOException"></exception>
		public SamrDomainHandle(DcerpcHandle handle, SamrPolicyHandle policyHandle, int access
			, Rpc.SidT sid)
		{
			MsrpcSamrOpenDomain rpc = new MsrpcSamrOpenDomain(policyHandle, access, sid, this
				);
			handle.Sendrecv(rpc);
			if (rpc.Retval != 0)
			{
				throw new SmbException(rpc.Retval, false);
			}
		}
Exemple #5
0
        /// <exception cref="System.IO.IOException"></exception>
        public SamrDomainHandle(DcerpcHandle handle, SamrPolicyHandle policyHandle, int access
                                , Rpc.SidT sid)
        {
            MsrpcSamrOpenDomain rpc = new MsrpcSamrOpenDomain(policyHandle, access, sid, this
                                                              );

            handle.Sendrecv(rpc);
            if (rpc.Retval != 0)
            {
                throw new SmbException(rpc.Retval, false);
            }
        }
		/// <exception cref="System.IO.IOException"></exception>
		public LsaPolicyHandle(DcerpcHandle handle, string server, int access)
		{
			if (server == null)
			{
				server = "\\\\";
			}
			MsrpcLsarOpenPolicy2 rpc = new MsrpcLsarOpenPolicy2(server, access, this);
			handle.Sendrecv(rpc);
			if (rpc.Retval != 0)
			{
				throw new SmbException(rpc.Retval, false);
			}
		}
        /// <exception cref="System.IO.IOException"></exception>
        public LsaPolicyHandle(DcerpcHandle handle, string server, int access)
        {
            if (server == null)
            {
                server = "\\\\";
            }
            MsrpcLsarOpenPolicy2 rpc = new MsrpcLsarOpenPolicy2(server, access, this);

            handle.Sendrecv(rpc);
            if (rpc.Retval != 0)
            {
                throw new SmbException(rpc.Retval, false);
            }
        }
Exemple #8
0
        /// <exception cref="System.IO.IOException"></exception>
        public virtual Sid[] GetGroupMemberSids(string authorityServerName,
                                                NtlmPasswordAuthentication auth,
                                                int flags)
        {
            if (Type != SidTypeDomGrp && Type != SidTypeAlias)
            {
                return(new Sid[0]);
            }
            DcerpcHandle     handle       = null;
            SamrPolicyHandle policyHandle = null;
            SamrDomainHandle domainHandle = null;
            Sid domsid = GetDomainSid();

            lock (SidCache)
            {
                try
                {
                    handle = DcerpcHandle.GetHandle("ncacn_np:" + authorityServerName
                                                    + "[\\PIPE\\samr]", auth);
                    policyHandle = new SamrPolicyHandle(handle,
                                                        authorityServerName,
                                                        unchecked (0x00000030));
                    domainHandle = new SamrDomainHandle(handle,
                                                        policyHandle,
                                                        unchecked (0x00000200),
                                                        domsid);
                    return(GetGroupMemberSids0(handle,
                                               domainHandle,
                                               domsid,
                                               GetRid(),
                                               flags));
                }
                finally
                {
                    if (handle != null)
                    {
                        if (policyHandle != null)
                        {
                            if (domainHandle != null)
                            {
                                domainHandle.Close();
                            }
                            policyHandle.Close();
                        }
                        handle.Close();
                    }
                }
            }
        }
Exemple #9
0
        public bool doPsexec(String binPath, NtlmPasswordAuthentication auth, String cmd)
        {
            Random       rnd     = new Random();
            int          randInt = rnd.Next(1, 10000000);
            String       host    = "127.0.0.1";
            DcerpcHandle handle  = DcerpcHandle.GetHandle("ncacn_np:" + host + "[\\pipe\\svcctl]", auth);

            // Open the SCManager on the remote machine and get a handle
            // for that open instance (scManagerHandle).
            Rpc.PolicyHandle     scManagerHandle  = new Rpc.PolicyHandle();
            svcctl.OpenSCManager openSCManagerRpc = new svcctl.OpenSCManager("\\\\" + host, null,
                                                                             (0x000F0000 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020), scManagerHandle);
            handle.Sendrecv(openSCManagerRpc);
            if (openSCManagerRpc.retval != 0)
            {
                throw new SmbException(openSCManagerRpc.retval, true);
            }

            Rpc.PolicyHandle   svcHandle      = new Rpc.PolicyHandle();
            svcctl.OpenService openServiceRpc = new svcctl.OpenService(scManagerHandle,
                                                                       "GetShell" + randInt, svcctl.SC_MANAGER_ALL_ACCESS, svcHandle);
            handle.Sendrecv(openServiceRpc);

            // If the service didn't exist, create it.
            if (openServiceRpc.retval == 1060)
            {
                // Create a new service.
                svcHandle = new Rpc.PolicyHandle();
                //code 272 is for an interactive, own process service this was originally svcctl.SC_TYPE_SERVICE_WIN32_OWN_PROCESS
                svcctl.CreateServiceW createServiceWRpc = new svcctl.CreateServiceW(
                    scManagerHandle, "GetShell" + randInt, "GetShell" + randInt,
                    svcctl.SC_MANAGER_ALL_ACCESS, 272,
                    svcctl.SC_START_TYPE_SERVICE_DEMAND_START, svcctl.SC_SERVICE_ERROR_NORMAL,
                    cmd,
                    null, null, null, 0, null, null, 0, svcHandle);
                handle.Sendrecv(createServiceWRpc);
                if (createServiceWRpc.retval != 0)
                {
                    throw new SmbException(createServiceWRpc.retval, true);
                }
            }

            svcctl.StartService startServiceRpc = new svcctl.StartService(svcHandle, 0, new String[0]);
            handle.Sendrecv(startServiceRpc);
            return(true);
        }
Exemple #10
0
        /// <exception cref="System.IO.IOException"></exception>
        internal static void ResolveSids(DcerpcHandle handle, LsaPolicyHandle policyHandle
                                         , Sid[] sids)
        {
            MsrpcLookupSids rpc = new MsrpcLookupSids(policyHandle, sids);

            handle.Sendrecv(rpc);
            switch (rpc.Retval)
            {
            case 0:
            case NtStatus.NtStatusNoneMapped:
            case unchecked (0x00000107):
            {
                // NT_STATUS_SOME_NOT_MAPPED
                break;
            }

            default:
            {
                throw new SmbException(rpc.Retval, false);
            }
            }
            for (int si = 0; si < sids.Length; si++)
            {
                sids[si].Type       = rpc.Names.Names[si].SidType;
                sids[si].DomainName = null;
                switch (sids[si].Type)
                {
                case SidTypeUser:
                case SidTypeDomGrp:
                case SidTypeDomain:
                case SidTypeAlias:
                case SidTypeWknGrp:
                {
                    int sidIndex            = rpc.Names.Names[si].SidIndex;
                    Rpc.Unicode_string ustr = rpc.Domains.Domains[sidIndex].Name;
                    sids[si].DomainName = (new UnicodeString(ustr, false)).ToString();
                    break;
                }
                }
                sids[si].AcctName = (new UnicodeString(rpc.Names.Names[si].Name, false)).ToString
                                        ();
                sids[si].OriginServer = null;
                sids[si].OriginAuth   = null;
            }
        }
Exemple #11
0
        /// <exception cref="System.IO.IOException"></exception>
        internal static Sid[] GetGroupMemberSids0(DcerpcHandle handle,
                                                  SamrDomainHandle domainHandle,
                                                  Sid domsid,
                                                  int rid,
                                                  int flags)
        {
            SamrAliasHandle aliasHandle = null;

            Lsarpc.LsarSidArray    sidarray = new Lsarpc.LsarSidArray();
            MsrpcGetMembersInAlias rpc      = null;

            try
            {
                aliasHandle = new SamrAliasHandle(handle, domainHandle, unchecked (0x0002000c), rid);
                rpc         = new MsrpcGetMembersInAlias(aliasHandle, sidarray);
                handle.Sendrecv(rpc);
                if (rpc.Retval != 0)
                {
                    throw new SmbException(rpc.Retval, false);
                }
                Sid[]  sids         = new Sid[rpc.Sids.NumSids];
                string originServer = handle.GetServer();
                NtlmPasswordAuthentication originAuth
                    = (NtlmPasswordAuthentication)handle.GetPrincipal();
                for (int i = 0; i < sids.Length; i++)
                {
                    sids[i] = new Sid(rpc.Sids.Sids[i].Sid, 0, null, null, false);
                    sids[i].OriginServer = originServer;
                    sids[i].OriginAuth   = originAuth;
                }
                if (sids.Length > 0 && (flags & SidFlagResolveSids) != 0)
                {
                    ResolveSids(originServer, originAuth, sids);
                }
                return(sids);
            }
            finally
            {
                if (aliasHandle != null)
                {
                    aliasHandle.Close();
                }
            }
        }
Exemple #12
0
        /// <exception cref="System.IO.IOException"></exception>
        public static Sid GetServerSid(string server,
                                       NtlmPasswordAuthentication auth)
        {
            DcerpcHandle    handle       = null;
            LsaPolicyHandle policyHandle = null;

            Lsarpc.LsarDomainInfo       info = new Lsarpc.LsarDomainInfo();
            MsrpcQueryInformationPolicy rpc;

            lock (SidCache)
            {
                try
                {
                    handle = DcerpcHandle.GetHandle("ncacn_np:" + server + "[\\PIPE\\lsarpc]", auth);
                    // NetApp doesn't like the 'generic' access mask values
                    policyHandle = new LsaPolicyHandle(handle, null, unchecked (0x00000001));
                    rpc          = new MsrpcQueryInformationPolicy(policyHandle,
                                                                   Lsarpc.PolicyInfoAccountDomain,
                                                                   info);
                    handle.Sendrecv(rpc);
                    if (rpc.Retval != 0)
                    {
                        throw new SmbException(rpc.Retval, false);
                    }
                    return(new Sid(info.Sid,
                                   SidTypeDomain,
                                   (new UnicodeString(info.Name, false)).ToString(),
                                   null,
                                   false));
                }
                finally
                {
                    if (handle != null)
                    {
                        if (policyHandle != null)
                        {
                            policyHandle.Close();
                        }
                        handle.Close();
                    }
                }
            }
        }
		/// <exception cref="System.IO.IOException"></exception>
		public SamrPolicyHandle(DcerpcHandle handle, string server, int access)
		{
			if (server == null)
			{
				server = "\\\\";
			}
			MsrpcSamrConnect4 rpc = new MsrpcSamrConnect4(server, access, this);
			try
			{
				handle.Sendrecv(rpc);
			}
			catch (DcerpcException de)
			{
				if (de.GetErrorCode() != DcerpcError.DcerpcFaultOpRngError)
				{
					throw;
				}
				MsrpcSamrConnect2 rpc2 = new MsrpcSamrConnect2(server, access, this);
				handle.Sendrecv(rpc2);
			}
		}
        /// <exception cref="System.IO.IOException"></exception>
        public SamrPolicyHandle(DcerpcHandle handle, string server, int access)
        {
            if (server == null)
            {
                server = "\\\\";
            }
            MsrpcSamrConnect4 rpc = new MsrpcSamrConnect4(server, access, this);

            try
            {
                handle.Sendrecv(rpc);
            }
            catch (DcerpcException de)
            {
                if (de.GetErrorCode() != DcerpcError.DcerpcFaultOpRngError)
                {
                    throw;
                }
                MsrpcSamrConnect2 rpc2 = new MsrpcSamrConnect2(server, access, this);
                handle.Sendrecv(rpc2);
            }
        }
Exemple #15
0
        /// <summary>
        /// This specialized method returns a Map of users and local groups for the
        /// target server where keys are SIDs representing an account and each value
        /// is an List<object> of SIDs represents the local groups that the account is
        /// a member of.
        /// </summary>
        /// <remarks>
        /// This specialized method returns a Map of users and local groups for the
        /// target server where keys are SIDs representing an account and each value
        /// is an List<object> of SIDs represents the local groups that the account is
        /// a member of.
        /// <p/>
        /// This method is designed to assist with computing access control for a
        /// given user when the target object's ACL has local groups. Local groups
        /// are not listed in a user's group membership (e.g. as represented by the
        /// tokenGroups constructed attribute retrived via LDAP).
        /// <p/>
        /// Domain groups nested inside a local group are currently not expanded. In
        /// this case the key (SID) type will be SID_TYPE_DOM_GRP rather than
        /// SID_TYPE_USER.
        /// </remarks>
        /// <param name="authorityServerName">The server from which the local groups will be queried.
        ///     </param>
        /// <param name="auth">The credentials required to query groups and group members.</param>
        /// <param name="flags">
        /// Flags that control the behavior of the operation. When all
        /// name associated with SIDs will be required, the SID_FLAG_RESOLVE_SIDS
        /// flag should be used which causes all group member SIDs to be resolved
        /// together in a single more efficient operation.
        /// </param>
        /// <exception cref="System.IO.IOException"></exception>
        internal static Hashtable GetLocalGroupsMap(string authorityServerName, NtlmPasswordAuthentication
                                                    auth, int flags)
        {
            Sid              domsid       = GetServerSid(authorityServerName, auth);
            DcerpcHandle     handle       = null;
            SamrPolicyHandle policyHandle = null;
            SamrDomainHandle domainHandle = null;

            Samr.SamrSamArray             sam = new Samr.SamrSamArray();
            MsrpcEnumerateAliasesInDomain rpc;

            lock (SidCache)
            {
                try
                {
                    handle = DcerpcHandle.GetHandle("ncacn_np:" + authorityServerName + "[\\PIPE\\samr]"
                                                    , auth);
                    policyHandle = new SamrPolicyHandle(handle, authorityServerName, unchecked (0x02000000));
                    domainHandle = new SamrDomainHandle(handle, policyHandle, unchecked (0x02000000), domsid);
                    rpc          = new MsrpcEnumerateAliasesInDomain(domainHandle, unchecked (0xFFFF), sam
                                                                     );
                    handle.Sendrecv(rpc);
                    if (rpc.Retval != 0)
                    {
                        throw new SmbException(rpc.Retval, false);
                    }
                    Hashtable map = new Hashtable();
                    for (int ei = 0; ei < rpc.Sam.Count; ei++)
                    {
                        Samr.SamrSamEntry entry = rpc.Sam.Entries[ei];
                        Sid[]             mems  = GetGroupMemberSids0(handle, domainHandle, domsid
                                                                      , entry.Idx, flags);
                        Sid groupSid = new Sid(domsid, entry.Idx);
                        groupSid.Type       = SidTypeAlias;
                        groupSid.DomainName = domsid.GetDomainName();
                        groupSid.AcctName   = (new UnicodeString(entry.Name, false)).ToString();
                        for (int mi = 0; mi < mems.Length; mi++)
                        {
                            List <object> groups = (List <object>)map.Get(mems[mi]);
                            if (groups == null)
                            {
                                groups = new List <object>();
                                map.Put(mems[mi], groups);
                            }
                            if (!groups.Contains(groupSid))
                            {
                                groups.Add(groupSid);
                            }
                        }
                    }
                    return(map);
                }
                finally
                {
                    if (handle != null)
                    {
                        if (policyHandle != null)
                        {
                            if (domainHandle != null)
                            {
                                domainHandle.Close();
                            }
                            policyHandle.Close();
                        }
                        handle.Close();
                    }
                }
            }
        }