Skip to content

Commit 5c93fb2

Browse files
author
lsanchez-r7
committed
arp_sweep is once again working
modified the capture mixin to use NetworkInteface instead of pcaprub for interfaces and addresses FIXRM rapid7#8023,rapid7#7943
1 parent 50cf8ad commit 5c93fb2

File tree

2 files changed

+51
-45
lines changed

2 files changed

+51
-45
lines changed

lib/msf/core/exploit/capture.rb

Lines changed: 50 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ def initialize(info = {})
5353
@pcaprub_error = e
5454
end
5555

56+
begin
57+
require 'network_interface'
58+
@network_interface_loaded = true
59+
rescue ::Exception => e
60+
@network_interface_loaded = false
61+
@network_interface_error = e
62+
end
63+
5664
end
5765

5866
def stats_recv(pcap=self.capture)
@@ -376,7 +384,10 @@ def check_pcaprub_loaded
376384
if not @pcaprub_loaded
377385
print_status("The Pcaprub module is not available: #{@pcaprub_error}")
378386
raise RuntimeError, "Pcaprub not available"
379-
else
387+
elsif not @network_interface_loaded
388+
print_status("The NetworkInterface module is not available: #{@network_interface_error}")
389+
raise RuntimeError, "NetworkInterface not available"
390+
else
380391
true
381392
end
382393
end
@@ -406,29 +417,24 @@ def should_arp?(ip)
406417

407418
#Netifaces code
408419

409-
# netifaces code is not available in pcaprub 0.9.2 and prior,
410-
# which is going to be installed in a lot of places. Modules
411-
# which want it should check explicitly for it. TODO: Bug upstream
412-
# to release it for real in 0.9.3
413420
def netifaces_implemented?
414-
@pcaprub_loaded and
415-
Pcap.respond_to?(:lookupaddrs) and
416-
Pcap.respond_to?(:interfaces) and
417-
Pcap.respond_to?(:addresses)
421+
@network_interface_loaded and
422+
NetworkInterface.respond_to?(:interfaces) and
423+
NetworkInterface.respond_to?(:addresses)
418424
end
419425

420426
def list_interfaces
421427
check_pcaprub_loaded
422-
Pcap.interfaces
428+
NetworkInterface.interfaces
423429
end
424430

425431
def is_interface?(dev)
426432
check_pcaprub_loaded
427433
if RUBY_PLATFORM == "i386-mingw32"
428434
if dev =~ /\\Device\\NPF_\{[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}\}/
429-
return Pcap.interfaces.include?(dev)
435+
return NetworkInterface.interfaces.include?(dev)
430436
elsif dev.to_s =~ /^[0-9]{1,2}$/
431-
if (dev.to_i <= Pcap.interfaces.length) and (dev.to_i >= 0)
437+
if (dev.to_i <= NetworkInterface.interfaces.length) and (dev.to_i >= 0)
432438
return true
433439
else
434440
return false
@@ -437,7 +443,7 @@ def is_interface?(dev)
437443
return false
438444
end
439445
else
440-
return Pcap.interfaces.include?(dev)
446+
return NetworkInterface.interfaces.include?(dev)
441447
end
442448
end
443449

@@ -447,7 +453,7 @@ def get_interface_guid(dev)
447453
if RUBY_PLATFORM == "i386-mingw32"
448454
if dev.to_s =~ /^[0-9]{1,2}$/
449455
if is_interface?(dev)
450-
Pcap.interfaces[(dev.to_i) - 1]
456+
NetworkInterface.interfaces[(dev.to_i) - 1]
451457
else
452458
return dev
453459
end
@@ -462,80 +468,80 @@ def get_interface_guid(dev)
462468
def get_mac(dev)
463469
check_pcaprub_loaded
464470
dev = get_interface_guid(dev)
465-
addrs = Pcap.addresses(dev)
471+
addrs = NetworkInterface.addresses(dev)
466472
raise RuntimeError, "Interface #{dev} does not exist" if !addrs
467-
raise RuntimeError, "Can not get mac address for interface #{dev}" if !addrs[Pcap::AF_LINK][0]['addr']
468-
addrs[Pcap::AF_LINK][0]['addr']
473+
raise RuntimeError, "Can not get mac address for interface #{dev}" if !addrs[NetworkInterface::AF_LINK][0]['addr']
474+
addrs[NetworkInterface::AF_LINK][0]['addr']
469475
end
470476

471477
def get_ipv4_addr_count(dev)
472478
check_pcaprub_loaded
473479
dev = get_interface_guid(dev)
474-
addrs = Pcap.addresses(dev)
480+
addrs = NetworkInterface.addresses(dev)
475481
raise RuntimeError, "Interface #{dev} does not exist" if !addrs
476-
addrs[Pcap::AF_INET].length
482+
addrs[NetworkInterface::AF_INET].length
477483
end
478484

479485
def get_ipv4_addr(dev, num=0)
480486
check_pcaprub_loaded
481487
dev = get_interface_guid(dev)
482-
addrs = Pcap.addresses(dev)
488+
addrs = NetworkInterface.addresses(dev)
483489
raise RuntimeError, "Interface #{dev} do not exists" if !addrs
484-
raise RuntimeError, "Interface #{dev} do not have an ipv4 address at position #{num}" if addrs[Pcap::AF_INET].length < num + 1
485-
raise RuntimeError, "Can not get the IPv4 address for interface #{dev}" if !addrs[Pcap::AF_INET][num]['addr']
486-
addrs[Pcap::AF_INET][num]['addr']
490+
raise RuntimeError, "Interface #{dev} do not have an ipv4 address at position #{num}" if addrs[NetworkInterface::AF_INET].length < num + 1
491+
raise RuntimeError, "Can not get the IPv4 address for interface #{dev}" if !addrs[NetworkInterface::AF_INET][num]['addr']
492+
addrs[NetworkInterface::AF_INET][num]['addr']
487493
end
488494

489495
def get_ipv4_netmask(dev, num=0)
490496
check_pcaprub_loaded
491497
dev = get_interface_guid(dev)
492-
addrs = Pcap.addresses(dev)
498+
addrs = NetworkInterface.addresses(dev)
493499
raise RuntimeError, "Interface #{dev} do not exists" if !addrs
494-
raise RuntimeError, "Interface #{dev} do not have an ipv4 address at position #{num}" if addrs[Pcap::AF_INET].length < num + 1
495-
raise RuntimeError, "Can not get IPv4 netmask for interface #{dev}" if !addrs[Pcap::AF_INET][num]['netmask']
496-
addrs[Pcap::AF_INET][num]['netmask']
500+
raise RuntimeError, "Interface #{dev} do not have an ipv4 address at position #{num}" if addrs[NetworkInterface::AF_INET].length < num + 1
501+
raise RuntimeError, "Can not get IPv4 netmask for interface #{dev}" if !addrs[NetworkInterface::AF_INET][num]['netmask']
502+
addrs[NetworkInterface::AF_INET][num]['netmask']
497503
end
498504

499505
def get_ipv4_broadcast(dev, num=0)
500506
check_pcaprub_loaded
501507
dev = get_interface_guid(dev)
502-
addrs = Pcap.addresses(dev)
508+
addrs = NetworkInterface.addresses(dev)
503509
raise RuntimeError, "Interface #{dev} do not exists" if !addrs
504-
raise RuntimeError, "Interface #{dev} do not have an ipv4 address at position #{num}" if addrs[Pcap::AF_INET].length < num + 1
505-
raise RuntimeError, "Can not get IPv4 broadcast address for interface #{dev}" if !addrs[Pcap::AF_INET][num]['broadcast']
506-
addrs[Pcap::AF_INET][num]['broadcast']
510+
raise RuntimeError, "Interface #{dev} do not have an ipv4 address at position #{num}" if addrs[NetworkInterface::AF_INET].length < num + 1
511+
raise RuntimeError, "Can not get IPv4 broadcast address for interface #{dev}" if !addrs[NetworkInterface::AF_INET][num]['broadcast']
512+
addrs[NetworkInterface::AF_INET][num]['broadcast']
507513
end
508514

509515
def get_ipv6_addr_count(dev)
510516
check_pcaprub_loaded
511517
dev = get_interface_guid(dev)
512-
raise RuntimeError, "IPv6 information is not available on this platform" if not ::Pcap.const_defined?(:AF_INET6)
513-
addrs = Pcap.addresses(dev)
518+
raise RuntimeError, "IPv6 information is not available on this platform" if not ::NetworkInterface.const_defined?(:AF_INET6)
519+
addrs = NetworkInterface.addresses(dev)
514520
raise RuntimeError, "Interface #{dev} do not exists" if !addrs
515-
addrs[Pcap::AF_INET6].length
521+
addrs[NetworkInterface::AF_INET6].length
516522
end
517523

518524
# NOTE: IPv6 is not implemented on Windows
519525
def get_ipv6_addr(dev, num=0)
520526
check_pcaprub_loaded
521527
dev = get_interface_guid(dev)
522-
raise RuntimeError, "IPv6 information is not available on this platform" if not ::Pcap.const_defined?(:AF_INET6)
523-
addrs = Pcap.addresses(dev)
528+
raise RuntimeError, "IPv6 information is not available on this platform" if not ::NetworkInterface.const_defined?(:AF_INET6)
529+
addrs = NetworkInterface.addresses(dev)
524530
raise RuntimeError, "Interface #{dev} do not exists" if !addrs
525-
raise RuntimeError, "Interface #{dev} do not have an ipv6 address at position #{num}" if addrs[Pcap::AF_INET6].length < num + 1
526-
raise RuntimeError, "Can not get ipv6 address for interface #{dev}" if !addrs[Pcap::AF_INET6][num]['addr']
527-
addrs[Pcap::AF_INET6][num]['addr'].gsub(/%(.)*$/,'')
531+
raise RuntimeError, "Interface #{dev} do not have an ipv6 address at position #{num}" if addrs[NetworkInterface::AF_INET6].length < num + 1
532+
raise RuntimeError, "Can not get ipv6 address for interface #{dev}" if !addrs[NetworkInterface::AF_INET6][num]['addr']
533+
addrs[NetworkInterface::AF_INET6][num]['addr'].gsub(/%(.)*$/,'')
528534
end
529535

530536
def get_ipv6_netmask(dev, num=0)
531537
check_pcaprub_loaded
532538
dev = get_interface_guid(dev)
533-
raise RuntimeError, "IPv6 information is not available on this platform" if not ::Pcap.const_defined?(:AF_INET6)
534-
addrs = Pcap.addresses(dev)
539+
raise RuntimeError, "IPv6 information is not available on this platform" if not ::NetworkInterface.const_defined?(:AF_INET6)
540+
addrs = NetworkInterface.addresses(dev)
535541
raise RuntimeError, "Interface #{dev} do not exists" if !addrs
536-
raise RuntimeError, "Interface #{dev} do not have an ipv6 address at position #{num}" if addrs[Pcap::AF_INET6].length < num + 1
537-
raise RuntimeError, "Can not get ipv6 netmask address for interface #{dev}" if !addrs[Pcap::AF_INET6][num]['netmask']
538-
addrs[Pcap::AF_INET6][num]['netmask']
542+
raise RuntimeError, "Interface #{dev} do not have an ipv6 address at position #{num}" if addrs[NetworkInterface::AF_INET6].length < num + 1
543+
raise RuntimeError, "Can not get ipv6 netmask address for interface #{dev}" if !addrs[NetworkInterface::AF_INET6][num]['netmask']
544+
addrs[NetworkInterface::AF_INET6][num]['netmask']
539545
end
540546

541547
# Protocol-specific encoding/decoding methods until more

modules/auxiliary/scanner/discovery/arp_sweep.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def run_batch(hosts)
4444

4545
@netifaces = true
4646
if not netifaces_implemented?
47-
print_error("WARNING : Pcaprub is not uptodate, some functionality will not be available")
47+
print_error("WARNING : NetworkInterface is not up-to-date, some functionality will not be available")
4848
@netifaces = false
4949
end
5050

0 commit comments

Comments
 (0)