metasploit-framework/lib/packetfu/packetfu/inject.rb

67 lines
1.9 KiB
Ruby

# -*- coding: binary -*-
module PacketFu
# The Inject class handles injecting arrays of binary data on the wire.
#
# To inject single packets, use PacketFu::Packet.to_w() instead.
class Inject
attr_accessor :array, :stream, :show_live # Leave these public and open.
attr_reader :iface, :snaplen, :promisc, :timeout # Cant change after the init.
def initialize(args={})
@array = [] # Where the packet array goes.
@stream = [] # Where the stream goes.
@iface = args[:iface] || ENV['IFACE'] || Pcap.lookupdev || "lo"
@snaplen = args[:snaplen] || 0xffff
@promisc = args[:promisc] || false # Sensible for some Intel wifi cards
@timeout = args[:timeout] || 1
@show_live = nil
end
# Takes an array, and injects them onto an interface. Note that
# complete packets (Ethernet headers on down) are expected.
#
# === Parameters
#
# :array || arr
# An array of binary data (usually packet.to_s style).
# :int || sleep
# Number of seconds to sleep between injections (in float format)
# :show_live || :live
# If true, puts data about what was injected to stdout.
#
# === Example
#
# inj = PacketFu::Inject.new
# inj.array_to_wire(:array => [pkt1, pkt2, pkt3], :sleep => 0.1)
#
def array_to_wire(args={})
pkt_array = args[:array] || args[:arr] || @array
interval = args[:int] || args[:sleep]
show_live = args[:show_live] || args[:live] || @show_live
@stream = Pcap.open_live(@iface,@snaplen,@promisc,@timeout)
pkt_count = 0
pkt_array.each do |pkt|
@stream.inject(pkt)
sleep interval if interval
pkt_count +=1
puts "Sent Packet \##{pkt_count} (#{pkt.size})" if show_live
end
# Return # of packets sent, array size, and array total size
[pkt_count, pkt_array.size, pkt_array.join.size]
end
# Equivalent to array_to_wire
def a2w(args={})
array_to_wire(args)
end
# Equivalent to array_to_wire
def inject(args={})
array_to_wire(args)
end
end
end