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 +7 -0
- data/.gitignore +36 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/CONTRIBUTING.md +47 -0
- data/Gemfile +3 -0
- data/README.md +54 -0
- data/Rakefile +15 -0
- data/bin/ssh_scan.rb +14 -0
- data/lib/ssh_scan.rb +11 -0
- data/lib/ssh_scan/basic_server.rb +19 -0
- data/lib/ssh_scan/constants.rb +19 -0
- data/lib/ssh_scan/policy.rb +75 -0
- data/lib/ssh_scan/protocol.rb +97 -0
- data/lib/ssh_scan/scan_engine.rb +37 -0
- data/lib/ssh_scan/version.rb +3 -0
- data/lib/string_ext.rb +6 -0
- data/ssh_scan.gemspec +32 -0
- metadata +117 -0
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
data/.travis.yml
ADDED
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
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# ssh_scan
|
2
|
+
|
3
|
+
[](http://travis-ci.org/claudijd/ssh_scan)
|
4
|
+
[](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,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
|
data/lib/string_ext.rb
ADDED
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: []
|