ssh_scan 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []