ronin-exploits 0.2.0 → 0.2.1

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.tar.gz.sig +0 -0
  2. data/History.txt +27 -0
  3. data/Manifest.txt +21 -5
  4. data/README.txt +40 -3
  5. data/Rakefile +6 -6
  6. data/TODO.txt +12 -9
  7. data/lib/ronin/exploits/allow.rb +1 -1
  8. data/lib/ronin/{targeted_arch.rb → exploits/arch.rb} +1 -5
  9. data/lib/ronin/exploits/exploit.rb +59 -144
  10. data/lib/ronin/exploits/ftp.rb +4 -1
  11. data/lib/ronin/exploits/helpers.rb +1 -0
  12. data/lib/ronin/exploits/helpers/file_based.rb +113 -0
  13. data/lib/ronin/exploits/http.rb +10 -0
  14. data/lib/ronin/exploits/license.rb +34 -0
  15. data/lib/ronin/exploits/os.rb +34 -0
  16. data/lib/ronin/{targeted_product.rb → exploits/product.rb} +1 -1
  17. data/lib/ronin/exploits/remote_tcp.rb +2 -3
  18. data/lib/ronin/exploits/remote_udp.rb +2 -3
  19. data/lib/ronin/exploits/target.rb +8 -10
  20. data/lib/ronin/exploits/verifiers.rb +92 -0
  21. data/lib/ronin/exploits/version.rb +1 -1
  22. data/lib/ronin/exploits/web.rb +21 -1
  23. data/lib/ronin/model/has_default_port.rb +54 -0
  24. data/lib/ronin/model/targets_arch.rb +8 -10
  25. data/lib/ronin/model/targets_os.rb +9 -9
  26. data/lib/ronin/payloads.rb +1 -0
  27. data/lib/ronin/payloads/arch.rb +32 -0
  28. data/lib/ronin/payloads/asm_payload.rb +34 -0
  29. data/lib/ronin/payloads/encoder.rb +24 -18
  30. data/lib/ronin/payloads/helpers/exceptions.rb +2 -1
  31. data/lib/ronin/payloads/helpers/exceptions/{unimplemented.rb → not_implemented.rb} +1 -1
  32. data/lib/ronin/payloads/helpers/file_system.rb +12 -12
  33. data/lib/ronin/payloads/helpers/rpc.rb +7 -7
  34. data/lib/ronin/payloads/helpers/shell.rb +2 -2
  35. data/lib/ronin/payloads/license.rb +34 -0
  36. data/lib/ronin/payloads/nops.rb +3 -1
  37. data/lib/ronin/{targeted_os.rb → payloads/os.rb} +1 -5
  38. data/lib/ronin/payloads/payload.rb +89 -41
  39. data/lib/ronin/payloads/shellcode.rb +4 -1
  40. data/lib/ronin/ui/command_line/commands/exploits.rb +1 -1
  41. data/lib/ronin/ui/command_line/commands/payload.rb +2 -2
  42. data/lib/ronin/ui/command_line/commands/payloads.rb +1 -1
  43. data/spec/exploits/exploit_spec.rb +12 -30
  44. data/spec/exploits/file_based_exploit_spec.rb +39 -0
  45. data/spec/exploits/ftp_spec.rb +1 -5
  46. data/spec/exploits/http_spec.rb +4 -4
  47. data/spec/exploits/remote_tcp_spec.rb +7 -3
  48. data/spec/exploits/remote_udp_spec.rb +7 -3
  49. data/spec/exploits/target_spec.rb +9 -2
  50. data/spec/exploits/targets/buffer_overflow_spec.rb +6 -2
  51. data/spec/exploits/web_spec.rb +6 -0
  52. data/spec/model/has_default_port_spec.rb +27 -0
  53. data/spec/model/models/default_port_model.rb +13 -0
  54. data/spec/model/models/non_default_port_model.rb +11 -0
  55. data/spec/model/models/targets_arch_model.rb +11 -0
  56. data/spec/model/models/targets_os_model.rb +11 -0
  57. data/spec/model/targets_arch_spec.rb +22 -0
  58. data/spec/model/targets_os_spec.rb +23 -0
  59. data/spec/objects/exploits/example.rb +25 -0
  60. data/spec/objects/exploits/test.rb +0 -4
  61. data/spec/objects/payloads/test.rb +5 -1
  62. data/spec/payloads/encoder_spec.rb +5 -1
  63. data/spec/payloads/payload_spec.rb +77 -14
  64. metadata +58 -13
  65. metadata.gz.sig +0 -0
  66. data/spec/objects/payloads/example.rb +0 -19
@@ -4,11 +4,7 @@ require 'spec_helper'
4
4
 
5
5
  describe Exploits::FTP do
6
6
  before(:all) do
7
- @exploit = Exploits::FTP.new do
8
- self.name = 'example_ftp'
9
- end
10
-
11
- @exploit.save!
7
+ @exploit = Exploits::FTP.create(:name => 'example_ftp')
12
8
  end
13
9
 
14
10
  it "should have a default port of 21" do
@@ -4,11 +4,11 @@ require 'spec_helper'
4
4
 
5
5
  describe Exploits::HTTP do
6
6
  before(:all) do
7
- @exploit = Exploits::HTTP.new do
8
- self.name = 'example_httpd'
9
- end
7
+ @exploit = Exploits::HTTP.create(:name => 'example_httpd')
8
+ end
10
9
 
11
- @exploit.save!
10
+ it "should initialize all parameters by default" do
11
+ @exploit.params.should_not be_empty
12
12
  end
13
13
 
14
14
  it "should have a default port of 80" do
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
 
5
5
  describe Exploits::RemoteTCP do
6
6
  before(:all) do
7
- @exp = Exploits::RemoteTCP.new(
7
+ @exploit = Exploits::RemoteTCP.new(
8
8
  :default_port => 22,
9
9
  :host => '127.0.0.1'
10
10
  )
@@ -14,10 +14,14 @@ describe Exploits::RemoteTCP do
14
14
  Exploits::RemoteTCP.include?(Sessions::TCP).should == true
15
15
  end
16
16
 
17
+ it "should initialize all parameters by default" do
18
+ @exploit.params.should_not be_empty
19
+ end
20
+
17
21
  it "should default the port to the default_port before deploying" do
18
- @exp.build!
22
+ @exploit.build!
19
23
 
20
- @exp.deploy! do |exp|
24
+ @exploit.deploy! do |exp|
21
25
  exp.port.should == 22
22
26
  end
23
27
  end
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
 
5
5
  describe Exploits::RemoteUDP do
6
6
  before(:all) do
7
- @exp = Exploits::RemoteUDP.new(
7
+ @exploit = Exploits::RemoteUDP.new(
8
8
  :default_port => 22,
9
9
  :host => '127.0.0.1'
10
10
  )
@@ -14,10 +14,14 @@ describe Exploits::RemoteUDP do
14
14
  Exploits::RemoteUDP.include?(Sessions::UDP).should == true
15
15
  end
16
16
 
17
+ it "should initialize all parameters by default" do
18
+ @exploit.params.should_not be_empty
19
+ end
20
+
17
21
  it "should default the port to the default_port before deploying" do
18
- @exp.build!
22
+ @exploit.build!
19
23
 
20
- @exp.deploy! do |exp|
24
+ @exploit.deploy! do |exp|
21
25
  exp.port.should == 22
22
26
  end
23
27
  end
@@ -3,9 +3,14 @@ require 'ronin/exploits/target'
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Exploits::Target do
6
+ before(:all) do
7
+ @exploit = Exploits::Exploit.create(:name => 'exploit with targets')
8
+ end
9
+
6
10
  before(:each) do
7
11
  @target = Exploits::Target.new(
8
- :data => {:var => 1, :test => 'hello'}
12
+ :data => {:var => 1, :test => 'hello'},
13
+ :exploit => @exploit
9
14
  )
10
15
  end
11
16
 
@@ -68,9 +73,11 @@ describe Exploits::Target do
68
73
  end
69
74
 
70
75
  it "should be able to serialize and deserialize it's target data" do
71
- @target.save!
76
+ @target.save
72
77
 
73
78
  target = Exploits::Target.get(@target.id)
79
+ target.should_not be_nil
80
+
74
81
  target.data[:var].should == 1
75
82
  target.data[:test].should == 'hello'
76
83
  end
@@ -3,8 +3,12 @@ require 'ronin/exploits/targets/buffer_overflow'
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Exploits::Targets::BufferOverflow do
6
+ before(:all) do
7
+ @exploit = Exploits::Exploit.create(:name => 'buffer overflow exploit')
8
+ end
9
+
6
10
  it "should require an ip to overwrite with" do
7
- target = Exploits::Targets::BufferOverflow.new
11
+ target = Exploits::Targets::BufferOverflow.new(:exploit => @exploit)
8
12
  target.should_not be_valid
9
13
 
10
14
  target.ip = 0xffffeeee
@@ -12,7 +16,7 @@ describe Exploits::Targets::BufferOverflow do
12
16
  end
13
17
 
14
18
  it "should have a default frame_repeat of 1" do
15
- target = Exploits::Targets::BufferOverflow.new
19
+ target = Exploits::Targets::BufferOverflow.new(:exploit => @exploit)
16
20
  target.frame_repeat.should == 1
17
21
  end
18
22
  end
@@ -4,6 +4,12 @@ require 'spec_helper'
4
4
 
5
5
  describe Exploits::Web do
6
6
  describe "targeted_url" do
7
+ it "should initialize all parameters by default" do
8
+ exploit = Exploits::Web.new
9
+
10
+ exploit.params.should_not be_empty
11
+ end
12
+
7
13
  it "should create a targeted URL using the host param" do
8
14
  host = 'www.example.com'
9
15
  exploit = Exploits::Web.new(:host => host)
@@ -0,0 +1,27 @@
1
+ require 'ronin/model/has_default_port'
2
+
3
+ require 'spec_helper'
4
+ require 'model/models/default_port_model'
5
+ require 'model/models/non_default_port_model'
6
+
7
+ describe Model::HasDefaultPort do
8
+ it "should define a default_port property" do
9
+ end
10
+
11
+ it "should initialize the default_port property if DEFAULT_PORT is defined" do
12
+ model = DefaultPortModel.new
13
+
14
+ model.default_port.should == DefaultPortModel::DEFAULT_PORT
15
+ end
16
+
17
+ it "should not initialize the default_port property if DEFAULT_PORT is undefined" do
18
+ model = NonDefaultPortModel.new
19
+ model.default_port.should be_nil
20
+ end
21
+
22
+ it "should allow default_port to be overridden" do
23
+ model = DefaultPortModel.new(:default_port => 70)
24
+
25
+ model.default_port.should == 70
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ require 'ronin/model'
2
+ require 'ronin/model/has_default_port'
3
+
4
+ class DefaultPortModel
5
+
6
+ include Ronin::Model
7
+ include Ronin::Model::HasDefaultPort
8
+
9
+ DEFAULT_PORT = 80
10
+
11
+ property :id, Serial
12
+
13
+ end
@@ -0,0 +1,11 @@
1
+ require 'ronin/model'
2
+ require 'ronin/model/has_default_port'
3
+
4
+ class NonDefaultPortModel
5
+
6
+ include Ronin::Model
7
+ include Ronin::Model::HasDefaultPort
8
+
9
+ property :id, Serial
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'ronin/model'
2
+ require 'ronin/model/targets_arch'
3
+
4
+ class TargetsArchModel
5
+
6
+ include Ronin::Model
7
+ include Ronin::Model::TargetsArch
8
+
9
+ property :id, Serial
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'ronin/model'
2
+ require 'ronin/model/targets_os'
3
+
4
+ class TargetsOSModel
5
+
6
+ include Ronin::Model
7
+ include Ronin::Model::TargetsOS
8
+
9
+ property :id, Serial
10
+
11
+ end
@@ -0,0 +1,22 @@
1
+ require 'ronin/model/targets_arch'
2
+
3
+ require 'spec_helper'
4
+ require 'model/models/targets_arch_model'
5
+
6
+ describe Model::TargetsArch do
7
+ it "should define an arch relation" do
8
+ TargetsArchModel.relationships.has_key?('arch')
9
+ end
10
+
11
+ it "should provide access to the targeted arch" do
12
+ model = TargetsArchModel.new(:arch => Arch.i386)
13
+ model.arch.name.should == 'i386'
14
+ end
15
+
16
+ it "should allow the arch to be set via the getter method" do
17
+ model = TargetsArchModel.new
18
+ model.arch :i386
19
+
20
+ model.arch.name.should == 'i386'
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require 'ronin/model/targets_os'
2
+
3
+ require 'spec_helper'
4
+ require 'model/models/targets_os_model'
5
+
6
+ describe Model::TargetsOS do
7
+ it "should define an os relation" do
8
+ TargetsOSModel.relationships.has_key?('os')
9
+ end
10
+
11
+ it "should provide access to the targeted os" do
12
+ model = TargetsOSModel.new(:os => OS.linux('2.6.29'))
13
+ model.os.should == OS.linux('2.6.29')
14
+ end
15
+
16
+ it "should allow the os to be set via the getter method" do
17
+ model = TargetsOSModel.new
18
+ model.os :name => 'Linux', :version => '2.6.29'
19
+
20
+ model.os.name.should == 'Linux'
21
+ model.os.version.should == '2.6.29'
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ ronin_exploit do
2
+ parameter :path,
3
+ :default => 'data',
4
+ :description => 'Parameter to be shared with the exploit'
5
+
6
+ cache do
7
+ self.name = 'example'
8
+
9
+ author :name => 'Anonymous', :email => 'anonymous@example.com'
10
+
11
+ targeting do |target|
12
+ target.arch :i686
13
+ target.os :name => 'Linux', :version => '2.6.23'
14
+ target.product :name => 'ExampleWare', :version => '1.5'
15
+ end
16
+ end
17
+
18
+ def buffer
19
+ @buffer
20
+ end
21
+
22
+ def build
23
+ @buffer = "GET /#{@path}/#{@encoded_payload}"
24
+ end
25
+ end
@@ -1,8 +1,4 @@
1
1
  ronin_exploit do
2
- parameter :var,
3
- :default => 'value1',
4
- :description => 'Parameter to be shared with the payload'
5
-
6
2
  cache do
7
3
  self.name = 'test'
8
4
  self.version = '0.2'
@@ -1,4 +1,8 @@
1
1
  ronin_payload do
2
+ parameter :custom,
3
+ :default => 'func',
4
+ :description => 'Custom value to use in building the payload'
5
+
2
6
  cache do
3
7
  self.name = 'test'
4
8
 
@@ -6,6 +10,6 @@ ronin_payload do
6
10
  end
7
11
 
8
12
  def build
9
- @payload = 'code'
13
+ @payload = "code.#{@custom}"
10
14
  end
11
15
  end
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
 
5
5
  describe Payloads::Encoder do
6
6
  before(:all) do
7
- @encoder = Payloads::Encoder.new
7
+ @encoder = Payloads::Encoder.new(:name => 'test')
8
8
  @data = 'some data'
9
9
  end
10
10
 
@@ -23,4 +23,8 @@ describe Payloads::Encoder do
23
23
  it "should return the data to be encoded by default" do
24
24
  @encoder.call(@data).should == @data
25
25
  end
26
+
27
+ it "should have a custom inspect method" do
28
+ @encoder.inspect.should == '#<Ronin::Payloads::Encoder: test>'
29
+ end
26
30
  end
@@ -6,6 +6,7 @@ require 'helpers/objects'
6
6
  describe Payloads::Payload do
7
7
  before(:each) do
8
8
  @payload = load_payload('test')
9
+ @exploit = load_exploit('example')
9
10
  end
10
11
 
11
12
  it "should require a name attribute" do
@@ -36,24 +37,21 @@ describe Payloads::Payload do
36
37
  third_payload.should be_valid
37
38
  end
38
39
 
40
+ it "should initialize all parameters by default" do
41
+ @payload.params.should_not be_empty
42
+ end
43
+
39
44
  it "should not have any controls by default" do
40
45
  @payload.controls.should be_empty
41
46
  end
42
47
 
43
48
  it "should specify what behaviors the payload controls" do
44
- @payload.controlling :memory_read
49
+ @payload.controlling :memory_read, :memory_write
45
50
 
46
- @payload.behaviors.first.should == Vuln::Behavior[:memory_read]
47
- end
48
-
49
- it "should allow for the extending of Helper modules" do
50
- @payload.instance_eval { helper :shell }.should == true
51
- end
52
-
53
- it "should raise an UnknownHelper when extending an unknown helper" do
54
- lambda {
55
- @payload.instance_eval { helper :obvious_not_there }
56
- }.should raise_error(Payloads::UnknownHelper)
51
+ @payload.behaviors.should == [
52
+ Vuln::Behavior[:memory_read],
53
+ Vuln::Behavior[:memory_write]
54
+ ]
57
55
  end
58
56
 
59
57
  it "should not have an Arch by default" do
@@ -77,14 +75,45 @@ describe Payloads::Payload do
77
75
  @payload.os.version.should == '7.1'
78
76
  end
79
77
 
78
+ it "should allow for the extending of Helper modules" do
79
+ @payload.instance_eval { helper :shell }.should == true
80
+ end
81
+
82
+ it "should raise an UnknownHelper when extending an unknown helper" do
83
+ lambda {
84
+ @payload.instance_eval { helper :obvious_not_there }
85
+ }.should raise_error(Payloads::UnknownHelper)
86
+ end
87
+
88
+ it "should not have an exploit by default" do
89
+ @payload.exploit.should be_nil
90
+ end
91
+
80
92
  it "should have 'built' and 'unbiult' states" do
81
93
  @payload.should_not be_built
82
94
  @payload.build!
83
95
  @payload.should be_built
84
96
  end
85
97
 
86
- it "should return the built payload when calling build" do
87
- @payload.build!.should == 'code'
98
+ it "should store the built payload in the @payload instance variable" do
99
+ @payload.build!
100
+ @payload.payload.should == "code.func"
101
+ end
102
+
103
+ it "should return the built payload when calling build!" do
104
+ @payload.build!.should == "code.func"
105
+ end
106
+
107
+ it "should use parameters in the building of the payload" do
108
+ @payload.custom = 'hello'
109
+ @payload.build!.should == "code.hello"
110
+ end
111
+
112
+ it "should have 'deployed' and 'undeployed' states" do
113
+ @payload.should_not be_deployed
114
+ @payload.build!
115
+ @payload.deploy!
116
+ @payload.should be_deployed
88
117
  end
89
118
 
90
119
  it "should have a default deployer method" do
@@ -92,4 +121,38 @@ describe Payloads::Payload do
92
121
  payload.should == @payload
93
122
  end
94
123
  end
124
+
125
+ it "should pass the built payload to the exploit when deploying" do
126
+ @payload.exploit = @exploit
127
+
128
+ @payload.build!
129
+ @payload.deploy! do |payload|
130
+ payload.exploit.payload.should == "code.func"
131
+ end
132
+ end
133
+
134
+ it "should call the exploit when deployed" do
135
+ @payload.exploit = @exploit
136
+
137
+ @payload.build!
138
+ @payload.deploy! do |payload|
139
+ payload.exploit.should be_built
140
+ payload.exploit.should be_deployed
141
+ end
142
+ end
143
+
144
+ it "should build and deploy the payload when called" do
145
+ @payload.call
146
+
147
+ @payload.should be_built
148
+ @payload.should be_deployed
149
+ end
150
+
151
+ it "should return the name and the version when calling to_s" do
152
+ @payload.to_s.should == 'test 0.1'
153
+ end
154
+
155
+ it "should have a custom inspect method" do
156
+ @payload.inspect.should == '#<Ronin::Payloads::Payload: test 0.1 {:custom=>"func"}>'
157
+ end
95
158
  end