ssh_scan 0.0.15 → 0.0.16

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c5d764d9a2898d145c0f46eee1c59bb0c6e7bcde
4
- data.tar.gz: 9bd1e38f1e4c715bf01a9526b85a5cf4d5c7961f
3
+ metadata.gz: 4ee64bc0510d0062484755cc9258e947ddd53575
4
+ data.tar.gz: abc430f6465b494019aa648d358c25224d49f4ce
5
5
  SHA512:
6
- metadata.gz: d9dca78fe553facec68df4241f43ed13537ef08d5b39f9d50ddafa50e97ba0c24d76a836f527c677e7cd90092be970604a3729b0348e06dfd28daefb4aef34b1
7
- data.tar.gz: 67329c5b6e9c652b4572c9d1085be7cf220d48cafe19cf4dfa2827d8849ea5e43afcc284f79638cd1fdb03fca79677b1b662c3bef64f61765e4ab51f442475a4
6
+ metadata.gz: e0b5318192b079acc3c8a7d4232f56029dcaa8ad48d5dc40e1abc64bea229ef40b29ef4f24e9a42bb989e09b589c9f3f604e1f89bb164c4da7837e97e7300c40
7
+ data.tar.gz: 5c6d3cbaea3d77c7d3394dcf20fdca6a90f8b5bc14973c971d88bc84ee8220fb4332f182c3f5621c9414544ca8d376432bfccc54a5855d6777fcb0840c689f60
data/Rakefile CHANGED
@@ -4,6 +4,8 @@ require 'rubygems/package_task'
4
4
  require 'rspec'
5
5
  require 'rspec/core'
6
6
  require 'rspec/core/rake_task'
7
+ require 'bundler/setup'
8
+ require 'ssh_scan/version'
7
9
 
8
10
  $:.unshift File.join(File.dirname(__FILE__), "lib")
9
11
 
@@ -13,3 +15,137 @@ task :default => :spec
13
15
 
14
16
  desc "Run all specs in spec directory"
15
17
  RSpec::Core::RakeTask.new(:spec)
18
+
19
+ PACKAGE_NAME = "ssh_scan"
20
+ VERSION = SSHScan::VERSION
21
+ TRAVELING_RUBY_VERSION = "20150210-2.1.5"
22
+ SQLITE3_VERSION = "1.3.9" # Must match Gemfile
23
+
24
+ desc "Package your app"
25
+ task :package => ['package:linux:x86', 'package:linux:x86_64', 'package:osx', 'package:win32']
26
+
27
+ namespace :package do
28
+ namespace :linux do
29
+ desc "Package your app for Linux x86"
30
+ task :x86 => [:bundle_install,
31
+ "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86.tar.gz",
32
+ "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-sqlite3-#{SQLITE3_VERSION}.tar.gz"
33
+ ] do
34
+ create_package("linux-x86")
35
+ end
36
+
37
+ desc "Package your app for Linux x86_64"
38
+ task :x86_64 => [:bundle_install,
39
+ "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64.tar.gz",
40
+ "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-sqlite3-#{SQLITE3_VERSION}.tar.gz"
41
+ ] do
42
+ create_package("linux-x86_64")
43
+ end
44
+ end
45
+
46
+ desc "Package your app for OS X"
47
+ task :osx => [:bundle_install,
48
+ "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx.tar.gz",
49
+ "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-sqlite3-#{SQLITE3_VERSION}.tar.gz"
50
+ ] do
51
+ create_package("osx")
52
+ end
53
+
54
+ desc "Package your app for Windows x86"
55
+ task :win32 => [:bundle_install, "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-win32.tar.gz"] do
56
+ create_package("win32", :windows)
57
+ end
58
+
59
+ desc "Install gems to local directory"
60
+ task :bundle_install do
61
+ if RUBY_VERSION !~ /^2\.3\./
62
+ abort "You can only 'bundle install' using Ruby 2.3, because that's what Traveling Ruby uses."
63
+ end
64
+ sh "rm -rf packaging/tmp"
65
+ sh "mkdir packaging/tmp"
66
+ sh "mkdir packaging/tmp/lib"
67
+ sh "mkdir packaging/tmp/bin"
68
+ sh "cp -R lib/* packaging/tmp/lib"
69
+ sh "cp -R bin/* packaging/tmp/bin"
70
+ sh "cp Gemfile Gemfile.lock #{PACKAGE_NAME}.gemspec packaging/tmp/"
71
+ Bundler.with_clean_env do
72
+ sh "cd packaging/tmp && env BUNDLE_IGNORE_CONFIG=1 bundle install --path ../vendor --without development"
73
+ end
74
+ sh "rm -rf packaging/tmp"
75
+ sh "rm -f packaging/vendor/*/*/cache/*"
76
+ sh "rm -rf packaging/vendor/ruby/*/extensions"
77
+ sh "find packaging/vendor/ruby/*/gems -name '*.so' | xargs rm -f"
78
+ sh "find packaging/vendor/ruby/*/gems -name '*.bundle' | xargs rm -f"
79
+ sh "find packaging/vendor/ruby/*/gems -name '*.o' | xargs rm -f"
80
+ end
81
+ end
82
+
83
+ file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86.tar.gz" do
84
+ download_runtime("linux-x86")
85
+ end
86
+
87
+ file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64.tar.gz" do
88
+ download_runtime("linux-x86_64")
89
+ end
90
+
91
+ file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx.tar.gz" do
92
+ download_runtime("osx")
93
+ end
94
+
95
+ file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-win32.tar.gz" do
96
+ download_runtime("win32")
97
+ end
98
+
99
+ file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86-sqlite3-#{SQLITE3_VERSION}.tar.gz" do
100
+ download_native_extension("linux-x86", "sqlite3-#{SQLITE3_VERSION}")
101
+ end
102
+
103
+ file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-linux-x86_64-sqlite3-#{SQLITE3_VERSION}.tar.gz" do
104
+ download_native_extension("linux-x86_64", "sqlite3-#{SQLITE3_VERSION}")
105
+ end
106
+
107
+ file "packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-osx-sqlite3-#{SQLITE3_VERSION}.tar.gz" do
108
+ download_native_extension("osx", "sqlite3-#{SQLITE3_VERSION}")
109
+ end
110
+
111
+ def create_package(target, os_type = :unix)
112
+ package_dir = "#{PACKAGE_NAME}-#{VERSION}-#{target}"
113
+ sh "rm -rf #{package_dir}"
114
+ sh "mkdir #{package_dir}"
115
+ sh "mkdir -p #{package_dir}/lib/app"
116
+ sh "cp bin/#{PACKAGE_NAME} #{package_dir}/lib/app/"
117
+ sh "mkdir #{package_dir}/lib/ruby"
118
+ sh "tar -xzf packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}.tar.gz -C #{package_dir}/lib/ruby"
119
+ if os_type == :unix
120
+ sh "cp packaging/wrapper.sh #{package_dir}/#{PACKAGE_NAME}"
121
+ else
122
+ sh "cp packaging/wrapper.bat #{package_dir}/#{PACKAGE_NAME}.bat"
123
+ end
124
+
125
+ sh "cp -R lib/* #{package_dir}/lib/"
126
+ sh "cp -pR packaging/vendor #{package_dir}/lib/"
127
+ sh "cp Gemfile Gemfile.lock #{PACKAGE_NAME}.gemspec #{package_dir}/lib/vendor/"
128
+ sh "mkdir #{package_dir}/lib/vendor/.bundle"
129
+ sh "cp packaging/bundler-config #{package_dir}/lib/vendor/.bundle/config"
130
+ sh "tar -xzf packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}-sqlite3-#{SQLITE3_VERSION}.tar.gz " +
131
+ "-C #{package_dir}/lib/vendor/ruby"
132
+ if !ENV['DIR_ONLY']
133
+ if os_type == :unix
134
+ sh "tar -czf #{package_dir}.tar.gz #{package_dir}"
135
+ else
136
+ sh "zip -9r #{package_dir}.zip #{package_dir}"
137
+ end
138
+
139
+ sh "rm -rf #{package_dir}"
140
+ end
141
+ end
142
+
143
+ def download_runtime(target)
144
+ sh "cd packaging && curl -L -O --fail " +
145
+ "https://d6r77u77i8pq3.cloudfront.net/releases/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}.tar.gz"
146
+ end
147
+
148
+ def download_native_extension(target, gem_name_and_version)
149
+ sh "curl -L --fail -o packaging/traveling-ruby-#{TRAVELING_RUBY_VERSION}-#{target}-#{gem_name_and_version}.tar.gz " +
150
+ "https://d6r77u77i8pq3.cloudfront.net/releases/traveling-ruby-gems-#{TRAVELING_RUBY_VERSION}-#{target}/#{gem_name_and_version}.tar.gz"
151
+ end
@@ -113,6 +113,10 @@ opt_parser = OptionParser.new do |opts|
113
113
  options[:fingerprint_database] = fingerprint_db
114
114
  end
115
115
 
116
+ opts.on("--suppress-update-status", "Do not check for updates") do
117
+ options[:suppress_update_status] = true
118
+ end
119
+
116
120
  opts.on("-u", "--unit-test [FILE]",
117
121
  "Throw appropriate exit codes based on compliance status") do
118
122
  options[:unit_test] = true
@@ -138,6 +142,11 @@ opt_parser = OptionParser.new do |opts|
138
142
  exit
139
143
  end
140
144
 
145
+ opts.on("-l", "--listen", "Listen and serve API requests") do
146
+ SSHScan::API.run!
147
+ exit
148
+ end
149
+
141
150
  opts.on_tail("-h", "--help", "Show this message") do
142
151
  puts opts
143
152
  puts "\nExamples:"
@@ -190,11 +199,19 @@ unless File.exists?(options[:policy])
190
199
  end
191
200
 
192
201
  # Check to see if we're running the latest released version
193
- update = SSHScan::Update.new
194
- if update.newer_gem_available?
195
- options[:logger].warn("You're NOT using the latest version of ssh_scan, try 'gem update ssh_scan' to get the latest")
196
- else
197
- options[:logger].info("You're using the latest version of ssh_scan #{SSHScan::VERSION}")
202
+ if !options[:suppress_update_status]
203
+ update = SSHScan::Update.new
204
+ if update.newer_gem_available?
205
+ options[:logger].warn("You're NOT using the latest version of ssh_scan, try 'gem update ssh_scan' to get the latest")
206
+ else
207
+ if update.errors.size > 0
208
+ update.errors.each do |error|
209
+ options[:logger].error(error)
210
+ end
211
+ else
212
+ options[:logger].info("You're using the latest version of ssh_scan #{SSHScan::VERSION}")
213
+ end
214
+ end
198
215
  end
199
216
 
200
217
  options[:policy_file] = SSHScan::Policy.from_file(options[:policy])
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), "../lib")
4
+
5
+ require 'optparse'
6
+ require 'ssh_scan'
7
+
8
+ options = {
9
+ :port => 8000,
10
+ }
11
+
12
+ opt_parser = OptionParser.new do |opts|
13
+ opts.banner = "ssh_scan_api v#{SSHScan::API_VERSION} (https://github.com/mozilla/ssh_scan)\n\n" +
14
+ "Usage: ssh_scan [options]"
15
+
16
+ opts.on("-p", "--port [PORT]", "Listen and serve API requests on this port (Default: 8000)") do |port|
17
+ options[:port] = port.to_i
18
+ end
19
+
20
+ opts.on("-v", "--version", "Show ssh_scan API version") do
21
+ puts SSHScan::API_VERSION
22
+ exit
23
+ end
24
+
25
+ opts.on_tail("-h", "--help", "Show help") do
26
+ puts opts
27
+ puts "\nExamples:\n"
28
+ puts " ssh_scan_api -p 4567"
29
+ puts ""
30
+ exit
31
+ end
32
+ end
33
+
34
+ opt_parser.parse!
35
+
36
+ SSHScan::API.run!(:port => options[:port])
@@ -12,6 +12,7 @@ require 'ssh_scan/protocol'
12
12
  require 'ssh_scan/scan_engine'
13
13
  require 'ssh_scan/target_parser'
14
14
  require 'ssh_scan/update'
15
+ require 'ssh_scan/api'
15
16
 
16
17
  #Monkey Patches
17
18
  require 'string_ext'
@@ -0,0 +1,124 @@
1
+ require 'sinatra/base'
2
+ require 'sinatra/namespace'
3
+ require 'ssh_scan/version'
4
+ require 'ssh_scan/policy'
5
+ require 'ssh_scan/scan_engine'
6
+ require 'json'
7
+ require 'haml'
8
+ require 'secure_headers'
9
+
10
+ module SSHScan
11
+ class API < Sinatra::Base
12
+ use SecureHeaders::Middleware
13
+
14
+ SecureHeaders::Configuration.default do |config|
15
+ config.cookies = {
16
+ secure: true, # mark all cookies as "Secure"
17
+ httponly: true, # mark all cookies as "HttpOnly"
18
+ }
19
+ config.hsts = "max-age=31536000; includeSubdomains; preload"
20
+ config.x_frame_options = "DENY"
21
+ config.x_content_type_options = "nosniff"
22
+ config.x_xss_protection = "1; mode=block"
23
+ config.x_download_options = "noopen"
24
+ config.x_permitted_cross_domain_policies = "none"
25
+ config.referrer_policy = "origin-when-cross-origin"
26
+ config.csp = {
27
+ default_src: %w('none'),
28
+ frame_ancestors: %w('none'),
29
+ upgrade_insecure_requests: true, # see https://www.w3.org/TR/upgrade-insecure-requests/
30
+ }
31
+ end
32
+
33
+ class NullLogger < Logger
34
+ def initialize(*args)
35
+ end
36
+
37
+ def add(*args, &block)
38
+ end
39
+ end
40
+
41
+ register Sinatra::Namespace
42
+
43
+ before do
44
+ headers "Server" => "ssh_scan_api"
45
+ end
46
+
47
+ # Custom 404 handling
48
+ not_found do
49
+ content_type "text/plain"
50
+ 'Invalid request, see API documentation here: https://github.com/mozilla/ssh_scan/wiki/ssh_scan-Web-API'
51
+ end
52
+
53
+ get '/robots.txt' do
54
+ content_type "text/plain"
55
+ "User-agent: *\nDisallow: /\n"
56
+ end
57
+
58
+ get '/contribute.json' do
59
+ content_type :json
60
+ {
61
+ :name => "ssh_scan api",
62
+ :description => "An api for performing ssh compliance and policy scanning",
63
+ :repository => {
64
+ :url => "https://github.com/mozilla/ssh_scan",
65
+ :tests => "https://travis-ci.org/mozilla/ssh_scan",
66
+ },
67
+ :participate => {
68
+ :home => "https://github.com/mozilla/ssh_scan",
69
+ :docs => "https://github.com/mozilla/ssh_scan",
70
+ :irc => "irc://irc.mozilla.org/#infosec",
71
+ :irc_contacts => [
72
+ "claudijd",
73
+ "pwnbus",
74
+ "kang",
75
+ ],
76
+ :glitter => "https://gitter.im/mozilla-ssh_scan/Lobby",
77
+ :glitter_contacts => [
78
+ "claudijd",
79
+ "pwnbus",
80
+ "kang",
81
+ "jinankjain",
82
+ "agaurav77"
83
+ ],
84
+ },
85
+ :bugs => {
86
+ :list => "https://github.com/mozilla/ssh_scan/issues",
87
+ },
88
+ :keywords => [
89
+ "ruby",
90
+ "sinatra",
91
+ ],
92
+ }.to_json
93
+ end
94
+
95
+
96
+ namespace "/api/v#{SSHScan::API_VERSION}" do
97
+ before do
98
+ content_type :json
99
+ end
100
+
101
+ post '/scan' do
102
+ options = {
103
+ :sockets => [],
104
+ :policy => File.expand_path("../../../policies/mozilla_modern.yml", __FILE__),
105
+ :timeout => 2,
106
+ :verbosity => nil,
107
+ :logger => NullLogger.new,
108
+ :fingerprint_database => "fingerprints.db",
109
+ }
110
+ options[:sockets] << "#{params[:target]}:#{params[:port] ? params[:port] : "22"}"
111
+ options[:policy_file] = SSHScan::Policy.from_file(options[:policy])
112
+ scan_engine = SSHScan::ScanEngine.new()
113
+ scan_engine.scan(options).to_json
114
+ end
115
+
116
+ get '/__version__' do
117
+ {
118
+ :ssh_scan_version => SSHScan::VERSION,
119
+ :api_version => SSHScan::API_VERSION,
120
+ }.to_json
121
+ end
122
+ end
123
+ end
124
+ end
@@ -25,14 +25,30 @@ module SSHScan
25
25
  return SSHScan::SSHLib::OpenSSH.new(@string)
26
26
  when /LibSSH/i
27
27
  return SSHScan::SSHLib::LibSSH.new()
28
+ when /ipssh/i
29
+ return SSHScan::SSHLib::IpSsh.new(@string)
28
30
  when /Cisco/i
29
31
  return SSHScan::SSHLib::CiscoSSH.new()
30
- when /ROS/i
32
+ when /ROS/
31
33
  return SSHScan::SSHLib::ROSSSH.new()
32
34
  when /DOPRASSH/i
33
35
  return SSHScan::SSHLib::DOPRASSH.new()
36
+ when /cryptlib/i
37
+ return SSHScan::SSHLib::Cryptlib.new()
38
+ when /NOS-SSH/i
39
+ return SSHScan::SSHLib::NosSSH.new(@string)
40
+ when /pgp/i
41
+ return SSHScan::SSHLib::PGP.new()
42
+ when /ServerTech_SSH|Mocana SSH/i
43
+ return SSHScan::SSHLib::SentrySSH.new()
44
+ when /mpssh/i
45
+ return SSHScan::SSHLib::Mpssh.new(@string)
34
46
  when /dropbear/i
35
47
  return SSHScan::SSHLib::Dropbear.new(@string)
48
+ when /RomSShell/i
49
+ return SSHScan::SSHLib::RomSShell.new(@string)
50
+ when /Flowssh/i
51
+ return SSHScan::SSHLib::FlowSsh.new(@string)
36
52
  else
37
53
  return SSHScan::SSHLib::Unknown.new()
38
54
  end
@@ -52,10 +68,12 @@ module SSHScan
52
68
  return SSHScan::OS::FreeBSD.new
53
69
  when /Debian/i
54
70
  return SSHScan::OS::Debian.new
55
- when /Windows/i
71
+ when /Windows|Microsoft/i
56
72
  return SSHScan::OS::Windows.new
57
73
  when /Cisco/i
58
74
  return SSHScan::OS::Cisco.new
75
+ when /Raspbian/i
76
+ return SSHScan::OS::Raspbian.new(@string)
59
77
  when /ROS/i
60
78
  return SSHScan::OS::ROS.new
61
79
  when /DOPRA/i
@@ -6,5 +6,6 @@ require 'ssh_scan/os/windows'
6
6
  require 'ssh_scan/os/redhat'
7
7
  require 'ssh_scan/os/cisco'
8
8
  require 'ssh_scan/os/ros'
9
+ require 'ssh_scan/os/raspbian'
9
10
  require 'ssh_scan/os/dopra'
10
11
  require 'ssh_scan/os/unknown'
@@ -0,0 +1,39 @@
1
+ module SSHScan
2
+ module OS
3
+ class Raspbian
4
+ class Version
5
+ def initialize(version_string)
6
+ @version_string = version_string
7
+ end
8
+
9
+ def to_s
10
+ @version_string
11
+ end
12
+ end
13
+
14
+ def initialize(banner)
15
+ @banner = banner
16
+ @version = Raspbian::Version.new(raspbian_version_guess)
17
+ end
18
+
19
+ def raspbian_version_guess
20
+ return nil if @banner.nil?
21
+ match = @banner.match(/SSH-2.0-Raspbian-(\d+)/)
22
+ return nil if match.nil?
23
+ return match[1]
24
+ end
25
+
26
+ def common
27
+ "raspbian"
28
+ end
29
+
30
+ def cpe
31
+ "o:raspbian:raspbian"
32
+ end
33
+
34
+ def version
35
+ @version
36
+ end
37
+ end
38
+ end
39
+ end
@@ -200,7 +200,7 @@ module SSHScan
200
200
  end
201
201
 
202
202
  def cpe
203
- "o:canonical:ubuntu:#{@version}"
203
+ "o:canonical:ubuntu" + (@version.to_s ? ":#{@version}" : "")
204
204
  end
205
205
  end
206
206
  end
@@ -4,4 +4,12 @@ require 'ssh_scan/ssh_lib/ciscossh'
4
4
  require 'ssh_scan/ssh_lib/rosssh'
5
5
  require 'ssh_scan/ssh_lib/doprassh'
6
6
  require 'ssh_scan/ssh_lib/dropbear'
7
+ require 'ssh_scan/ssh_lib/romsshell'
8
+ require 'ssh_scan/ssh_lib/flowssh'
9
+ require 'ssh_scan/ssh_lib/cryptlib'
10
+ require 'ssh_scan/ssh_lib/mpssh'
11
+ require 'ssh_scan/ssh_lib/sentryssh'
12
+ require 'ssh_scan/ssh_lib/ipssh'
13
+ require 'ssh_scan/ssh_lib/pgp'
14
+ require 'ssh_scan/ssh_lib/nosssh'
7
15
  require 'ssh_scan/ssh_lib/unknown'
@@ -0,0 +1,17 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class Cryptlib
4
+ def common
5
+ "cryptlib"
6
+ end
7
+
8
+ def cpe
9
+ "a:cryptlib:cryptlib"
10
+ end
11
+
12
+ def version
13
+ nil
14
+ end
15
+ end
16
+ end
17
+ end
@@ -31,7 +31,7 @@ module SSHScan
31
31
  end
32
32
 
33
33
  def cpe
34
- "o:dropbear:dropbear:#{@version.to_s}"
34
+ "a:dropbear:dropbear" << (":" + version.to_s) unless version.nil?
35
35
  end
36
36
 
37
37
  def version
@@ -40,4 +40,3 @@ module SSHScan
40
40
  end
41
41
  end
42
42
  end
43
-
@@ -0,0 +1,34 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class FlowSsh
4
+ class Version
5
+ def initialize(version_string)
6
+ @version_string = version_string
7
+ end
8
+
9
+ def to_s
10
+ @version_string
11
+ end
12
+ end
13
+
14
+ def initialize(banner = nil)
15
+ @banner = banner
16
+ end
17
+
18
+ def version()
19
+ return nil if @banner.nil?
20
+ match = @banner.match(/(\d+[\.\d+]+(p)?(\d+)?) FlowSsh/)
21
+ return nil if match.nil?
22
+ return FlowSsh::Version.new(match[1])
23
+ end
24
+
25
+ def common
26
+ "flowssh"
27
+ end
28
+
29
+ def cpe
30
+ "a:bitvise:flowssh" << (":" + version.to_s) unless version.nil?
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class IpSsh
4
+ class Version
5
+ def initialize(version_string)
6
+ @version_string = version_string
7
+ end
8
+
9
+ def to_s
10
+ @version_string
11
+ end
12
+ end
13
+
14
+ def initialize(banner = nil)
15
+ @banner = banner
16
+ end
17
+
18
+ def version()
19
+ return nil if @banner.nil?
20
+ match = @banner.match(/IPSSH-(\d+[\.\d+]+(p)?(\d+)?)/)
21
+ return nil if match.nil?
22
+ return IpSsh::Version.new(match[1])
23
+ end
24
+
25
+ def common
26
+ "ipssh"
27
+ end
28
+
29
+ def cpe
30
+ "a:ipssh:ipssh" << (":" + version.to_s) unless version.nil?
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class Mpssh
4
+ class Version
5
+ def initialize(version_string)
6
+ @version_string = version_string
7
+ end
8
+
9
+ def to_s
10
+ @version_string
11
+ end
12
+ end
13
+
14
+ def initialize(banner = nil)
15
+ @banner = banner
16
+ end
17
+
18
+ def version()
19
+ return nil if @banner.nil?
20
+ match = @banner.match(/mpSSH_(\d+[\.\d+]+(p)?(\d+)?)/i)
21
+ return nil if match.nil?
22
+ return Mpssh::Version.new(match[1])
23
+ end
24
+
25
+ def common
26
+ "mpssh"
27
+ end
28
+
29
+ def cpe
30
+ "a:mpssh:mpssh" << (":" + version.to_s) unless version.nil?
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class NosSSH
4
+ class Version
5
+ def initialize(version_string)
6
+ @version_string = version_string
7
+ end
8
+
9
+ def to_s
10
+ @version_string
11
+ end
12
+ end
13
+
14
+ def initialize(banner = nil)
15
+ @banner = banner
16
+ end
17
+
18
+ def version()
19
+ return nil if @banner.nil?
20
+ match = @banner.match(/NOS-SSH_(\d+[\.\d+]+)/)
21
+ return nil if match.nil?
22
+ return NosSSH::Version.new(match[1])
23
+ end
24
+
25
+ def common
26
+ "nosssh"
27
+ end
28
+
29
+ def cpe
30
+ "a:nosssh:nosssh" << (":" + version.to_s) unless version.nil?
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,17 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class PGP
4
+ def common
5
+ "pgp"
6
+ end
7
+
8
+ def cpe
9
+ "a:pgp:pgp"
10
+ end
11
+
12
+ def version
13
+ nil
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class RomSShell
4
+ class Version
5
+ def initialize(version_string)
6
+ @version_string = version_string
7
+ end
8
+
9
+ def to_s
10
+ @version_string
11
+ end
12
+ end
13
+
14
+ def initialize(banner = nil)
15
+ @banner = banner
16
+ end
17
+
18
+ def version()
19
+ return nil if @banner.nil?
20
+ match = @banner.match(/RomSShell_(\d+[\.\d+]+(p)?(\d+)?)/)
21
+ return nil if match.nil?
22
+ return RomSShell::Version.new(match[1])
23
+ end
24
+
25
+ def common
26
+ "romsshell"
27
+ end
28
+
29
+ def cpe
30
+ "a:allegrosoft:romsshell" << (":" + version.to_s) unless version.nil?
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,17 @@
1
+ module SSHScan
2
+ module SSHLib
3
+ class SentrySSH
4
+ def common
5
+ "sentryssh"
6
+ end
7
+
8
+ def cpe
9
+ "a:servertech:sentryssh"
10
+ end
11
+
12
+ def version
13
+ nil
14
+ end
15
+ end
16
+ end
17
+ end
@@ -5,6 +5,10 @@ require 'net/http'
5
5
 
6
6
  module SSHScan
7
7
  class Update
8
+ def initialize
9
+ @errors = []
10
+ end
11
+
8
12
  def next_patch_version(version = SSHScan::VERSION)
9
13
  major, minor, patch = version.split(".")
10
14
  patch_num = patch.to_i
@@ -34,7 +38,8 @@ module SSHScan
34
38
 
35
39
  begin
36
40
  res = Net::HTTP.get_response(uri)
37
- rescue
41
+ rescue Exception => e
42
+ @errors << e.message
38
43
  return false
39
44
  end
40
45
 
@@ -45,6 +50,10 @@ module SSHScan
45
50
  end
46
51
  end
47
52
 
53
+ def errors
54
+ @errors.uniq
55
+ end
56
+
48
57
  def newer_gem_available?(version = SSHScan::VERSION)
49
58
  if gem_exists?(next_patch_version(version))
50
59
  return true
@@ -1,3 +1,4 @@
1
1
  module SSHScan
2
- VERSION = '0.0.15'
2
+ VERSION = '0.0.16'
3
+ API_VERSION = '0.0.1'
3
4
  end
@@ -30,6 +30,11 @@ Gem::Specification.new do |s|
30
30
  s.add_dependency('netaddr')
31
31
  s.add_dependency('net-ssh')
32
32
  s.add_dependency('sqlite3')
33
+ s.add_dependency('sinatra')
34
+ s.add_dependency('sinatra-contrib')
35
+ s.add_dependency('haml')
36
+ s.add_dependency('secure_headers')
37
+ s.add_development_dependency('rack-test')
33
38
  s.add_development_dependency('pry')
34
39
  s.add_development_dependency('rspec', '~> 3.0')
35
40
  s.add_development_dependency('rspec-its', '~> 1.2')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ssh_scan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Claudius
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-21 00:00:00.000000000 Z
12
+ date: 2016-10-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bindata
@@ -67,6 +67,76 @@ dependencies:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: sinatra
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: sinatra-contrib
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: haml
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: secure_headers
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rack-test
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
70
140
  - !ruby/object:Gem::Dependency
71
141
  name: pry
72
142
  requirement: !ruby/object:Gem::Requirement
@@ -127,6 +197,7 @@ description: A Ruby-based SSH scanner for configuration and policy scanning
127
197
  email: claudijd@yahoo.com
128
198
  executables:
129
199
  - ssh_scan
200
+ - ssh_scan_api
130
201
  extensions: []
131
202
  extra_rdoc_files: []
132
203
  files:
@@ -138,7 +209,9 @@ files:
138
209
  - README.md
139
210
  - Rakefile
140
211
  - bin/ssh_scan
212
+ - bin/ssh_scan_api
141
213
  - lib/ssh_scan.rb
214
+ - lib/ssh_scan/api.rb
142
215
  - lib/ssh_scan/banner.rb
143
216
  - lib/ssh_scan/client.rb
144
217
  - lib/ssh_scan/constants.rb
@@ -157,6 +230,7 @@ files:
157
230
  - lib/ssh_scan/os/debian.rb
158
231
  - lib/ssh_scan/os/dopra.rb
159
232
  - lib/ssh_scan/os/freebsd.rb
233
+ - lib/ssh_scan/os/raspbian.rb
160
234
  - lib/ssh_scan/os/redhat.rb
161
235
  - lib/ssh_scan/os/ros.rb
162
236
  - lib/ssh_scan/os/ubuntu.rb
@@ -168,11 +242,19 @@ files:
168
242
  - lib/ssh_scan/scan_engine.rb
169
243
  - lib/ssh_scan/ssh_lib.rb
170
244
  - lib/ssh_scan/ssh_lib/ciscossh.rb
245
+ - lib/ssh_scan/ssh_lib/cryptlib.rb
171
246
  - lib/ssh_scan/ssh_lib/doprassh.rb
172
247
  - lib/ssh_scan/ssh_lib/dropbear.rb
248
+ - lib/ssh_scan/ssh_lib/flowssh.rb
249
+ - lib/ssh_scan/ssh_lib/ipssh.rb
173
250
  - lib/ssh_scan/ssh_lib/libssh.rb
251
+ - lib/ssh_scan/ssh_lib/mpssh.rb
252
+ - lib/ssh_scan/ssh_lib/nosssh.rb
174
253
  - lib/ssh_scan/ssh_lib/openssh.rb
254
+ - lib/ssh_scan/ssh_lib/pgp.rb
255
+ - lib/ssh_scan/ssh_lib/romsshell.rb
175
256
  - lib/ssh_scan/ssh_lib/rosssh.rb
257
+ - lib/ssh_scan/ssh_lib/sentryssh.rb
176
258
  - lib/ssh_scan/ssh_lib/unknown.rb
177
259
  - lib/ssh_scan/target_parser.rb
178
260
  - lib/ssh_scan/update.rb
@@ -201,7 +283,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
283
  version: '0'
202
284
  requirements: []
203
285
  rubyforge_project:
204
- rubygems_version: 2.6.2
286
+ rubygems_version: 2.5.1
205
287
  signing_key:
206
288
  specification_version: 4
207
289
  summary: Ruby-based SSH Scanner