/// <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> 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)); }
/// <exception cref="SharpCifs.Smb.SmbException"></exception> internal void SessionSetup(ServerMessageBlock andx, ServerMessageBlock andxResponse ) { lock (Transport()) { INtlmContext nctx = null; SmbException ex = null; SmbComSessionSetupAndX request; SmbComSessionSetupAndXResponse response; byte[] token = new byte[0]; int state = 10; while (ConnectionState != 0) { if (ConnectionState == 2 || ConnectionState == 3) { // connected or disconnecting return; } try { Runtime.Wait(transport); } catch (Exception ie) { throw new SmbException(ie.Message, ie); } } ConnectionState = 1; // trying ... try { transport.Connect(); if (transport.Log.Level >= 4) { transport.Log.WriteLine("sessionSetup: accountName=" + Auth.Username + ",primaryDomain=" + Auth.Domain); } Uid = 0; do { switch (state) { case 10: { if (Auth != NtlmPasswordAuthentication.Anonymous && transport.HasCapability(SmbConstants .CapExtendedSecurity)) { state = 20; break; } request = new SmbComSessionSetupAndX(this, andx, Auth); response = new SmbComSessionSetupAndXResponse(andxResponse); if (transport.IsSignatureSetupRequired(Auth)) { if (Auth.HashesExternal && NtlmPasswordAuthentication.DefaultPassword != NtlmPasswordAuthentication .Blank) { transport.GetSmbSession(NtlmPasswordAuthentication.Default).GetSmbTree(LogonShare , null).TreeConnect(null, null); } else { byte[] signingKey = Auth.GetSigningKey(transport.Server.EncryptionKey); request.Digest = new SigningDigest(signingKey, false); } } request.Auth = Auth; try { transport.Send(request, response); } catch (SmbAuthException sae) { throw; } catch (SmbException se) { ex = se; } if (response.IsLoggedInAsGuest && Runtime.EqualsIgnoreCase("GUEST", Auth. Username) == false && transport.Server.Security != SmbConstants.SecurityShare && Auth != NtlmPasswordAuthentication.Anonymous) { throw new SmbAuthException(NtStatus.NtStatusLogonFailure); } if (ex != null) { throw ex; } Uid = response.Uid; if (request.Digest != null) { transport.Digest = request.Digest; } ConnectionState = 2; state = 0; break; } case 20: { if (nctx == null) { bool doSigning = (transport.Flags2 & SmbConstants.Flags2SecuritySignatures ) != 0; nctx = Config.getNtlmContextFactory().create(Auth, doSigning); } if (SmbTransport.LogStatic.Level >= 4) { SmbTransport.LogStatic.WriteLine(nctx); } if (nctx.IsEstablished()) { NetbiosName = nctx.GetNetbiosName(); ConnectionState = 2; state = 0; break; } try { token = nctx.InitSecContext(token, 0, token.Length); } catch (SmbException se) { try { transport.Disconnect(true); } catch (IOException) { } Uid = 0; throw; } if (token != null) { request = new SmbComSessionSetupAndX(this, null, token); response = new SmbComSessionSetupAndXResponse(null); if (transport.IsSignatureSetupRequired(Auth)) { byte[] signingKey = nctx.GetSigningKey(); if (signingKey != null) { request.Digest = new SigningDigest(signingKey, true); } } request.Uid = Uid; Uid = 0; try { transport.Send(request, response); } catch (SmbAuthException sae) { throw; } catch (SmbException se) { ex = se; try { transport.Disconnect(true); } catch (Exception) { } } if (response.IsLoggedInAsGuest && Runtime.EqualsIgnoreCase("GUEST", Auth. Username) == false) { throw new SmbAuthException(NtStatus.NtStatusLogonFailure); } if (ex != null) { throw ex; } Uid = response.Uid; if (request.Digest != null) { transport.Digest = request.Digest; } token = response.Blob; } break; } default: { throw new SmbException("Unexpected session setup state: " + state); } } }while (state != 0); } catch (SmbException se) { Logoff(true); ConnectionState = 0; throw; } finally { Runtime.NotifyAll(transport); } } }