Nessus6 0.1.0

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: 4fd4cdfa535bfd5f763074b2364aec98c58c128b
4
+ data.tar.gz: ea9e76b76ec8b8944933bd4258cd6460b3daac07
5
+ SHA512:
6
+ metadata.gz: aa72aa5257c78b7751279ff72cf953e46c3a8b05b71d419988059245e772ecd5c75b3e8937c1a811c3d329ab41a067037dc8391578f4a9e63ab22cac264d01d4
7
+ data.tar.gz: 3c7d133ebdc754dcff55b64e57a31129abc4a28cc2286176e0f393253c343ced1e294c831bc23373a5df781d571e923e103deb7670ca031802a938902dd196b1
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in Nessus6.gemspec
4
+ gemspec
data/Nessus6.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'Nessus6/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "Nessus6"
8
+ spec.version = Nessus6::VERSION
9
+ spec.authors = ["Kevin Kirsche"]
10
+ spec.email = ["kev.kirsche@gmail.com"]
11
+ spec.license = 'Apache-2.0'
12
+
13
+ spec.summary = %q{[Under Construction] Nessus 6 API Gem}
14
+ spec.description = %q{Gem for interacting with the Tenable Nessus 6 REST API.}
15
+ spec.homepage = "https://github.com/kkirsche/Nessus6"
16
+
17
+ spec.required_ruby_version = '>= 2.0.0'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.9"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "minitest", "~> 5.8"
27
+ spec.add_runtime_dependency "hurley", "~> 0.1"
28
+ end
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Nessus6
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/Nessus6`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'Nessus6'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install Nessus6
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ 1. Fork it ( https://github.com/[my-github-username]/Nessus6/fork )
36
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
37
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
38
+ 4. Push to the branch (`git push origin my-new-feature`)
39
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "Nessus6"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/lib/Nessus6.rb ADDED
@@ -0,0 +1,63 @@
1
+ require 'hurley'
2
+ require 'Nessus6/version'
3
+ require 'Nessus6/editor/methods'
4
+ require 'Nessus6/session/methods'
5
+ require 'Nessus6/users/methods'
6
+ require 'Nessus6/file/methods'
7
+ require 'Nessus6/folders/methods'
8
+ require 'Nessus6/groups/methods'
9
+ require 'Nessus6/permissions/methods'
10
+ require 'Nessus6/scans/methods'
11
+
12
+ module Nessus6
13
+ # The Client class is used to interact with the Nessus API
14
+ class Client
15
+ attr_reader :client, :editor, :session, :users, :file, :folders, :groups,
16
+ :permissions, :scans
17
+
18
+ def initialize(credentials, nessus)
19
+ nessus[:port] = '8834' unless nessus.key?(:port)
20
+
21
+ # Create our client
22
+ @client = Hurley::Client.new 'https://' + nessus[:ip] + ':' + nessus[:port]
23
+ @client.ssl_options.skip_verification = true
24
+
25
+ authenticate credentials
26
+
27
+ build_clients @client
28
+
29
+ @client
30
+ end
31
+
32
+ def authenticate(credentials)
33
+ # Open up a session and get our token so we can make queries
34
+ @session = Nessus6::Session.new @client
35
+ if credentials[:username] && credentials[:password]
36
+ @token = @session.create(credentials[:username], credentials[:password])
37
+ @client.header['X-Cookie'] = "token = #{@token}"
38
+ elsif credentials[:access_key] && credentials[:secret_key]
39
+ else
40
+ fail AuthenticationError, 'Authentication credentials not provided. ' \
41
+ 'Must provided either username and password or access key and' \
42
+ ' secret key.'
43
+ end
44
+ end
45
+
46
+ def logout
47
+ @session.destroy
48
+ end
49
+
50
+ private
51
+
52
+ def build_clients(client)
53
+ @session = Nessus6::Session.new client
54
+ @editor = Nessus6::Editor.new client
55
+ @users = Nessus6::Users.new client
56
+ @file = Nessus6::File.new client
57
+ @folders = Nessus6::Folders.new client
58
+ @groups = Nessus6::Groups.new client
59
+ @permissions = Nessus6::Permissions.new client
60
+ @scans = Nessus6::Scans.new client
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,108 @@
1
+ require 'json'
2
+ require 'Nessus6/errors/forbidden'
3
+ require 'Nessus6/errors/not_found'
4
+ require 'Nessus6/errors/unknown'
5
+
6
+ module Nessus6
7
+ # The Editor class is for interacting with Nessus6 templates
8
+ class Editor
9
+ def initialize(client)
10
+ @client = client
11
+ end
12
+
13
+ def audits(type, object_id, file_id)
14
+ response = @client.get("editor/#{type}/#{object_id}/audits/#{file_id}")
15
+ verify_audits response
16
+ end
17
+
18
+ def details(type, template_uuid)
19
+ response = @client.get("editor/#{type}/templates/#{template_uuid}")
20
+ verify_details response
21
+ end
22
+
23
+ def edit(type, id)
24
+ response = @client.get("editor/#{type}/#{id}")
25
+ verify_edit response
26
+ end
27
+
28
+ def list(type)
29
+ response = @client.get("editor/#{type}/templates")
30
+ verify response
31
+ end
32
+
33
+ def plugin_description(policy_id, family_id, plugin_id)
34
+ response = @client.get("editor/policy/#{policy_id}/families/#{family_id}/plugins/#{plugin_id}")
35
+ verify_plugin_description response
36
+ end
37
+
38
+ private
39
+
40
+ def verify_audits(response)
41
+ case response.status_code
42
+ when 200
43
+ return JSON.parse response.body
44
+ when 403
45
+ fail ForbiddenError,
46
+ 'You do not have permission to export the audit file'
47
+ when 404
48
+ fail NotFoundError, 'Audit file does not exist'
49
+ else
50
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
51
+ 'for further details.'
52
+ end
53
+ end
54
+
55
+ def verify_details(response)
56
+ case response.status_code
57
+ when 200
58
+ return JSON.parse response.body
59
+ when 403
60
+ fail ForbiddenError,
61
+ 'You do not have permission to open the template'
62
+ when 404
63
+ fail NotFoundError, 'Template does not exist'
64
+ else
65
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
66
+ 'for further details.'
67
+ end
68
+ end
69
+
70
+ def verify_edit(response)
71
+ case response.status_code
72
+ when 200
73
+ return JSON.parse response.body
74
+ when 403
75
+ fail ForbiddenError,
76
+ 'You do not have permission to open the object'
77
+ when 404
78
+ fail NotFoundError, 'Object does not exist'
79
+ else
80
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
81
+ 'for further details.'
82
+ end
83
+ end
84
+
85
+ def verify_list(response)
86
+ case response.status_code
87
+ when 200
88
+ return JSON.parse response.body
89
+ when 403
90
+ fail ForbiddenError,
91
+ 'You do not have permission to view the list'
92
+ else
93
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
94
+ 'for further details.'
95
+ end
96
+ end
97
+
98
+ def verify_plugin_description(response)
99
+ case response.status_code
100
+ when 200
101
+ return JSON.parse response.body
102
+ else
103
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
104
+ 'for further details.'
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,7 @@
1
+ # BadRequestError represents HTTP 400 Responses
2
+ # The server cannot or will not process the request
3
+ # due to something that is perceived to be a client
4
+ # error (e.g. malformed request syntax, invalid request
5
+ # message framing, or deceptive request routing)
6
+ class BadRequestError < StandardError
7
+ end
@@ -0,0 +1,6 @@
1
+ # ConflictError represents HTTP 409 Responses
2
+ # Indicates that the request could not be processed
3
+ # because of a conflict in the request such as an
4
+ # edit conflict in the case of multiple updates.
5
+ class ConflictError < StandardError
6
+ end
@@ -0,0 +1,6 @@
1
+ # ForbiddenError represents HTTP 403 Responses
2
+ # The request was a valid request, but the server
3
+ # is refusing to respond to it. Unlike 401 Unauthorized
4
+ # responses, authenticating will make no difference
5
+ class ForbiddenError < StandardError
6
+ end
@@ -0,0 +1,5 @@
1
+ # InternalServerError represents HTTP 500 Responses
2
+ # A generic error message, given when an unexpected condition
3
+ # was encountered and no more specific message is suitable
4
+ class InternalServerError < StandardError
5
+ end
@@ -0,0 +1,6 @@
1
+ # NotFoundError represents HTTP 404 Responses
2
+ # The requested resource could not be found but may be
3
+ # available again in the future. Subsequent requests by
4
+ # the client are permissible.
5
+ class NotFoundError < StandardError
6
+ end
@@ -0,0 +1,8 @@
1
+ # UnauthorizedError represents HTTP 401 Responses
2
+ # Similar to 403 Forbidden, but specifically for use
3
+ # when authentication is required and has failed or has
4
+ # not yet been provided. The response must include a
5
+ # WWW-Authenticate header field containing a challenge
6
+ # applicable to the requested resource
7
+ class UnauthorizedError < StandardError
8
+ end
@@ -0,0 +1,4 @@
1
+ # UnknownError represents something that Nessus doesn't
2
+ # provide an HTTP code for
3
+ class UnknownError < StandardError
4
+ end
@@ -0,0 +1,34 @@
1
+ require 'json'
2
+ require 'hurley'
3
+ require 'Nessus6/errors/internal_server_error'
4
+ require 'Nessus6/errors/unknown'
5
+
6
+ module Nessus6
7
+ # The Editor class is for interacting with Nessus6 templates
8
+ class File
9
+ def initialize(client)
10
+ @client = client
11
+ end
12
+
13
+ def upload(file_path, file_type, encrypted = 0)
14
+ response = @client.post('file/upload',
15
+ file: Hurley::UploadIO.new(file_path, file_type),
16
+ no_enc: encrypted)
17
+ verify_upload response
18
+ end
19
+
20
+ private
21
+
22
+ def verify_upload(response)
23
+ case response.status_code
24
+ when 200
25
+ return JSON.parse response.body
26
+ when 500
27
+ fail InternalServerError, 'File failed to upload'
28
+ else
29
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
30
+ 'for further details.'
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,100 @@
1
+ require 'json'
2
+ require 'Nessus6/errors/internal_server_error'
3
+ require 'Nessus6/errors/forbidden'
4
+ require 'Nessus6/errors/bad_request'
5
+ require 'Nessus6/errors/not_found'
6
+ require 'Nessus6/errors/unknown'
7
+
8
+ module Nessus6
9
+ # The Editor class is for interacting with Nessus6 templates
10
+ class Folders
11
+ def initialize(client)
12
+ @client = client
13
+ end
14
+
15
+ def create(name)
16
+ response = @client.post('folders', name: name)
17
+ verify_create response
18
+ end
19
+
20
+ def delete(folder_id)
21
+ response = @client.delete("folders/#{folder_id}")
22
+ verify_delete response
23
+ end
24
+
25
+ def edit(folder_id, name)
26
+ response = @client.put("folders/#{folder_id}", name: name)
27
+ verify_edit response
28
+ end
29
+
30
+ alias_method :rename, :edit
31
+
32
+ def list
33
+ response = @client.get('folders')
34
+ verify_list response
35
+ end
36
+
37
+ private
38
+
39
+ def verify_create(response)
40
+ case response.status_code
41
+ when 200
42
+ return JSON.parse response.body
43
+ when 400
44
+ fail BadRequestError, 'Folder name is invalid'
45
+ when 403
46
+ fail ForbiddenError, 'You do not have permission to create a folder'
47
+ when 500
48
+ fail InternalServerError, 'Server failed to create the folder'
49
+ else
50
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
51
+ 'for further details.'
52
+ end
53
+ end
54
+
55
+ def verify_delete(response)
56
+ case response.status_code
57
+ when 200
58
+ return JSON.parse response.body
59
+ when 403
60
+ fail ForbiddenError, 'Cannot delete a system folder'
61
+ when 404
62
+ fail NotFoundError, 'Folder does not exist'
63
+ when 500
64
+ fail InternalServerError, 'Server failed to delete the folder'
65
+ else
66
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
67
+ 'for further details.'
68
+ end
69
+ end
70
+
71
+ def verify_edit(response)
72
+ case response.status_code
73
+ when 200
74
+ return JSON.parse response.body
75
+ when 403
76
+ fail ForbiddenError, 'Cannot rename a system folder'
77
+ when 404
78
+ fail NotFoundError, 'Folder does not exist'
79
+ when 500
80
+ fail InternalServerError, 'Server failed to rename the folder'
81
+ else
82
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
83
+ 'for further details.'
84
+ end
85
+ end
86
+
87
+ def verify_list(response)
88
+ case response.status_code
89
+ when 200
90
+ return JSON.parse response.body
91
+ when 403
92
+ fail ForbiddenError,
93
+ 'You do not have permission to view the folder list'
94
+ else
95
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
96
+ 'for further details.'
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,167 @@
1
+ require 'json'
2
+ require 'Nessus6/errors/internal_server_error' # 500
3
+ require 'Nessus6/errors/forbidden' # 403
4
+ require 'Nessus6/errors/bad_request' # 400
5
+ require 'Nessus6/errors/not_found' # 404
6
+ require 'Nessus6/errors/unknown'
7
+
8
+ module Nessus6
9
+ # The Editor class is for interacting with Nessus6 templates
10
+ class Groups
11
+ def initialize(client)
12
+ @client = client
13
+ end
14
+
15
+ def add_user(group_id, user_id)
16
+ response = @client.post("groups/#{group_id}/users/#{user_id}")
17
+ verify_add_user response
18
+ end
19
+
20
+ def create(name)
21
+ response = @client.post('groups', name: name)
22
+ verify_create response
23
+ end
24
+
25
+ def delete(group_id)
26
+ response = @client.delete("groups/#{group_id}")
27
+ verify_delete response
28
+ end
29
+
30
+ def delete_user(group_id, user_id)
31
+ response = @client.delete("groups/#{group_id}/users/#{user_id}")
32
+ verify_delete_user response
33
+ end
34
+
35
+ def edit(group_id, name)
36
+ response = @client.put("groups/#{group_id}", name: name)
37
+ verify_edit response
38
+ end
39
+
40
+ alias_method :rename, :edit
41
+
42
+ def list
43
+ response = @client.get('groups')
44
+ verify_list response
45
+ end
46
+
47
+ def list_users(group_id)
48
+ response = @client.get("groups/#{group_id}/users")
49
+ verify_list_users response
50
+ end
51
+
52
+ private
53
+
54
+ def verify_add_user(response)
55
+ case response.status_code
56
+ when 200
57
+ return JSON.parse response.body
58
+ when 403
59
+ fail ForbiddenError,
60
+ 'You do not have permission to add users to a group'
61
+ when 404
62
+ fail NotFoundError, 'Group or user does not exist'
63
+ when 500
64
+ fail InternalServerError, 'Server failed to add the user to the group'
65
+ else
66
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
67
+ 'for further details.'
68
+ end
69
+ end
70
+
71
+ def verify_create(response)
72
+ case response.status_code
73
+ when 200
74
+ return JSON.parse response.body
75
+ when 400
76
+ fail BadRequestError, 'Field is invalid'
77
+ when 403
78
+ fail ForbiddenError, 'You do not have permission to create a group'
79
+ when 500
80
+ fail InternalServerError, 'Server failed to create the group'
81
+ else
82
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
83
+ 'for further details.'
84
+ end
85
+ end
86
+
87
+ def verify_delete(response)
88
+ case response.status_code
89
+ when 200
90
+ return JSON.parse response.body
91
+ when 400
92
+ fail BadRequestError, 'Group does not exist'
93
+ when 403
94
+ fail ForbiddenError, 'You do not have permission to delete the group'
95
+ when 500
96
+ fail InternalServerError, 'Server failed to delete the group'
97
+ else
98
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
99
+ 'for further details.'
100
+ end
101
+ end
102
+
103
+ def verify_delete_user(response)
104
+ case response.status_code
105
+ when 200
106
+ return JSON.parse response.body
107
+ when 403
108
+ fail ForbiddenError,
109
+ 'You do not have permission to delete users from a group'
110
+ when 404
111
+ fail NotFoundError, 'Group or user does not exist'
112
+ when 500
113
+ fail InternalServerError,
114
+ 'Server failed to remove the user from the group'
115
+ else
116
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
117
+ 'for further details.'
118
+ end
119
+ end
120
+
121
+ def verify_edit(response)
122
+ case response.status_code
123
+ when 200
124
+ return JSON.parse response.body
125
+ when 400
126
+ fail BadRequestError, 'Field is invalid'
127
+ when 403
128
+ fail ForbiddenError, 'You do not have permission to edit a group'
129
+ when 404
130
+ fail NotFoundError, 'Group does not exist'
131
+ when 500
132
+ fail InternalServerError, 'Server failed to edit / rename the group'
133
+ else
134
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
135
+ 'for further details.'
136
+ end
137
+ end
138
+
139
+ def verify_list(response)
140
+ case response.status_code
141
+ when 200
142
+ return JSON.parse response.body
143
+ when 403
144
+ fail ForbiddenError,
145
+ 'You do not have permission to view the groups list'
146
+ else
147
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
148
+ 'for further details.'
149
+ end
150
+ end
151
+
152
+ def verify_list_users(response)
153
+ case response.status_code
154
+ when 200
155
+ return JSON.parse response.body
156
+ when 403
157
+ fail ForbiddenError,
158
+ 'You do not have permission to view the groups users list'
159
+ when 404
160
+ fail NotFoundError, 'Group does not exist'
161
+ else
162
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
163
+ 'for further details.'
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,54 @@
1
+ require 'json'
2
+ require 'Nessus6/errors/forbidden' # 403
3
+ require 'Nessus6/errors/not_found' # 404
4
+ require 'Nessus6/errors/unknown'
5
+
6
+ module Nessus6
7
+ # The Editor class is for interacting with Nessus6 templates
8
+ class Permissions
9
+ def initialize(client)
10
+ @client = client
11
+ end
12
+
13
+ def change(object_type, object_id, permissions)
14
+ response = @client.put("permissions/#{object_type}/#{object_id}",
15
+ body: permissions)
16
+ verify_change response
17
+ end
18
+
19
+ def list(object_type, object_id)
20
+ response = @client.get("permissions/#{object_type}/#{object_id}")
21
+ verify_list response
22
+ end
23
+
24
+ private
25
+
26
+ def verify_change(response)
27
+ case response.status_code
28
+ when 200
29
+ return JSON.parse response.body
30
+ when 403
31
+ fail ForbiddenError, 'You do not have permission to edit the object'
32
+ when 404
33
+ fail NotFoundError, 'Object does not exist'
34
+ else
35
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
36
+ 'for further details.'
37
+ end
38
+ end
39
+
40
+ def verify_list(response)
41
+ case response.status_code
42
+ when 200
43
+ return JSON.parse response.body
44
+ when 403
45
+ fail ForbiddenError, 'You do not have permission to view the object'
46
+ when 404
47
+ fail NotFoundError, 'Object does not exist'
48
+ else
49
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
50
+ 'for further details.'
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,88 @@
1
+ require 'json'
2
+ require 'Nessus6/errors/forbidden' # 403
3
+ require 'Nessus6/errors/not_found' # 404
4
+ require 'Nessus6/errors/conflict' # 409
5
+ require 'Nessus6/errors/internal_server_error' # 500
6
+ require 'Nessus6/errors/unknown'
7
+
8
+ module Nessus6
9
+ # The Editor class is for interacting with Nessus6 templates
10
+ class Scans
11
+ def initialize(client)
12
+ @client = client
13
+ end
14
+
15
+ def launch(scan_id, alt_targets = nil)
16
+ if alt_targets.is_a? Array
17
+ response = @client.post "scans/#{scan_id}/launch",
18
+ alt_targets: alt_targets
19
+ else
20
+ response = @client.post "scans/#{scan_id}/launch"
21
+ end
22
+
23
+ verify_launch response
24
+ end
25
+
26
+ def list
27
+ response = @client.get 'scans'
28
+ JSON.parse response.body
29
+ end
30
+
31
+ def pause(scan_id)
32
+ response = @client.post "scans/#{scan_id}/pause"
33
+ verify_pause response
34
+ end
35
+
36
+ def stop(scan_id)
37
+ response = @client.post "scans/#{scan_id}/stop"
38
+ verify_stop response
39
+ end
40
+
41
+ private
42
+
43
+ def verify_launch(response)
44
+ case response.status_code
45
+ when 200
46
+ return JSON.parse response.body
47
+ when 403
48
+ fail ForbiddenError, 'This scan is disabled.'
49
+ when 404
50
+ fail NotFoundError, 'Scan does not exist.'
51
+ when 500
52
+ fail InternalServerError, 'Failed to launch scan. This is usually due to the'\
53
+ ' scan already running.'
54
+ else
55
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
56
+ 'for further details.'
57
+ end
58
+ end
59
+
60
+ def verify_pause(response)
61
+ case response.status_code
62
+ when 200
63
+ return JSON.parse response.body
64
+ when 403
65
+ fail ForbiddenError, 'This scan is disabled.'
66
+ when 409
67
+ fail ConflictError, 'Scan is not active.'
68
+ else
69
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
70
+ 'for further details.'
71
+ end
72
+ end
73
+
74
+ def verify_stop(response)
75
+ case response.status_code
76
+ when 200
77
+ return JSON.parse response.body
78
+ when 404
79
+ fail NotFoundError, 'Scan does not exist.'
80
+ when 409
81
+ fail ConflictError, 'Scan is not active.'
82
+ else
83
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
84
+ 'for further details.'
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,142 @@
1
+ require 'json'
2
+ require 'Nessus6/errors/bad_request'
3
+ require 'Nessus6/errors/forbidden'
4
+ require 'Nessus6/errors/internal_server_error'
5
+ require 'Nessus6/errors/unauthorized'
6
+ require 'Nessus6/errors/unknown'
7
+
8
+ module Nessus6
9
+ class Session
10
+ attr_reader :token
11
+
12
+ def initialize(client)
13
+ @client = client
14
+ end
15
+
16
+ def create(username, password)
17
+ response = @client.post('session',
18
+ username: username, password: password)
19
+ verified = verify_create response
20
+ @token = verified['token']
21
+ end
22
+
23
+ def destroy
24
+ response = @client.delete('session')
25
+
26
+ case response.status_code
27
+ when 200
28
+ @token = ''
29
+ return true
30
+ when 401
31
+ fail 'No session exists'
32
+ else
33
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
34
+ 'for further details.'
35
+ end
36
+ end
37
+
38
+ def edit(user)
39
+ if user[:name] && user[:email]
40
+ response = @client.put('session', name: user[:name],
41
+ email: user[:email])
42
+ elsif user[:name]
43
+ response = @client.put('session', name: user[:name])
44
+ elsif user[:email]
45
+ response = @client.put('session', email: user[:email])
46
+ else
47
+ fail "User's name or email was not provided in hash form."
48
+ end
49
+ verify_edit response
50
+ end
51
+
52
+ def get
53
+ verify_get @client.get('session')
54
+ end
55
+
56
+ def password(new_password)
57
+ response = @client.put('session/chpasswd', password: new_password)
58
+ verify_password response
59
+ end
60
+
61
+ def keys
62
+ response = @client.put('session/keys')
63
+ verify_keys response
64
+ end
65
+
66
+ private
67
+
68
+ def verify_create(response)
69
+ case response.status_code
70
+ when 200
71
+ return JSON.parse response.body
72
+ when 400
73
+ fail BadRequestError, 'Username format is not valid'
74
+ when 401
75
+ fail UnauthorizedError, 'Username or password is invalid'
76
+ when 500
77
+ fail InternalServerError, 'Too many users are connected'
78
+ else
79
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
80
+ 'for further details.'
81
+ end
82
+ end
83
+
84
+ def verify_edit(response)
85
+ case response.status_code
86
+ when 200
87
+ return JSON.parse response.body
88
+ when 403
89
+ fail ForbiddenError,
90
+ 'You do not have permission to edit the session data'
91
+ when 500
92
+ fail InternalServerError, 'Server failed to edit the user'
93
+ else
94
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
95
+ 'for further details.'
96
+ end
97
+ end
98
+
99
+ def verify_get(response)
100
+ case response.status_code
101
+ when 200
102
+ return JSON.parse response.body
103
+ when 403
104
+ fail ForbiddenError,
105
+ 'You do not have permission to view the session data'
106
+ else
107
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
108
+ 'for further details.'
109
+ end
110
+ end
111
+
112
+ def verify_password(response)
113
+ case response.status_code
114
+ when 200
115
+ return JSON.parse response.body
116
+ when 400
117
+ fail BadRequestError, 'Password is too short'
118
+ when 401
119
+ fail UnauthorizedError,
120
+ 'You do not have permission to change this password'
121
+ when 500
122
+ fail InternalServerError, 'Server failed to change the password'
123
+ else
124
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
125
+ 'for further details.'
126
+ end
127
+ end
128
+
129
+ def verify_keys(response)
130
+ case response.status_code
131
+ when 200
132
+ return JSON.parse response.body
133
+ when 401
134
+ fail UnauthorizedError,
135
+ 'You are not logged in / authenticated'
136
+ else
137
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
138
+ 'for further details.'
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,180 @@
1
+ require 'json'
2
+ require 'Nessus6/errors/bad_request'
3
+ require 'Nessus6/errors/conflict'
4
+ require 'Nessus6/errors/forbidden'
5
+ require 'Nessus6/errors/internal_server_error'
6
+ require 'Nessus6/errors/not_found'
7
+ require 'Nessus6/errors/unknown'
8
+
9
+ module Nessus6
10
+ class Users
11
+ def initialize(client)
12
+ @client = client
13
+ end
14
+
15
+ def create(credentials, user_perm, user_info = {})
16
+ new_user = {}.tap do |user|
17
+ user[:username] = credentials[:username]
18
+ user[:password] = credentials[:password]
19
+ user[:permissions] = user_perm[:permissions]
20
+ user[:type] = user_perm[:type]
21
+ user[:name] = user_info[:name] if user_info.key?(:name)
22
+ user[:email] = user_info[:email] if user_info.key?(:email)
23
+ end
24
+
25
+ response = @client.post('users', new_user)
26
+
27
+ verify_create response
28
+ end
29
+
30
+ def delete(user_id)
31
+ response = @client.delete("users/#{user_id}")
32
+ verify_delete response
33
+ end
34
+
35
+ def edit(user_id, permissions, user_info = {})
36
+ edit_user = {}.tap do |user|
37
+ user[:permissions] = permissions
38
+ user[:name] = user_info[:name] if user_info.key?(:name)
39
+ user[:email] = user_info[:email] if user_info.key?(:email)
40
+ end
41
+ response = @client.post("users/#{user_id}", edit_user)
42
+ verify_edit response
43
+ end
44
+
45
+ def get(user_id)
46
+ response = @client.get("users/#{user_id}")
47
+ verify_get response
48
+ end
49
+
50
+ def list
51
+ response = @client.get('users')
52
+ verify_list response
53
+ end
54
+
55
+ def password(user_id, new_password)
56
+ response = @client.post("users/#{user_id}/chpasswd",
57
+ password: new_password)
58
+ verify_password response
59
+ end
60
+
61
+ def keys(user_id)
62
+ response = @client.get("users/#{user_id}/keys")
63
+ verify_keys response
64
+ end
65
+
66
+ private
67
+
68
+ def verify_create(response)
69
+ case response.status_code
70
+ when 200
71
+ return JSON.parse response.body
72
+ when 400
73
+ fail BadRequestError, 'Field is invalid'
74
+ when 403
75
+ fail ForbiddenError, 'You do not have permission to create this user'
76
+ when 409
77
+ fail ConflictError, 'User already exists'
78
+ else
79
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
80
+ 'for further details.'
81
+ end
82
+ end
83
+
84
+ def verify_delete(response)
85
+ case response.status_code
86
+ when 200
87
+ return true
88
+ when 403
89
+ fail ForbiddenError, 'Not authorized to delete users'
90
+ when 404
91
+ fail NotFoundError, 'You do not have permission to delete this user'
92
+ when 409
93
+ fail ConflictError, 'Cannot delete your own account'
94
+ when 500
95
+ fail InternalServerError,
96
+ 'Failed to delete the user due to an interal server error'
97
+ else
98
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
99
+ 'for further details.'
100
+ end
101
+ end
102
+
103
+ def verify_edit(response)
104
+ case response.status_code
105
+ when 200
106
+ return JSON.parse response.body
107
+ when 400
108
+ fail BadRequestError, 'Field is invalid'
109
+ when 403
110
+ fail ForbiddenError, 'You do not have permission to edit this user'
111
+ when 404
112
+ fail NotFoundError, 'User does not exist'
113
+ when 409
114
+ fail ConflictError, 'Cannot edit your own permissions'
115
+ else
116
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
117
+ 'for further details.'
118
+ end
119
+ end
120
+
121
+ def verify_get(response)
122
+ case response.status_code
123
+ when 200
124
+ return JSON.parse response.body
125
+ when 404
126
+ fail NotFoundError, 'User does not exist'
127
+ else
128
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
129
+ 'for further details.'
130
+ end
131
+ end
132
+
133
+ def verify_list(response)
134
+ case response.status_code
135
+ when 200
136
+ return JSON.parse response.body
137
+ when 403
138
+ fail ForbiddenError, 'You do not have permission to view the list'
139
+ else
140
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
141
+ 'for further details.'
142
+ end
143
+ end
144
+
145
+ def verify_password(response)
146
+ case response.status_code
147
+ when 200
148
+ return true
149
+ when 400
150
+ fail BadRequestError, 'Password is too short'
151
+ when 403
152
+ fail ForbiddenError,
153
+ 'You do not have permission to change the users password'
154
+ when 404
155
+ fail NotFoundError, 'User does not exist'
156
+ when 500
157
+ fail InternalServerError, 'Server failed to change the password'
158
+ else
159
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
160
+ 'for further details.'
161
+ end
162
+ end
163
+
164
+ def verify_keys(response)
165
+ case response.status_code
166
+ when 200
167
+ return JSON.parse response.body
168
+ when 403
169
+ fail ForbiddenError, 'You do not have permission to generate API keys'
170
+ when 404
171
+ fail NotFoundError, 'User does not exist'
172
+ when 500
173
+ fail InternalServerError, 'Server failed to change the keys'
174
+ else
175
+ fail UnknownError, 'An unknown error occurred. Please consult Nessus' \
176
+ 'for further details.'
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,3 @@
1
+ module Nessus6
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: Nessus6
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kevin Kirsche
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hurley
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.1'
69
+ description: Gem for interacting with the Tenable Nessus 6 REST API.
70
+ email:
71
+ - kev.kirsche@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
+ - Gemfile
79
+ - Nessus6.gemspec
80
+ - README.md
81
+ - Rakefile
82
+ - bin/console
83
+ - bin/setup
84
+ - lib/Nessus6.rb
85
+ - lib/Nessus6/editor/methods.rb
86
+ - lib/Nessus6/errors/bad_request.rb
87
+ - lib/Nessus6/errors/conflict.rb
88
+ - lib/Nessus6/errors/forbidden.rb
89
+ - lib/Nessus6/errors/internal_server_error.rb
90
+ - lib/Nessus6/errors/not_found.rb
91
+ - lib/Nessus6/errors/unauthorized.rb
92
+ - lib/Nessus6/errors/unknown.rb
93
+ - lib/Nessus6/file/methods.rb
94
+ - lib/Nessus6/folders/methods.rb
95
+ - lib/Nessus6/groups/methods.rb
96
+ - lib/Nessus6/permissions/methods.rb
97
+ - lib/Nessus6/scans/methods.rb
98
+ - lib/Nessus6/session/methods.rb
99
+ - lib/Nessus6/users/methods.rb
100
+ - lib/Nessus6/version.rb
101
+ homepage: https://github.com/kkirsche/Nessus6
102
+ licenses:
103
+ - Apache-2.0
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 2.0.0
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.4.6
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: "[Under Construction] Nessus 6 API Gem"
125
+ test_files: []