Skip to content

Commit f7dfba6

Browse files
committed
deduplicate code from python meterpreter
1 parent b7c231b commit f7dfba6

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

lib/msf/core/payload/python/meterpreter_loader.rb

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: binary -*-
22

33
require 'msf/core'
4+
require 'msf/core/payload/transport_config'
45
require 'msf/base/sessions/meterpreter_options'
56
require 'msf/core/payload/uuid/options'
67

@@ -16,6 +17,7 @@ module Payload::Python::MeterpreterLoader
1617

1718
include Msf::Payload::Python
1819
include Msf::Payload::UUID::Options
20+
include Msf::Payload::TransportConfig
1921
include Msf::Sessions::MeterpreterOptions
2022

2123
def initialize(info = {})
@@ -106,17 +108,11 @@ def stage_meterpreter(opts={})
106108
# so we need to generate it
107109
# TODO: move this to somewhere more common so that it can be used across payload types
108110
unless opts[:url].to_s == ''
109-
uri = "/#{opts[:url].split('/').reject(&:empty?)[-1]}"
110-
111-
scheme = opts[:url].to_s.split(':')[0]
112-
lhost = ds['LHOST']
113-
lport = ds['LPORT']
114-
if ds['OverrideRequestHost']
115-
scheme = ds['OverrideScheme'] || scheme
116-
lhost = ds['OverrideLHOST'] || lhost
117-
lport = ds['OverrideLPORT'] || lport
118-
end
119111

112+
# Build the callback URL (TODO: share this logic with TransportConfig
113+
uri = "/#{opts[:url].split('/').reject(&:empty?)[-1]}"
114+
opts[:scheme] ||= opts[:url].to_s.split(':')[0]
115+
scheme, lhost, lport = transport_uri_components(opts)
120116
callback_url = "#{scheme}://#{lhost}:#{lport}#{ds['LURI']}#{uri}/"
121117

122118
# patch in the various payload related configuration

lib/msf/core/payload/transport_config.rb

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,26 @@ def transport_config_bind_tcp(opts={})
3636

3737
def transport_config_reverse_https(opts={})
3838
ds = opts[:datastore] || datastore
39+
opts[:scheme] ||= 'https'
3940
config = transport_config_reverse_http(opts)
4041
config[:ssl_cert_hash] = get_ssl_cert_hash(ds['StagerVerifySSLCert'],
4142
ds['HandlerSSLCert'])
4243
config
4344
end
4445

46+
def transport_uri_components(opts={})
47+
ds = opts[:datastore] || datastore
48+
scheme = opts[:scheme]
49+
lhost = ds['LHOST']
50+
lport = ds['LPORT']
51+
if ds['OverrideRequestHost']
52+
scheme = ds['OverrideScheme'] || scheme
53+
lhost = ds['OverrideLHOST'] || lhost
54+
lport = ds['OverrideLPORT'] || lport
55+
end
56+
[scheme, lhost, lport]
57+
end
58+
4559
def transport_config_reverse_http(opts={})
4660
# most cases we'll have a URI already, but in case we don't
4761
# we should ask for a connect to happen given that this is
@@ -54,15 +68,8 @@ def transport_config_reverse_http(opts={})
5468
end
5569

5670
ds = opts[:datastore] || datastore
57-
58-
scheme = opts[:url].to_s.split(':')[0]
59-
lhost = ds['LHOST']
60-
lport = ds['LPORT']
61-
if ds['OverrideRequestHost']
62-
scheme = ds['OverrideScheme'] || scheme
63-
lhost = ds['OverrideLHOST'] || lhost
64-
lport = ds['OverrideLPORT'] || lport
65-
end
71+
opts[:scheme] ||= 'http'
72+
scheme, lhost, lport = transport_uri_components(opts)
6673

6774
{
6875
scheme: scheme,

0 commit comments

Comments
 (0)