spec/exploits/exploit_spec.rb in ronin-exploits-0.1.1 vs spec/exploits/exploit_spec.rb in ronin-exploits-0.2.0
- old
+ new
@@ -1,80 +1,177 @@
require 'ronin/exploits/exploit'
require 'spec_helper'
+require 'helpers/objects'
describe Exploits::Exploit do
before(:each) do
- @exp = Exploits::Exploit.new(:name => 'test') do
- def builder
- 'result'
- end
- end
+ @exploit = load_exploit('test')
+ @payload = load_payload('example')
end
it "should require a name attribute" do
- exp2 = Exploits::Exploit.new(:object_path => 'test.rb')
+ exp2 = Exploits::Exploit.new
exp2.should_not be_valid
exp2.name = 'test'
exp2.should be_valid
end
it "should have a unique name and version" do
first_exp = Exploits::Exploit.create(
- :object_path => 'test.rb',
- :name => 'test',
+ :name => 'test2',
:version => '0.0.1'
)
first_exp.should be_valid
second_exp = Exploits::Exploit.new(
- :object_path => 'other.rb',
- :name => 'test',
+ :name => 'test2',
:version => '0.0.1'
)
second_exp.should_not be_valid
third_exp = Exploits::Exploit.new(
- :object_path => 'other.rb',
- :name => 'test',
+ :name => 'test2',
:version => '0.0.2'
)
third_exp.should be_valid
end
+ it "should not have any allowances by default" do
+ @exploit.allows.should be_empty
+ end
+
+ it "should specify the behaviors allowed by the exploit" do
+ @exploit.allowing :memory_read
+
+ @exploit.behaviors.first.should == Vuln::Behavior[:memory_read]
+ end
+
+ it "should allow for the extending of Helper modules" do
+ @exploit.instance_eval { helper :padding }.should == true
+ end
+
+ it "should raise an UnknownHelper when extending an unknown helper" do
+ lambda {
+ @exploit.instance_eval { helper :obvious_not_there }
+ }.should raise_error(Exploits::UnknownHelper)
+ end
+
+ it "should have targeted Archs" do
+ @exploit.targeted_archs.should == [Arch.i686, Arch.i386]
+ end
+
+ it "should have targeted OSes" do
+ @exploit.targeted_oses.should == [
+ OS.linux_version('2.6.23'),
+ OS.windows_version('7.1')
+ ]
+ end
+
+ it "should have targeted products" do
+ @exploit.targeted_products.all? { |product|
+ product.name == 'ExampleWare' && product.version == '1.5'
+ }.should == true
+ end
+
+ it "should allow the explicit selection of a target" do
+ @exploit.select_target { |target| target.arch == Arch.i686 }
+
+ @exploit.target.arch.should == Arch.i686
+ end
+
+ it "should have a default target" do
+ @exploit.target.should_not be_nil
+
+ @exploit.target.arch.should == Arch.i686
+
+ @exploit.target.os.name.should == 'Linux'
+ @exploit.target.os.version.should == '2.6.23'
+ end
+
+ it "should have a default targeted Arch" do
+ @exploit.arch.should == Arch.i686
+ end
+
+ it "should have a default targeted OS" do
+ @exploit.os.should == OS.linux_version('2.6.23')
+ end
+
+ it "should have a default targeted Product" do
+ @exploit.product.name.should == 'ExampleWare'
+ @exploit.product.version.should == '1.5'
+ end
+
it "should be able to switch between payloads" do
- @exp.payload = 'payload1'
+ @exploit.payload = @payload
- @exp.switch_payload('payload2') do
- @exp.payload.should == 'payload2'
+ @exploit.switch_payload('other_payload') do
+ @exploit.payload.should == 'other_payload'
end
- @exp.payload.should == 'payload1'
+ @exploit.payload.should == @payload
end
+ it "should build the payload if it is a kind of Payloads::Payload" do
+ @exploit.payload = @payload
+ @exploit.encode_payload!
+
+ @exploit.payload.should be_built
+ end
+
+ it "should share parameters with the payload if it is a kind of Payloads::Payload" do
+ @exploit.payload = @payload
+ @exploit.encode_payload!
+
+ @payload.var.should == @exploit.var
+ end
+
+ it "should encode a String payload" do
+ @exploit.payload = 'data'
+
+ @exploit.encode_payload!
+ @exploit.encoded_payload.should == 'data'
+ end
+
+ it "should encode a String using encoders" do
+ @exploit.payload = 'data'
+ @exploit.encoders << lambda { |payload| payload.upcase }
+
+ @exploit.encode_payload!
+ @exploit.encoded_payload.should == 'DATA'
+ end
+
+ it "should ignore payload encoders which return nil" do
+ @exploit.payload = 'data'
+ @exploit.encoders << lambda { |payload| nil }
+
+ @exploit.encode_payload!
+ @exploit.encoded_payload.should == 'data'
+ end
+
it "should have 'unbuilt' and 'built' states" do
- @exp.should_not be_built
- @exp.build
- @exp.should be_built
+ @exploit.should_not be_built
+ @exploit.build!
+ @exploit.should be_built
end
it "should return the result of the builder" do
- @exp.build.should == 'result'
+ @exploit.build!.should == 'result'
end
it "should require the exploit is built before being deployed" do
- lambda { @exp.deploy }.should raise_error(Exploits::ExploitNotBuilt)
+ lambda { @exploit.deploy! }.should raise_error(Exploits::ExploitNotBuilt)
end
it "should have a default deployer method" do
- @exp.build
+ @exploit.build!
- @exp.deploy do |exploit|
- @exp.should == exploit
+ @exploit.deploy! do |exploit|
+ @exploit.should == exploit
end
end
it "should return the name and the version when calling to_s" do
- @exp.to_s.should == 'test 0.1'
+ @exploit.to_s.should == 'test 0.2'
end
end