packetfu 1.1.11 → 1.1.12.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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,45 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
module PacketFu
|
4
|
+
module PcapNG
|
5
|
+
|
6
|
+
# Hash containing attended structure for each test file.
|
7
|
+
# Hash's values are arrays. Each element of these arrays are a section in
|
8
|
+
# pcapng file. A section is described as a hash which keys are block types
|
9
|
+
# and values number of each type in a section.
|
10
|
+
PCAPNG_TEST_FILES = {
|
11
|
+
"basic/test001.pcapng"=>[{:idb=>1, :epb=>4, :spb=>0, :unknown=>0}],
|
12
|
+
"basic/test002.pcapng"=>[{:idb=>0, :epb=>0, :spb=>0, :unknown=>0}],
|
13
|
+
"basic/test003.pcapng"=>[{:idb=>1, :epb=>0, :spb=>0, :unknown=>0}],
|
14
|
+
"basic/test004.pcapng"=>[{:idb=>2, :epb=>4, :spb=>0, :unknown=>0}],
|
15
|
+
"basic/test005.pcapng"=>[{:idb=>2, :epb=>4, :spb=>0, :unknown=>0}],
|
16
|
+
"basic/test006.pcapng"=>[{:idb=>2, :epb=>5, :spb=>0, :unknown=>0}],
|
17
|
+
"basic/test007.pcapng"=>[{:idb=>1, :epb=>1, :spb=>0, :unknown=>0}],
|
18
|
+
"basic/test008.pcapng"=>[{:idb=>2, :epb=>4, :spb=>0, :unknown=>0}],
|
19
|
+
"basic/test009.pcapng"=>[{:idb=>1, :epb=>2, :spb=>0, :unknown=>0}],
|
20
|
+
"basic/test010.pcapng"=>[{:idb=>1, :epb=>0, :spb=>4, :unknown=>0}],
|
21
|
+
"basic/test011.pcapng"=>[{:idb=>1, :epb=>2, :spb=>2, :unknown=>0}],
|
22
|
+
"basic/test012.pcapng"=>[{:idb=>1, :epb=>2, :spb=>2, :unknown=>0}],
|
23
|
+
"basic/test013.pcapng"=>[{:idb=>1, :epb=>0, :spb=>0, :unknown=>1}],
|
24
|
+
"basic/test014.pcapng"=>[{:idb=>3, :epb=>0, :spb=>0, :unknown=>3}],
|
25
|
+
"basic/test015.pcapng"=>[{:idb=>1, :epb=>0, :spb=>0, :unknown=>1}],
|
26
|
+
"basic/test016.pcapng"=>[{:idb=>1, :epb=>2, :spb=>2, :unknown=>3}],
|
27
|
+
"basic/test017.pcapng"=>[{:idb=>0, :epb=>0, :spb=>0, :unknown=>4}],
|
28
|
+
"basic/test018.pcapng"=>[{:idb=>1, :epb=>2, :spb=>2, :unknown=>4}],
|
29
|
+
"advanced/test100.pcapng"=>[{:idb=>3, :epb=>3, :spb=>2, :unknown=>5}],
|
30
|
+
"advanced/test101.pcapng"=>[{:idb=>3, :epb=>3, :spb=>1, :unknown=>6}],
|
31
|
+
"advanced/test102.pcapng"=>[{:idb=>3, :epb=>4, :spb=>1, :unknown=>12}],
|
32
|
+
"difficult/test200.pcapng"=>[{:idb=>1, :epb=>0, :spb=>0, :unknown=>0},
|
33
|
+
{:idb=>1, :epb=>0, :spb=>0, :unknown=>0},
|
34
|
+
{:idb=>1, :epb=>0, :spb=>0, :unknown=>0}],
|
35
|
+
"difficult/test201.pcapng"=>[{:idb=>2, :epb=>1, :spb=>0, :unknown=>1},
|
36
|
+
{:idb=>1, :epb=>1, :spb=>1, :unknown=>1},
|
37
|
+
{:idb=>2, :epb=>1, :spb=>0, :unknown=>2}],
|
38
|
+
"difficult/test202.pcapng"=>[{:idb=>2, :epb=>3, :spb=>0, :unknown=>4},
|
39
|
+
{:idb=>1, :epb=>2, :spb=>2, :unknown=>4},
|
40
|
+
{:idb=>2, :epb=>1, :spb=>0, :unknown=>4}]
|
41
|
+
}
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'packetfu'
|
4
|
+
|
5
|
+
module PacketFu
|
6
|
+
module PcapNG
|
7
|
+
describe IDB do
|
8
|
+
before(:each) { @idb = IDB.new }
|
9
|
+
|
10
|
+
it 'should have correct initialization values' do
|
11
|
+
expect(@idb).to be_a(IDB)
|
12
|
+
expect(@idb.endian).to eq(:little)
|
13
|
+
expect(@idb.type.to_i).to eq(PcapNG::IDB_TYPE.to_i)
|
14
|
+
expect(@idb.link_type.to_i).to eq(PcapNG::LINKTYPE_ETHERNET)
|
15
|
+
expect(@idb.snaplen.to_i).to eq(0)
|
16
|
+
expect(@idb.block_len.to_i).to eq(IDB::MIN_SIZE)
|
17
|
+
expect(@idb.block_len2).to eq(@idb.block_len)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should decode tsresol on demand from its options' do
|
21
|
+
@idb.options.read [9, 1, 4].pack('vvC')
|
22
|
+
expect(@idb.ts_resol).to eq(1E-4)
|
23
|
+
|
24
|
+
@idb.options.read [9, 1, 0x83].pack('vvC')
|
25
|
+
expect(@idb.ts_resol(true)).to eq(2**-3)
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when reading' do
|
29
|
+
it 'should accept a String' do
|
30
|
+
str = ::File.read(::File.join(__dir__, '../..', 'test', 'sample.pcapng'))[52, 32]
|
31
|
+
expect { @idb.read(str) }.to_not raise_error
|
32
|
+
expect(@idb.type.to_i).to eq(PcapNG::IDB_TYPE.to_i)
|
33
|
+
expect(@idb.block_len.to_i).to eq(32)
|
34
|
+
expect(@idb.link_type.to_i).to eq(PcapNG::LINKTYPE_ETHERNET)
|
35
|
+
expect(@idb.snaplen.to_i).to eq(0xffff)
|
36
|
+
expect(@idb.has_options?).to be(true)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should accept an IO' do
|
40
|
+
::File.open(::File.join(__dir__, '../..', 'test', 'sample.pcapng')) do |f|
|
41
|
+
f.seek(52, :CUR)
|
42
|
+
@idb.read f
|
43
|
+
end
|
44
|
+
expect(@idb.type.to_i).to eq(PcapNG::IDB_TYPE.to_i)
|
45
|
+
expect(@idb.block_len.to_i).to eq(32)
|
46
|
+
expect(@idb.link_type.to_i).to eq(PcapNG::LINKTYPE_ETHERNET)
|
47
|
+
expect(@idb.snaplen.to_i).to eq(0xffff)
|
48
|
+
expect(@idb.has_options?).to be(true)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'packetfu'
|
4
|
+
|
5
|
+
module PacketFu
|
6
|
+
module PcapNG
|
7
|
+
describe SHB do
|
8
|
+
before(:each) { @shb = SHB.new }
|
9
|
+
|
10
|
+
it 'should have correct initialization values' do
|
11
|
+
expect(@shb).to be_a(SHB)
|
12
|
+
expect(@shb.endian).to eq(:little)
|
13
|
+
expect(@shb.type.to_i).to eq(PcapNG::SHB_TYPE.to_i)
|
14
|
+
expect(@shb.block_len.to_i).to eq(SHB::MIN_SIZE)
|
15
|
+
expect(@shb.magic.to_s).to eq(SHB::MAGIC_LITTLE)
|
16
|
+
expect(@shb.ver_major.to_i).to eq(1)
|
17
|
+
expect(@shb.ver_minor.to_i).to eq(0)
|
18
|
+
expect(@shb.section_len.to_i).to eq(0xffffffff_ffffffff)
|
19
|
+
expect(@shb.block_len2).to eq(@shb.block_len)
|
20
|
+
expect(@shb.interfaces).to eq([])
|
21
|
+
expect(@shb.unknown_blocks).to eq([])
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when reading' do
|
25
|
+
it 'should accept a String' do
|
26
|
+
str = ::File.read(::File.join(__dir__, '../..', 'test', 'sample.pcapng'), 52)
|
27
|
+
expect { @shb.read(str) }.to_not raise_error
|
28
|
+
expect(@shb.block_len.to_i).to eq(52)
|
29
|
+
expect(@shb.has_options?).to be(true)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should accept an IO' do
|
33
|
+
::File.open(::File.join(__dir__, '../..', 'test', 'sample.pcapng')) do |f|
|
34
|
+
@shb.read(f)
|
35
|
+
end
|
36
|
+
expect(@shb.block_len.to_i).to eq(52)
|
37
|
+
expect(@shb.has_options?).to be(true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'packetfu'
|
4
|
+
|
5
|
+
module PacketFu
|
6
|
+
module PcapNG
|
7
|
+
describe SPB do
|
8
|
+
before(:each) { @spb = SPB.new }
|
9
|
+
|
10
|
+
it 'should have correct initialization values' do
|
11
|
+
expect(@spb).to be_a(SPB)
|
12
|
+
expect(@spb.endian).to eq(:little)
|
13
|
+
expect(@spb.type.to_i).to eq(PcapNG::SPB_TYPE.to_i)
|
14
|
+
expect(@spb.orig_len.to_i).to eq(0)
|
15
|
+
expect(@spb.block_len.to_i).to eq(SPB::MIN_SIZE)
|
16
|
+
expect(@spb.block_len2).to eq(@spb.block_len)
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when reading' do
|
20
|
+
it 'should accept a String' do
|
21
|
+
str = ::File.read(::File.join(__dir__, '../..', 'test',
|
22
|
+
'sample-spb.pcapng'))[128, 0x14c]
|
23
|
+
expect { @spb.read str }.to_not raise_error
|
24
|
+
expect(@spb.type.to_i).to eq(PcapNG::SPB_TYPE.to_i)
|
25
|
+
expect(@spb.block_len.to_i).to eq(0x14c)
|
26
|
+
expect(@spb.orig_len.to_i).to eq(0x13a)
|
27
|
+
expect(@spb.data.size).to eq(0x13a)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should accept an IO' do
|
31
|
+
::File.open(::File.join(__dir__, '../..', 'test', 'sample-spb.pcapng')) do |f|
|
32
|
+
f.seek(128, :CUR)
|
33
|
+
@spb.read f
|
34
|
+
end
|
35
|
+
expect(@spb.type.to_i).to eq(PcapNG::SPB_TYPE.to_i)
|
36
|
+
expect(@spb.block_len.to_i).to eq(0x14c)
|
37
|
+
expect(@spb.orig_len.to_i).to eq(0x13a)
|
38
|
+
expect(@spb.data.size).to eq(0x13a)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'packetfu'
|
4
|
+
|
5
|
+
module PacketFu
|
6
|
+
module PcapNG
|
7
|
+
describe UnknownBlock do
|
8
|
+
before(:each) { @ub = UnknownBlock.new }
|
9
|
+
|
10
|
+
it 'should have correct initialization values' do
|
11
|
+
expect(@ub).to be_a(UnknownBlock)
|
12
|
+
expect(@ub.endian).to eq(:little)
|
13
|
+
expect(@ub.type.to_i).to eq(0)
|
14
|
+
expect(@ub.block_len.to_i).to eq(UnknownBlock::MIN_SIZE)
|
15
|
+
expect(@ub.block_len2).to eq(@ub.block_len)
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when reading' do
|
19
|
+
it 'should accept a String' do
|
20
|
+
str = "\xff\xff\xff\xff\x0c\x00\x00\x00\x0c\x00\x00\x00"
|
21
|
+
expect { @ub.read(str) }.to_not raise_error
|
22
|
+
expect(@ub.type.to_i).to eq(0xffffffff)
|
23
|
+
expect(@ub.block_len.to_i).to eq(12)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should accept an IO' do
|
27
|
+
::File.open(::File.join(__dir__, '../..', 'test', 'sample.pcapng')) do |f|
|
28
|
+
@ub.read(f)
|
29
|
+
end
|
30
|
+
expect(@ub.type.to_i).to eq(0x0a0d0d0a)
|
31
|
+
expect(@ub.block_len.to_i).to eq(52)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'packetfu'
|
1
|
+
require 'coveralls'
|
2
|
+
Coveralls.wear!
|
4
3
|
|
5
4
|
puts "rspec #{RSpec::Core::Version::STRING}"
|
6
5
|
if RSpec::Core::Version::STRING[0] == '3'
|
@@ -13,32 +12,5 @@ if RSpec::Core::Version::STRING[0] == '3'
|
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
15
|
+
require 'packetfu/common'
|
16
16
|
|
17
|
-
module FakePacket
|
18
|
-
def layer
|
19
|
-
7
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
class PacketFu::FooPacket < PacketFu::Packet
|
24
|
-
extend FakePacket
|
25
|
-
end
|
26
|
-
|
27
|
-
class PacketFu::BarPacket < PacketFu::Packet
|
28
|
-
extend FakePacket
|
29
|
-
end
|
30
|
-
|
31
|
-
class PacketBaz
|
32
|
-
end
|
33
|
-
|
34
|
-
def add_fake_packets
|
35
|
-
PacketFu.add_packet_class(PacketFu::FooPacket)
|
36
|
-
PacketFu.add_packet_class(PacketFu::BarPacket)
|
37
|
-
end
|
38
|
-
|
39
|
-
def remove_fake_packets
|
40
|
-
PacketFu.remove_packet_class(PacketFu::FooPacket)
|
41
|
-
PacketFu.remove_packet_class(PacketFu::BarPacket)
|
42
|
-
end
|
43
|
-
|
44
|
-
remove_fake_packets
|
data/spec/tcp_spec.rb
CHANGED
data/spec/udp_spec.rb
CHANGED
@@ -1,18 +1,130 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'packetfu/protos/eth'
|
3
|
+
require 'packetfu/protos/ip'
|
4
|
+
require 'packetfu/protos/ipv6'
|
5
|
+
require 'packetfu/protos/udp'
|
6
|
+
require 'packetfu/pcap'
|
2
7
|
|
3
8
|
include PacketFu
|
4
9
|
|
10
|
+
class String
|
11
|
+
def bin
|
12
|
+
self.scan(/../).map {|x| x.to_i(16).chr}.join
|
13
|
+
end
|
14
|
+
end
|
5
15
|
|
6
16
|
describe UDPPacket do
|
7
17
|
|
8
|
-
context
|
18
|
+
context 'when read from a pcap file' do
|
19
|
+
context '(UDP over IPv4)' do
|
20
|
+
before(:all) do
|
21
|
+
@udp4_packet = PcapFile.read_packets(File.join(File.dirname(__FILE__),
|
22
|
+
"ipv4_udp.pcap")).first
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should be recognized as a UDP packet' do
|
26
|
+
expect(@udp4_packet.is_udp?).to be(true)
|
27
|
+
expect(@udp4_packet.ipv6?).to be(false)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should have the right port numbers' do
|
31
|
+
expect(@udp4_packet.udp_src).to eq(41000)
|
32
|
+
expect(@udp4_packet.udp_dst).to eq(42000)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should have the right length' do
|
36
|
+
expect(@udp4_packet.udp_len).to eq(24)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should have the right checksum' do
|
40
|
+
expect(@udp4_packet.udp_sum).to eq(0xbd81)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context '(UDP over IPv6)' do
|
45
|
+
before(:all) do
|
46
|
+
@udp6_packet = PcapFile.read_packets(File.join(File.dirname(__FILE__),
|
47
|
+
"ipv6_udp.pcap")).first
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should be recognized as a UDP packet' do
|
51
|
+
expect(@udp6_packet.is_udp?).to be(true)
|
52
|
+
expect(@udp6_packet.ipv6?).to be(true)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should have the right port numbers' do
|
56
|
+
expect(@udp6_packet.udp_src).to eq(6809)
|
57
|
+
expect(@udp6_packet.udp_dst).to eq(6810)
|
58
|
+
end
|
9
59
|
|
60
|
+
it 'should have the right length' do
|
61
|
+
expect(@udp6_packet.udp_len).to eq(12)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should have the right checksum' do
|
65
|
+
expect(@udp6_packet.udp_sum).to eq(0xb9be)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'UDP over IPv4 v2' do
|
70
|
+
it "should have all the UDP attributes" do
|
71
|
+
udp_packet = PcapFile.new.file_to_array(:f => 'test/sample.pcap')[0]
|
72
|
+
udp_pkt = Packet.parse(udp_packet)
|
73
|
+
expect(udp_pkt).to be_kind_of(UDPPacket)
|
74
|
+
expect(udp_pkt.udp_sum.to_i).to eql(0x8bf8)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'UDP over IPv4 alter' do
|
79
|
+
it "should read and allow us to alert the payload" do
|
80
|
+
udp_packet = PcapFile.new.file_to_array(:f => 'test/sample.pcap')[0]
|
81
|
+
udp_pkt = Packet.parse(udp_packet)
|
82
|
+
expect(udp_pkt).to be_kind_of(UDPPacket)
|
83
|
+
|
84
|
+
udp_pkt.payload = udp_pkt.payload.gsub(/metasploit/,"MeatPistol")
|
85
|
+
udp_pkt.recalc
|
86
|
+
expect(udp_pkt.udp_sum).to eql(0x8341)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "when initializing UDPHeader from scratch" do
|
92
|
+
before(:each) { @udp_header = UDPHeader.new }
|
93
|
+
it 'should have the right instance variables' do
|
94
|
+
expect(@udp_header).to be_kind_of(UDPHeader)
|
95
|
+
expect(@udp_header.to_s.size).to eql(8)
|
96
|
+
expect(@udp_header.to_s).to eql("\x00\x00\x00\x00\x00\b\x00\x00")
|
97
|
+
expect(@udp_header.udp_src).to eq(0)
|
98
|
+
expect(@udp_header.udp_dst).to eq(0)
|
99
|
+
expect(@udp_header.udp_len).to eq(8)
|
100
|
+
expect(@udp_header.udp_sum).to eq(0)
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should allow setting of port numbers' do
|
104
|
+
@udp_header.udp_src = 1024
|
105
|
+
@udp_header.udp_dst = 1025
|
106
|
+
expect(@udp_header.udp_src).to eq(1024)
|
107
|
+
expect(@udp_header.udp_dst).to eq(1025)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "when initializing UDPPacket from scratch" do
|
10
112
|
it "should create UDP on IPv4 packets by default" do
|
11
113
|
udp = UDPPacket.new
|
12
114
|
expect(udp.ip_header).to be_a(IPHeader)
|
13
115
|
expect(udp.ipv6_header).to be_nil
|
14
116
|
end
|
15
117
|
|
118
|
+
it "should allow re-reading" do
|
119
|
+
udp_packet = PacketFu::UDPPacket.new
|
120
|
+
udp_packet2 = Packet.parse(udp_packet.to_s)
|
121
|
+
|
122
|
+
expect(udp_packet).to be_kind_of(UDPPacket)
|
123
|
+
expect(udp_packet2).to be_kind_of(UDPPacket)
|
124
|
+
expect(udp_packet.is_udp?).to be(true)
|
125
|
+
expect(udp_packet2.is_udp?).to be(true)
|
126
|
+
end
|
127
|
+
|
16
128
|
it "should create UDP on IPv6 packets" do
|
17
129
|
udp = UDPPacket.new(:on_ipv6 => true)
|
18
130
|
expect(udp.ip_header).to be_nil
|
@@ -28,5 +140,41 @@ describe UDPPacket do
|
|
28
140
|
expect(udp.udp_len).to eq(24)
|
29
141
|
end
|
30
142
|
|
143
|
+
it 'should support peek functionnality (IPv4 case)' do
|
144
|
+
udp = UDPPacket.new
|
145
|
+
udp.ip_saddr = '192.168.1.1'
|
146
|
+
udp.ip_daddr = '192.168.1.254'
|
147
|
+
udp.udp_src = 32756
|
148
|
+
udp.udp_dst = 80
|
149
|
+
udp.payload = 'abcdefghijklmnopqrstuvwxyz'
|
150
|
+
udp.recalc
|
151
|
+
expect(udp.peek).to match(/U 68\s+192.168.1.1:32756\s+->\s+192.168.1.254:80/)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should support peek functionnality (IPv6 case)' do
|
155
|
+
udp = UDPPacket.new(:on_ipv6 => true)
|
156
|
+
udp.ipv6_saddr = '2000::1'
|
157
|
+
udp.ipv6_daddr = '2001::1'
|
158
|
+
udp.udp_src = 32756
|
159
|
+
udp.udp_dst = 80
|
160
|
+
udp.payload = 'abcdefghijklmnopqrstuvwxyz'
|
161
|
+
udp.recalc
|
162
|
+
expect(udp.peek).to match(/6U 88\s+2000::1:32756\s+->\s+2001::1:80/)
|
163
|
+
end
|
31
164
|
end
|
165
|
+
|
166
|
+
context "when reading UDPPacket from string" do
|
167
|
+
it "should create UDPPacket and strip extra bytes" do
|
168
|
+
str = "01005e7ffffa100ba9eb63400800450000a12d7c0000011159b446a5fb7ceffffffacdf3076c008d516e4d2d534541524348202a20485454502f312e310d0a486f73743a3233392e3235352e3235352e3235303a313930300d0a53543a75726e3a736368656d61732d75706e702d6f72673a6465766963653a496e7465726e6574476174657761794465766963653a310d0a4d616e3a22737364703a646973636f766572220d0a4d583a330d0a0d0a".bin
|
169
|
+
str << "0102".bin # Tacking on a couple extra bytes tht we'll strip off.
|
170
|
+
not_stripped = UDPPacket.new
|
171
|
+
not_stripped.read(str)
|
172
|
+
expect(not_stripped.udp_header.body.length).to eql(135)
|
173
|
+
|
174
|
+
stripped = UDPPacket.new
|
175
|
+
stripped.read(str, :strip => true)
|
176
|
+
expect(stripped.udp_header.body.length).to eql(133)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
32
180
|
end
|