packetfu 1.1.11 → 1.1.12.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.rspec +2 -0
- data/.travis.yml +2 -3
- data/README.md +127 -0
- data/examples/100kpackets.rb +11 -10
- data/examples/ackscan.rb +4 -1
- data/examples/arp.rb +4 -5
- data/examples/arphood.rb +5 -4
- data/examples/dissect_thinger.rb +10 -7
- data/examples/ethernet.rb +8 -3
- data/examples/ids.rb +22 -4
- data/examples/idsv2.rb +25 -6
- data/examples/ifconfig.rb +6 -3
- data/examples/new-simple-stats.rb +5 -6
- data/examples/packetfu-shell.rb +11 -48
- data/examples/pcap2pcapng.rb +32 -0
- data/examples/simple-sniffer.rb +9 -4
- data/examples/simple-stats.rb +7 -8
- data/examples/slammer.rb +2 -2
- data/examples/uniqpcap.rb +17 -7
- data/lib/packetfu.rb +10 -175
- data/lib/packetfu/capture.rb +2 -2
- data/lib/packetfu/common.rb +142 -0
- data/lib/packetfu/config.rb +8 -8
- data/lib/packetfu/inject.rb +3 -3
- data/lib/packetfu/packet.rb +22 -18
- data/lib/packetfu/pcap.rb +2 -1
- data/lib/packetfu/pcapng.rb +37 -0
- data/lib/packetfu/pcapng/block.rb +25 -0
- data/lib/packetfu/pcapng/epb.rb +112 -0
- data/lib/packetfu/pcapng/file.rb +316 -0
- data/lib/packetfu/pcapng/idb.rb +125 -0
- data/lib/packetfu/pcapng/shb.rb +146 -0
- data/lib/packetfu/pcapng/spb.rb +83 -0
- data/lib/packetfu/pcapng/unknown_block.rb +60 -0
- data/lib/packetfu/protos.rb +3 -0
- data/lib/packetfu/protos/arp.rb +10 -10
- data/lib/packetfu/protos/icmpv6.rb +131 -0
- data/lib/packetfu/protos/icmpv6/header.rb +69 -0
- data/lib/packetfu/protos/icmpv6/mixin.rb +14 -0
- data/lib/packetfu/protos/ip.rb +4 -5
- data/lib/packetfu/protos/ipv6/header.rb +2 -0
- data/lib/packetfu/protos/udp.rb +24 -12
- data/lib/packetfu/structfu.rb +27 -0
- data/lib/packetfu/utils.rb +55 -9
- data/lib/packetfu/version.rb +1 -1
- data/packetfu.gemspec +13 -7
- data/spec/arp_spec.rb +11 -5
- data/spec/eth_spec.rb +20 -11
- data/spec/fake_packets.rb +28 -0
- data/spec/hsrp_spec.rb +15 -0
- data/spec/icmp_spec.rb +12 -5
- data/spec/icmpv6_spec.rb +98 -0
- data/spec/invalid_spec.rb +28 -0
- data/spec/ip_spec.rb +10 -5
- data/spec/ipv4_icmp.pcap +0 -0
- data/spec/ipv4_udp.pcap +0 -0
- data/spec/ipv6_icmp.pcap +0 -0
- data/spec/ipv6_spec.rb +4 -0
- data/spec/ipv6_udp.pcap +0 -0
- data/spec/lldp_spec.rb +36 -0
- data/spec/octets_spec.rb +43 -0
- data/spec/packet_spec.rb +24 -0
- data/spec/packetfu_spec.rb +6 -1
- data/spec/pcap_spec.rb +286 -0
- data/spec/pcapng/epb_spec.rb +81 -0
- data/spec/pcapng/file_spec.rb +295 -0
- data/spec/pcapng/file_spec_helper.rb +45 -0
- data/spec/pcapng/idb_spec.rb +53 -0
- data/spec/pcapng/shb_spec.rb +42 -0
- data/spec/pcapng/spb_spec.rb +43 -0
- data/spec/pcapng/unknown_block_spec.rb +36 -0
- data/spec/spec_helper.rb +3 -31
- data/spec/tcp_spec.rb +4 -1
- data/spec/udp_spec.rb +149 -1
- data/spec/utils_spec.rb +98 -15
- data/test/pcapng-test/output_be/advanced/test100.pcapng +0 -0
- data/test/pcapng-test/output_be/advanced/test100.txt +11 -0
- data/test/pcapng-test/output_be/advanced/test101.pcapng +0 -0
- data/test/pcapng-test/output_be/advanced/test101.txt +11 -0
- data/test/pcapng-test/output_be/advanced/test102.pcapng +0 -0
- data/test/pcapng-test/output_be/advanced/test102.txt +14 -0
- data/test/pcapng-test/output_be/basic/test001.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test001.txt +9 -0
- data/test/pcapng-test/output_be/basic/test002.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test002.txt +7 -0
- data/test/pcapng-test/output_be/basic/test003.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test003.txt +8 -0
- data/test/pcapng-test/output_be/basic/test004.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test004.txt +9 -0
- data/test/pcapng-test/output_be/basic/test005.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test005.txt +9 -0
- data/test/pcapng-test/output_be/basic/test006.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test006.txt +9 -0
- data/test/pcapng-test/output_be/basic/test007.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test007.txt +9 -0
- data/test/pcapng-test/output_be/basic/test008.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test008.txt +9 -0
- data/test/pcapng-test/output_be/basic/test009.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test009.txt +9 -0
- data/test/pcapng-test/output_be/basic/test010.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test010.txt +9 -0
- data/test/pcapng-test/output_be/basic/test011.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test011.txt +10 -0
- data/test/pcapng-test/output_be/basic/test012.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test012.txt +10 -0
- data/test/pcapng-test/output_be/basic/test013.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test013.txt +9 -0
- data/test/pcapng-test/output_be/basic/test014.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test014.txt +9 -0
- data/test/pcapng-test/output_be/basic/test015.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test015.txt +9 -0
- data/test/pcapng-test/output_be/basic/test016.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test016.txt +11 -0
- data/test/pcapng-test/output_be/basic/test017.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test017.txt +9 -0
- data/test/pcapng-test/output_be/basic/test018.pcapng +0 -0
- data/test/pcapng-test/output_be/basic/test018.txt +12 -0
- data/test/pcapng-test/output_be/difficult/test200.pcapng +0 -0
- data/test/pcapng-test/output_be/difficult/test200.txt +8 -0
- data/test/pcapng-test/output_be/difficult/test201.pcapng +0 -0
- data/test/pcapng-test/output_be/difficult/test201.txt +11 -0
- data/test/pcapng-test/output_be/difficult/test202.pcapng +0 -0
- data/test/pcapng-test/output_be/difficult/test202.txt +14 -0
- data/test/pcapng-test/output_le/advanced/test100.pcapng +0 -0
- data/test/pcapng-test/output_le/advanced/test100.txt +11 -0
- data/test/pcapng-test/output_le/advanced/test101.pcapng +0 -0
- data/test/pcapng-test/output_le/advanced/test101.txt +11 -0
- data/test/pcapng-test/output_le/advanced/test102.pcapng +0 -0
- data/test/pcapng-test/output_le/advanced/test102.txt +14 -0
- data/test/pcapng-test/output_le/basic/test001.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test001.txt +9 -0
- data/test/pcapng-test/output_le/basic/test002.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test002.txt +7 -0
- data/test/pcapng-test/output_le/basic/test003.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test003.txt +8 -0
- data/test/pcapng-test/output_le/basic/test004.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test004.txt +9 -0
- data/test/pcapng-test/output_le/basic/test005.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test005.txt +9 -0
- data/test/pcapng-test/output_le/basic/test006.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test006.txt +9 -0
- data/test/pcapng-test/output_le/basic/test007.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test007.txt +9 -0
- data/test/pcapng-test/output_le/basic/test008.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test008.txt +9 -0
- data/test/pcapng-test/output_le/basic/test009.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test009.txt +9 -0
- data/test/pcapng-test/output_le/basic/test010.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test010.txt +9 -0
- data/test/pcapng-test/output_le/basic/test011.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test011.txt +10 -0
- data/test/pcapng-test/output_le/basic/test012.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test012.txt +10 -0
- data/test/pcapng-test/output_le/basic/test013.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test013.txt +9 -0
- data/test/pcapng-test/output_le/basic/test014.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test014.txt +9 -0
- data/test/pcapng-test/output_le/basic/test015.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test015.txt +9 -0
- data/test/pcapng-test/output_le/basic/test016.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test016.txt +11 -0
- data/test/pcapng-test/output_le/basic/test017.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test017.txt +9 -0
- data/test/pcapng-test/output_le/basic/test018.pcapng +0 -0
- data/test/pcapng-test/output_le/basic/test018.txt +12 -0
- data/test/pcapng-test/output_le/difficult/test200.pcapng +0 -0
- data/test/pcapng-test/output_le/difficult/test200.txt +8 -0
- data/test/pcapng-test/output_le/difficult/test201.pcapng +0 -0
- data/test/pcapng-test/output_le/difficult/test201.txt +11 -0
- data/test/pcapng-test/output_le/difficult/test202.pcapng +0 -0
- data/test/pcapng-test/output_le/difficult/test202.txt +14 -0
- data/test/sample-ipv6.pcapng +0 -0
- data/test/sample-spb.pcapng +0 -0
- data/test/sample.pcapng +0 -0
- data/test/sample2.pcapng +0 -0
- metadata +190 -68
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -2
- data/INSTALL.rdoc +0 -40
- data/README.rdoc +0 -64
- data/examples/examples.rb +0 -4
- data/setup.rb +0 -1586
- data/test/func_lldp.rb +0 -25
- data/test/ptest.rb +0 -16
- data/test/test_eth.rb +0 -93
- data/test/test_hsrp.rb +0 -20
- data/test/test_invalid.rb +0 -28
- data/test/test_octets.rb +0 -36
- data/test/test_pcap.rb +0 -211
- data/test/test_udp.rb +0 -100
- metadata.gz.sig +0 -2
@@ -0,0 +1,32 @@
|
|
1
|
+
# Usage:
|
2
|
+
# rvmsudo ruby examples/pcap2pcapng.rb test.pcap test.pcapng
|
3
|
+
|
4
|
+
# Path setting slight of hand:
|
5
|
+
$: << File.expand_path("../../lib", __FILE__)
|
6
|
+
|
7
|
+
require 'packetfu'
|
8
|
+
|
9
|
+
pcap_filename = ARGV[0].chomp
|
10
|
+
pcapng_filename = ARGV[1].chomp
|
11
|
+
|
12
|
+
unless File.exists?(pcap_filename)
|
13
|
+
puts "PCAP input file #{pcap_filename} could not be found"
|
14
|
+
end
|
15
|
+
|
16
|
+
if File.exists?(pcapng_filename)
|
17
|
+
puts "PCAP-NG output file #{pcap_filename} already exists"
|
18
|
+
puts "Do you wish to overwrite the file? (Y/N, Default = N)"
|
19
|
+
STDOUT.flush
|
20
|
+
response = $stdin.gets.chomp
|
21
|
+
unless response == "Y"
|
22
|
+
puts "Aborting..."
|
23
|
+
exit 0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
puts "Reading PCAP to packet array from #{File.expand_path(pcap_filename)}"
|
28
|
+
packet_array = PacketFu::PcapFile.file_to_array(pcap_filename)
|
29
|
+
|
30
|
+
puts "Writing packet array to PCAP-NG at #{File.expand_path(pcapng_filename)}"
|
31
|
+
pcapng_file = PacketFu::PcapNG::File.new()
|
32
|
+
pcapng_file.array_to_file(:array => packet_array, :file => pcapng_filename)
|
data/examples/simple-sniffer.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: binary -*-
|
3
|
-
|
3
|
+
|
4
|
+
# Usage:
|
5
|
+
# rvmsudo ruby examples/simple-sniffer.rb
|
6
|
+
|
7
|
+
# Path setting slight of hand:
|
8
|
+
$: << File.expand_path("../../lib", __FILE__)
|
4
9
|
require 'packetfu'
|
5
10
|
|
6
11
|
puts "Simple sniffer for PacketFu #{PacketFu.version}"
|
7
12
|
include PacketFu
|
8
|
-
iface = ARGV[0] ||
|
13
|
+
iface = ARGV[0] || PacketFu::Utils.default_int
|
9
14
|
|
10
15
|
def sniff(iface)
|
11
16
|
cap = Capture.new(:iface => iface, :start => true)
|
@@ -21,7 +26,7 @@ end
|
|
21
26
|
|
22
27
|
sniff(iface)
|
23
28
|
|
24
|
-
=begin
|
29
|
+
=begin
|
25
30
|
Results look like this:
|
26
31
|
145.58.33.95 -> 192.168.11.70 1514 TCP
|
27
32
|
212.233.158.76 -> 192.168.11.70 110 UDP
|
@@ -38,4 +43,4 @@ Results look like this:
|
|
38
43
|
8.8.8.8 -> 192.168.11.70 128 UDP
|
39
44
|
8.8.8.8 -> 192.168.11.70 187 UDP
|
40
45
|
24.45.247.232 -> 192.168.11.70 70 TCP
|
41
|
-
=end
|
46
|
+
=end
|
data/examples/simple-stats.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: binary -*-
|
3
3
|
|
4
|
-
# Simple-stats.rb takes a pcap file, and gives some simple
|
4
|
+
# Simple-stats.rb takes a pcap file, and gives some simple
|
5
5
|
# stastics on the protocols found. It's mainly used to
|
6
6
|
# demonstrate a method to parse pcap files.
|
7
7
|
#
|
@@ -10,7 +10,11 @@
|
|
10
10
|
# See new-simple-stats.rb for an example of the streaming
|
11
11
|
# parsing method.
|
12
12
|
|
13
|
-
|
13
|
+
# Usage:
|
14
|
+
# ruby examples/simple-stats.rb test/sample.pcap
|
15
|
+
|
16
|
+
# Path setting slight of hand:
|
17
|
+
$: << File.expand_path("../../lib", __FILE__)
|
14
18
|
require 'packetfu'
|
15
19
|
|
16
20
|
# Takes a file name, parses the packets, and records the packet
|
@@ -23,7 +27,7 @@ def count_packet_types(file)
|
|
23
27
|
pcapfile.read(file)
|
24
28
|
pcapfile.each do |p|
|
25
29
|
# Now it's a PacketFu packet struct.
|
26
|
-
pkt = PacketFu::Packet.parse(p.data)
|
30
|
+
pkt = PacketFu::Packet.parse(p.data)
|
27
31
|
kind = pkt.class.to_s.split("::").last
|
28
32
|
if stats[kind]
|
29
33
|
stats[kind] += 1
|
@@ -44,8 +48,3 @@ if File.readable?(infile = (ARGV[0] || 'in.pcap'))
|
|
44
48
|
else
|
45
49
|
raise RuntimeError, "Need an infile, like so: #{$0} in.pcap"
|
46
50
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
data/examples/slammer.rb
CHANGED
@@ -8,6 +8,8 @@ raise RuntimeError, "Need a target" unless target
|
|
8
8
|
action = ARGV[1]
|
9
9
|
raise RuntimeError, "Need an action. Try file or your interface." unless action
|
10
10
|
|
11
|
+
# Path setting slight of hand:
|
12
|
+
$: << File.expand_path("../../lib", __FILE__)
|
11
13
|
require 'packetfu'
|
12
14
|
include PacketFu
|
13
15
|
|
@@ -30,5 +32,3 @@ if action == 'file'.downcase
|
|
30
32
|
else
|
31
33
|
puts kill_packet.to_w(action.downcase)
|
32
34
|
end
|
33
|
-
|
34
|
-
|
data/examples/uniqpcap.rb
CHANGED
@@ -1,15 +1,25 @@
|
|
1
|
-
# Uniqpcap.rb takes a pcap file, strips out duplicate packets, and
|
1
|
+
# Uniqpcap.rb takes a pcap file, strips out duplicate packets, and
|
2
2
|
# writes them to a file.
|
3
3
|
#
|
4
|
-
# The duplicate pcap problem is common when I'm capturing
|
4
|
+
# The duplicate pcap problem is common when I'm capturing
|
5
5
|
# traffic to/from a VMWare image, for some reason.
|
6
6
|
#
|
7
|
-
# Currently, the timestamp information is lost due to PcapRub's
|
8
|
-
# file read. For me, this isn't a big deal. Future versions
|
7
|
+
# Currently, the timestamp information is lost due to PcapRub's
|
8
|
+
# file read. For me, this isn't a big deal. Future versions
|
9
9
|
# will deal with timestamps correctly.
|
10
|
-
|
10
|
+
|
11
|
+
# Usage:
|
12
|
+
# ruby examples/uniqcap.rb test/sample.pcap
|
13
|
+
|
14
|
+
# Path setting slight of hand:
|
15
|
+
$: << File.expand_path("../../lib", __FILE__)
|
11
16
|
require 'packetfu'
|
12
17
|
|
13
|
-
|
14
|
-
|
18
|
+
pcap_file = ARGV[0].chomp
|
19
|
+
|
20
|
+
in_array = PacketFu::Read.f2a(:file => pcap_file)
|
21
|
+
|
22
|
+
puts "Original Packets: #{in_array.size}"
|
23
|
+
puts "Uniq'd Packets: #{in_array.uniq.size}"
|
15
24
|
|
25
|
+
puts PacketFu::Write.a2f(:file => pcap_file + ".uniq", :arr => in_array.uniq).inspect
|
data/lib/packetfu.rb
CHANGED
@@ -1,176 +1,11 @@
|
|
1
1
|
# -*- coding: binary -*-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require 'rubygems' if RUBY_VERSION =~ /^1\.[0-8]/
|
13
|
-
|
14
|
-
module PacketFu
|
15
|
-
|
16
|
-
# Picks up all the protocols defined in the protos subdirectory
|
17
|
-
def self.require_protos(cwd)
|
18
|
-
protos_dir = File.join(cwd, "packetfu", "protos")
|
19
|
-
Dir.new(protos_dir).each do |fname|
|
20
|
-
next unless fname[/\.rb$/]
|
21
|
-
begin
|
22
|
-
require File.join(protos_dir,fname)
|
23
|
-
rescue
|
24
|
-
warn "Warning: Could not load `#{fname}'. Skipping."
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# Deal with Ruby's encoding by ignoring it.
|
30
|
-
def self.force_binary(str)
|
31
|
-
str.force_encoding Encoding::BINARY if str.respond_to? :force_encoding
|
32
|
-
end
|
33
|
-
|
34
|
-
# Sets the expected byte order for a pcap file. See PacketFu::Read.set_byte_order
|
35
|
-
@byte_order = :little
|
36
|
-
|
37
|
-
# Checks if pcaprub is loaded correctly.
|
38
|
-
@pcaprub_loaded = false
|
39
|
-
|
40
|
-
# PacketFu works best with Pcaprub version 0.8-dev (at least)
|
41
|
-
# The current (Aug 01, 2010) pcaprub gem is 0.9, so should be fine.
|
42
|
-
def self.pcaprub_platform_require
|
43
|
-
begin
|
44
|
-
require 'pcaprub'
|
45
|
-
rescue LoadError
|
46
|
-
return false
|
47
|
-
end
|
48
|
-
@pcaprub_loaded = true
|
49
|
-
end
|
50
|
-
|
51
|
-
pcaprub_platform_require
|
52
|
-
|
53
|
-
if @pcaprub_loaded
|
54
|
-
pcaprub_regex = /[0-9]\.([8-9]|[1-7][0-9])(-dev)?/ # Regex for 0.8 and beyond.
|
55
|
-
if Pcap.version !~ pcaprub_regex
|
56
|
-
@pcaprub_loaded = false # Don't bother with broken versions
|
57
|
-
raise LoadError, "PcapRub not at a minimum version of 0.8-dev"
|
58
|
-
end
|
59
|
-
require "packetfu/capture"
|
60
|
-
require "packetfu/inject"
|
61
|
-
end
|
62
|
-
|
63
|
-
# Returns the status of pcaprub
|
64
|
-
def self.pcaprub_loaded?
|
65
|
-
@pcaprub_loaded
|
66
|
-
end
|
67
|
-
|
68
|
-
# Returns an array of classes defined in PacketFu
|
69
|
-
def self.classes
|
70
|
-
constants.map { |const| const_get(const) if const_get(const).kind_of? Class}.compact
|
71
|
-
end
|
72
|
-
|
73
|
-
# Adds the class to PacketFu's list of packet classes -- used in packet parsing.
|
74
|
-
def self.add_packet_class(klass)
|
75
|
-
raise "Need a class" unless klass.kind_of? Class
|
76
|
-
if klass.name !~ /[A-Za-z0-9]Packet/
|
77
|
-
raise "Packet classes should be named 'ProtoPacket'"
|
78
|
-
end
|
79
|
-
@packet_classes ||= []
|
80
|
-
@packet_classes << klass
|
81
|
-
self.clear_packet_groups
|
82
|
-
@packet_classes.sort_by! { |x| x.name }
|
83
|
-
end
|
84
|
-
|
85
|
-
# Presumably, there may be a time where you'd like to remove a packet class.
|
86
|
-
def self.remove_packet_class(klass)
|
87
|
-
raise "Need a class" unless klass.kind_of? Class
|
88
|
-
@packet_classes ||= []
|
89
|
-
@packet_classes.delete klass
|
90
|
-
self.clear_packet_groups
|
91
|
-
@packet_classes
|
92
|
-
end
|
93
|
-
|
94
|
-
# Returns an array of packet classes
|
95
|
-
def self.packet_classes
|
96
|
-
@packet_classes || []
|
97
|
-
end
|
98
|
-
|
99
|
-
# Returns an array of packet types by packet prefix.
|
100
|
-
def self.packet_prefixes
|
101
|
-
return [] if @packet_classes.nil?
|
102
|
-
self.reset_packet_groups unless @packet_class_prefixes
|
103
|
-
@packet_class_prefixes
|
104
|
-
end
|
105
|
-
|
106
|
-
def self.packet_classes_by_layer
|
107
|
-
return [] if @packet_classes.nil?
|
108
|
-
self.reset_packet_groups unless @packet_classes_by_layer
|
109
|
-
@packet_classes_by_layer
|
110
|
-
end
|
111
|
-
|
112
|
-
def self.packet_classes_by_layer_without_application
|
113
|
-
return [] if @packet_classes.nil?
|
114
|
-
self.reset_packet_groups unless @packet_classes_by_layer_without_application
|
115
|
-
@packet_classes_by_layer_without_application
|
116
|
-
end
|
117
|
-
|
118
|
-
def self.clear_packet_groups
|
119
|
-
@packet_class_prefixes = nil
|
120
|
-
@packet_classes_by_layer = nil
|
121
|
-
@packet_classes_by_layer_without_application = nil
|
122
|
-
end
|
123
|
-
|
124
|
-
def self.reset_packet_groups
|
125
|
-
@packet_class_prefixes = @packet_classes.map {|p| p.to_s.split("::").last.to_s.downcase.gsub(/packet$/,"")}
|
126
|
-
@packet_classes_by_layer = @packet_classes.sort_by { |pclass| pclass.layer }.reverse
|
127
|
-
@packet_classes_by_layer_without_application = @packet_classes_by_layer.reject { |pclass| pclass.layer_symbol == :application }
|
128
|
-
end
|
129
|
-
|
130
|
-
# The current inspect style. One of :hex, :dissect, or :default
|
131
|
-
# Note that :default means Ruby's default, which is usually
|
132
|
-
# far too long to be useful.
|
133
|
-
def self.inspect_style
|
134
|
-
@inspect_style ||= :dissect
|
135
|
-
end
|
136
|
-
|
137
|
-
# Setter for PacketFu's @inspect_style
|
138
|
-
def self.inspect_style=(arg)
|
139
|
-
@inspect_style = case arg
|
140
|
-
when :hex, :pretty
|
141
|
-
:hex
|
142
|
-
when :dissect, :verbose
|
143
|
-
:dissect
|
144
|
-
when :default, :ugly
|
145
|
-
:default
|
146
|
-
else
|
147
|
-
:dissect
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
# Switches inspect styles in a round-robin fashion between
|
152
|
-
# :dissect, :default, and :hex
|
153
|
-
def toggle_inspect
|
154
|
-
case @inspect_style
|
155
|
-
when :hex, :pretty
|
156
|
-
@inspect_style = :dissect
|
157
|
-
when :dissect, :verbose
|
158
|
-
@inspect_style = :default
|
159
|
-
when :default, :ugly
|
160
|
-
@inspect_style = :hex
|
161
|
-
else
|
162
|
-
@inspect_style = :dissect
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
end
|
168
|
-
|
169
|
-
require File.join(cwd,"packetfu","version")
|
170
|
-
require File.join(cwd,"packetfu","pcap")
|
171
|
-
require File.join(cwd,"packetfu","packet")
|
172
|
-
PacketFu.require_protos(cwd)
|
173
|
-
require File.join(cwd,"packetfu","utils")
|
174
|
-
require File.join(cwd,"packetfu","config")
|
175
|
-
|
176
|
-
# vim: nowrap sw=2 sts=0 ts=2 ff=unix ft=ruby
|
2
|
+
require 'ipaddr'
|
3
|
+
require 'packetfu/common'
|
4
|
+
require 'packetfu/structfu'
|
5
|
+
require 'packetfu/version'
|
6
|
+
require 'packetfu/pcap'
|
7
|
+
require 'packetfu/packet'
|
8
|
+
require 'packetfu/protos'
|
9
|
+
require 'packetfu/utils'
|
10
|
+
require 'packetfu/config'
|
11
|
+
require 'packetfu/pcapng'
|
data/lib/packetfu/capture.rb
CHANGED
@@ -4,7 +4,7 @@ module PacketFu
|
|
4
4
|
# The Capture class is used to construct PcapRub objects in order to collect
|
5
5
|
# packets from an interface.
|
6
6
|
#
|
7
|
-
# This class requires PcapRub. In addition, you will need root (or root-like) privileges
|
7
|
+
# This class requires PcapRub. In addition, you will need root (or root-like) privileges
|
8
8
|
# in order to capture from the interface.
|
9
9
|
#
|
10
10
|
# Note, on some wireless cards, setting :promisc => true will disable capturing.
|
@@ -83,7 +83,7 @@ module PacketFu
|
|
83
83
|
# clear() clears the @stream and @array variables, essentially starting the
|
84
84
|
# capture session over. Valid arguments are:
|
85
85
|
#
|
86
|
-
# :array
|
86
|
+
# :array
|
87
87
|
# If true, the @array is cleared.
|
88
88
|
# :stream
|
89
89
|
# If true, the @stream is cleared.
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'packetfu/structfu'
|
2
|
+
require 'packetfu/packet'
|
3
|
+
|
4
|
+
module PacketFu
|
5
|
+
|
6
|
+
# Deal with Ruby's encoding by ignoring it.
|
7
|
+
def self.force_binary(str)
|
8
|
+
str.force_encoding Encoding::BINARY if str.respond_to? :force_encoding
|
9
|
+
end
|
10
|
+
|
11
|
+
# Sets the expected byte order for a pcap file. See PacketFu::Read.set_byte_order
|
12
|
+
@byte_order = :little
|
13
|
+
|
14
|
+
# Checks if pcaprub is loaded correctly.
|
15
|
+
@pcaprub_loaded = false
|
16
|
+
|
17
|
+
# PacketFu works best with Pcaprub version 0.8-dev (at least)
|
18
|
+
# The current (Aug 01, 2010) pcaprub gem is 0.9, so should be fine.
|
19
|
+
def self.pcaprub_platform_require
|
20
|
+
begin
|
21
|
+
require 'pcaprub'
|
22
|
+
rescue LoadError
|
23
|
+
return false
|
24
|
+
end
|
25
|
+
@pcaprub_loaded = true
|
26
|
+
end
|
27
|
+
|
28
|
+
pcaprub_platform_require
|
29
|
+
|
30
|
+
if @pcaprub_loaded
|
31
|
+
pcaprub_regex = /[0-9]\.([8-9]|[1-7][0-9])(-dev)?/ # Regex for 0.8 and beyond.
|
32
|
+
if Pcap.version !~ pcaprub_regex
|
33
|
+
@pcaprub_loaded = false # Don't bother with broken versions
|
34
|
+
raise LoadError, "PcapRub not at a minimum version of 0.8-dev"
|
35
|
+
end
|
36
|
+
require "packetfu/capture"
|
37
|
+
require "packetfu/inject"
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns the status of pcaprub
|
41
|
+
def self.pcaprub_loaded?
|
42
|
+
@pcaprub_loaded
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns an array of classes defined in PacketFu
|
46
|
+
def self.classes
|
47
|
+
constants.map { |const| const_get(const) if const_get(const).kind_of? Class}.compact
|
48
|
+
end
|
49
|
+
|
50
|
+
# Adds the class to PacketFu's list of packet classes -- used in packet parsing.
|
51
|
+
def self.add_packet_class(klass)
|
52
|
+
raise "Need a class" unless klass.kind_of? Class
|
53
|
+
if klass.name !~ /[A-Za-z0-9]Packet/
|
54
|
+
raise "Packet classes should be named 'ProtoPacket'"
|
55
|
+
end
|
56
|
+
@packet_classes ||= []
|
57
|
+
@packet_classes << klass
|
58
|
+
self.clear_packet_groups
|
59
|
+
@packet_classes.sort_by! { |x| x.name }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Presumably, there may be a time where you'd like to remove a packet class.
|
63
|
+
def self.remove_packet_class(klass)
|
64
|
+
raise "Need a class" unless klass.kind_of? Class
|
65
|
+
@packet_classes ||= []
|
66
|
+
@packet_classes.delete klass
|
67
|
+
self.clear_packet_groups
|
68
|
+
@packet_classes
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns an array of packet classes
|
72
|
+
def self.packet_classes
|
73
|
+
@packet_classes || []
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns an array of packet types by packet prefix.
|
77
|
+
def self.packet_prefixes
|
78
|
+
return [] if @packet_classes.nil?
|
79
|
+
self.reset_packet_groups unless @packet_class_prefixes
|
80
|
+
@packet_class_prefixes
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.packet_classes_by_layer
|
84
|
+
return [] if @packet_classes.nil?
|
85
|
+
self.reset_packet_groups unless @packet_classes_by_layer
|
86
|
+
@packet_classes_by_layer
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.packet_classes_by_layer_without_application
|
90
|
+
return [] if @packet_classes.nil?
|
91
|
+
self.reset_packet_groups unless @packet_classes_by_layer_without_application
|
92
|
+
@packet_classes_by_layer_without_application
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.clear_packet_groups
|
96
|
+
@packet_class_prefixes = nil
|
97
|
+
@packet_classes_by_layer = nil
|
98
|
+
@packet_classes_by_layer_without_application = nil
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.reset_packet_groups
|
102
|
+
@packet_class_prefixes = @packet_classes.map {|p| p.to_s.split("::").last.to_s.downcase.gsub(/packet$/,"")}
|
103
|
+
@packet_classes_by_layer = @packet_classes.sort_by { |pclass| pclass.layer }.reverse
|
104
|
+
@packet_classes_by_layer_without_application = @packet_classes_by_layer.reject { |pclass| pclass.layer_symbol == :application }
|
105
|
+
end
|
106
|
+
|
107
|
+
# The current inspect style. One of :hex, :dissect, or :default
|
108
|
+
# Note that :default means Ruby's default, which is usually
|
109
|
+
# far too long to be useful.
|
110
|
+
def self.inspect_style
|
111
|
+
@inspect_style ||= :dissect
|
112
|
+
end
|
113
|
+
|
114
|
+
# Setter for PacketFu's @inspect_style
|
115
|
+
def self.inspect_style=(arg)
|
116
|
+
@inspect_style = case arg
|
117
|
+
when :hex, :pretty
|
118
|
+
:hex
|
119
|
+
when :dissect, :verbose
|
120
|
+
:dissect
|
121
|
+
when :default, :ugly
|
122
|
+
:default
|
123
|
+
else
|
124
|
+
:dissect
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Switches inspect styles in a round-robin fashion between
|
129
|
+
# :dissect, :default, and :hex
|
130
|
+
def toggle_inspect
|
131
|
+
case @inspect_style
|
132
|
+
when :hex, :pretty
|
133
|
+
@inspect_style = :dissect
|
134
|
+
when :dissect, :verbose
|
135
|
+
@inspect_style = :default
|
136
|
+
when :default, :ugly
|
137
|
+
@inspect_style = :hex
|
138
|
+
else
|
139
|
+
@inspect_style = :dissect
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|