# frozen_string_literal: true # # Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com) # # ronin-support is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # ronin-support is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with ronin-support. If not, see . # require 'ronin/support/network/telnet' require 'ronin/support/network/dns/idn' module Ronin module Support module Network # # Provides helper methods for communicating with Telnet services. # # @deprecated Will be removed in 1.0.0. # module Telnet # # Provides helper methods for using the Telnet protocol. # module Mixin # # Creates a new Telnet connection. # # @param [String] host # The host to connect to. # # @param [Integer] port # The port to connect to. # # @param [Boolean] binmode # Indicates that newline substitution shall not be performed. # # @param [String, nil] output_log # The name of the file to write connection status messages and all # received traffic to. # # @param [String, nil] dump_log # Similar to the `:output_log` option, but connection output is also # written in hexdump format. # # @param [Regexp] prompt # A regular expression matching the host command-line prompt # sequence, used to determine when a command has finished. # # @param [Boolean] telnet # Indicates that the connection shall behave as a telnet connection. # # @param [Boolean] plain # Indicates that the connection shall behave as a normal TCP # connection. # # @param [Integer] timeout # The number of seconds to wait before timing out both the initial # attempt to connect to host, and all attempts to read data from the # host. # # @param [Integer] wait_time # The amount of time to wait after seeing what looks like a prompt. # # @param [Net::Telnet, IO, nil] proxy # A proxy object to used instead of opening a direct connection to # the host. # # @param [String, nil] user # The user to login as. # # @param [String, nil] password # The password to login with. # # @yield [telnet] # If a block is given, it will be passed the newly created Telnet # session. # # @yieldparam [Net::Telnet] telnet # The newly created Telnet session. # # @return [Net::Telnet] # The Telnet session # # @example # telnet_connect('towel.blinkenlights.nl') # # => # # # @example # telnet_connect('towel.blinkenlights.nl') do |movie| # movie.each_line { |line| puts line } # end # # @api public # def telnet_connect(host, # connection options proxy: Telnet.proxy, port: Telnet::DEFAULT_PORT, binmode: false, wait_time: 0, prompt: Telnet::DEFAULT_PROMPT, timeout: Telnet.default_timeout, telnet: nil, plain: nil, # authentication options user: nil, password: nil, # log options output_log: nil, dump_log: nil) host = DNS::IDN.to_ascii(host) telnet_options = { 'Host' => host, 'Port' => port, 'Binmode' => binmode, 'Waittime' => wait_time, 'Prompt' => prompt, 'Timeout' => timeout } telnet_options['Telnetmode'] = true if (telnet && !plain) telnet_options['Output_log'] = output_log if output_log telnet_options['Dump_log'] = dump_log if dump_log telnet_options['Proxy'] = proxy if proxy telnet = Net::Telnet.new(telnet_options) telnet.login(user,password) if user if block_given? yield telnet telnet.close else return telnet end end end end end end end