ronin 1.1.0.rc3 → 1.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.
Files changed (66) hide show
  1. data/ChangeLog.md +10 -5
  2. data/Gemfile +1 -1
  3. data/README.md +1 -1
  4. data/Rakefile +4 -4
  5. data/bin/ronin +2 -2
  6. data/bin/ronin-campaigns +2 -2
  7. data/bin/ronin-console +2 -2
  8. data/bin/ronin-creds +2 -2
  9. data/bin/ronin-database +2 -2
  10. data/bin/ronin-emails +2 -2
  11. data/bin/ronin-exec +2 -2
  12. data/bin/ronin-help +2 -2
  13. data/bin/ronin-hosts +2 -2
  14. data/bin/ronin-ips +2 -2
  15. data/bin/ronin-repos +2 -2
  16. data/bin/ronin-urls +2 -2
  17. data/gemspec.yml +2 -4
  18. data/lib/ronin/database/database.rb +12 -13
  19. data/lib/ronin/database/migrations.rb +2 -29
  20. data/lib/ronin/database/migrations/1.0.0.rb +568 -0
  21. data/lib/ronin/database/migrations/1.1.0.rb +125 -0
  22. data/lib/ronin/spec/database.rb +1 -4
  23. data/lib/ronin/target.rb +0 -19
  24. data/lib/ronin/ui/cli/cli.rb +1 -1
  25. data/lib/ronin/ui/cli/commands/database.rb +15 -22
  26. data/lib/ronin/ui/output/output.rb +1 -1
  27. data/lib/ronin/url.rb +23 -24
  28. data/lib/ronin/url_query_param.rb +4 -6
  29. data/lib/ronin/url_query_param_name.rb +89 -0
  30. data/lib/ronin/user_name.rb +0 -2
  31. data/lib/ronin/version.rb +1 -1
  32. data/ronin.gemspec +129 -13
  33. data/spec/host_name_spec.rb +9 -10
  34. data/spec/ip_address.rb +3 -3
  35. data/spec/url_query_param_spec.rb +5 -3
  36. data/spec/url_spec.rb +14 -9
  37. metadata +9 -35
  38. data/lib/ronin/database/migrations/add_created_at_column_to_targets_table.rb +0 -48
  39. data/lib/ronin/database/migrations/add_updated_at_column_to_campaigns_table.rb +0 -47
  40. data/lib/ronin/database/migrations/create_addresses_table.rb +0 -49
  41. data/lib/ronin/database/migrations/create_arches_table.rb +0 -43
  42. data/lib/ronin/database/migrations/create_authors_table.rb +0 -46
  43. data/lib/ronin/database/migrations/create_campaigns_table.rb +0 -43
  44. data/lib/ronin/database/migrations/create_countries_table.rb +0 -43
  45. data/lib/ronin/database/migrations/create_credentials_table.rb +0 -64
  46. data/lib/ronin/database/migrations/create_email_addresses_table.rb +0 -50
  47. data/lib/ronin/database/migrations/create_host_name_ip_addresses_table.rb +0 -50
  48. data/lib/ronin/database/migrations/create_ip_address_mac_addresses_table.rb +0 -50
  49. data/lib/ronin/database/migrations/create_licenses_table.rb +0 -43
  50. data/lib/ronin/database/migrations/create_open_ports_table.rb +0 -56
  51. data/lib/ronin/database/migrations/create_organizations_table.rb +0 -43
  52. data/lib/ronin/database/migrations/create_os_guesses_table.rb +0 -49
  53. data/lib/ronin/database/migrations/create_os_table.rb +0 -42
  54. data/lib/ronin/database/migrations/create_passwords_table.rb +0 -41
  55. data/lib/ronin/database/migrations/create_ports_table.rb +0 -47
  56. data/lib/ronin/database/migrations/create_proxies_table.rb +0 -54
  57. data/lib/ronin/database/migrations/create_repositories_table.rb +0 -60
  58. data/lib/ronin/database/migrations/create_script_paths_table.rb +0 -46
  59. data/lib/ronin/database/migrations/create_services_table.rb +0 -46
  60. data/lib/ronin/database/migrations/create_softwares_table.rb +0 -45
  61. data/lib/ronin/database/migrations/create_targets_table.rb +0 -49
  62. data/lib/ronin/database/migrations/create_url_query_params_table.rb +0 -41
  63. data/lib/ronin/database/migrations/create_url_schemes_table.rb +0 -39
  64. data/lib/ronin/database/migrations/create_urls_table.rb +0 -65
  65. data/lib/ronin/database/migrations/create_user_names_table.rb +0 -42
  66. data/lib/ronin/database/migrations/create_vendors_table.rb +0 -41
@@ -0,0 +1,125 @@
1
+ #
2
+ # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ #
4
+ # This file is part of Ronin.
5
+ #
6
+ # Ronin is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Ronin is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ require 'ronin/database/migrations/1.0.0'
21
+ require 'ronin/campaign'
22
+ require 'ronin/target'
23
+
24
+ module Ronin
25
+ module Database
26
+ module Migrations
27
+ migration :add_updated_at_column_to_campaigns_table,
28
+ :needs => :create_campaigns_table do
29
+ up do
30
+ modify_table :ronin_campaigns do
31
+ add_column :updated_at, Time
32
+ end
33
+
34
+ # set the updated_at column to created_at
35
+ Campaign.each do |campaign|
36
+ campaign.update(:updated_at => campaign.created_at)
37
+ end
38
+ end
39
+ end
40
+
41
+ migration :add_created_at_column_to_targets_table,
42
+ :needs => :create_targets_table do
43
+ up do
44
+ modify_table :ronin_targets do
45
+ add_column :created_at, Time
46
+ end
47
+
48
+ # set the updated_at column to the created_at of the Campaign
49
+ Target.each do |target|
50
+ target.update(:created_at => target.campaign.created_at)
51
+ end
52
+ end
53
+ end
54
+
55
+ migration :create_url_query_param_names_table,
56
+ :needs => :create_url_query_params_table do
57
+ up do
58
+ create_table :ronin_url_query_param_names do
59
+ column :id, Integer, :serial => true
60
+ column :name, String, :length => 256, :not_null => true
61
+ end
62
+
63
+ create_index :ronin_url_query_param_names, :name, :unique => true
64
+
65
+ # select any previous URLQueryParam entries before recreating the table
66
+ query_params = adapter.select('SELECT id,name,value,url_id FROM ronin_url_query_params')
67
+
68
+ # recreate the `ronin_url_query_params` table
69
+ drop_table :ronin_url_query_params
70
+ create_table :ronin_url_query_params do
71
+ column :id, Integer, :serial => true
72
+ column :name_id, Integer, :not_null => true
73
+ column :value, Text
74
+ column :url_id, Integer, :not_null => true
75
+ end
76
+
77
+ name_ids = {}
78
+
79
+ query_params.each do |row|
80
+ unless name_ids.has_key?(row.name)
81
+ result = adapter.execute(
82
+ 'INSERT INTO ronin_url_query_param_names (name) VALUES (?)',
83
+ row.name
84
+ )
85
+
86
+ name_ids[row.name] = result.insert_id
87
+ end
88
+
89
+ adapter.execute(
90
+ 'INSERT INTO ronin_url_query_params (id,name_id,value,url_id) VALUES (?,?,?,?)',
91
+ row.id, name_ids[row.name], row.value, row.url_id
92
+ )
93
+ end
94
+ end
95
+
96
+ down do
97
+ id_names = {}
98
+
99
+ adapter.select('SELECT id,name FROM ronin_url_query_param_names').each do |row|
100
+ id_names[row.id] = row.name
101
+ end
102
+
103
+ query_params = adapter.select('SELECT id,name_id,value,url_id FROM ronin_url_query_params')
104
+
105
+ drop_table :ronin_url_query_params
106
+ create_table :ronin_url_query_params do
107
+ column :id, Integer, :serial => true
108
+ column :name, String, :length => 256, :not_null => true
109
+ column :value, Text
110
+ column :url_id, Integer, :not_null => true
111
+ end
112
+
113
+ query_params.each do |row|
114
+ adapter.execute(
115
+ 'INSERT INTO ronin_url_query_params (id,name,value,url_id) VALUES (?,?,?,?)',
116
+ row.id, id_names[row.name_id], row.value, row.url_id
117
+ )
118
+ end
119
+
120
+ drop_table :ronin_url_query_param_names
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -25,10 +25,7 @@ require 'tempfile'
25
25
  RSpec.configure do |spec|
26
26
  spec.before(:suite) do
27
27
  database_file = Tempfile.new('ronin_database').path
28
- database_uri = Addressable::URI.new(
29
- :scheme => 'sqlite3',
30
- :path => database_file
31
- )
28
+ database_uri = {:adapter => 'sqlite3', :database => database_file}
32
29
 
33
30
  Ronin::Database.repositories[:default] = database_uri
34
31
 
data/lib/ronin/target.rb CHANGED
@@ -51,25 +51,6 @@ module Ronin
51
51
  # Validates the uniqueness of the address and the campaign.
52
52
  validates_uniqueness_of :address, :scope => [:campaign]
53
53
 
54
- #
55
- # The directory to store files related to the target.
56
- #
57
- # @return [String]
58
- # The path to the directory.
59
- #
60
- # @since 1.0.0
61
- #
62
- # @api semipublic
63
- #
64
- def directory
65
- if self.campaign
66
- path = File.join(self.campaign.directory,self.address.address)
67
-
68
- FileUtils.mkdir(path) unless File.directory?(path)
69
- return path
70
- end
71
- end
72
-
73
54
  #
74
55
  # Converts the target to a String.
75
56
  #
@@ -136,7 +136,7 @@ module Ronin
136
136
  begin
137
137
  CLI.command(name).start(argv)
138
138
  rescue UnknownCommand => e
139
- STDERR.puts e
139
+ $stderr.puts e.message
140
140
  exit -1
141
141
  end
142
142
 
@@ -20,6 +20,8 @@
20
20
  require 'ronin/ui/cli/command'
21
21
  require 'ronin/database'
22
22
 
23
+ require 'addressable/uri'
24
+
23
25
  module Ronin
24
26
  module UI
25
27
  module CLI
@@ -68,10 +70,8 @@ module Ronin
68
70
  elsif options[:delete]
69
71
  delete_repository
70
72
  else
71
- indent do
72
- Ronin::Database.repositories.each do |name,uri|
73
- puts "#{name}: #{uri}"
74
- end
73
+ Ronin::Database.repositories.each do |name,uri|
74
+ print_hash uri, :title => name
75
75
  end
76
76
  end
77
77
  end
@@ -85,25 +85,18 @@ module Ronin
85
85
  # The repository URI.
86
86
  #
87
87
  def repository_uri
88
- uri = if options[:uri]
89
- Addressable::URI.parse(options[:uri])
90
- else
91
- Addressable::URI.new()
92
- end
93
-
94
- uri.scheme = options[:adapter] if options[:adapter]
95
- uri.host = options[:host] if options[:host]
96
- uri.port = options[:port] if options[:port]
97
- uri.user = options[:user] if options[:user]
98
- uri.password = options[:password] if options[:password]
99
-
100
- if options[:database]
101
- uri.path = options[:database]
102
- elsif options[:path]
103
- uri.path = options[:path]
88
+ if options[:uri]
89
+ Addressable::URI.parse(options[:uri]).to_hash
90
+ else
91
+ {
92
+ :adapter => options[:adapter],
93
+ :host => options[:host],
94
+ :port => options[:port],
95
+ :user => options[:user],
96
+ :password => options[:password],
97
+ :database => (options[:database] || options[:path])
98
+ }
104
99
  end
105
-
106
- return uri
107
100
  end
108
101
 
109
102
  #
@@ -26,7 +26,7 @@ module Ronin
26
26
  # Controls {Output} from Ronin.
27
27
  #
28
28
  module Output
29
- @mode = if ENV['VERBOSE']
29
+ @mode = if ($VERBOSE || $DEBUG || ENV['VERBOSE'])
30
30
  :verbose
31
31
  else
32
32
  :quiet
data/lib/ronin/url.rb CHANGED
@@ -186,7 +186,7 @@ module Ronin
186
186
  # @api public
187
187
  #
188
188
  def self.query_param(name)
189
- all('query_params.name' => name)
189
+ all('query_params.name.name' => name)
190
190
  end
191
191
 
192
192
  #
@@ -223,31 +223,27 @@ module Ronin
223
223
  return super(url) if url.kind_of?(Integer)
224
224
 
225
225
  # optionally parse the URL
226
- unless url.kind_of?(::URI)
227
- url = ::URI.parse(url.to_s)
228
- end
229
-
230
- port = if url.port
231
- {:number => url.port}
232
- end
233
-
234
- path = normalized_path(url)
235
- fragment = url.fragment
226
+ url = ::URI.parse(url.to_s) unless url.kind_of?(::URI)
236
227
 
237
228
  # create the initial query
238
229
  query = all(
239
- :scheme => {:name => url.scheme},
240
- :host_name => {:address => url.host},
241
- :port => port,
242
- :path => path,
243
- :fragment => fragment
230
+ 'scheme.name' => url.scheme,
231
+ 'host_name.address' => url.host,
232
+ :path => normalized_path(url),
233
+ :fragment => url.fragment
244
234
  )
245
235
 
236
+ if url.port
237
+ # query the port
238
+ query = query.all('port.number' => url.port)
239
+ end
240
+
246
241
  if url.query
247
242
  # add the query params to the query
248
243
  URI::QueryParams.parse(url.query).each do |name,value|
249
244
  query = query.all(
250
- :query_params => {:name => name, :value => value}
245
+ 'query_params.name.name' => name,
246
+ 'query_params.value' => value
251
247
  )
252
248
  end
253
249
  end
@@ -270,10 +266,10 @@ module Ronin
270
266
  #
271
267
  def self.from(uri)
272
268
  # find or create the URL scheme, host_name and port
273
- scheme = self.scheme.model.first_or_new(:name => uri.scheme)
274
- host_name = self.host_name.model.first_or_new(:address => uri.host)
269
+ scheme = URLScheme.first_or_new(:name => uri.scheme)
270
+ host_name = HostName.first_or_new(:address => uri.host)
275
271
  port = if uri.port
276
- self.port.model.first_or_new(:number => uri.port)
272
+ TCPPort.first_or_new(:number => uri.port)
277
273
  end
278
274
 
279
275
  path = normalized_path(uri)
@@ -284,10 +280,10 @@ module Ronin
284
280
  if uri.respond_to?(:query_params)
285
281
  # find or create the URL query params
286
282
  uri.query_params.each do |name,value|
287
- query_params << self.query_params.model.first_or_new(
288
- :name => name,
283
+ query_params << {
284
+ :name => URLQueryParamName.first_or_new(:name => name),
289
285
  :value => value
290
- )
286
+ }
291
287
  end
292
288
  end
293
289
 
@@ -386,7 +382,10 @@ module Ronin
386
382
  self.query_params.clear
387
383
 
388
384
  URI::QueryParams.parse(query).each do |name,value|
389
- self.query_params.new(:name => name, :value => value)
385
+ self.query_params.new(
386
+ :name => URLQueryParamName.first_or_new(:name => name),
387
+ :value => value
388
+ )
390
389
  end
391
390
 
392
391
  return query
@@ -17,7 +17,7 @@
17
17
  # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
18
18
  #
19
19
 
20
- require 'ronin/model/has_name'
20
+ require 'ronin/url_query_param_name'
21
21
  require 'ronin/model'
22
22
 
23
23
  require 'uri/query_params'
@@ -29,14 +29,12 @@ module Ronin
29
29
  class URLQueryParam
30
30
 
31
31
  include Model
32
- include Model::HasName
33
32
 
34
33
  # The primary-key of the URL query param
35
34
  property :id, Serial
36
35
 
37
- property :name, String, :length => 256,
38
- :required => true,
39
- :index => true
36
+ # The name of the URL query param
37
+ belongs_to :name, :model => 'URLQueryParamName'
40
38
 
41
39
  # The value of the URL query param
42
40
  property :value, Text
@@ -55,7 +53,7 @@ module Ronin
55
53
  # @api public
56
54
  #
57
55
  def to_s
58
- URI::QueryParams.dump(self.name => self.value)
56
+ URI::QueryParams.dump(self.name.to_s => self.value)
59
57
  end
60
58
 
61
59
  #
@@ -0,0 +1,89 @@
1
+ #
2
+ # Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ #
4
+ # This file is part of Ronin.
5
+ #
6
+ # Ronin is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Ronin is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Ronin. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+
20
+ require 'ronin/model/has_unique_name'
21
+ require 'ronin/model'
22
+
23
+ module Ronin
24
+ #
25
+ # Represents the name of a {URLQueryParam}.
26
+ #
27
+ class URLQueryParamName
28
+
29
+ include Model
30
+ include Model::HasUniqueName
31
+
32
+ # The primary-key of the URL query param
33
+ property :id, Serial
34
+
35
+ # The name of the URL query param
36
+ property :name, String, :length => 256,
37
+ :required => true,
38
+ :unique => true
39
+
40
+ # The URL query params
41
+ has 0..n, :query_params, :model => 'URLQueryParam',
42
+ :child_key => [:name_id]
43
+
44
+ #
45
+ # Specifies when the URL query param name was first seen.
46
+ #
47
+ # @return [Time]
48
+ # The timestamp that the query param name was first seen.
49
+ #
50
+ # @since 1.1.0
51
+ #
52
+ # @api public
53
+ #
54
+ def created_at
55
+ if (url = self.query_params.urls.first(:fields => [:created_at]))
56
+ url.created_at
57
+ end
58
+ end
59
+
60
+ #
61
+ # Converts the URL query param name to a String.
62
+ #
63
+ # @return [String]
64
+ # The name of the URL query param
65
+ #
66
+ # @since 1.1.0
67
+ #
68
+ # @api public
69
+ #
70
+ def to_s
71
+ self.name.to_s
72
+ end
73
+
74
+ #
75
+ # Inspects the URL query param name.
76
+ #
77
+ # @return [String]
78
+ # The inspected URL query param name.
79
+ #
80
+ # @since 1.1.0
81
+ #
82
+ # @api public
83
+ #
84
+ def inspect
85
+ "#<#{self.class}: #{self}>"
86
+ end
87
+
88
+ end
89
+ end