Class: Rex::Socket::Parameters

Inherits:
Object
  • Object
show all
Defined in:
lib/rex/socket/parameters.rb

Overview

This class represents the set of parameters that are used to create a socket, whether it be a server or client socket.

Examples:

nsock = Rex::Socket::Tcp.create(
  'PeerHost'  =>  opts['RHOST'] || rhost,
  'PeerPort'  => (opts['RPORT'] || rport).to_i,
  'LocalHost' =>  opts['CHOST'] || chost || "0.0.0.0",
  'LocalPort' => (opts['CPORT'] || cport || 0).to_i,
  'SSL'       =>  dossl,
  'SSLVersion'=>  opts['SSLVersion'] || ssl_version,
  'Proxies'   => proxies,
  'Timeout'   => (opts['ConnectTimeout'] || connect_timeout || 10).to_i,
  'Context'   =>
    {
      'Msf'        => framework,
      'MsfExploit' => self,
    })

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hash) ⇒ Parameters

Initializes the attributes from the supplied hash. The following hash keys can be specified.

Parameters:

  • hash (Hash)

    a customizable set of options

Options Hash (hash):

  • 'PeerHost' (String)

    The remote host to connect to

  • 'PeerAddr' (String) — default: alias for 'PeerHost'
  • 'PeerPort' (Fixnum)

    The remote port to connect to

  • 'LocalHost' (String)

    The local host to communicate from, if any

  • 'LocalPort' (String)

    The local port to communicate from, if any

  • 'Bool' (Bool)

    Create a bare socket

  • 'Server' (Bool)

    Whether or not this should be a server

  • 'SSL' (Bool)

    Whether or not SSL should be used

  • 'SSLVersion' (String)

    Specify SSL2, SSL3, or TLS1 (SSL3 is default)

  • 'SSLCert' (String)

    A file containing an SSL certificate (for server sockets)

  • 'SSLCipher' (String)
  • 'SSLCompression' (Bool)

    enable SSL-level compression where available

  • 'SSLVerifyMode' (String)

    SSL certificate verification mechanism. One of 'NONE' (default), 'CLIENT_ONCE', 'FAIL_IF_NO_PEER_CERT ', 'PEER'

  • 'Proxies' (String)

    List of proxies to use.

  • 'Proto' (String)

    The underlying protocol to use.

  • 'IPv6' (String)

    Force the use of IPv6.

  • 'Comm' (String)

    The underlying Comm object to use to create the socket for this parameter set.

  • 'Context' (Hash)

    A context hash that can allow users of this parameter class instance to determine who is responsible for requesting that a socket be created.

  • 'Retries' (String)

    The number of times a connection should be retried.

  • 'Timeout' (Fixnum)

    The number of seconds before a connection should time out



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/rex/socket/parameters.rb', line 79

def initialize(hash)
  if (hash['PeerHost'])
    self.peerhost = hash['PeerHost']
  elsif (hash['PeerAddr'])
    self.peerhost = hash['PeerAddr']
  else
    self.peerhost = nil
  end

  if (hash['LocalHost'])
    self.localhost = hash['LocalHost']
  elsif (hash['LocalAddr'])
    self.localhost = hash['LocalAddr']
  else
    self.localhost = '0.0.0.0'
  end

  if (hash['PeerPort'])
    self.peerport = hash['PeerPort'].to_i
  else
    self.peerport = 0
  end

  if (hash['LocalPort'])
    self.localport = hash['LocalPort'].to_i
  else
    self.localport = 0
  end

  if (hash['Bare'])
    self.bare = hash['Bare']
  else
    self.bare = false
  end

  if (hash['SSL'] and hash['SSL'].to_s =~ /^(t|y|1)/i)
    self.ssl = true
  else
    self.ssl = false
  end

  supported_ssl_versions = ['SSL2', 'SSL23', 'TLS1', 'SSL3', :SSLv2, :SSLv3, :SSLv23, :TLSv1]
  if (hash['SSLVersion'] and supported_ssl_versions.include? hash['SSLVersion'])
    self.ssl_version = hash['SSLVersion']
  end

  supported_ssl_verifiers = %W{CLIENT_ONCE FAIL_IF_NO_PEER_CERT NONE PEER}
  if (hash['SSLVerifyMode'] and supported_ssl_verifiers.include? hash['SSLVerifyMode'])
    self.ssl_verify_mode = hash['SSLVerifyMode']
  end

  if hash['SSLCompression']
    self.ssl_compression = hash['SSLCompression']
  end

  if (hash['SSLCipher'])
    self.ssl_cipher = hash['SSLCipher']
  end

  if (hash['SSLCert'] and ::File.file?(hash['SSLCert']))
    begin
      self.ssl_cert = ::File.read(hash['SSLCert'])
    rescue ::Exception => e
      elog("Failed to read cert: #{e.class}: #{e}", LogSource)
    end
  end

  if hash['Proxies']
    self.proxies = hash['Proxies'].split('-').map{|a| a.strip}.map{|a| a.split(':').map{|b| b.strip}}
  end

  # The protocol this socket will be using
  if (hash['Proto'])
    self.proto = hash['Proto'].downcase
  else
    self.proto = 'tcp'
  end

  # Whether or not the socket should be a server
  self.server    = hash['Server'] || false

  # The communication subsystem to use to create the socket
  self.comm      = hash['Comm']

  # The context that was passed in, if any.
  self.context   = hash['Context'] || {}

  # If no comm was supplied, try to use the comm that is best fit to
  # handle the provided host based on the current routing table.
  if( self.server )
    if (self.comm == nil and self.localhost)
      self.comm  = Rex::Socket::SwitchBoard.best_comm(self.localhost)
    end
  else
    if (self.comm == nil and self.peerhost)
      self.comm  = Rex::Socket::SwitchBoard.best_comm(self.peerhost)
    end
  end

  # If we still haven't found a comm, we default to the local comm.
  self.comm      = Rex::Socket::Comm::Local if (self.comm == nil)

  # If we are a UDP server, turn off the server flag as it was only set when
  # creating the UDP socket in order to avail of the switch board above.
  if( self.server and self.proto == 'udp' )
    self.server = false
  end

  # The number of connection retries to make (client only)
  if hash['Retries']
    self.retries = hash['Retries'].to_i
  else
    self.retries = 0
  end

  # The number of seconds before a connect attempt times out (client only)
  if hash['Timeout']
    self.timeout = hash['Timeout'].to_i
  else
    self.timeout = 5
  end

  # Whether to force IPv6 addressing
  self.v6        = hash['IPv6'] || false
end

Instance Attribute Details

#bareBool

Whether or not this is a bare (non-extended) socket instance that should be created.

Returns:

  • (Bool)


321
322
323
# File 'lib/rex/socket/parameters.rb', line 321

def bare
  @bare
end

#commComm

The Comm instance that should be used to create the underlying socket.

Returns:



304
305
306
# File 'lib/rex/socket/parameters.rb', line 304

def comm
  @comm
end

#contextHash

The context hash that was passed in to the structure. (default: {})

Returns:

  • (Hash)


308
309
310
# File 'lib/rex/socket/parameters.rb', line 308

def context
  @context
end

#localhostString Also known as: localaddr

The local host. Equivalent to the LocalHost parameter hash key.

Returns:

  • (String)


286
287
288
# File 'lib/rex/socket/parameters.rb', line 286

def localhost
  @localhost
end

#localportFixnum

The local port. Equivalent to the LocalPort parameter hash key.

Returns:

  • (Fixnum)


290
291
292
# File 'lib/rex/socket/parameters.rb', line 290

def localport
  @localport
end

#peerhostString Also known as: peeraddr

The remote host information, equivalent to the PeerHost parameter hash key.

Returns:

  • (String)


278
279
280
# File 'lib/rex/socket/parameters.rb', line 278

def peerhost
  @peerhost
end

#peerportFixnum

The remote port. Equivalent to the PeerPort parameter hash key.

Returns:

  • (Fixnum)


282
283
284
# File 'lib/rex/socket/parameters.rb', line 282

def peerport
  @peerport
end

#protoString

The protocol to to use, such as TCP. Equivalent to the Proto parameter hash key.

Returns:

  • (String)


295
296
297
# File 'lib/rex/socket/parameters.rb', line 295

def proto
  @proto
end

#proxiesString

List of proxies to use

Returns:

  • (String)


359
360
361
# File 'lib/rex/socket/parameters.rb', line 359

def proxies
  @proxies
end

#retriesFixnum

The number of attempts that should be made.

Returns:

  • (Fixnum)


312
313
314
# File 'lib/rex/socket/parameters.rb', line 312

def retries
  @retries
end

#serverBool

Whether or not this is a server. Equivalent to the Server parameter hash key.

Returns:

  • (Bool)


300
301
302
# File 'lib/rex/socket/parameters.rb', line 300

def server
  @server
end

#sslBool

Whether or not SSL should be used to wrap the connection.

Returns:

  • (Bool)


325
326
327
# File 'lib/rex/socket/parameters.rb', line 325

def ssl
  @ssl
end

#ssl_certString

The SSL certificate, in pem format, stored as a string. See SslTcpServer#makessl

Returns:

  • (String)


340
341
342
# File 'lib/rex/socket/parameters.rb', line 340

def ssl_cert
  @ssl_cert
end

#ssl_cipherString, Array

What specific SSL Cipher(s) to use, may be a string containing the cipher name or an array of strings containing cipher names e.g.

“DHE-RSA-AES256-SHA”, “DHE-DSS-AES256-SHA”

Returns:

  • (String, Array)


335
336
337
# File 'lib/rex/socket/parameters.rb', line 335

def ssl_cipher
  @ssl_cipher
end

#ssl_compressionBool

Enables SSL/TLS-level compression

Returns:

  • (Bool)


344
345
346
# File 'lib/rex/socket/parameters.rb', line 344

def ssl_compression
  @ssl_compression
end

#ssl_verify_modeObject

The SSL context verification mechanism



349
350
351
# File 'lib/rex/socket/parameters.rb', line 349

def ssl_verify_mode
  @ssl_verify_mode
end

#ssl_versionString, Symbol

What version of SSL to use (SSL2, SSL3, SSL23, TLS1)

Returns:

  • (String, Symbol)


329
330
331
# File 'lib/rex/socket/parameters.rb', line 329

def ssl_version
  @ssl_version
end

#timeoutFixnum

The number of seconds before a connection attempt should time out.

Returns:

  • (Fixnum)


316
317
318
# File 'lib/rex/socket/parameters.rb', line 316

def timeout
  @timeout
end

#v6Bool

Whether we should use IPv6

Returns:

  • (Bool)


354
355
356
# File 'lib/rex/socket/parameters.rb', line 354

def v6
  @v6
end

Class Method Details

.from_hash(hash) ⇒ Object

Creates an instance of the Parameters class using the supplied hash.



37
38
39
# File 'lib/rex/socket/parameters.rb', line 37

def self.from_hash(hash)
  return self.new(hash)
end

Instance Method Details

#bare?Boolean

Returns true if the socket is a bare socket that does not inherit from any extended Rex classes.

Returns:

  • (Boolean)


250
251
252
# File 'lib/rex/socket/parameters.rb', line 250

def bare?
  return (bare == true)
end

#client?Boolean

Returns true if this represents parameters for a client.

Returns:

  • (Boolean)


221
222
223
# File 'lib/rex/socket/parameters.rb', line 221

def client?
  return (server == false)
end

#ip?Boolean

Returns true if the protocol for the parameters is IP.

Returns:

  • (Boolean)


242
243
244
# File 'lib/rex/socket/parameters.rb', line 242

def ip?
  return (proto == 'ip')
end

#server?Boolean

Returns true if this represents parameters for a server.

Returns:

  • (Boolean)


214
215
216
# File 'lib/rex/socket/parameters.rb', line 214

def server?
  return (server == true)
end

#ssl?Boolean

Returns true if SSL has been requested.

Returns:

  • (Boolean)


257
258
259
# File 'lib/rex/socket/parameters.rb', line 257

def ssl?
  return ssl
end

#tcp?Boolean

Returns true if the protocol for the parameters is TCP.

Returns:

  • (Boolean)


228
229
230
# File 'lib/rex/socket/parameters.rb', line 228

def tcp?
  return (proto == 'tcp')
end

#udp?Boolean

Returns true if the protocol for the parameters is UDP.

Returns:

  • (Boolean)


235
236
237
# File 'lib/rex/socket/parameters.rb', line 235

def udp?
  return (proto == 'udp')
end

#v6?Boolean

Returns true if IPv6 has been enabled

Returns:

  • (Boolean)


264
265
266
# File 'lib/rex/socket/parameters.rb', line 264

def v6?
  return v6
end