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; } }
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); } }
/// <exception cref="SharpCifs.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); }
/// <exception cref="SharpCifs.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); }
/// <exception cref="SharpCifs.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); } }
internal SmbTransport Transport() { lock (this) { if (transport == null) { transport = SmbTransport.GetSmbTransport(_address, _port, _localAddr, _localPort, null ); } return(transport); } }
/// <exception cref="SharpCifs.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); }
/// <exception cref="SharpCifs.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); } }
/// <exception cref="SharpCifs.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); }
/// <exception cref="SharpCifs.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)); }
internal ServerData(SmbTransport enclosing) { this._enclosing = enclosing; }
/// <exception cref="SharpCifs.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); } }
internal SmbComNegotiateResponse(SmbTransport.ServerData server) { this.Server = server; }
internal SmbTransport Transport() { lock (this) { if (transport == null) { transport = SmbTransport.GetSmbTransport(_address, _port, _localAddr, _localPort, null ); } return transport; } }
/// <exception cref="SharpCifs.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; }
/// <summary> /// Clear All Cached Transport-Connections /// </summary> /// <remarks> /// Alias of SmbTransport.ClearCachedConnections /// </remarks> public static void ClearCachedConnections() { SmbTransport.ClearCachedConnections(); }