nessus_client 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1dda4cc05fbcee8eac14f8469f106944fa356ec74ecb31e3623c13338ec175f9
4
+ data.tar.gz: db9270a96eb7866357754b65e1d3e17c0c67d9fdc98e5d507104a44fee49ef31
5
+ SHA512:
6
+ metadata.gz: d8c172bec3e3039644a3352dfa279e3799153351936b3d4b9ac86d90e87a31d9d151480e34ef7eb742258b77fdeb28066224216c07ae5a2cf31c9fb5771f8e8b
7
+ data.tar.gz: 74dff229a778e97680bde8f690c845e84767b3da1847459577a377d2cfea2febc35f53c8fd1aac1befce5138c450cc7092c3b71d5f35cd840edd516dd4012461
File without changes
@@ -0,0 +1,39 @@
1
+ NessusApi
2
+ =========
3
+ **Ruby wrapper for Nessus API**
4
+
5
+ * [Source Code]
6
+ * [API documentation]
7
+ * [Changelog]
8
+ * [Rubygem]
9
+
10
+
11
+ Ruby wrapper for Nessus API (all verions)
12
+
13
+ ## Contact
14
+
15
+ *Code and Bug Reports*
16
+
17
+ * [Issue Tracker](https://github.com/heyder/nessus_client/issues)
18
+ * See [CONTRIBUTING](https://github.com/heyder/nessus_client/blob/master/CONTRIBUTING.md) for how to contribute along
19
+ with some common problems to check out before creating an issue.
20
+
21
+
22
+ Getting started
23
+ ---------------
24
+
25
+
26
+
27
+
28
+ ## Code of Conduct
29
+
30
+ Everyone participating in this project's development, issue trackers and other channels is expected to follow our
31
+ [Code of Conduct](./CODE_OF_CONDUCT.md)
32
+
33
+ ## Contributing
34
+
35
+ See the [contributing guide](https://github.com/heyder/nessus_client/blob/master/CONTRIBUTING.md).
36
+
37
+ ## Copyright
38
+
39
+ Copyright (c) 2016-2019 Heyder Andrade. See MIT-LICENSE for details.
@@ -0,0 +1,15 @@
1
+ # require_relative '../nessus_client/request'
2
+
3
+ module NessusClient::Exports
4
+ # export scans
5
+ def export_request( scan_id, format )
6
+ params = {:format => format }
7
+ self.request.post("/scans/#{scan_id}/export", params)
8
+ end
9
+ def export_status( export_id )
10
+ self.request.get("/tokens/#{export_id}/status")
11
+ end
12
+ def export_download( export_id )
13
+ self.request.get("/tokens/#{export_id}/download")
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ # require_relative '../nessus_client/request'
2
+
3
+ module NessusClient::Folders
4
+ # folders
5
+ def list_folders
6
+ self.request.get("/folders")
7
+ end
8
+ def create_folder( folder_name )
9
+ params = {:name => folder_name }.to_json
10
+ self.request.post("/folders", params)
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # require_relative '../nessus_client/request'
2
+
3
+ module NessusClient::Policies
4
+ def policies
5
+ self.request.get( "/policies" )
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+
2
+ module NessusClient::Scans
3
+
4
+ def list_scans( folder_id=nil )
5
+ query = folder_id.nil? ? nil : { "folder_id" => folder_id }
6
+ self.request.get( "/scans", nil, query )
7
+ end
8
+ alias_method :scans, :list_scans
9
+
10
+ def scan_details( scan_id, history_id=nil )
11
+ query = history_id.nil? ? nil : { "history_id" => history_id }
12
+ self.request.get( "/scans/#{scan_id}", nil, query )
13
+ end
14
+
15
+ def launch_by_name( scan_name, targets=[] )
16
+ scan_id = get_scan_by_name( scan_name )
17
+ params = { :alt_targets => targets } unless targets.empty?
18
+ self.request.post( "/scans/#{scan_id}/launch", params )
19
+ end
20
+
21
+ def get_scan_by_name( folder_id=nil, name )
22
+ Oj.load(list_scans( folder_id ))["scans"].each do |scan|
23
+ return scan['id'] if scan['name'] == name
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,53 @@
1
+ # require 'pry'
2
+ require_relative 'nessus_client/version'
3
+ require_relative 'nessus_client/exception'
4
+
5
+ Dir[File.join(__dir__, 'modules', '*.rb')].each { |file| require file }
6
+
7
+ class NessusClient
8
+
9
+ attr_reader :request, :session
10
+
11
+ include NessusClient::Scans
12
+ include NessusClient::Exports
13
+ include NessusClient::Folders
14
+ include NessusClient::Policies
15
+
16
+ autoload :Request, "nessus_client/request"
17
+ autoload :Session, "nessus_client/session"
18
+
19
+ def initialize( params={uri: nil, username: nil, password: nil, :ssl_verify_peer => false} )
20
+ @has_session = false
21
+ req_params = params.select {|key, value| [:uri, :ssl_verify_peer].include?(key) }
22
+ # session_params = params.select {|key, value| [:username, :password].include?(key) }
23
+
24
+ @request = NessusClient::Request.new( req_params )
25
+ @session = NessusClient::Session.create( params.fetch(:username), params.fetch(:password) )
26
+
27
+ if @session.token
28
+ begin
29
+ @has_session = true
30
+ # NessusClient::Request.headers.update( 'X-Cookie' => 'token=' + api_session.token )
31
+ @request.headers.update( 'X-Cookie' => 'token=' + @session.token )
32
+ @session.set_api_token
33
+ rescue NessusClient::Error => err
34
+ puts err.message
35
+ else
36
+ request.headers.update( 'X-API-Token' => @session.api_token )
37
+ ensure
38
+ return
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ def has_session?
46
+ @has_session
47
+ end
48
+
49
+ def status
50
+ self.request.get( "/server/status" )
51
+ end
52
+
53
+ end
@@ -0,0 +1,7 @@
1
+ class NessusClient
2
+ class Error < ::StandardError
3
+ def initialize(msg="message")
4
+ super
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,76 @@
1
+ require 'excon'
2
+ require 'json'
3
+ # require 'pry'
4
+ class NessusClient
5
+
6
+ # Excon.defaults[:ssl_verify_peer] = false
7
+ # This class should be used to in all requests classes
8
+
9
+ class Request
10
+ # attr_accessor :headers
11
+ attr_reader :url, :headers
12
+
13
+ DEFAULT_HEADERS = {
14
+ "User-Agent" => "Mozilla/5.0 (Linux x86_64)",
15
+ "Content-Type" => "application/json"
16
+ }
17
+
18
+ def initialize( params )
19
+ params = {:uri => nil, :ssl_verify_peer => false, :headers => {} }.merge( params )
20
+ @@ssl_verify_peer = params.fetch(:ssl_verify_peer)
21
+ @url = @@url = NessusClient::Request.uri_parse( params.fetch(:uri) )
22
+ @headers = params.fetch( :headers ).merge( DEFAULT_HEADERS )
23
+ end
24
+
25
+ # def self.headers
26
+ # @@headers
27
+ # end
28
+ def headers=(value)
29
+ raise NotImplementedError.new("Use update from Hash insted.")
30
+ end
31
+
32
+ def get( path=nil, payload=nil, query=nil )
33
+ http_request( :get, path, payload, query )
34
+ end
35
+
36
+ def post( path=nil, payload=nil, query=nil )
37
+ http_request( :post, path, payload, query )
38
+ end
39
+
40
+ def delete( path=nil, payload=nil, query=nil )
41
+ http_request( :delete, path, payload, query )
42
+ end
43
+
44
+ def self.uri_parse( uri )
45
+ url = URI.parse( uri )
46
+ raise URI::InvalidURIError unless url.scheme
47
+ return url.to_s
48
+ end
49
+
50
+ private
51
+
52
+ def http_request( method=:get, path, payload, query )
53
+ # binding.pry
54
+ connection = Excon.new( @@url )
55
+
56
+ body = payload ? payload.to_json : ''
57
+ options = {
58
+ method: method,
59
+ path: path,
60
+ body: body,
61
+ query: query,
62
+ headers: @headers,
63
+ ssl_verify_peer: @@ssl_verify_peer,
64
+ #idempotent: true,
65
+ #proxy: "http://127.0.0.1:8080",
66
+ expects: [200, 201]
67
+ }
68
+ response = connection.request( options )
69
+
70
+ return response.body if response.body.length > 0
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
@@ -0,0 +1,56 @@
1
+ require 'oj'
2
+ require_relative 'request'
3
+ require_relative 'exception'
4
+
5
+ class NessusClient
6
+
7
+ # This class should be used to get an access token
8
+ # for use with the main client class.
9
+ class Session
10
+ attr_reader :token, :api_token
11
+
12
+ @token = @api_token = nil
13
+
14
+ # @param [String] username
15
+ # @param [String] password
16
+ def self.create( username, password )
17
+
18
+ payload = {
19
+ username: username,
20
+ password: password,
21
+ }
22
+
23
+ response = NessusClient::Request.post( '/session', payload )
24
+ response = Oj.load(response) if response.length > 0
25
+
26
+ if response['token']
27
+ return self.new( response['token'] )
28
+ else
29
+ raise NessusClient::Error.new "#{__method__}::Response did not include a session token."
30
+ end
31
+
32
+ end
33
+
34
+ def initialize( token )
35
+ @token = token
36
+ end
37
+
38
+ def set_api_token
39
+ response = NessusClient::Request.get( "/nessus6.js" )
40
+ response.match( %r{return"(\w{8}-(?:\w{4}-){3}\w{12})"\}} )
41
+
42
+ raise NessusClient::Error.new( "Unable to get API Token. Some features won't work." ) unless $1#.nil?
43
+
44
+ @api_token = $1
45
+
46
+ end
47
+
48
+ def destroy
49
+ NessusClient::Request.delete( '/session', nil )
50
+ @token = nil
51
+ end
52
+ alias_method :logout , :destroy
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,3 @@
1
+ class NessusClient
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nessus_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Heyder
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: excon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.62'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.62'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oj
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.7'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.12'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.12'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.12.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.12.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.17.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.17.0
111
+ description: Ruby wrapper for Nessus API (all verions)
112
+ email: eu@heyderandrade.org
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files:
116
+ - README.md
117
+ - CONTRIBUTING.md
118
+ files:
119
+ - CONTRIBUTING.md
120
+ - README.md
121
+ - lib/modules/exports.rb
122
+ - lib/modules/folders.rb
123
+ - lib/modules/policies.rb
124
+ - lib/modules/scans.rb
125
+ - lib/nessus_client.rb
126
+ - lib/nessus_client/exception.rb
127
+ - lib/nessus_client/request.rb
128
+ - lib/nessus_client/session.rb
129
+ - lib/nessus_client/version.rb
130
+ homepage: https://rubygemspec.org/gems/nessus_client
131
+ licenses:
132
+ - MIT
133
+ metadata:
134
+ source_code_uri: https://github.com/heyder/nessus_client
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: 2.5.1
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubygems_version: 3.0.3
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: Ruby wrapper for Nessus API
154
+ test_files: []