ronin 0.2.2 → 0.2.3

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 (98) hide show
  1. data/History.txt +53 -0
  2. data/Manifest.txt +26 -18
  3. data/README.txt +12 -19
  4. data/Rakefile +9 -9
  5. data/TODO.txt +5 -5
  6. data/lib/ronin/cacheable.rb +246 -0
  7. data/lib/ronin/database/database.rb +21 -3
  8. data/lib/ronin/database/exceptions/invalid_config.rb +1 -1
  9. data/lib/ronin/environment.rb +5 -2
  10. data/lib/ronin/extensions.rb +2 -0
  11. data/lib/ronin/{models.rb → extensions/array.rb} +19 -6
  12. data/lib/ronin/extensions/ip_addr.rb +127 -0
  13. data/lib/ronin/{objectify/exceptions/object_context_not_found.rb → extensions/kernel.rb} +14 -3
  14. data/lib/ronin/extensions/uri/query_params.rb +4 -2
  15. data/lib/ronin/formatting/extensions/binary/integer.rb +6 -0
  16. data/lib/ronin/formatting/extensions/binary/string.rb +14 -12
  17. data/lib/ronin/formatting/extensions/text/string.rb +37 -19
  18. data/lib/ronin/has_license.rb +4 -2
  19. data/lib/ronin/model.rb +0 -1
  20. data/lib/ronin/network/extensions/http/net.rb +30 -3
  21. data/lib/ronin/network/extensions/telnet/net.rb +0 -18
  22. data/lib/ronin/network/http/exceptions/unknown_request.rb +1 -1
  23. data/lib/ronin/platform/exceptions/extension_not_found.rb +1 -1
  24. data/lib/ronin/platform/exceptions/overlay_cached.rb +1 -1
  25. data/lib/ronin/platform/exceptions/overlay_not_found.rb +1 -1
  26. data/lib/ronin/platform/extension.rb +18 -3
  27. data/lib/ronin/platform/extension_cache.rb +7 -1
  28. data/lib/ronin/platform/object_cache.rb +13 -12
  29. data/lib/ronin/platform/overlay.rb +14 -6
  30. data/lib/ronin/platform/overlay_cache.rb +11 -5
  31. data/lib/ronin/product.rb +20 -3
  32. data/lib/ronin/ronin.rb +0 -15
  33. data/lib/ronin/rpc/exceptions/response_missing.rb +1 -1
  34. data/lib/ronin/sessions/esmtp.rb +1 -10
  35. data/lib/ronin/{objectify.rb → sessions/exceptions.rb} +3 -3
  36. data/lib/ronin/{objectify/exceptions/unknown_object_context.rb → sessions/exceptions/variable_missing.rb} +4 -4
  37. data/lib/ronin/sessions/http.rb +3 -10
  38. data/lib/ronin/sessions/imap.rb +1 -10
  39. data/lib/ronin/sessions/pop3.rb +1 -9
  40. data/lib/ronin/sessions/session.rb +11 -21
  41. data/lib/ronin/sessions/smtp.rb +1 -10
  42. data/lib/ronin/sessions/tcp.rb +10 -13
  43. data/lib/ronin/sessions/telnet.rb +2 -17
  44. data/lib/ronin/sessions/udp.rb +6 -11
  45. data/lib/ronin/static/finders.rb +24 -0
  46. data/lib/ronin/ui/command_line/command_line.rb +41 -21
  47. data/lib/ronin/ui/command_line/commands/help.rb +7 -3
  48. data/lib/ronin/ui/command_line/commands/ls.rb +1 -1
  49. data/lib/ronin/ui/command_line/commands/rm.rb +1 -1
  50. data/lib/ronin/ui/command_line/exceptions/unknown_command.rb +1 -1
  51. data/lib/ronin/ui/diagnostics.rb +12 -5
  52. data/lib/ronin/ui/hexdump/extensions/file.rb +3 -1
  53. data/lib/ronin/ui/hexdump/hexdump.rb +1 -1
  54. data/lib/ronin/ui/verbose.rb +14 -0
  55. data/lib/ronin/version.rb +1 -1
  56. data/spec/cacheable_spec.rb +150 -0
  57. data/spec/classes/cacheable_model.rb +15 -0
  58. data/spec/classes/licensed_model.rb +12 -0
  59. data/spec/code/classes/thing.rb +13 -0
  60. data/spec/code/reference_spec.rb +1 -14
  61. data/spec/extensions/array_spec.rb +34 -0
  62. data/spec/extensions/ip_addr_spec.rb +44 -0
  63. data/spec/extensions/kernel_spec.rb +19 -0
  64. data/spec/extensions/uri/query_params_spec.rb +8 -0
  65. data/spec/formatting/binary/string_spec.rb +1 -1
  66. data/spec/formatting/digest/string_spec.rb +84 -0
  67. data/spec/formatting/http/string_spec.rb +84 -0
  68. data/spec/formatting/text/string_spec.rb +51 -0
  69. data/spec/has_license_spec.rb +29 -0
  70. data/spec/helpers/cacheable.rb +7 -0
  71. data/spec/helpers/contexts/ronin_cacheable_model.rb +13 -0
  72. data/spec/helpers/database.rb +5 -0
  73. data/spec/platform/helpers/overlays/hello/lib/init.rb +1 -0
  74. data/spec/platform/helpers/overlays/hello/lib/stuff/another_test.rb +6 -0
  75. data/spec/platform/helpers/overlays/hello/lib/stuff/test.rb +4 -0
  76. data/spec/platform/overlay_cache_spec.rb +1 -1
  77. data/spec/platform/overlay_spec.rb +28 -0
  78. data/spec/product_spec.rb +7 -0
  79. data/spec/sessions/classes/test_session.rb +11 -0
  80. data/spec/sessions/classes/uses_test_session.rb +10 -0
  81. data/spec/sessions/session_spec.rb +13 -44
  82. data/spec/spec_helper.rb +0 -5
  83. data/spec/static/{helpers → classes}/static_class.rb +0 -0
  84. data/spec/static/helpers/static.rb +0 -1
  85. data/spec/static/static_spec.rb +1 -0
  86. metadata +44 -35
  87. data/lib/ronin/objectify/exceptions.rb +0 -25
  88. data/lib/ronin/objectify/objectify.rb +0 -240
  89. data/lib/ronin/target.rb +0 -44
  90. data/lib/ronin/ui/command_line/param_parser.rb +0 -93
  91. data/spec/formatting/digest_spec.rb +0 -54
  92. data/spec/formatting/http_spec.rb +0 -53
  93. data/spec/formatting/text_spec.rb +0 -40
  94. data/spec/helpers.rb +0 -0
  95. data/spec/objectify/objectify_spec.rb +0 -31
  96. data/spec/target_spec.rb +0 -16
  97. data/spec/ui/command_line/helpers/example_command.rb +0 -21
  98. data/spec/ui/command_line/param_parser_spec.rb +0 -49
@@ -23,7 +23,7 @@
23
23
 
24
24
  module Ronin
25
25
  module RPC
26
- class ResponseMissing < RuntimeError
26
+ class ResponseMissing < StandardError
27
27
  end
28
28
  end
29
29
  end
@@ -29,15 +29,6 @@ module Ronin
29
29
  module ESMTP
30
30
  include Session
31
31
 
32
- setup_session do
33
- parameter :host, :description => 'ESMTP host'
34
- parameter :port, :description => 'ESMTP port'
35
-
36
- parameter :esmtp_login, :description => 'ESMTP login'
37
- parameter :esmtp_user, :description => 'ESMTP user'
38
- parameter :esmtp_password, :description => 'ESMTP password'
39
- end
40
-
41
32
  protected
42
33
 
43
34
  def esmtp_message(options={},&block)
@@ -45,7 +36,7 @@ module Ronin
45
36
  end
46
37
 
47
38
  def esmtp_connect(options={},&block)
48
- require_params :host
39
+ require_variable :host
49
40
 
50
41
  options[:port] ||= @port
51
42
  options[:login] ||= @esmtp_login
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
- # Ronin - A Ruby platform designed for information security and data
4
- # exploration tasks.
3
+ # Ronin - A ruby development platform designed for information security
4
+ # and data exploration tasks.
5
5
  #
6
6
  # Copyright (c) 2006-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
7
7
  #
@@ -21,4 +21,4 @@
21
21
  #++
22
22
  #
23
23
 
24
- require 'ronin/objectify/objectify'
24
+ require 'ronin/sessions/exceptions/variable_missing'
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
- # Ronin - A Ruby platform designed for information security and data
4
- # exploration tasks.
3
+ # Ronin - A ruby development platform designed for information security
4
+ # and data exploration tasks.
5
5
  #
6
6
  # Copyright (c) 2006-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
7
7
  #
@@ -22,8 +22,8 @@
22
22
  #
23
23
 
24
24
  module Ronin
25
- module Objectify
26
- class UnknownObjectContext < RuntimeError
25
+ module Sessions
26
+ class VariableMissing < RuntimeError
27
27
  end
28
28
  end
29
29
  end
@@ -23,22 +23,12 @@
23
23
 
24
24
  require 'ronin/sessions/session'
25
25
  require 'ronin/network/http'
26
- require 'ronin/network/extensions/http'
27
26
 
28
27
  module Ronin
29
28
  module Sessions
30
29
  module HTTP
31
30
  include Session
32
31
 
33
- setup_session do
34
- parameter :http_user, :description => 'HTTP user'
35
- parameter :http_password, :description => 'HTTP password'
36
-
37
- parameter :http_proxy, :description => 'HTTP Proxy'
38
-
39
- parameter :http_user_agent, :description => 'Web User-Agent'
40
- end
41
-
42
32
  protected
43
33
 
44
34
  #
@@ -131,6 +121,9 @@ module Ronin
131
121
  private
132
122
 
133
123
  def http_merge_options(options={})
124
+ options[:host] ||= @http_host if @http_host
125
+ options[:port] ||= @http_port if @http_port
126
+
134
127
  options[:user] ||= @http_user if @http_user
135
128
  options[:password] ||= @http_password if @http_password
136
129
 
@@ -29,19 +29,10 @@ module Ronin
29
29
  module IMAP
30
30
  include Session
31
31
 
32
- setup_session do
33
- parameter :host, :description => 'IMAP host'
34
- parameter :port, :description => 'IMAP port'
35
-
36
- parameter :imap_auth, :description => 'IMAP authentication mode'
37
- parameter :imap_user, :description => 'IMAP user'
38
- parameter :imap_password, :description => 'IMAP password'
39
- end
40
-
41
32
  protected
42
33
 
43
34
  def imap_connect(options={},&block)
44
- require_params :host
35
+ require_variable :host
45
36
 
46
37
  options[:port] ||= @port
47
38
  options[:auth] ||= @imap_auth
@@ -29,18 +29,10 @@ module Ronin
29
29
  module POP3
30
30
  include Session
31
31
 
32
- setup_session do
33
- parameter :host, :description => 'POP3 host'
34
- parameter :port, :description => 'POP3 port'
35
-
36
- parameter :pop3_user, :description => 'POP3 user'
37
- parameter :pop3_password, :description => 'POP3 password'
38
- end
39
-
40
32
  protected
41
33
 
42
34
  def pop3_connect(options={},&block)
43
- require_params :host
35
+ require_variable :host
44
36
 
45
37
  options[:port] ||= @port
46
38
  options[:user] ||= @pop3_user
@@ -21,33 +21,23 @@
21
21
  #++
22
22
  #
23
23
 
24
- require 'ronin/extensions/meta'
25
-
26
- require 'parameters'
24
+ require 'ronin/sessions/exceptions/variable_missing'
27
25
 
28
26
  module Ronin
29
27
  module Sessions
30
28
  module Session
31
- def self.included(base)
32
- base.module_eval do
33
- def self.setup_session(&block)
34
- #
35
- # Includes Parameters and runs the _block_.
36
- #
37
- metaclass_def(:included) do |base_class|
38
- base_class.class_eval { include Parameters }
39
- base_class.class_eval(&block)
40
- end
29
+ protected
41
30
 
42
- #
43
- # Extends Parameters and runs the specified _block_.
44
- #
45
- metaclass_def(:extended) do |base_obj|
46
- base_obj.extend Parameters
47
- base_obj.instance_eval(&block)
48
- end
49
- end
31
+ #
32
+ # Raises a VariableMissing exception if the instance variable with
33
+ # the specified _name_ is not defined, returns +true+ otherwise.
34
+ #
35
+ def require_variable(name)
36
+ if instance_variable_get("@#{name}").nil?
37
+ raise(VariableMissing,"the session variable @#{name} was not set",caller)
50
38
  end
39
+
40
+ return true
51
41
  end
52
42
  end
53
43
  end
@@ -29,15 +29,6 @@ module Ronin
29
29
  module SMTP
30
30
  include Session
31
31
 
32
- setup_session do
33
- parameter :host, :description => 'SMTP host'
34
- parameter :port, :description => 'SMTP port'
35
-
36
- parameter :smtp_login, :description => 'SMTP login'
37
- parameter :smtp_user, :description => 'SMTP user'
38
- parameter :smtp_password, :description => 'SMTP password'
39
- end
40
-
41
32
  protected
42
33
 
43
34
  def smtp_message(options={},&block)
@@ -45,7 +36,7 @@ module Ronin
45
36
  end
46
37
 
47
38
  def smtp_connect(options={},&block)
48
- require_params :host
39
+ require_variable :host
49
40
 
50
41
  options[:port] ||= @port
51
42
  options[:login] ||= @smtp_login
@@ -29,14 +29,6 @@ module Ronin
29
29
  module TCP
30
30
  include Session
31
31
 
32
- setup_session do
33
- parameter :local_host, :description => 'TCP local host'
34
- parameter :local_port, :description => 'TCP local port'
35
-
36
- parameter :host, :description => 'TCP remote host'
37
- parameter :port, :description => 'TCP remote port'
38
- end
39
-
40
32
  protected
41
33
 
42
34
  #
@@ -48,7 +40,8 @@ module Ronin
48
40
  # object.
49
41
  #
50
42
  def tcp_connect(&block)
51
- require_params :host, :port
43
+ require_variable :host
44
+ require_variable :port
52
45
 
53
46
  return ::Net.tcp_connect(@host,@port,@local_host,@local_port,&block)
54
47
  end
@@ -59,7 +52,8 @@ module Ronin
59
52
  # it will be passed the newly created TCPSocket object.
60
53
  #
61
54
  def tcp_connect_and_send(data,&block)
62
- require_params :host, :port
55
+ require_variable :host
56
+ require_variable :port
63
57
 
64
58
  return ::Net.tcp_connect_and_send(data,@host,@port,@local_host,@local_port,&block)
65
59
  end
@@ -71,7 +65,8 @@ module Ronin
71
65
  # has returned, the TCPSocket object will be closed.
72
66
  #
73
67
  def tcp_session(&block)
74
- require_params :host, :port
68
+ require_variable :host
69
+ require_variable :port
75
70
 
76
71
  return Net.tcp_session(@host,@port,@local_host,@local_port,&block)
77
72
  end
@@ -83,7 +78,8 @@ module Ronin
83
78
  # banner String.
84
79
  #
85
80
  def tcp_banner(&block)
86
- require_params :host, :port
81
+ require_variable :host
82
+ require_variable :port
87
83
 
88
84
  return ::Net.tcp_banner(@host,@port,@local_host,@local_port,&block)
89
85
  end
@@ -94,7 +90,8 @@ module Ronin
94
90
  # connection. Returns +true+ if the data was successfully sent.
95
91
  #
96
92
  def tcp_send(data)
97
- require_params :host, :port
93
+ require_variable :host
94
+ require_variable :port
98
95
 
99
96
  return ::Net.tcp_send(data,@host,@port,@local_host,@local_port)
100
97
  end
@@ -26,28 +26,13 @@ require 'ronin/network/telnet'
26
26
 
27
27
  module Ronin
28
28
  module Sessions
29
- module TELNET
29
+ module Telnet
30
30
  include Session
31
31
 
32
- setup_session do
33
- parameter :host, :description => 'Telnet host'
34
- parameter :port,
35
- :default => lambda {
36
- Ronin::Network::Telnet.default_port
37
- },
38
- :description => 'Telnet port'
39
-
40
- parameter :telnet_user, :description => 'Telnet user'
41
- parameter :telnet_password, :description => 'Telnet password'
42
-
43
- parameter :telnet_proxy, :description => 'Telnet proxy'
44
- parameter :telnet_ssl, :description => 'Telnet SSL options'
45
- end
46
-
47
32
  protected
48
33
 
49
34
  def telnet_connect(options={},&block)
50
- require_params :host
35
+ require_variable :host
51
36
 
52
37
  options[:port] ||= @port
53
38
  options[:user] ||= @telnet_user
@@ -29,14 +29,6 @@ module Ronin
29
29
  module UDP
30
30
  include Session
31
31
 
32
- setup_session do
33
- parameter :local_host, :description => 'local host'
34
- parameter :local_port, :description => 'local port'
35
-
36
- parameter :host, :description => 'remote host'
37
- parameter :port, :description => 'remote port'
38
- end
39
-
40
32
  protected
41
33
 
42
34
  #
@@ -46,7 +38,8 @@ module Ronin
46
38
  # of the UDP connection. A UDPSocket object will be returned.
47
39
  #
48
40
  def udp_connect(&block)
49
- require_params :host, :port
41
+ require_variable :host
42
+ require_variable :port
50
43
 
51
44
  return ::Net.udp_connect(@host,@port,@local_host,@local_port,&block)
52
45
  end
@@ -57,7 +50,8 @@ module Ronin
57
50
  # it will be passed the newly created UDPSocket object.
58
51
  #
59
52
  def udp_connect_and_send(data,&block)
60
- require_params :host, :port
53
+ require_variable :host
54
+ require_variable :port
61
55
 
62
56
  return ::Net.udp_connect_and_send(data,@host,@port,@local_host,@local_port,&block)
63
57
  end
@@ -69,7 +63,8 @@ module Ronin
69
63
  # has returned, the UDPSocket object will be closed.
70
64
  #
71
65
  def udp_session(&block)
72
- require_params :host, :port
66
+ require_variable :host
67
+ require_variable :port
73
68
 
74
69
  return ::Net.udp_session(@host,@port,@local_host,@local_port,&block)
75
70
  end
@@ -101,6 +101,14 @@ module Ronin
101
101
  return paths
102
102
  end
103
103
 
104
+ #
105
+ # Passes all matching static paths for the specified _path_ to the
106
+ # given _block_.
107
+ #
108
+ def each_static_path(path,&block)
109
+ static_find_all(path).each(&block)
110
+ end
111
+
104
112
  #
105
113
  # Returns all matching static files for the specified _path_.
106
114
  #
@@ -114,6 +122,14 @@ module Ronin
114
122
  return paths
115
123
  end
116
124
 
125
+ #
126
+ # Passes each matching static file for the specified _path_ to the
127
+ # given _block_.
128
+ #
129
+ def each_static_file(path,&block)
130
+ find_static_files(path).each(&block)
131
+ end
132
+
117
133
  #
118
134
  # Returns all matching static directories for the specified _path_.
119
135
  #
@@ -127,6 +143,14 @@ module Ronin
127
143
  return paths
128
144
  end
129
145
 
146
+ #
147
+ # Passes each matching static directory for the specified _path_ to
148
+ # the given _block_.
149
+ #
150
+ def each_static_dir(path,&block)
151
+ find_static_dirs(path).each(&block)
152
+ end
153
+
130
154
  #
131
155
  # Returns all matching static paths for the specified _pattern_.
132
156
  #
@@ -22,28 +22,33 @@
22
22
  #
23
23
 
24
24
  require 'ronin/ui/command_line/exceptions/unknown_command'
25
- require 'ronin/ui/command_line/commands/console'
26
- require 'ronin/ui/console'
27
25
 
28
26
  require 'reverse_require'
27
+ require 'extlib'
29
28
 
30
29
  module Ronin
31
30
  module UI
32
31
  module CommandLine
32
+ # Directory which stores the commands
33
+ COMMANDS_DIR = File.join('ronin','ui','command_line','commands')
34
+
35
+ # Name of the default to run
36
+ DEFAULT_COMMAND = 'console'
37
+
33
38
  #
34
39
  # Returns the commands registered with the command-line utility.
35
40
  #
36
41
  def CommandLine.commands
37
42
  unless class_variable_defined?('@@ronin_commands')
38
- paths = Gem.find_resources('bin/ronin-*')
43
+ pattern = File.join('lib',COMMANDS_DIR,'*.rb')
44
+ paths = Gem.find_resources(pattern)
39
45
 
40
- @@ronin_commands = {}
46
+ @@ronin_commands = []
41
47
 
42
48
  paths.each do |path|
43
- next unless File.executable?(path)
44
- name = File.basename(path).gsub(/^ronin-/,'')
49
+ name = File.basename(path).gsub(/\.rb$/,'')
45
50
 
46
- @@ronin_commands[name] ||= path
51
+ @@ronin_commands << name unless @@ronin_commands.include?(name)
47
52
  end
48
53
  end
49
54
 
@@ -51,11 +56,11 @@ module Ronin
51
56
  end
52
57
 
53
58
  #
54
- # Returns +true+ if the a Command with the specified _name_ was
55
- # registered with the command-line utility.
59
+ # Returns +true+ if a command exists with the specified _name_,
60
+ # returns +false+ otherwise.
56
61
  #
57
62
  def CommandLine.has_command?(name)
58
- CommandLine.commands.has_key?(name.to_s)
63
+ CommandLine.commands.include?(name.to_s)
59
64
  end
60
65
 
61
66
  #
@@ -65,11 +70,25 @@ module Ronin
65
70
  def CommandLine.get_command(name)
66
71
  name = name.to_s
67
72
 
68
- unless CommandLine.has_command?(name)
73
+ begin
74
+ require File.join(COMMANDS_DIR,name)
75
+ rescue LoadError
76
+ raise(UnknownCommand,"unable to load the command #{name.dump}",caller)
77
+ end
78
+
79
+ class_name = name.to_const_string
80
+
81
+ unless Commands.const_defined?(class_name)
69
82
  raise(UnknownCommand,"unknown command #{name.dump}",caller)
70
83
  end
71
84
 
72
- return CommandLine.commands[name]
85
+ command = Commands.const_get(class_name)
86
+
87
+ unless command.respond_to?(:run)
88
+ raise(UnknownCommand,"command #{name.dump} must provide a 'run' method",caller)
89
+ end
90
+
91
+ return command
73
92
  end
74
93
 
75
94
  #
@@ -78,18 +97,19 @@ module Ronin
78
97
  # attempt to find and execute the Command with the same name.
79
98
  #
80
99
  def CommandLine.run(*argv)
81
- if (argv.empty? || argv[0][0..0]=='-')
82
- Commands::Console.run(*argv)
100
+ if (argv.empty? || argv.first[0..0]=='-')
101
+ name = DEFAULT_COMMAND
102
+ argv = ARGV
83
103
  else
84
- cmd = argv.first
104
+ name = argv.first
85
105
  argv = argv[1..-1]
106
+ end
86
107
 
87
- begin
88
- exec(CommandLine.get_command(cmd),*argv)
89
- rescue UnknownCommand => e
90
- STDERR.puts e
91
- exit -1
92
- end
108
+ begin
109
+ CommandLine.get_command(name).run(*argv)
110
+ rescue UnknownCommand => e
111
+ STDERR.puts e
112
+ exit -1
93
113
  end
94
114
 
95
115
  return true