Class: Ronin::Support::Network::IP

Inherits:
IPAddr
  • Object
show all
Defined in:
lib/ronin/support/network/ip.rb,
lib/ronin/support/network/ip/mixin.rb

Overview

Represents a single IP address.

Examples

ip = IP.new('192.30.255.113')

Reverse DNS lookup:

ip.get_name
# => "lb-192-30-255-113-sea.github.com"
ip.get_names
# => ["lb-192-30-255-113-sea.github.com"]
ip.get_host
# => #<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>
ip.get_hosts
# => [#<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>]
ip.host
# => #<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>
ip.hosts
# => [#<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>]

Get ASN information:

ip.asn
# => #<Ronin::Support::Network::ASN::DNSRecord:0x00007f34142de598
#     @country_code="US",
#     @name=nil,
#     @number=15133,
#     @range=#<Ronin::Support::Network::IPRange::CIDR: 93.184.216.0/24>>

Since:

  • 1.0.0

Defined Under Namespace

Modules: Mixin

Constant Summary collapse

IPINFO_URI =

The URI for https://ipinfo.io/ip

Since:

  • 1.0.0

URI::HTTPS.build(host: 'ipinfo.io', path: '/ip')

Constants inherited from IPAddr

IPAddr::MASKS

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from IPAddr

#each

Methods included from Enumerable

#map_hash

Constructor Details

#initialize(address, family = Socket::AF_UNSPEC) ⇒ IP

Note:

If the IP address has an %iface suffix, it will be removed from the IP address.

Initializes the IP address.

Examples:

ip = IP.new('192.30.255.113')

Parameters:

  • address (String)

    The address of the IP.

  • family (Integer) (defaults to: Socket::AF_UNSPEC)

    The address family for the CIDR range. This is mainly for backwards compatibility with IPAddr#initialize.

Raises:

  • (InvalidIP)

    The given address is not a valid IP address.

Since:

  • 1.0.0



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/ronin/support/network/ip.rb', line 89

def initialize(address,family=Socket::AF_UNSPEC)
  case address
  when String
    # XXX: remove the %iface suffix for ruby < 3.1.0
    if address =~ /%.+$/
      address = address.sub(/%.+$/,'')
    end

    # pre-cache the given IP address String
    @address = address
  end

  begin
    super(address,family)
  rescue IPAddr::InvalidAddressError
    raise(InvalidIP,"invalid IP address: #{address.inspect}")
  end
end

Class Method Details

.extract(text, version = nil) {|ip| ... } ⇒ Array<String>

Extracts IP Addresses from text.

Examples:

IPAddr.extract("Host: 127.0.0.1\n\rHost: 10.1.1.1\n\r")
# => ["127.0.0.1", "10.1.1.1"]

Extract only IPv4 addresses from a large amount of text:

IPAddr.extract(text,:v4) do |ip|
  puts ip
end

Parameters:

  • text (String)

    The text to scan for IP Addresses.

  • version (4, :v4, :ipv4, 6, :v6, :ipv6) (defaults to: nil)

    The version of IP Address to extract.

Yields:

  • (ip)

    The given block will be passed each extracted IP Address.

Yield Parameters:

  • ip (String)

    An IP Address from the text.

Returns:

  • (Array<String>)

    The IP Addresses found in the text.

Since:

  • 1.0.0



253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/ronin/support/network/ip.rb', line 253

def self.extract(text,version=nil,&block)
  return enum_for(__method__,text,version).to_a unless block_given?

  regexp = case version
           when :ipv4, :v4, 4 then Text::Patterns::IPV4_ADDR
           when :ipv6, :v6, 6 then Text::Patterns::IPV6_ADDR
           else                    Text::Patterns::IP_ADDR
           end

  text.scan(regexp,&block)
  return nil
end

.local_addressString

Determines the local IP address.

Examples:

IP.local_address
# => "127.0.0.1"

Returns:

Since:

  • 1.0.0



209
210
211
# File 'lib/ronin/support/network/ip.rb', line 209

def self.local_address
  Socket.ip_address_list.first.ip_address
end

.local_addressesArray<String>

Determines all local IP addresses.

Examples:

IP.local_addresses
# => ["127.0.0.1", "192.168.1.42", "::1", "fe80::4ba:612f:9e2:37e2"]

Returns:

Since:

  • 1.0.0



172
173
174
175
176
177
178
179
180
181
182
# File 'lib/ronin/support/network/ip.rb', line 172

def self.local_addresses
  Socket.ip_address_list.map do |addrinfo|
    address = addrinfo.ip_address

    if address =~ /%.+$/
      address = address.sub(/%.+$/,'')
    end

    address
  end
end

.local_ipIP

Determines the local IP.

Examples:

IP.local_ip
# => #<Ronin::Support::Network::IP: 127.0.0.1>

Returns:

Since:

  • 1.0.0



222
223
224
# File 'lib/ronin/support/network/ip.rb', line 222

def self.local_ip
  new(local_address)
end

.local_ipsArray<IP>

Determines all local IPs.

Examples:

IP.local_ips
# => [#<Ronin::Support::Network::IP: 127.0.0.1>,
      #<Ronin::Support::Network::IP: 192.168.1.42>,
      #<Ronin::Support::Network::IP: ::1>,
      #<Ronin::Support::Network::IP: fe80::04ba:612f:09e2:37e2>]

Returns:

Since:

  • 1.0.0



196
197
198
# File 'lib/ronin/support/network/ip.rb', line 196

def self.local_ips
  local_addresses.map(&method(:new))
end

.public_addressString?

Determines the current public IP address.

Returns:

Since:

  • 1.0.0



139
140
141
142
143
144
145
146
147
148
149
# File 'lib/ronin/support/network/ip.rb', line 139

def self.public_address
  response = begin
               Net::HTTP.get_response(IPINFO_URI)
             rescue
               # ignore any network failures
             end

  if response && response.code == '200'
    return response.body
  end
end

.public_ipIP?

Determines the current public IP.

Returns:

Since:

  • 1.0.0



157
158
159
160
161
# File 'lib/ronin/support/network/ip.rb', line 157

def self.public_ip
  if (address = public_address)
    new(address)
  end
end

Instance Method Details

#addressString

The IP address.

Returns:

  • (String)

    The String version of the IP address.

Since:

  • 1.0.0



313
314
315
# File 'lib/ronin/support/network/ip.rb', line 313

def address
  @address ||= to_s
end

#asnASN::Record

The Autonomous System Number (ASN) information for the IP address.

Examples:

ip = IP.new('93.184.216.34')
ip.asn
# => #<Ronin::Support::Network::ASN::DNSRecord:0x00007f34142de598
      @country_code="US",
      @name=nil,
      @number=15133,
      @range=#<Ronin::Support::Network::IPRange::CIDR: 93.184.216.0/24>>

Returns:

Since:

  • 1.0.0



331
332
333
# File 'lib/ronin/support/network/ip.rb', line 331

def asn
  @asn ||= ASN.query(self)
end

#broadcast?Boolean

Determines if the address is a IPv4 broadcast addresses.

Examples:

ip = IPAddr.new('255.255.255.255')
ip.broadcast?
# => true
ip = IPAddr.new('192.168.1.255')
ip.broadcast?
# => true
ip = IPAddr.new('1.1.1.1')
ip.broadcast?
# => false

Returns:

  • (Boolean)

Since:

  • 1.0.0



282
283
284
285
# File 'lib/ronin/support/network/ip.rb', line 282

def broadcast?
  # NOTE: IPv6 does not have broadcast addresses
  ipv4? && (@addr & 0xff) == 0xff
end

#get_host(**kwargs) ⇒ Host?

Looks up the host for the IP.

Examples:

ip = IP.new('192.30.255.113')
ip.get_host
# => #<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

  • (Host, nil)

    The host for the IP.

Since:

  • 1.0.0



405
406
407
408
409
# File 'lib/ronin/support/network/ip.rb', line 405

def get_host(**kwargs)
  if (name = get_name(**kwargs))
    Host.new(name)
  end
end

#get_hosts(**kwargs) ⇒ Array<Host>

Looks up all hosts associated with the IP.

Examples:

ip = IP.new('192.30.255.113')
ip.get_hosts
# => [#<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>]

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

Since:

  • 1.0.0



431
432
433
# File 'lib/ronin/support/network/ip.rb', line 431

def get_hosts(**kwargs)
  get_names(**kwargs).map { |name| Host.new(name) }
end

#get_name(**kwargs) ⇒ String? Also known as: reverse_lookup

Looks up the hostname of the address.

Examples:

ip = IP.new('192.30.255.113')
ip.get_name
# => "lb-192-30-255-113-sea.github.com"

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

  • (String, nil)

    The hostname of the address.

Since:

  • 1.0.0



355
356
357
# File 'lib/ronin/support/network/ip.rb', line 355

def get_name(**kwargs)
  DNS.get_name(@address,**kwargs)
end

#get_names(**kwargs) ⇒ Array<String>

Looks up all hostnames associated with the IP.

Examples:

ip = IP.new('192.30.255.113')
ip.get_names
# => ["lb-192-30-255-113-sea.github.com"]

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

Since:

  • 1.0.0



381
382
383
# File 'lib/ronin/support/network/ip.rb', line 381

def get_names(**kwargs)
  DNS.get_names(@address,**kwargs)
end

#get_ptr_name(**kwargs) ⇒ String?

Queries the PTR host name for the IP address.

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

  • (String, nil)

    The host name that points to the given IP.

Since:

  • 1.0.0



505
506
507
# File 'lib/ronin/support/network/ip.rb', line 505

def get_ptr_name(**kwargs)
  DNS.get_ptr_name(@address,**kwargs)
end

#get_ptr_names(**kwargs) ⇒ Array<String>

Queries all PTR names for the IP address.

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

Since:

  • 1.0.0



545
546
547
# File 'lib/ronin/support/network/ip.rb', line 545

def get_ptr_names(**kwargs)
  DNS.get_ptr_names(@address,**kwargs)
end

#get_ptr_record(**kwargs) ⇒ Resolv::DNS::Resource::PTR?

Queries the first PTR DNS record for the IP address.

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

  • (Resolv::DNS::Resource::PTR, nil)

    The first PTR DNS record of the host name or nil if the host name has no PTR records.

See Also:

Since:

  • 1.0.0



486
487
488
# File 'lib/ronin/support/network/ip.rb', line 486

def get_ptr_record(**kwargs)
  DNS.get_ptr_record(@address,**kwargs)
end

#get_ptr_records(**kwargs) ⇒ Array<Resolv::DNS::Resource::PTR>

Queries all PTR DNS records for the IP address.

Parameters:

  • kwargs (Hash{Symbol => Object})

    Additional keyword arguments.

  • [Array<String>, (Hash)

    a customizable set of options

  • [String, (Hash)

    a customizable set of options

Returns:

  • (Array<Resolv::DNS::Resource::PTR>)

    All PTR DNS records for the given IP.

See Also:

Since:

  • 1.0.0



526
527
528
# File 'lib/ronin/support/network/ip.rb', line 526

def get_ptr_records(**kwargs)
  DNS.get_ptr_records(@address,**kwargs)
end

#hostHost?

The primary host name of the address.

Examples:

ip = IP.new('192.30.255.113')
ip.host
# => #<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>

Returns:

  • (Host, nil)

    The host name or nil if the IP address has no host names.

Since:

  • 1.0.0



464
465
466
# File 'lib/ronin/support/network/ip.rb', line 464

def host
  hosts.first
end

#hostsArray<Host>

Note:

This method returns memoized data.

The host names of the address.

Examples:

ip = IP.new('192.30.255.113')
ip.hosts
# => [#<Ronin::Support::Network::Host: lb-192-30-255-113-sea.github.com>]

Returns:

  • (Array<Host>)

    The host names of the address or an empty Array if the IP address has no host names.

Since:

  • 1.0.0



449
450
451
# File 'lib/ronin/support/network/ip.rb', line 449

def hosts
  @hosts ||= get_hosts
end

#inspectString

Inspects the IP.

Returns:

  • (String)

    The inspected IP object.

Since:

  • 1.0.0



559
560
561
# File 'lib/ronin/support/network/ip.rb', line 559

def inspect
  "#<#{self.class}: #{@address}>"
end

#logical?Boolean

Determines if the address is a "logical" IPv4 address.

Examples:

ip = IPAddr.new('0.0.0.0')
ip.logical?
# => true
ip = IPAddr.new('192.168.1.0')
ip.logical?
# => true
ip = IPAddr.new('1.1.1.1')
ip.logical?
# => false

Returns:

  • (Boolean)

Since:

  • 1.0.0



303
304
305
# File 'lib/ronin/support/network/ip.rb', line 303

def logical?
  ipv4? && (@addr & 0xff) == 0x00
end

#set(addr, *family) ⇒ Object (protected)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Sets the IP address using the numeric IP address value.

Parameters:

  • addr (Integer)

    The new numeric IP address value.

  • family (Integer)

    Optional IP address family.

Since:

  • 1.0.0



121
122
123
124
125
126
# File 'lib/ronin/support/network/ip.rb', line 121

def set(addr,*family)
  super(addr,*family)

  # unset the cached IP address since the numeric address has changed
  @address = nil
end