pstream 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1afe70b3724cd8353c6bd17031e138c7dd42b50b
4
- data.tar.gz: 4d3bf554e42032d0cbc2c881cc9fa21aab4bd251
3
+ metadata.gz: db60008303d60fa05efe50c9481ad9218c69f7f2
4
+ data.tar.gz: 7eb962f4c41ee92d12b2ae00d68e783d92ba8954
5
5
  SHA512:
6
- metadata.gz: 08103ae437935a21d93334da06aabc13687c5dfcf3d9d1ff6b426e60311605cdf9a6788063fcee666cf4c7ae5ec8e1b3fd79f1752d00f0987cd7027b2599745c
7
- data.tar.gz: 71803c79752fdb01a8b268eb589017ddc191bf30d88a29ed90ed4a9ac02654f3e4fe47fd8985ae58d3396f1fe0c8e9e2d31f395ce1cbb725a2c18d5da4855817
6
+ metadata.gz: 91c364b4931a5f687ef496e1705101ecad13097aa7c8dc5e490e45cfdee15fac03290034db6ff0992f38399245ff2b08d7a938f521de5e30cfbd05328a581d97
7
+ data.tar.gz: 371ed0e85b84eb5ce2c66c3e0b5a594055c6a08e092146c9fdb75fec6a7e1f83f9c2a4f5c38920aeeb2758c4c74e2d3d2e98de79f395e9cadbf9fa782f8ae9cf
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require "colorize"
4
+ require "io/wait"
3
5
  require "optparse"
4
6
  require "pstream"
5
7
  require "string"
@@ -18,6 +20,7 @@ def parse(args)
18
20
  options["ciphers"] = false
19
21
  options["prot"] = "tcp"
20
22
  options["stream"] = nil
23
+ options["verbose"] = false
21
24
 
22
25
  info = "Analyze pcap files. Can view tcp/udp streams or " \
23
26
  "ciphersuites in use."
@@ -46,6 +49,14 @@ def parse(args)
46
49
  options["prot"] = "udp"
47
50
  end
48
51
 
52
+ opts.on(
53
+ "-v",
54
+ "--verbose",
55
+ "Show backtrace when error occurs"
56
+ ) do
57
+ options["verbose"] = true
58
+ end
59
+
49
60
  opts.on("", info.word_wrap)
50
61
  end
51
62
 
@@ -80,19 +91,45 @@ begin
80
91
  pstream = PStream.new(options["pcap"])
81
92
 
82
93
  if (options["stream"])
83
- case options["prot"]
84
- when "tcp"
85
- puts pstream.tcp_streams[options["stream"]].contents
86
- when "udp"
87
- puts pstream.udp_streams[options["stream"]].contents
88
- end
94
+ puts pstream.get_stream(
95
+ options["stream"].to_i,
96
+ options["prot"]
97
+ ).contents
89
98
  elsif (options["ciphers"])
90
99
  puts pstream.ciphers
91
100
  else
92
- puts pstream.summary
101
+ puts pstream.to_s
93
102
  end
94
103
  rescue PStream::Error => e
95
- puts e.message
104
+ $stderr.puts e.message.red
105
+ if (options["verbose"])
106
+ e.backtrace.each do |line|
107
+ $stderr.puts line.yellow
108
+ end
109
+ end
110
+ exit PStreamExit::EXCEPTION
111
+ rescue Interrupt
112
+ # ^C
113
+ # Exit gracefully
114
+ rescue Errno::EPIPE
115
+ # Do nothing. This can happen if piping to another program such as
116
+ # less. Usually if less is closed before PStream is done with
117
+ # STDOUT.
118
+ rescue Exception => e
119
+ $stderr.puts "Oops! Looks like an error has occured! If the " \
120
+ "error persists, file a bug at:"
121
+ $stderr.puts
122
+ $stderr.puts " https://gitlab.com/mjwhitta/pstream/issues"
123
+ $stderr.puts
124
+ $stderr.puts "Maybe the message below will help. If not, you " \
125
+ "can use the --verbose flag to get a backtrace.".word_wrap
126
+
127
+ $stderr.puts e.message.red
128
+ if (options["verbose"])
129
+ e.backtrace.each do |line|
130
+ $stderr.puts line.yellow
131
+ end
132
+ end
96
133
  exit PStreamExit::EXCEPTION
97
134
  end
98
135
  exit PStreamExit::GOOD
@@ -2,24 +2,56 @@ require "pathname"
2
2
  require "scoobydoo"
3
3
 
4
4
  class PStream
5
- attr_accessor :tcp_streams
6
- attr_accessor :udp_streams
5
+ attr_reader :tcp_streams
6
+ attr_reader :udp_streams
7
7
 
8
8
  def ciphers
9
9
  # List ciphers during ssl handshake
10
10
  out = %x(
11
- tshark -r #{@pcap} -Y ssl.handshake.ciphersuite -V | \
12
- \grep -E "Internet Protocol|Hostname:|Cipher Suite"
11
+ tshark -r #{@pcap} -Y ssl.handshake.ciphersuite -V 2>&1 \
12
+ | \grep -E "Internet Protocol|Hostname:|Cipher Suite"
13
13
  )
14
14
  return out
15
15
  end
16
16
 
17
+ def get_stream(stream, prot = "tcp")
18
+ case prot
19
+ when "tcp"
20
+ if (@tcp_streams.empty? && !@udp_streams.empty?)
21
+ return get_stream(stream, "udp")
22
+ end
23
+ if (stream >= @tcp_streams.length)
24
+ raise PStream::Error::StreamNotFound.new(stream, prot)
25
+ else
26
+ return @tcp_streams[stream]
27
+ end
28
+ when "udp"
29
+ if (@udp_streams.empty? && !@tcp_streams.empty?)
30
+ return get_stream(stream, "udp")
31
+ end
32
+ if (stream >= @udp_streams.length)
33
+ raise PStream::Error::StreamNotFound.new(stream, prot)
34
+ else
35
+ return @udp_streams[stream]
36
+ end
37
+ else
38
+ raise PStream::Error::ProtocolNotSupported.new(prot)
39
+ end
40
+ end
41
+
17
42
  def get_streams(prot)
43
+ case prot
44
+ when "tcp", "udp"
45
+ # Do nothing
46
+ else
47
+ raise PStream::Error::ProtocolNotSupported.new(prot)
48
+ end
49
+
18
50
  streams = Array.new
19
51
 
20
52
  out = %x(
21
- tshark -r #{@pcap} -z conv,#{prot} | \grep -E "<->" | \
22
- awk '{print $1, $2, $3, "|", $8, "Frames"}'
53
+ tshark -r #{@pcap} -z conv,#{prot} 2>&1 | \grep -E "<->" \
54
+ | awk '{print $1, $2, $3, "|", $8, "Frames"}'
23
55
  )
24
56
 
25
57
  count = 0
@@ -54,6 +86,16 @@ class PStream
54
86
  @udp_streams = get_streams("udp")
55
87
  end
56
88
 
89
+ def negotiated_ciphers
90
+ f = "ssl.handshake.ciphersuite && ssl.handshake.type == 2"
91
+ out = %x(
92
+ tshark -r #{@pcap} -Y "#{f}" -V 2>&1 | \
93
+ \grep -E "Cipher Suite:" | \
94
+ sed -r "s|^ +Cipher Suite: ||g" | sort -u
95
+ )
96
+ return out.split("\n")
97
+ end
98
+
57
99
  def summary
58
100
  ret = Array.new
59
101
 
@@ -77,16 +119,11 @@ class PStream
77
119
 
78
120
  # List ciphers that were actually selected
79
121
  ret.push("Ciphers in use:")
80
- f = "ssl.handshake.ciphersuite && ssl.handshake.type == 2"
81
- out = %x(
82
- tshark -r #{@pcap} -Y "#{f}" -V | \
83
- \grep -E "Cipher Suite:" | \
84
- sed -r "s|^ +Cipher Suite: ||g" | sort -u
85
- )
86
- ret.concat(out.split("\n"))
122
+ ret.concat(negotiated_ciphers)
87
123
 
88
124
  return ret.join("\n")
89
125
  end
126
+ private :summary
90
127
 
91
128
  def to_s
92
129
  return summary
@@ -3,4 +3,6 @@ end
3
3
 
4
4
  require "pstream/error/pcap_not_found"
5
5
  require "pstream/error/pcap_not_readable"
6
+ require "pstream/error/protocol_not_supported"
7
+ require "pstream/error/stream_not_found"
6
8
  require "pstream/error/tshark_not_found"
@@ -0,0 +1,5 @@
1
+ class PStream::Error::ProtocolNotSupported < PStream::Error
2
+ def initialize(prot)
3
+ super("Protocol #{prot} not supported")
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class PStream::Error::StreamNotFound < PStream::Error
2
+ def initialize(stream, prot = "tcp")
3
+ super("Protocol #{prot} does not have stream #{stream}")
4
+ end
5
+ end
@@ -1,7 +1,7 @@
1
1
  class PStream::Stream
2
- attr_accessor :desc
3
- attr_accessor :frames
4
- attr_accessor :id
2
+ attr_reader :desc
3
+ attr_reader :frames
4
+ attr_reader :id
5
5
 
6
6
  def contents
7
7
  out = %x(
@@ -19,7 +19,7 @@ class PStream::Stream
19
19
  @prot = prot
20
20
  end
21
21
 
22
- def to_s()
22
+ def to_s
23
23
  return contents
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pstream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Whittaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-18 00:00:00.000000000 Z
11
+ date: 2016-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.7.7
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.7'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.7.7
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: scoobydoo
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -42,6 +62,8 @@ files:
42
62
  - lib/pstream/error.rb
43
63
  - lib/pstream/error/pcap_not_found.rb
44
64
  - lib/pstream/error/pcap_not_readable.rb
65
+ - lib/pstream/error/protocol_not_supported.rb
66
+ - lib/pstream/error/stream_not_found.rb
45
67
  - lib/pstream/error/tshark_not_found.rb
46
68
  - lib/pstream/stream.rb
47
69
  - lib/string.rb