ronin-exploits 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.
- data/COPYING.txt +339 -0
- data/History.txt +18 -0
- data/Manifest.txt +42 -0
- data/README.txt +69 -0
- data/Rakefile +15 -0
- data/TODO.txt +25 -0
- data/lib/ronin/exploits.rb +39 -0
- data/lib/ronin/exploits/binary_exploit.rb +133 -0
- data/lib/ronin/exploits/buffer_overflow.rb +76 -0
- data/lib/ronin/exploits/buffer_overflow_target.rb +46 -0
- data/lib/ronin/exploits/exceptions.rb +25 -0
- data/lib/ronin/exploits/exceptions/exploit_not_built.rb +29 -0
- data/lib/ronin/exploits/exceptions/restricted_char.rb +29 -0
- data/lib/ronin/exploits/exploit.rb +263 -0
- data/lib/ronin/exploits/exploit_author.rb +34 -0
- data/lib/ronin/exploits/exploit_target.rb +48 -0
- data/lib/ronin/exploits/exploitable.rb +77 -0
- data/lib/ronin/exploits/format_string.rb +84 -0
- data/lib/ronin/exploits/format_string_target.rb +43 -0
- data/lib/ronin/exploits/impact.rb +46 -0
- data/lib/ronin/exploits/requirement.rb +46 -0
- data/lib/ronin/exploits/version.rb +29 -0
- data/lib/ronin/exploits/web_exploit.rb +77 -0
- data/lib/ronin/models.rb +38 -0
- data/lib/ronin/payloads.rb +33 -0
- data/lib/ronin/payloads/ability.rb +46 -0
- data/lib/ronin/payloads/binary_payload.rb +40 -0
- data/lib/ronin/payloads/payload.rb +203 -0
- data/lib/ronin/payloads/payload_author.rb +34 -0
- data/lib/ronin/payloads/shellcode.rb +34 -0
- data/lib/ronin/payloads/web_payload.rb +34 -0
- data/lib/ronin/translators/xor.rb +96 -0
- data/lib/ronin/vuln/behavior.rb +92 -0
- data/spec/exploits/exploit_spec.rb +80 -0
- data/spec/exploits/exploitable_spec.rb +21 -0
- data/spec/exploits/web_exploit_spec.rb +29 -0
- data/spec/exploits_spec.rb +9 -0
- data/spec/payloads/payload_spec.rb +60 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/translators/xor_spec.rb +26 -0
- data/spec/vuln/behavior_spec.rb +15 -0
- data/tasks/spec.rb +9 -0
- metadata +119 -0
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require './tasks/spec.rb'
|
6
|
+
require './lib/ronin/exploits/version.rb'
|
7
|
+
|
8
|
+
Hoe.new('ronin-exploits', Ronin::Exploits::VERSION) do |p|
|
9
|
+
p.rubyforge_name = 'ronin'
|
10
|
+
p.developer('Postmodern', 'postmodern.mod3@gmail.com')
|
11
|
+
p.remote_rdoc_dir = 'docs/ronin-exploits'
|
12
|
+
p.extra_deps = [['ronin', '>=0.1.3']]
|
13
|
+
end
|
14
|
+
|
15
|
+
# vim: syntax=Ruby
|
data/TODO.txt
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
== TODO:
|
2
|
+
|
3
|
+
=== Ronin Exploits 0.1.0:
|
4
|
+
|
5
|
+
* Complete exploit/payload taxonomy code.
|
6
|
+
* Add dm-scope methods for finding exploits based on their taxonomy
|
7
|
+
relations.
|
8
|
+
|
9
|
+
=== Ronin Exploits 0.1.1:
|
10
|
+
|
11
|
+
* Add more dm-scope methods for finding exploits and payloads based:
|
12
|
+
* Target attributes:
|
13
|
+
* Arch (name).
|
14
|
+
* Platform (os, version).
|
15
|
+
* Authors
|
16
|
+
* Spec exploit/payload relations and dm-scope methods.
|
17
|
+
* Add methods for chaining exploits.
|
18
|
+
|
19
|
+
=== Ronin Exploits 0.1.2:
|
20
|
+
|
21
|
+
* Design a basic Vulnerability Scanner class:
|
22
|
+
* Scan networks of hosts.
|
23
|
+
* Scan web-sites.
|
24
|
+
* Custom tests.
|
25
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
require 'ronin/exploits/requirement'
|
25
|
+
require 'ronin/exploits/impact'
|
26
|
+
require 'ronin/exploits/exploit_author'
|
27
|
+
require 'ronin/exploits/exploit_target'
|
28
|
+
require 'ronin/exploits/exploit'
|
29
|
+
require 'ronin/exploits/binary_exploit'
|
30
|
+
require 'ronin/exploits/buffer_overflow_target'
|
31
|
+
require 'ronin/exploits/buffer_overflow'
|
32
|
+
require 'ronin/exploits/format_string_target'
|
33
|
+
require 'ronin/exploits/format_string'
|
34
|
+
|
35
|
+
require 'reverse_require'
|
36
|
+
|
37
|
+
module Ronin
|
38
|
+
require_for 'ronin', 'ronin/exploits'
|
39
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
require 'ronin/exploits/exceptions/exploit_not_built'
|
25
|
+
require 'ronin/exploits/exceptions/restricted_char'
|
26
|
+
require 'ronin/exploits/exploit_target'
|
27
|
+
require 'ronin/exploits/exploit'
|
28
|
+
require 'ronin/chars/char_set'
|
29
|
+
require 'ronin/formatting/binary'
|
30
|
+
|
31
|
+
module Ronin
|
32
|
+
module Exploits
|
33
|
+
class BinaryExploit < Exploit
|
34
|
+
|
35
|
+
objectify :ronin_binary_exploit
|
36
|
+
|
37
|
+
# Targets of the exploit
|
38
|
+
has n, :targets, :class_name => 'ExploitTarget'
|
39
|
+
|
40
|
+
# Target index to use
|
41
|
+
parameter :target_index,
|
42
|
+
:value => 0,
|
43
|
+
:description => 'default target index'
|
44
|
+
|
45
|
+
# Custom target to use
|
46
|
+
parameter :custom_target, :description => 'custom target'
|
47
|
+
|
48
|
+
# String to pad extra space with
|
49
|
+
parameter :pad, :value => 'A', :description => 'padding string'
|
50
|
+
|
51
|
+
# Restricted characters that may not occurr in the built exploit
|
52
|
+
attr_accessor :restricted
|
53
|
+
|
54
|
+
# The built exploit
|
55
|
+
attr_accessor :exploit
|
56
|
+
|
57
|
+
#
|
58
|
+
# Creates a new BinaryExploit object with the given _attributes_.
|
59
|
+
#
|
60
|
+
def initialize(attributes={})
|
61
|
+
super(attributes)
|
62
|
+
|
63
|
+
@restricted = Chars::CharSet.new(attributes[:restricted] || [])
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# Adds an ExploitTarget with the given _attributes_. If a _block_ is
|
68
|
+
# given, it will be passed the ExploitTarget.
|
69
|
+
#
|
70
|
+
def target(attributes={},&block)
|
71
|
+
@targets << ExploitTarget.first_or_create(attributes,&block)
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# Returns the selected target.
|
76
|
+
#
|
77
|
+
def selected_target
|
78
|
+
(@custom_target || @targets[@target_index])
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Creates a padded buffer of the specified _length_ using the
|
83
|
+
# specified _padding_ data.
|
84
|
+
#
|
85
|
+
def pad_buffer(padding,length)
|
86
|
+
padding = padding.to_s
|
87
|
+
|
88
|
+
buffer = (padding * (length / padding.length))
|
89
|
+
pad_remaining = (length % padding.length)
|
90
|
+
|
91
|
+
unless pad_remaining==0
|
92
|
+
buffer += padding[0,pad_remaining]
|
93
|
+
end
|
94
|
+
|
95
|
+
return buffer
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Adds the given _chars_ to the restricted list of characters.
|
100
|
+
#
|
101
|
+
# restrict 0x00, "\n"
|
102
|
+
# # => #<Ronin::Chars::CharSet: {"\0", "\n"}>
|
103
|
+
#
|
104
|
+
def restrict(*chars)
|
105
|
+
@restricted += pattern
|
106
|
+
end
|
107
|
+
|
108
|
+
def build
|
109
|
+
@exploit = ''
|
110
|
+
return super
|
111
|
+
end
|
112
|
+
|
113
|
+
#
|
114
|
+
# Verifies that the exploit is built and does not contain any
|
115
|
+
# restricted characters.
|
116
|
+
#
|
117
|
+
def verify
|
118
|
+
unless @exploit
|
119
|
+
raise(ExploitNotBuilt,"cannot verify an unbuilt exploit",caller)
|
120
|
+
end
|
121
|
+
|
122
|
+
@restricted.each do |char|
|
123
|
+
if @exploit.include?(char)
|
124
|
+
raise(RestrictedChar,"Restricted character '#{char}' was found in the built exploit",caller)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
return super
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
require 'ronin/exploits/buffer_overflow_target'
|
25
|
+
require 'ronin/exploits/binary_exploit'
|
26
|
+
|
27
|
+
module Ronin
|
28
|
+
module Exploits
|
29
|
+
class BufferOverflow < BinaryExploit
|
30
|
+
|
31
|
+
objectify :ronin_buffer_overflow
|
32
|
+
|
33
|
+
# Targets of the buffer overflow
|
34
|
+
has n, :targets, :class_name => 'BufferOverflowTarget'
|
35
|
+
|
36
|
+
#
|
37
|
+
# Adds a new BufferOverflowTarget with the given _attributes_. If a
|
38
|
+
# _block_ is given, it will be passed the BufferOverflowTarget object.
|
39
|
+
#
|
40
|
+
def target(options={},&block)
|
41
|
+
@targets << BufferOverflowTarget.new(options,&block)
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Builds the exploit buffer with the given _options_.
|
46
|
+
#
|
47
|
+
def build_buffer(options={})
|
48
|
+
target = (options[:target] || selected_target)
|
49
|
+
payload = (options[:payload] || @payload).to_s
|
50
|
+
|
51
|
+
unless payload.length<=target.buffer_length
|
52
|
+
raise(PayloadSize,"the specified payload is too large for the target's buffer length",caller)
|
53
|
+
end
|
54
|
+
|
55
|
+
buffer = pad_buffer(@pad,(target.buffer_length-payload.length))+payload
|
56
|
+
|
57
|
+
ip_packed = target.ip.pack(target.arch)
|
58
|
+
unless target.bp==0
|
59
|
+
buffer += (target.bp.pack(target.arch)+ip_packed)*target.return_length
|
60
|
+
else
|
61
|
+
buffer += ip_packed*(target.return_length*2)
|
62
|
+
end
|
63
|
+
|
64
|
+
return buffer
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# Default builder method which simply calls build_buffer.
|
69
|
+
#
|
70
|
+
def builder
|
71
|
+
@package = build_buffer
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
require 'ronin/exploits/exploit_target'
|
25
|
+
|
26
|
+
module Ronin
|
27
|
+
module Exploits
|
28
|
+
class BufferOverflowTarget < ExploitTarget
|
29
|
+
|
30
|
+
# Buffer length
|
31
|
+
property :buffer_length, Integer, :default => 0
|
32
|
+
|
33
|
+
# Return length
|
34
|
+
property :return_length, Integer, :default => 1
|
35
|
+
|
36
|
+
# Instruction Pointer
|
37
|
+
property :ip, Integer, :default => 0x0
|
38
|
+
|
39
|
+
# Stack base pointer
|
40
|
+
property :bp, Integer
|
41
|
+
|
42
|
+
belongs_to :buffer_overflow
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
require 'ronin/exploits/exceptions/exploit_not_built'
|
25
|
+
require 'ronin/exploits/exceptions/restricted_char'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
module Ronin
|
25
|
+
module Exploits
|
26
|
+
class ExploitNotBuilt < RuntimeError
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
module Ronin
|
25
|
+
module Exploits
|
26
|
+
class RestrictedChar < RuntimeError
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,263 @@
|
|
1
|
+
#
|
2
|
+
#--
|
3
|
+
# Ronin Exploits - A Ruby library for Ronin that provides exploitation and
|
4
|
+
# payload crafting functionality.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
11
|
+
# (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
# GNU General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU General Public License
|
19
|
+
# along with this program; if not, write to the Free Software
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
+
#++
|
22
|
+
#
|
23
|
+
|
24
|
+
require 'ronin/exploits/requirement'
|
25
|
+
require 'ronin/exploits/impact'
|
26
|
+
require 'ronin/exploits/exploit_author'
|
27
|
+
require 'ronin/vulnerability/behavior'
|
28
|
+
require 'ronin/objectify'
|
29
|
+
require 'ronin/has_license'
|
30
|
+
|
31
|
+
module Ronin
|
32
|
+
module Exploits
|
33
|
+
class Exploit
|
34
|
+
|
35
|
+
include Objectify
|
36
|
+
include HasLicense
|
37
|
+
|
38
|
+
objectify :ronin_exploit
|
39
|
+
|
40
|
+
# Primary key of the exploit
|
41
|
+
property :id, Serial
|
42
|
+
|
43
|
+
# Name of the exploit
|
44
|
+
property :name, String, :index => true
|
45
|
+
|
46
|
+
# Version of the exploit
|
47
|
+
property :version, String, :default => '0.1', :index => true
|
48
|
+
|
49
|
+
# Description of the exploit
|
50
|
+
property :description, Text
|
51
|
+
|
52
|
+
# Author(s) of the exploit
|
53
|
+
has n, :authors, :class_name => 'ExploitAuthor'
|
54
|
+
|
55
|
+
# The requirements of the exploit
|
56
|
+
has n, :requirements
|
57
|
+
|
58
|
+
# Impact of the exploit
|
59
|
+
has n, :impact, :class_name => 'Impact'
|
60
|
+
|
61
|
+
# Validations
|
62
|
+
validates_present :name
|
63
|
+
validates_is_unique :version, :scope => [:name]
|
64
|
+
|
65
|
+
# Exploit payload
|
66
|
+
attr_accessor :payload
|
67
|
+
|
68
|
+
#
|
69
|
+
# Creates a new Exploit object with the given _attributes_.
|
70
|
+
#
|
71
|
+
def initialize(attributes={},&block)
|
72
|
+
super(attributes)
|
73
|
+
|
74
|
+
@built = false
|
75
|
+
|
76
|
+
instance_eval(&block) if block
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Finds all exploits with names like the specified _name_.
|
81
|
+
#
|
82
|
+
def self.named(name)
|
83
|
+
self.all(:name.like => "%#{name}%")
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# Finds all exploits with descriptions like the specified
|
88
|
+
# _description_.
|
89
|
+
#
|
90
|
+
def self.describing(description)
|
91
|
+
self.all(:description.like => "%#{description}%")
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Finds the exploit with the most recent vesion.
|
96
|
+
#
|
97
|
+
def self.latest
|
98
|
+
self.first(:order => [:version.desc])
|
99
|
+
end
|
100
|
+
|
101
|
+
#
|
102
|
+
# Adds an ExploitAuthor with the given _attributes_ to the exploit.
|
103
|
+
# If a _block_ is given, it will be passed the ExploitAuthro object.
|
104
|
+
#
|
105
|
+
def author(attributes={},&block)
|
106
|
+
self.authors << ExploitAuthor.first_or_create(attributes,&block)
|
107
|
+
end
|
108
|
+
|
109
|
+
#
|
110
|
+
# Adds a new Requirement for the Ability with the specified
|
111
|
+
# _behavior_.
|
112
|
+
#
|
113
|
+
def requires(behavior)
|
114
|
+
self.requirements << Requirement.new(
|
115
|
+
:behavior => behavior,
|
116
|
+
:exploit => self
|
117
|
+
)
|
118
|
+
|
119
|
+
return self
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Adds a new Impact granting the specified _behavior_.
|
124
|
+
#
|
125
|
+
def allows(behavior)
|
126
|
+
self.impact << Impact.new(
|
127
|
+
:behavior => behavior,
|
128
|
+
:exploit => self
|
129
|
+
)
|
130
|
+
|
131
|
+
return self
|
132
|
+
end
|
133
|
+
|
134
|
+
#
|
135
|
+
# Switches to the _new_payload_ then calls the specified _block_.
|
136
|
+
# After the _block_ has been called the payload will be reverted to
|
137
|
+
# it's previous value.
|
138
|
+
#
|
139
|
+
def switch_payload(new_payload,&block)
|
140
|
+
old_payload = @payload
|
141
|
+
@payload = new_payload
|
142
|
+
|
143
|
+
block.call(self)
|
144
|
+
|
145
|
+
@payload = old_payload
|
146
|
+
return self
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
# Default vulnerability test method. Returning +true+ symbolizes
|
151
|
+
# that the target of the exploit is vulnerable. Returning +nil+
|
152
|
+
# symbolizes that the exploit cannot determine if the target is
|
153
|
+
# vulnerable or not. Returning +false+ symbolizes that the target
|
154
|
+
# of the exploit is definitely not vulnerable. Returns +nil+ by
|
155
|
+
# default.
|
156
|
+
#
|
157
|
+
def vulnerable?
|
158
|
+
nil
|
159
|
+
end
|
160
|
+
|
161
|
+
#
|
162
|
+
# Default builder method.
|
163
|
+
#
|
164
|
+
def builder
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
# Returns +true+ if the exploit is built, returns +false+ otherwise.
|
169
|
+
#
|
170
|
+
def built?
|
171
|
+
@built == true
|
172
|
+
end
|
173
|
+
|
174
|
+
#
|
175
|
+
# Builds the exploit with the given _options_ and checks for
|
176
|
+
# restricted characters or patterns. If any restricted characters or
|
177
|
+
# patterns are found in the built exploit, a RestrictedText exception
|
178
|
+
# will be raised.
|
179
|
+
#
|
180
|
+
def build(options={})
|
181
|
+
self.params = options
|
182
|
+
|
183
|
+
@payload = (options[:payload] || @payload)
|
184
|
+
|
185
|
+
if (@payload && @payload.include?(Parameters))
|
186
|
+
@payload.params = options
|
187
|
+
end
|
188
|
+
|
189
|
+
@built = false
|
190
|
+
|
191
|
+
result = builder
|
192
|
+
|
193
|
+
@built = true
|
194
|
+
return result
|
195
|
+
end
|
196
|
+
|
197
|
+
#
|
198
|
+
# Default exploit verifier method.
|
199
|
+
#
|
200
|
+
def verifier
|
201
|
+
end
|
202
|
+
|
203
|
+
#
|
204
|
+
# Verifies the exploit is properly configured, built and ready to be
|
205
|
+
# deployed. An exception should be raised if the exploit is not ready
|
206
|
+
# to be deployed, returns +true+ otherwise.
|
207
|
+
#
|
208
|
+
def verify
|
209
|
+
unless built?
|
210
|
+
raise(ExploitNotBuilt,"cannot deploy an unbuilt exploit",caller)
|
211
|
+
end
|
212
|
+
|
213
|
+
verifier
|
214
|
+
return true
|
215
|
+
end
|
216
|
+
|
217
|
+
#
|
218
|
+
# Default exploit deployer method, passes the exploit object to the
|
219
|
+
# given _block_ by default.
|
220
|
+
#
|
221
|
+
def deployer(&block)
|
222
|
+
block.call(self) if block
|
223
|
+
end
|
224
|
+
|
225
|
+
#
|
226
|
+
# Deploys the exploit. If a _block_ is given and the payload used is
|
227
|
+
# a kind of Payload, then the payloads deploy method will be passed
|
228
|
+
# the given _block_. If the payload used is not a kind of Payload and
|
229
|
+
# a _block_ is given, the _block_ will be passed to the exploits
|
230
|
+
# deployer method. If the exploit has not been previously built, an
|
231
|
+
# ExploitNotBuilt exception will be raised.
|
232
|
+
#
|
233
|
+
def deploy(&block)
|
234
|
+
verify
|
235
|
+
|
236
|
+
if (@payload && @payload.kind_of?(Payloads::Payload))
|
237
|
+
deployer()
|
238
|
+
|
239
|
+
return @payload.deploy(&block)
|
240
|
+
else
|
241
|
+
return deployer(&block)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
#
|
246
|
+
# Builds, deploys and then cleans the exploit with the given _options_.
|
247
|
+
#
|
248
|
+
def exploit(options={},&block)
|
249
|
+
build(options)
|
250
|
+
|
251
|
+
return deploy(&block)
|
252
|
+
end
|
253
|
+
|
254
|
+
#
|
255
|
+
# Returns the built exploit.
|
256
|
+
#
|
257
|
+
def to_s
|
258
|
+
"#{self.name} #{self.version}"
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|