Module: RubySMB::Server::ServerClient::SessionSetup
- Included in:
- RubySMB::Server::ServerClient
- Defined in:
- lib/ruby_smb/server/server_client/session_setup.rb
Instance Method Summary collapse
- #do_session_setup_smb1(request) ⇒ Object
- #do_session_setup_smb2(request) ⇒ Object
-
#handle_session_setup(raw_request) ⇒ Object
Setup a new session based on the negotiated dialect.
Instance Method Details
#do_session_setup_smb1(request) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/ruby_smb/server/server_client/session_setup.rb', line 31 def do_session_setup_smb1(request) gss_result = process_gss(request.data_block.security_blob) return if gss_result.nil? response = SMB1::Packet::SessionSetupResponse.new response.smb_header.pid_low = request.smb_header.pid_low response.smb_header.uid = rand(0x10000) response.smb_header.mid = request.smb_header.mid response.smb_header.nt_status = gss_result.nt_status.value response.smb_header.flags.reply = true response.smb_header.flags2.unicode = true response.smb_header.flags2.extended_security = true unless gss_result.buffer.nil? response.parameter_block.security_blob_length = gss_result.buffer.length response.data_block.security_blob = gss_result.buffer end if gss_result.nt_status == WindowsError::NTStatus::STATUS_SUCCESS @state = :authenticated @identity = gss_result.identity end response end |
#do_session_setup_smb2(request) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/ruby_smb/server/server_client/session_setup.rb', line 56 def do_session_setup_smb2(request) gss_result = process_gss(request.buffer) return if gss_result.nil? response = SMB2::Packet::SessionSetupResponse.new response.smb2_header.nt_status = gss_result.nt_status.value response.smb2_header.credits = 1 response.smb2_header. = request.smb2_header. response.smb2_header.session_id = @session_id = @session_id || SecureRandom.random_bytes(4).unpack1('V') response.buffer = gss_result.buffer update_preauth_hash(request) if @dialect == '0x0311' if gss_result.nt_status == WindowsError::NTStatus::STATUS_SUCCESS @state = :authenticated @identity = gss_result.identity @session_key = @gss_authenticator.session_key elsif gss_result.nt_status == WindowsError::NTStatus::STATUS_MORE_PROCESSING_REQUIRED && @dialect == '0x0311' update_preauth_hash(response) end response end |
#handle_session_setup(raw_request) ⇒ Object
Setup a new session based on the negotiated dialect. Once session setup is complete, the state will be updated to :authenticated.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/ruby_smb/server/server_client/session_setup.rb', line 10 def handle_session_setup(raw_request) response = nil case .order when Dialect::ORDER_SMB1 request = SMB1::Packet::SessionSetupRequest.read(raw_request) response = do_session_setup_smb1(request) when Dialect::ORDER_SMB2 request = SMB2::Packet::SessionSetupRequest.read(raw_request) response = do_session_setup_smb2(request) end if response.nil? disconnect! else send_packet(response) end nil end |