ruby-nmap 0.8.0 → 0.9.0

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: 388a408deac159e18f406b2a17c657ba3b775940
4
- data.tar.gz: 0e532295c98b5e0b3e1e627b11d1891c3d25dac3
3
+ metadata.gz: 7a11debc4eeccebd368b11d1d0444dd142f3dc91
4
+ data.tar.gz: fa232e147c7cd46e96bd8a15468f6af5b4ff1723
5
5
  SHA512:
6
- metadata.gz: 5c6f4a3931390deb37c27a64358055e04abd6e4f250f2c3379b9085f7885bf714006e43a2ca2bf73c44156f8057a41fc3f17d345663f7f49537f2462e0479c21
7
- data.tar.gz: b3e882efab065007b1d7370106ac39f3472114cec80716e37017056f49288b008bed3f4f6cf7db05a8c31f0c0780ccf48aaa3f789f14326b48c271b8d2b00f26
6
+ metadata.gz: 62a04a0bde27b4ae0f9aa015cfa668ca9efe08d596f710c2b01816c9bf6bc333a5f098afb40287f8f918546286ee9414c166624343b9e1ad994009b48b299bec
7
+ data.tar.gz: be13fe698e9c8197a6877cdcdd6193118326a683ee52b4e23c3f421ce48594faa333da8ead0cfa466ace383cb08d3433374ea28349e117ded444513b79699baa
@@ -1,13 +1,14 @@
1
1
  language: ruby
2
2
  before_install:
3
- - sudo apt-get install libxml2-dev libxslt1-dev nmap
3
+ - sudo apt-get install libxml2-dev libxslt1-dev
4
4
  rvm:
5
- - 1.9.3
6
- - 2.0.0
7
- - jruby-19mode
8
- - rbx-19mode
5
+ - 2.1.9
6
+ - 2.2.4
7
+ - 2.3.1
8
+ - jruby
9
+ - rbx
9
10
  matrix:
10
11
  allow_failures:
11
- - rvm: jruby-19mode
12
- - rvm: rbx-19mode
12
+ - rvm: jruby
13
+ - rvm: rbx
13
14
  script: rake test
@@ -1,3 +1,21 @@
1
+ ### 0.9.0 / 2016-07-14
2
+
3
+ * Added {Nmap::Address#vendor}.
4
+ * Added {Nmap::Service#to_s}.
5
+ * Added {Nmap::HostScript}.
6
+ * Added {Nmap::Prescript}.
7
+ * Added {Nmap::Postscript}.
8
+ * Added {Nmap::XML#prescript}.
9
+ * Added {Nmap::XML#postscript}.
10
+ * Added `Nmap::Task#quiet` (aka `-v0`).
11
+ * `#script_data` methods can now parse arbitrarily nested Arrays/Hashes.
12
+ * Fixed {Nmap::CPE#each_cpe} to only match child `cpe` elements, not all
13
+ `cpe` elements within the document.
14
+ * Changed {Nmap::Service#to_s} to output product/version only if both are
15
+ present.
16
+ * Changed `Nmap::Task#skip_discovery` to use `-Pn` instead of `-PN`, which was
17
+ deprecated in nmap >= 7.00.
18
+
1
19
  ### 0.8.0 / 2014-04-16
2
20
 
3
21
  * Added {Nmap::XML#each_down_host}.
@@ -94,7 +112,7 @@
94
112
  ### 0.3.0 / 2010-11-08
95
113
 
96
114
  * Added {Nmap::Host#scripts}.
97
- * Added {Nmap::Port#scripts}.
115
+ * Added {Nmap::Scripts#scripts Nmap::Port#scripts}.
98
116
 
99
117
  ### 0.2.0 / 2010-10-29
100
118
 
data/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
  * [Issues](https://github.com/sophsec/ruby-nmap/issues)
5
5
  * [Documentation](http://rubydoc.info/gems/ruby-nmap/frames)
6
6
  * [Email](mailto:postmodern.mod3 at gmail.com)
7
+ * [![Build Status](https://travis-ci.org/sophsec/ruby-nmap.svg)](https://travis-ci.org/sophsec/ruby-nmap)
7
8
 
8
9
  ## Description
9
10
 
@@ -71,6 +72,7 @@ Print NSE script output from an XML scan file:
71
72
 
72
73
  ## Requirements
73
74
 
75
+ * [ruby] >= 2.0.0
74
76
  * [nmap] >= 5.00
75
77
  * [nokogiri] ~> 1.3
76
78
  * [rprogram] ~> 0.3
@@ -86,5 +88,6 @@ Copyright (c) 2009-2014 Postmodern
86
88
  See {file:LICENSE.txt} for license information.
87
89
 
88
90
  [nmap]: http://www.insecure.org/
91
+ [ruby]: https://www.ruby-lang.org/
89
92
  [nokogiri]: http://nokogiri.rubyforge.org/
90
93
  [rprogram]: https://github.com/postmodern/rprogram#readme
data/Rakefile CHANGED
@@ -32,5 +32,5 @@ task :doc => :yard
32
32
 
33
33
  file 'spec/scan.xml' do
34
34
  puts ">>> Scanning scanme.nmap.org ..."
35
- sh 'sudo nmap -v -sS -sU -A -O -oX spec/scan.xml scanme.nmap.org'
35
+ sh 'sudo nmap -v -sS -sU -A -O --script ssh2-enum-algos,ssh-hostkey -oX spec/scan.xml scanme.nmap.org'
36
36
  end
@@ -10,6 +10,8 @@ email: postmodern.mod3@gmail.com
10
10
  homepage: https://github.com/sophsec/ruby-nmap#readme
11
11
  has_yard: true
12
12
 
13
+ required_ruby_version: ">= 2.0.0"
14
+
13
15
  requirements: nmap >= 5.00
14
16
 
15
17
  dependencies:
@@ -2,7 +2,23 @@ module Nmap
2
2
  #
3
3
  # Represents an IP or MAC address and Vendor name.
4
4
  #
5
- class Address < Struct.new(:type, :addr)
5
+ class Address < Struct.new(:type, :addr, :vendor)
6
+
7
+ #
8
+ # Initializes the address.
9
+ #
10
+ # @param [Symbol] type
11
+ # The type of address.
12
+ #
13
+ # @param [String] addr
14
+ # The address.
15
+ #
16
+ # @param [String, nil] vendor
17
+ # The optional vendor.
18
+ #
19
+ def initialize(type,addr,vendor=nil)
20
+ super(type,addr,vendor)
21
+ end
6
22
 
7
23
  #
8
24
  # Converts the address to a String.
@@ -1,2 +1,45 @@
1
1
  require 'nmap/cpe/url'
2
- require 'nmap/cpe/cpe'
2
+
3
+ module Nmap
4
+ #
5
+ # Mixins that adds methods for parsing [Common Platform Enumeration
6
+ # (CPE)][CPE] information.
7
+ #
8
+ # [CPE]: http://nmap.org/book/output-formats-cpe.html
9
+ #
10
+ # @since 0.7.0
11
+ #
12
+ module CPE
13
+ #
14
+ # Parses each Common Platform Enumeration (CPE) String.
15
+ #
16
+ # @yield [cpe]
17
+ # Passes each CPE URL to the given block.
18
+ #
19
+ # @yieldparam [URL] cpe
20
+ # The CPE URL.
21
+ #
22
+ # @return [Enumerator]
23
+ # If no block is given, an enumerator object will be returned.
24
+ #
25
+ def each_cpe
26
+ return enum_for(__method__) unless block_given?
27
+
28
+ @node.xpath('cpe').each do |cpe|
29
+ yield URL.parse(cpe.inner_text)
30
+ end
31
+
32
+ return self
33
+ end
34
+
35
+ #
36
+ # Parses each Common Platform Enumeration (CPE) String.
37
+ #
38
+ # @return [Array<URL>]
39
+ # The CPE URLs.
40
+ #
41
+ def cpe
42
+ each_cpe.to_a
43
+ end
44
+ end
45
+ end
@@ -8,6 +8,7 @@ require 'nmap/tcp_sequence'
8
8
  require 'nmap/tcp_ts_sequence'
9
9
  require 'nmap/uptime'
10
10
  require 'nmap/traceroute'
11
+ require 'nmap/host_script'
11
12
 
12
13
  require 'nokogiri'
13
14
  require 'time'
@@ -92,7 +93,8 @@ module Nmap
92
93
  @node.xpath("address[@addr]").each do |addr|
93
94
  address = Address.new(
94
95
  addr['addrtype'].to_sym,
95
- addr['addr']
96
+ addr['addr'],
97
+ addr['vendor']
96
98
  )
97
99
 
98
100
  yield address
@@ -132,8 +134,8 @@ module Nmap
132
134
  # @since 0.8.0
133
135
  #
134
136
  def vendor
135
- @vendor ||= if (vendor = @node.at("address[@vendor]"))
136
- vendor['vendor']
137
+ @vendor ||= if (vendor = @node.at("address/@vendor"))
138
+ vendor.inner_text
137
139
  end
138
140
  end
139
141
 
@@ -511,16 +513,28 @@ module Nmap
511
513
  #
512
514
  # @since 0.3.0
513
515
  #
516
+ # @deprecated Use {#host_script} instead.
517
+ #
514
518
  def scripts
515
- unless @scripts
516
- @scripts = {}
517
-
518
- @node.xpath('hostscript/script').each do |script|
519
- @scripts[script['id']] = script['output']
520
- end
519
+ if host_script
520
+ host_script.scripts
521
+ else
522
+ {}
521
523
  end
524
+ end
522
525
 
523
- return @scripts
526
+ #
527
+ # The NSE scripts ran against the host.
528
+ #
529
+ # @return [HostScript, nil]
530
+ # Contains the host script output and data.
531
+ #
532
+ # @since 0.9.0
533
+ #
534
+ def host_script
535
+ @host_script ||= if (hostscript = @node.at('hostscript'))
536
+ HostScript.new(hostscript)
537
+ end
524
538
  end
525
539
 
526
540
  #
@@ -0,0 +1,18 @@
1
+ require 'nmap/scripts'
2
+
3
+ module Nmap
4
+ #
5
+ # Represents the `hostscript` element.
6
+ #
7
+ # @since 0.9.0
8
+ #
9
+ class HostScript
10
+
11
+ include Scripts
12
+
13
+ def initialize(node)
14
+ @node = node
15
+ end
16
+
17
+ end
18
+ end
@@ -1,4 +1,5 @@
1
1
  require 'nmap/service'
2
+ require 'nmap/scripts'
2
3
 
3
4
  module Nmap
4
5
  #
@@ -6,6 +7,8 @@ module Nmap
6
7
  #
7
8
  class Port
8
9
 
10
+ include Scripts
11
+
9
12
  #
10
13
  # Creates a new Port object.
11
14
  #
@@ -70,26 +73,6 @@ module Nmap
70
73
  end
71
74
  end
72
75
 
73
- #
74
- # The output from the NSE scripts ran against the open port.
75
- #
76
- # @return [Hash{String => String}]
77
- # The NSE script names and output.
78
- #
79
- # @since 0.3.0
80
- #
81
- def scripts
82
- unless @scripts
83
- @scripts = {}
84
-
85
- @node.xpath('script').each do |script|
86
- @scripts[script['id']] = script['output']
87
- end
88
- end
89
-
90
- return @scripts
91
- end
92
-
93
76
  alias to_i number
94
77
 
95
78
  #
@@ -0,0 +1,16 @@
1
+ require 'nmap/scripts'
2
+
3
+ module Nmap
4
+ #
5
+ # Represents the `postscript` element.
6
+ #
7
+ class Postscript
8
+
9
+ include Scripts
10
+
11
+ def initialize(node)
12
+ @node = node
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require 'nmap/scripts'
2
+
3
+ module Nmap
4
+ #
5
+ # Represents the `prescript` element.
6
+ #
7
+ class Prescript
8
+
9
+ include Scripts
10
+
11
+ def initialize(node)
12
+ @node = node
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,71 @@
1
+ module Nmap
2
+ module Scripts
3
+ #
4
+ # The output from the NSE scripts ran against the open port.
5
+ #
6
+ # @return [Hash{String => String}]
7
+ # The NSE script names and output.
8
+ #
9
+ # @since 0.3.0
10
+ #
11
+ def scripts
12
+ unless @scripts
13
+ @scripts = {}
14
+
15
+ @node.xpath('script').each do |script|
16
+ @scripts[script['id']] = script['output']
17
+ end
18
+ end
19
+
20
+ return @scripts
21
+ end
22
+
23
+ #
24
+ # The structured output of the NSE scripts.
25
+ #
26
+ # @return [Hash{String => Hash{String => Array<String>}}]
27
+ # The NSE script names and their structured output.
28
+ #
29
+ # @since 0.9.0
30
+ #
31
+ def script_data
32
+ unless @script_data
33
+ @script_data = {}
34
+
35
+ traverse = lambda do |node|
36
+ case node.name
37
+ when 'script', 'table'
38
+ unless node.xpath('*[@key]').empty?
39
+ hash = {}
40
+
41
+ node.elements.each do |element|
42
+ hash[element['key']] = traverse.call(element)
43
+ end
44
+
45
+ hash
46
+ else
47
+ array = []
48
+
49
+ node.elements.each do |element|
50
+ array << traverse.call(element)
51
+ end
52
+
53
+ array
54
+ end
55
+ when 'elem'
56
+ node.inner_text
57
+ else
58
+ raise(NotImplementedError,"unrecognized XML NSE element: #{node}")
59
+ end
60
+ end
61
+
62
+ @node.xpath('script').each do |script|
63
+ @script_data[script['id']] = traverse.call(script)
64
+ end
65
+ end
66
+
67
+ return @script_data
68
+ end
69
+
70
+ end
71
+ end
@@ -152,7 +152,19 @@ module Nmap
152
152
  @confidence ||= @node.get_attribute('conf').to_i
153
153
  end
154
154
 
155
- alias to_s name
155
+ #
156
+ # Converts the service to a String.
157
+ #
158
+ # @return [String]
159
+ # String containing {#product} and {#version}, or {#name}.
160
+ #
161
+ def to_s
162
+ if (product && version)
163
+ "#{product} #{version}"
164
+ else
165
+ name
166
+ end
167
+ end
156
168
 
157
169
  end
158
170
  end
@@ -15,7 +15,7 @@ module Nmap
15
15
  #
16
16
  # * `-sL` - `nmap.list`
17
17
  # * `-sn` - `nmap.ping`
18
- # * `-PN` - `nmap.skip_discovery`
18
+ # * `-Pn` - `nmap.skip_discovery`
19
19
  # * `-PS` - `nmap.syn_discovery`
20
20
  # * `-PA` - `nmap.ack_discovery`
21
21
  # * `-PU` - `nmap.udp_discovery`
@@ -131,6 +131,7 @@ module Nmap
131
131
  # ### Verbosity and Debugging:
132
132
  #
133
133
  # * `-v` - `nmap.verbose`
134
+ # * `-v0` - `nmap.quiet`
134
135
  # * `-d` - `nmap.debug`
135
136
  # * `--reason` - `nmap.show_reason`
136
137
  # * `--stats-every` - `nmap.stats_every`
@@ -178,7 +179,7 @@ module Nmap
178
179
  # HOST DISCOVERY:
179
180
  short_option :flag => '-sL', :name => :list
180
181
  short_option :flag => '-sn', :name => :ping
181
- short_option :flag => '-PN', :name => :skip_discovery
182
+ short_option :flag => '-Pn', :name => :skip_discovery
182
183
  short_option :flag => '-PS', :name => :syn_discovery
183
184
  short_option :flag => '-PA', :name => :ack_discovery
184
185
  short_option :flag => '-PU', :name => :udp_discovery
@@ -300,6 +301,7 @@ module Nmap
300
301
 
301
302
  # Verbosity and Debugging:
302
303
  short_option :flag => '-v', :name => :verbose
304
+ short_option :flag => '-v0', :name => :quiet
303
305
  short_option :flag => '-d', :name => :debug
304
306
  long_option :flag => '--reason', :name => :show_reason
305
307
  long_option :flag => '--stats-every'