Module: Msf::Handler::Reverse::Bind

Included in:
Msf::Handler::Reverse, Msf::Handler::ReverseUdp
Defined in:
lib/msf/core/handler/reverse/bind.rb

Overview

Shared bind address functionality for reverse handlers.

Instance Method Summary collapse

Instance Method Details

#bind_addresses ⇒ Array<String>

A list of addresses to attempt to bind, in preferred order.

Returns:

  • (Array<String>) —

    a two-element array. The first element will be the address that datastore['LHOST'] resolves to, the second will be the INADDR_ANY address for IPv4 or IPv6, depending on the version of the first element.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/msf/core/handler/reverse/bind.rb', line 21

def bind_addresses
  if !datastore['ReverseListenerBindAddress'].to_s.empty?
    bind_addr = datastore['ReverseListenerBindAddress']
    any = Rex::Socket.is_ipv6?(bind_addr) ? '::0' : '0.0.0.0'
    return [ Rex::Socket.addr_atoi(bind_addr) == 0 ? any : bind_addr ]
  end

  begin
    addr_nbo = Rex::Socket.resolv_nbo(datastore['LHOST'])
  rescue StandardError
    print_warning("LHOST '#{datastore['LHOST']}' is not locally resolvable. Binding to 0.0.0.0. Set ReverseListenerBindAddress to override.")
    return ['0.0.0.0']
  end

  addr = Rex::Socket.addr_ntoa(addr_nbo)
  any = Rex::Socket.is_ipv4?(addr) ? '0.0.0.0' : '::0'

  if is_loopback_address?(addr)
    print_warning("You are binding to a loopback address by setting LHOST to #{addr}. Did you want ReverseListenerBindAddress?")
  end

  [addr, any]
end

#is_loopback_address?(address) ⇒ Boolean

Returns:

  • (Boolean)


8
9
10
11
12
13
# File 'lib/msf/core/handler/reverse/bind.rb', line 8

def is_loopback_address?(address)
  a = IPAddr.new(address.to_s)
  IPAddr.new('127.0.0.1/8').include?(a) || IPAddr.new('::1').include?(a)
rescue IPAddr::Error
  false
end