Beispiel #1
0
        /// <exception cref="WinrtCifs.Smb.SmbException"></exception>
        /// <exception cref="UnknownHostException"></exception>
        public static byte[] GetChallenge(UniAddress dc, int port)
        {
            SmbTransport trans = SmbTransport.GetSmbTransport(dc, port);

            trans.Connect();
            return(trans.Server.EncryptionKey);
        }
Beispiel #2
0
        internal static SmbTransport GetSmbTransport(UniAddress address, int port
                                                     , IPAddress localAddr, int localPort, string hostName)
        {
            lock (typeof(SmbTransport))
            {
                SmbTransport conn;

                lock (SmbConstants.Connections)
                {
                    if (SmbConstants.SsnLimit != 1)
                    {
                        conn =
                            SmbConstants.Connections.FirstOrDefault(
                                c =>
                                c.Matches(address, port, localAddr, localPort, hostName) &&
                                (SmbConstants.SsnLimit ==
                                 0 || c.Sessions.Count < SmbConstants.SsnLimit));

                        if (conn != null)
                        {
                            return(conn);
                        }
                    }

                    conn = new SmbTransport(address, port, localAddr, localPort);
                    SmbConstants.Connections.Insert(0, conn);
                }
                return(conn);
            }
        }
Beispiel #3
0
 /// <exception cref="WinrtCifs.Smb.SmbAuthException"></exception>
 public virtual DfsReferral GetReferral(SmbTransport trans, string domain, string
                                        root, string path, NtlmPasswordAuthentication auth)
 {
     if (Disabled)
     {
         return(null);
     }
     try
     {
         string p = "\\" + domain + "\\" + root;
         if (path != null)
         {
             p += path;
         }
         DfsReferral dr = trans.GetDfsReferrals(auth, p, 0);
         if (dr != null)
         {
             return(dr);
         }
     }
     catch (IOException ioe)
     {
         if (Log.Level >= 4)
         {
             Runtime.PrintStackTrace(ioe, Log);
         }
         if (StrictView && ioe is SmbAuthException)
         {
             throw (SmbAuthException)ioe;
         }
     }
     return(null);
 }
Beispiel #4
0
        /// <exception cref="WinrtCifs.Smb.SmbException"></exception>
        public SigningDigest(SmbTransport transport, NtlmPasswordAuthentication auth)
        {
            try
            {
                _digest = MessageDigest.GetInstance("MD5");
            }
            catch (NoSuchAlgorithmException ex)
            {
                if (Log.Level > 0)
                {
                    Runtime.PrintStackTrace(ex, Log);
                }
                throw new SmbException("MD5", ex);
            }
            try
            {
                switch (SmbConstants.LmCompatibility)
                {
                case 0:
                case 1:
                case 2:
                {
                    _macSigningKey = new byte[40];
                    auth.GetUserSessionKey(transport.Server.EncryptionKey, _macSigningKey, 0);
                    Array.Copy(auth.GetUnicodeHash(transport.Server.EncryptionKey), 0, _macSigningKey
                               , 16, 24);
                    break;
                }

                case 3:
                case 4:
                case 5:
                {
                    _macSigningKey = new byte[16];
                    auth.GetUserSessionKey(transport.Server.EncryptionKey, _macSigningKey, 0);
                    break;
                }

                default:
                {
                    _macSigningKey = new byte[40];
                    auth.GetUserSessionKey(transport.Server.EncryptionKey, _macSigningKey, 0);
                    Array.Copy(auth.GetUnicodeHash(transport.Server.EncryptionKey), 0, _macSigningKey
                               , 16, 24);
                    break;
                }
                }
            }
            catch (Exception ex)
            {
                throw new SmbException(string.Empty, ex);
            }
            if (Log.Level >= 5)
            {
                Log.WriteLine("LM_COMPATIBILITY=" + SmbConstants.LmCompatibility);
                Hexdump.ToHexdump(Log, _macSigningKey, 0, _macSigningKey.Length);
            }
        }
Beispiel #5
0
 internal SmbTransport Transport()
 {
     lock (this)
     {
         if (transport == null)
         {
             transport = SmbTransport.GetSmbTransport(_address, _port, _localAddr, _localPort, null
                                                      );
         }
         return(transport);
     }
 }
Beispiel #6
0
        /// <exception cref="WinrtCifs.Smb.SmbException"></exception>
        public static void Logon(UniAddress dc, int port, NtlmPasswordAuthentication auth
                                 )
        {
            SmbTree tree = SmbTransport.GetSmbTransport(dc, port).GetSmbSession(auth).GetSmbTree
                               (LogonShare, null);

            if (LogonShare == null)
            {
                tree.TreeConnect(null, null);
            }
            else
            {
                Trans2FindFirst2         req  = new Trans2FindFirst2("\\", "*", SmbFile.AttrDirectory);
                Trans2FindFirst2Response resp = new Trans2FindFirst2Response();
                tree.Send(req, resp);
            }
        }
Beispiel #7
0
 /// <exception cref="WinrtCifs.Smb.SmbAuthException"></exception>
 public virtual Hashtable GetTrustedDomains(NtlmPasswordAuthentication auth)
 {
     if (Disabled || auth.Domain == "?")
     {
         return(null);
     }
     if (Domains != null && Runtime.CurrentTimeMillis() > Domains.Expiration)
     {
         Domains = null;
     }
     if (Domains != null)
     {
         return(Domains.Map);
     }
     try
     {
         UniAddress   addr  = UniAddress.GetByName(auth.Domain, true);
         SmbTransport trans = SmbTransport.GetSmbTransport(addr, 0);
         CacheEntry   entry = new CacheEntry(Ttl * 10L);
         DfsReferral  dr    = trans.GetDfsReferrals(auth, string.Empty, 0);
         if (dr != null)
         {
             DfsReferral start = dr;
             do
             {
                 string domain = dr.Server.ToLower();
                 entry.Map.Put(domain, new Hashtable());
                 dr = dr.Next;
             }while (dr != start);
             Domains = entry;
             return(Domains.Map);
         }
     }
     catch (IOException ioe)
     {
         if (Log.Level >= 3)
         {
             Runtime.PrintStackTrace(ioe, Log);
         }
         if (StrictView && ioe is SmbAuthException)
         {
             throw (SmbAuthException)ioe;
         }
     }
     return(null);
 }
Beispiel #8
0
 /// <exception cref="WinrtCifs.Smb.SmbAuthException"></exception>
 public virtual SmbTransport GetDc(string domain, NtlmPasswordAuthentication auth)
 {
     if (Disabled)
     {
         return(null);
     }
     try
     {
         UniAddress   addr  = UniAddress.GetByName(domain, true);
         SmbTransport trans = SmbTransport.GetSmbTransport(addr, 0);
         DfsReferral  dr    = trans.GetDfsReferrals(auth, "\\" + domain, 1);
         if (dr != null)
         {
             DfsReferral start = dr;
             IOException e     = null;
             do
             {
                 try
                 {
                     addr = UniAddress.GetByName(dr.Server);
                     return(SmbTransport.GetSmbTransport(addr, 0));
                 }
                 catch (IOException ioe)
                 {
                     e = ioe;
                 }
                 dr = dr.Next;
             }while (dr != start);
             throw e;
         }
     }
     catch (IOException ioe)
     {
         if (Log.Level >= 3)
         {
             Runtime.PrintStackTrace(ioe, Log);
         }
         if (StrictView && ioe is SmbAuthException)
         {
             throw (SmbAuthException)ioe;
         }
     }
     return(null);
 }
Beispiel #9
0
        /// <exception cref="WinrtCifs.Smb.SmbException"></exception>
        private static NtlmChallenge Interrogate(NbtAddress addr)
        {
            UniAddress   dc    = new UniAddress(addr);
            SmbTransport trans = SmbTransport.GetSmbTransport(dc, 0);

            if (Username == null)
            {
                trans.Connect();
                if (SmbTransport.LogStatic.Level >= 3)
                {
                    SmbTransport.LogStatic.WriteLine("Default credentials (jcifs.smb.client.username/password)"
                                                     + " not specified. SMB signing may not work propertly." + "  Skipping DC interrogation."
                                                     );
                }
            }
            else
            {
                SmbSession ssn = trans.GetSmbSession(NtlmPasswordAuthentication.Default
                                                     );
                ssn.GetSmbTree(LogonShare, null).TreeConnect(null, null);
            }
            return(new NtlmChallenge(trans.Server.EncryptionKey, dc));
        }
Beispiel #10
0
 internal ServerData(SmbTransport enclosing)
 {
     this._enclosing = enclosing;
 }
Beispiel #11
0
 /// <exception cref="WinrtCifs.Smb.SmbAuthException"></exception>
 public virtual DfsReferral Resolve(string domain, string root, string path, NtlmPasswordAuthentication
                                    auth)
 {
     lock (this)
     {
         DfsReferral dr  = null;
         long        now = Runtime.CurrentTimeMillis();
         if (Disabled || root.Equals("IPC$"))
         {
             return(null);
         }
         Hashtable domains = GetTrustedDomains(auth);
         if (domains != null)
         {
             domain = domain.ToLower();
             Hashtable roots = (Hashtable)domains.Get(domain);
             if (roots != null)
             {
                 SmbTransport trans = null;
                 root = root.ToLower();
                 CacheEntry links = (CacheEntry)roots.Get(root);
                 if (links != null && now > links.Expiration)
                 {
                     //Sharpen.Collections.Remove(roots, root);
                     roots.Remove(root);
                     links = null;
                 }
                 if (links == null)
                 {
                     if ((trans = GetDc(domain, auth)) == null)
                     {
                         return(null);
                     }
                     dr = GetReferral(trans, domain, root, path, auth);
                     if (dr != null)
                     {
                         int len = 1 + domain.Length + 1 + root.Length;
                         links = new CacheEntry(0L);
                         DfsReferral tmp = dr;
                         do
                         {
                             if (path == null)
                             {
                                 // TODO: fix this
                                 //tmp.map = links.map;
                                 tmp.Key = "\\";
                             }
                             tmp.PathConsumed -= len;
                             tmp = tmp.Next;
                         }while (tmp != dr);
                         if (dr.Key != null)
                         {
                             links.Map.Put(dr.Key, dr);
                         }
                         roots.Put(root, links);
                     }
                     else
                     {
                         if (path == null)
                         {
                             roots.Put(root, FalseEntry);
                         }
                     }
                 }
                 else
                 {
                     if (links == FalseEntry)
                     {
                         links = null;
                     }
                 }
                 if (links != null)
                 {
                     string link = "\\";
                     dr = (DfsReferral)links.Map.Get(link);
                     if (dr != null && now > dr.Expiration)
                     {
                         //Sharpen.Collections.Remove(links.map, link);
                         links.Map.Remove(link);
                         dr = null;
                     }
                     if (dr == null)
                     {
                         if (trans == null)
                         {
                             if ((trans = GetDc(domain, auth)) == null)
                             {
                                 return(null);
                             }
                         }
                         dr = GetReferral(trans, domain, root, path, auth);
                         if (dr != null)
                         {
                             dr.PathConsumed -= 1 + domain.Length + 1 + root.Length;
                             dr.Link          = link;
                             links.Map.Put(link, dr);
                         }
                     }
                 }
             }
         }
         if (dr == null && path != null)
         {
             if (Referrals != null && now > Referrals.Expiration)
             {
                 Referrals = null;
             }
             if (Referrals == null)
             {
                 Referrals = new CacheEntry(0);
             }
             string key = "\\" + domain + "\\" + root;
             if (path.Equals("\\") == false)
             {
                 key += path;
             }
             key = key.ToLower();
             //ListIterator<object> iter = new ListIterator<object>(referrals.map.Keys.GetEnumerator(), 0);
             foreach (var current in Referrals.Map.Keys)
             {
                 string _key  = (string)current;
                 int    klen  = _key.Length;
                 bool   match = false;
                 if (klen == key.Length)
                 {
                     match = _key.Equals(key);
                 }
                 else
                 {
                     if (klen < key.Length)
                     {
                         match = _key.RegionMatches(false, 0, key, 0, klen) && key[klen] == '\\';
                     }
                 }
                 if (match)
                 {
                     dr = (DfsReferral)Referrals.Map.Get(_key);
                 }
             }
         }
         return(dr);
     }
 }