ssh_scan 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f6911a09269a07da696877c04d8d8e436875ca78
4
+ data.tar.gz: 4fb3f5b3e716db185cf140b060342404350467e6
5
+ SHA512:
6
+ metadata.gz: bd6f4506587b796e7a9c5374aa6209c348df48a5fea9fc13f7a50b5eed89ca9c648ebae5d70e73af6db6fc1977a424e06b6d6d242f732dc37921ab9e04e6f59d
7
+ data.tar.gz: f2d4380fb4dd20f49968f9546b03646ad122c4ca6222e34d0408e265906f47ef32edeceb73113a55fa087b6e4b42d4959aea10aa437ee997c0f0d154d87f628a
data/.gitignore ADDED
@@ -0,0 +1,36 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ ## Specific to RubyMotion:
14
+ .dat*
15
+ .repl_history
16
+ build/
17
+
18
+ ## Documentation cache and generated files:
19
+ /.yardoc/
20
+ /_yardoc/
21
+ /doc/
22
+ /rdoc/
23
+
24
+ ## Environment normalization:
25
+ /.bundle/
26
+ /vendor/bundle
27
+ /lib/bundler/man/
28
+
29
+ # for a library or gem, you might want to ignore these files since the code is
30
+ # intended to run in multiple environments; otherwise, check them in:
31
+ # Gemfile.lock
32
+ # .ruby-version
33
+ # .ruby-gemset
34
+
35
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
36
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.3
4
+ - 2.1.0
5
+ - 2.0.0
6
+ - 1.9.3
7
+ - jruby-19mode
8
+ - ruby-head
9
+ - jruby-head
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,47 @@
1
+ # Contributing to ssh_scan
2
+
3
+ Thanks for your interest in contributing to ssh_scan.
4
+
5
+ If you could follow the following guidelines, you will make it much easier for
6
+ us to give feedback, help you find whatever problem you have and fix it.
7
+
8
+ ## Issues
9
+
10
+ If you have questions of any kind, or are unsure of how something works, please
11
+ [create an issue](https://github.com/claudijd/ssh_scan/issues/new).
12
+
13
+ Please try to answer the following questions in your issue:
14
+
15
+ - What did you do?
16
+ - What did you expect to happen?
17
+ - What happened instead?
18
+
19
+ If you have identified a bug, it would be very helpful if you could include a
20
+ way to replicate the bug. Ideally a failing test would be perfect, but even a
21
+ simple script demonstrating the error would suffice.
22
+
23
+ Feature requests are great and if submitted they will be considered for
24
+ inclusion, but sending a pull request is much more awesome.
25
+
26
+ ## Pull Requests
27
+
28
+ If you want your pull requests to be accepted, please follow the following guidelines:
29
+
30
+ - [**Add tests!**](http://rspec.info/) Your patch won't be accepted (or will be delayed) if it doesn't have tests.
31
+
32
+ - [**Document any change in behaviour**](http://yardoc.org/) Make sure the README and any other
33
+ relevant documentation are kept up-to-date.
34
+
35
+ - [**Create topic branches**](https://github.com/dchelimsky/rspec/wiki/Topic-Branches) Don't ask us to pull from your master branch.
36
+
37
+ - [**One pull request per feature**](https://help.github.com/articles/using-pull-requests) If you want to do more than one thing, send
38
+ multiple pull requests.
39
+
40
+ - [**Send coherent history**](http://stackoverflow.com/questions/6934752/git-combining-multiple-commits-before-pushing) Make sure each individual commit in your pull
41
+ request is meaningful. If you had to make multiple intermediate commits while
42
+ developing, please squash them before sending them to us.
43
+
44
+ - [**Follow coding conventions**](https://github.com/styleguide/ruby) The standard Ruby stuff, two spaces indent,
45
+ don't omit parens unless you have a good reason.
46
+
47
+ Thank you so much for contributing!
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # ssh_scan
2
+
3
+ [![Build Status](https://secure.travis-ci.org/claudijd/ssh_scan.png)](http://travis-ci.org/claudijd/ssh_scan)
4
+ [![Code Climate](https://codeclimate.com/github/claudijd/ssh_scan.png)](https://codeclimate.com/github/claudijd/ssh_scan)
5
+
6
+ A Ruby-based SSH configuration and policy scanner
7
+
8
+ ## Key Benefits
9
+
10
+ - **Minimal Dependancies** - Uses native Ruby and BinData to do it's work, no heavy dependancies.
11
+ - **Not Just a Script** - Implementation is portable for use in another project or for automation of tasks.
12
+ - **Simple** - It is a small project so the interfaces are simple and easy to use.
13
+
14
+ ## Setup
15
+
16
+ To install, type
17
+
18
+ ```bash
19
+ gem install ssh_scan
20
+ ```
21
+
22
+ ## Example Command-Line Usage
23
+
24
+ Run `ssh_scan -h` to get this
25
+
26
+ Usage: ssh_scan [ip] [port]
27
+ -h, --help Show this message
28
+
29
+ Example: ssh_scan 192.168.1.1
30
+ Example: ssh_scan 192.168.1.1 22
31
+
32
+ ## Rubies Supported
33
+
34
+ This project is integrated with [travis-ci](http://about.travis-ci.org/) and is regularly tested to work with the following rubies:
35
+
36
+ * [2.1.3](https://github.com/ruby/ruby/tree/ruby_2_1)
37
+ * [2.1.0](https://github.com/ruby/ruby/tree/ruby_2_1)
38
+ * [2.0.0](https://github.com/ruby/ruby/tree/ruby_2_0_0)
39
+ * [1.9.3](https://github.com/ruby/ruby/tree/ruby_1_9_3)
40
+ * [ruby-head](https://github.com/ruby/ruby)
41
+ * [jruby-head](http://jruby.org/)
42
+ * [jruby-19mode](http://jruby.org/)
43
+
44
+ To checkout the current build status for these rubies, click [here](https://travis-ci.org/#!/claudijd/ssh_scan).
45
+
46
+ ## Contributing
47
+
48
+ If you are interested in contributing to this project, please see [CONTRIBUTING.md](https://github.com/claudijd/ssh_scan/blob/master/CONTRIBUTING.md)
49
+
50
+ ## Credits
51
+
52
+ **Sources of Inspiration for ssh_scan**
53
+
54
+ - [**Mozilla OpenSSH Security Guide**](https://wiki.mozilla.org/Security/Guidelines/OpenSSH) - For providing a sane baseline policy recommendation for SSH configuration parameters (eg. Ciphers, Macs, and KexAlgos).
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rubygems/package_task'
4
+ require 'rspec'
5
+ require 'rspec/core'
6
+ require 'rspec/core/rake_task'
7
+
8
+ $:.unshift File.join(File.dirname(__FILE__), "lib")
9
+
10
+ require 'ssh_scan'
11
+
12
+ task :default => :spec
13
+
14
+ desc "Run all specs in spec directory"
15
+ RSpec::Core::RakeTask.new(:spec)
data/bin/ssh_scan.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'ssh_scan'
2
+
3
+ # Usage: ruby ssh_scan.rb 192.168.1.1
4
+
5
+ # Populate the info we need to perform a scan
6
+ ip = ARGV[0].chomp
7
+ port = ARGV[1].nil? ? 22 : ARGV[1].to_i
8
+ policy = SSHScan::IntermediatePolicy.new
9
+
10
+ # Perform scan and get results
11
+ scan_engine = SSHScan::ScanEngine.new()
12
+ result = scan_engine.scan(ip, port, policy)
13
+
14
+ puts JSON.pretty_generate(result)
data/lib/ssh_scan.rb ADDED
@@ -0,0 +1,11 @@
1
+ #External Deps
2
+ require 'bindata'
3
+
4
+ #Internal Deps
5
+ require 'ssh_scan/constants'
6
+ require 'ssh_scan/policy'
7
+ require 'ssh_scan/protocol'
8
+ require 'ssh_scan/scan_engine'
9
+
10
+ #Monkey Patches
11
+ require 'string_ext'
@@ -0,0 +1,19 @@
1
+ require 'sinatra'
2
+ require 'protocol'
3
+ require 'socket'
4
+ require 'policy'
5
+ require 'constants'
6
+ require 'scan_engine'
7
+
8
+ get '/api/v1/scan/:ip' do
9
+ if ip = params['ip']
10
+ policy = SSHScan::IntermediatePolicy.new
11
+ scan_engine = SSHScan::ScanEngine.new()
12
+ result = scan_engine.scan(ip, 22, policy)
13
+ content_type :json
14
+ return JSON.pretty_generate(result)
15
+ else
16
+ status 500
17
+ body "Error: did not supply a valid IP to be scanned"
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module SSHScan
2
+ module Constants
3
+ DEFAULT_PROTOCOL = "SSH-2.0-client"
4
+ DEFAULT_KEY_INIT_RAW = "d8eb97b11b6cacbc3285473f08004500019ceccf40004006663fc0a80a7c3ff" +
5
+ "5db33cdfd0016982e6062988da97e801810154d2b00000101080a03a6399f3d" +
6
+ "f735d6000001640414e33f813f8cdcc6b00a3d852ec1aea4980000001a64696" +
7
+ "66669652d68656c6c6d616e2d67726f7570312d736861310000000f7373682d" +
8
+ "6473732c7373682d727361000000576165733132382d6362632c336465732d6" +
9
+ "362632c626c6f77666973682d6362632c6165733139322d6362632c61657332" +
10
+ "35362d6362632c6165733132382d6374722c6165733139322d6374722c61657" +
11
+ "33235362d637472000000576165733132382d6362632c336465732d6362632c" +
12
+ "626c6f77666973682d6362632c6165733139322d6362632c6165733235362d6" +
13
+ "362632c6165733132382d6374722c6165733139322d6374722c616573323536" +
14
+ "2d63747200000021686d61632d6d64352c686d61632d736861312c686d61632" +
15
+ "d726970656d6431363000000021686d61632d6d64352c686d61632d73686131" +
16
+ "2c686d61632d726970656d64313630000000046e6f6e65000000046e6f6e650" +
17
+ "00000000000000000000000006e05b3b4"
18
+ end
19
+ end
@@ -0,0 +1,75 @@
1
+ module SSHScan
2
+ class IntermediatePolicy
3
+ def name
4
+ self.class.to_s
5
+ end
6
+
7
+ def macs
8
+ ["hmac-sha2-512","hmac-sha2-256"]
9
+ end
10
+
11
+ def encryption
12
+ ["aes256-ctr","aes192-ctr","aes128-ctr"]
13
+ end
14
+
15
+ def kexs
16
+ ["diffie-hellman-group-exchange-sha256"]
17
+ end
18
+ end
19
+
20
+ class PolicyManager
21
+ def initialize(result, policy)
22
+ @policy = policy
23
+ @result = result
24
+ end
25
+
26
+ def out_of_policy_encryption
27
+ target_encryption = @result[:encryption_algorithms_client_to_server] | @result[:encryption_algorithms_server_to_client]
28
+ outliers = []
29
+ target_encryption.each do |target_enc|
30
+ outliers << target_enc unless @policy.encryption.include?(target_enc)
31
+ end
32
+ return outliers
33
+ end
34
+
35
+ def out_of_policy_macs
36
+ target_macs = @result[:mac_algorithms_server_to_client] | @result[:mac_algorithms_client_to_server]
37
+ outliers = []
38
+ target_macs.each do |target_mac|
39
+ outliers << target_mac unless @policy.macs.include?(target_mac)
40
+ end
41
+ return outliers
42
+ end
43
+
44
+ def out_of_policy_kex
45
+ target_kexs = @result[:key_algorithms]
46
+ outliers = []
47
+ target_kexs.each do |target_kex|
48
+ outliers << target_kex unless @policy.kexs.include?(target_kex)
49
+ end
50
+ return outliers
51
+ end
52
+
53
+ def compliant?
54
+ out_of_policy_encryption.empty? &&
55
+ out_of_policy_macs.empty? &&
56
+ out_of_policy_kex.empty?
57
+ end
58
+
59
+ def recommendations
60
+ recommendations = []
61
+ recommendations << "Remove these Key Exchange Algos: #{out_of_policy_kex.join(", ")}" unless out_of_policy_kex.empty?
62
+ recommendations << "Remove these MAC Algos: #{out_of_policy_macs.join(", ")}" unless out_of_policy_macs.empty?
63
+ recommendations << "Remove these Encryption Ciphers: #{out_of_policy_encryption.join(", ")}" unless out_of_policy_encryption.empty?
64
+ return recommendations
65
+ end
66
+
67
+ def compliance_results
68
+ {
69
+ :policy => @policy.name,
70
+ :compliant => compliant?,
71
+ :recommendations => recommendations
72
+ }
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,97 @@
1
+ require 'bindata'
2
+ require 'string_ext'
3
+ require 'json'
4
+
5
+ module SSHScan
6
+ # SSHv2 KexInit
7
+ class KeyExchangeInit < BinData::Record
8
+ endian :big
9
+ uint32 :packet_length
10
+ uint8 :padding_length
11
+ uint8 :message_code
12
+ string :cookie, :length => 16
13
+ uint32 :kex_algorithms_length
14
+ string :key_algorithms_string, :length => lambda { self.kex_algorithms_length }
15
+ uint32 :server_host_key_algorithms_length
16
+ string :server_host_key_algorithms_string, :length => lambda { self.server_host_key_algorithms_length }
17
+ uint32 :encryption_algorithms_client_to_server_length
18
+ string :encryption_algorithms_client_to_server_string, :length => lambda { self.encryption_algorithms_client_to_server_length }
19
+ uint32 :encryption_algorithms_server_to_client_length
20
+ string :encryption_algorithms_server_to_client_string, :length => lambda { self.encryption_algorithms_server_to_client_length }
21
+ uint32 :mac_algorithms_client_to_server_length
22
+ string :mac_algorithms_client_to_server_string, :length => lambda { self.mac_algorithms_client_to_server_length }
23
+ uint32 :mac_algorithms_server_to_client_length
24
+ string :mac_algorithms_server_to_client_string, :length => lambda { self.mac_algorithms_server_to_client_length }
25
+ uint32 :compression_algorithms_client_to_server_length
26
+ string :compression_algorithms_client_to_server_string, :length => lambda { self.compression_algorithms_client_to_server_length }
27
+ uint32 :compression_algorithms_server_to_client_length
28
+ string :compression_algorithms_server_to_client_string, :length => lambda { self.compression_algorithms_server_to_client_length }
29
+ uint32 :languages_client_to_server_length
30
+ string :languages_client_to_server_string, :length => lambda { self.languages_client_to_server_length }
31
+ uint32 :languages_server_to_client_length
32
+ string :languages_server_to_client_string, :length => lambda { self.languages_server_to_client_length }
33
+ uint8 :kex_first_packet_follows
34
+ uint32 :reserved
35
+
36
+ def key_algorithms
37
+ self.key_algorithms_string.split(",")
38
+ end
39
+
40
+ def server_host_key_algorithms
41
+ self.server_host_key_algorithms_string.split(",")
42
+ end
43
+
44
+ def encryption_algorithms_client_to_server
45
+ self.encryption_algorithms_client_to_server_string.split(",")
46
+ end
47
+
48
+ def encryption_algorithms_server_to_client
49
+ self.encryption_algorithms_server_to_client_string.split(",")
50
+ end
51
+
52
+ def mac_algorithms_client_to_server
53
+ self.mac_algorithms_client_to_server_string.split(",")
54
+ end
55
+
56
+ def mac_algorithms_server_to_client
57
+ self.mac_algorithms_server_to_client_string.split(",")
58
+ end
59
+
60
+ def compression_algorithms_client_to_server
61
+ self.compression_algorithms_client_to_server_string.split(",")
62
+ end
63
+
64
+ def compression_algorithms_server_to_client
65
+ self.compression_algorithms_client_to_server_string.split(",")
66
+ end
67
+
68
+ def languages_client_to_server
69
+ self.languages_client_to_server_string.split(",")
70
+ end
71
+
72
+ def languages_server_to_client
73
+ self.languages_server_to_client_string.split(",")
74
+ end
75
+
76
+ # Summarize as Hash
77
+ def to_hash
78
+ {
79
+ :key_algorithms => key_algorithms,
80
+ :server_host_key_algorithms => server_host_key_algorithms,
81
+ :encryption_algorithms_client_to_server => encryption_algorithms_client_to_server,
82
+ :encryption_algorithms_server_to_client => encryption_algorithms_server_to_client,
83
+ :mac_algorithms_client_to_server => mac_algorithms_client_to_server,
84
+ :mac_algorithms_server_to_client => mac_algorithms_server_to_client,
85
+ :compression_algorithms_client_to_server => compression_algorithms_client_to_server,
86
+ :compression_algorithms_server_to_client => compression_algorithms_server_to_client,
87
+ :languages_client_to_server => languages_client_to_server,
88
+ :languages_server_to_client => languages_server_to_client,
89
+ }
90
+ end
91
+
92
+ # Summarize as JSON
93
+ def to_json
94
+ self.to_hash.to_json
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,37 @@
1
+ require 'socket'
2
+
3
+ module SSHScan
4
+ class ScanEngine
5
+
6
+ # TODO: this is pretty crude, clean this up a bit
7
+
8
+ def scan(ip, port, policy)
9
+ # Do initial protocol exchange
10
+ sock = TCPSocket.new(ip, port)
11
+ server_protocol = sock.gets
12
+ sock.puts(SSHScan::Constants::DEFAULT_PROTOCOL)
13
+
14
+ # Perform Key Initialization Exchange
15
+ sock.write(SSHScan::Constants::DEFAULT_KEY_INIT_RAW)
16
+ resp = sock.read(4)
17
+ resp += sock.read(resp.unpack("N").first)
18
+ kex_init_response = SSHScan::KeyExchangeInit.read(resp)
19
+ sock.close
20
+
21
+ # Assemble and print results
22
+ result = {
23
+ :ip => ip,
24
+ :port => port,
25
+ :server_banner => server_protocol.chomp
26
+ }
27
+ result.merge!(kex_init_response.to_hash)
28
+
29
+ # Evaluate for Policy Compliance
30
+ policy = SSHScan::IntermediatePolicy.new
31
+ policy_mgr = SSHScan::PolicyManager.new(result, policy)
32
+ result['compliance'] = policy_mgr.compliance_results
33
+
34
+ return result
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module SSHScan
2
+ VERSION = '0.0.1'
3
+ end
data/lib/string_ext.rb ADDED
@@ -0,0 +1,6 @@
1
+ # Extend string to include some helpful stuff
2
+ class String
3
+ def unhexify
4
+ [self].pack("H*")
5
+ end
6
+ end
data/ssh_scan.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ $: << "lib"
2
+ require 'ssh_scan/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'ssh_scan'
6
+ s.version = SSHScan::VERSION
7
+ s.authors = ["Jonathan Claudius"]
8
+ s.date = Date.today.to_s
9
+ s.email = 'claudijd@yahoo.com'
10
+ s.platform = Gem::Platform::RUBY
11
+ s.files = Dir.glob("lib/**/*") +
12
+ Dir.glob("bin/**/*") +
13
+ [".gitignore",
14
+ ".rspec",
15
+ ".travis.yml",
16
+ "CONTRIBUTING.md",
17
+ "Gemfile",
18
+ "Rakefile",
19
+ "README.md",
20
+ "ssh_scan.gemspec"]
21
+ s.license = "ruby"
22
+ s.require_paths = ["lib"]
23
+ s.executables = s.files.grep(%r{^bin/[^\/]+$}) { |f| File.basename(f) }
24
+ s.summary = 'Ruby-based SSH Scanner'
25
+ s.description = 'A Ruby-based SSH scanner for configuration and policy scanning'
26
+ s.homepage = 'http://rubygems.org/gems/ssh_scan'
27
+
28
+ s.add_dependency('bindata', '~> 2.0')
29
+ s.add_development_dependency('rspec', '~> 3.0')
30
+ s.add_development_dependency('rspec-its', '~> 1.2')
31
+ s.add_development_dependency('rake', '~> 10.3')
32
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ssh_scan
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan Claudius
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bindata
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-its
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.3'
69
+ description: A Ruby-based SSH scanner for configuration and policy scanning
70
+ email: claudijd@yahoo.com
71
+ executables:
72
+ - ssh_scan.rb
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".travis.yml"
79
+ - CONTRIBUTING.md
80
+ - Gemfile
81
+ - README.md
82
+ - Rakefile
83
+ - bin/ssh_scan.rb
84
+ - lib/ssh_scan.rb
85
+ - lib/ssh_scan/basic_server.rb
86
+ - lib/ssh_scan/constants.rb
87
+ - lib/ssh_scan/policy.rb
88
+ - lib/ssh_scan/protocol.rb
89
+ - lib/ssh_scan/scan_engine.rb
90
+ - lib/ssh_scan/version.rb
91
+ - lib/string_ext.rb
92
+ - ssh_scan.gemspec
93
+ homepage: http://rubygems.org/gems/ssh_scan
94
+ licenses:
95
+ - ruby
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.4.8
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: Ruby-based SSH Scanner
117
+ test_files: []