Add debug option to Python Meterpreter
This commit is contained in:
parent
c252faf938
commit
fc73498919
|
@ -75,6 +75,10 @@ module Msf
|
||||||
'MeterpreterDebugBuild',
|
'MeterpreterDebugBuild',
|
||||||
[false, 'Use a debug version of Meterpreter']
|
[false, 'Use a debug version of Meterpreter']
|
||||||
),
|
),
|
||||||
|
OptMeterpreterDebugLogging.new(
|
||||||
|
'MeterpreterDebugLogging',
|
||||||
|
[false, 'The Meterpreter debug logging configuration, see https://github.com/rapid7/metasploit-framework/wiki/Meterpreter-Debugging-Meterpreter-Sessions']
|
||||||
|
)
|
||||||
],
|
],
|
||||||
self.class
|
self.class
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
# -*- coding: binary -*-
|
||||||
|
|
||||||
|
module Msf
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# Meterpreter Debug Logging option
|
||||||
|
#
|
||||||
|
###
|
||||||
|
class OptMeterpreterDebugLogging < OptBase
|
||||||
|
def initialize(in_name, attrs = [], **kwargs)
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
'meterpreterdebuglogging'
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_on_assignment?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid?(value, check_empty: true)
|
||||||
|
return false if !super(value, check_empty: check_empty)
|
||||||
|
|
||||||
|
begin
|
||||||
|
_parse_result = self.class.parse_logging_options(value)
|
||||||
|
true
|
||||||
|
rescue ::ArgumentError
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
#
|
||||||
|
# Parses the given Meterpreter Debug Logging string
|
||||||
|
#
|
||||||
|
##
|
||||||
|
def self.parse_logging_options(value)
|
||||||
|
result = {}
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
return result if value.nil?
|
||||||
|
|
||||||
|
value = value.strip
|
||||||
|
# Match 'rpath:./file', 'rpath:/file', and drive letters e.g. 'rpath:C:/file'
|
||||||
|
rpath_regex = %r{^rpath:((\.?/\p{ASCII}+)|(\p{ASCII}:/\p{ASCII}+))}i
|
||||||
|
|
||||||
|
# Check if we log to rpath
|
||||||
|
if value.match?(rpath_regex)
|
||||||
|
# https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd
|
||||||
|
max_length = 260
|
||||||
|
rpath_value = value.split('rpath:').last
|
||||||
|
if rpath_value.length <= max_length
|
||||||
|
result[:rpath] = rpath_value
|
||||||
|
else
|
||||||
|
errors << "Rpath is too long. Max length: #{max_length}"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
errors << 'Value is not a valid rpath string'
|
||||||
|
end
|
||||||
|
|
||||||
|
if errors.any?
|
||||||
|
raise ::ArgumentError, "Failed to validate MeterpreterDebugLogging option: #{value} with error/errors: #{errors.join('. ')}"
|
||||||
|
end
|
||||||
|
|
||||||
|
result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -34,9 +34,10 @@ module Payload::Python::MeterpreterLoader
|
||||||
default: true
|
default: true
|
||||||
),
|
),
|
||||||
OptBool.new(
|
OptBool.new(
|
||||||
'PythonMeterpreterDebug',
|
'MeterpreterDebugBuild',
|
||||||
'Enable debugging for the Python meterpreter'
|
'Enable debugging for the Python meterpreter',
|
||||||
),
|
aliases: ['PythonMeterpreterDebug']
|
||||||
|
)
|
||||||
] +
|
] +
|
||||||
Msf::Opt::http_header_options
|
Msf::Opt::http_header_options
|
||||||
)
|
)
|
||||||
|
@ -70,12 +71,16 @@ module Payload::Python::MeterpreterLoader
|
||||||
txt.gsub('\\', '\\' * 8).gsub('\'', %q(\\\\\\\'))
|
txt.gsub('\\', '\\' * 8).gsub('\'', %q(\\\\\\\'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ds['MeterpreterDebugBuild']
|
||||||
|
met.sub!(%q|DEBUGGING = False|, %q|DEBUGGING = True|)
|
||||||
|
|
||||||
|
logging_options = Msf::OptMeterpreterDebugLogging.parse_logging_options(ds['MeterpreterDebugLogging'])
|
||||||
|
met.sub!(%q|DEBUGGING_LOG_FILE_PATH = None|, %Q|DEBUGGING_LOG_FILE_PATH = "#{logging_options[:rpath]}"|) if logging_options[:rpath]
|
||||||
|
end
|
||||||
|
|
||||||
unless ds['MeterpreterTryToFork']
|
unless ds['MeterpreterTryToFork']
|
||||||
met.sub!('TRY_TO_FORK = True', 'TRY_TO_FORK = False')
|
met.sub!('TRY_TO_FORK = True', 'TRY_TO_FORK = False')
|
||||||
end
|
end
|
||||||
if ds['PythonMeterpreterDebug']
|
|
||||||
met.sub!('DEBUGGING = False', 'DEBUGGING = True')
|
|
||||||
end
|
|
||||||
|
|
||||||
met.sub!("# PATCH-SETUP-ENCRYPTION #", python_encryptor_loader)
|
met.sub!("# PATCH-SETUP-ENCRYPTION #", python_encryptor_loader)
|
||||||
|
|
||||||
|
@ -357,7 +362,6 @@ class AESCBC(object):
|
||||||
return _b2s(pt)
|
return _b2s(pt)
|
||||||
?
|
?
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding:binary -*-
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
RSpec.describe Msf::OptMeterpreterDebugLogging do
|
||||||
|
valid_values = [
|
||||||
|
{ value: 'rpath:C:/log.txt', normalized: 'rpath:C:/log.txt' },
|
||||||
|
{ value: 'rpath:/tmp/log.txt', normalized: 'rpath:/tmp/log.txt' },
|
||||||
|
{ value: 'rpath:./log.log', normalized: 'rpath:./log.log' },
|
||||||
|
{ value: ' rpath:./log.log ', normalized: ' rpath:./log.log ' }
|
||||||
|
]
|
||||||
|
invalid_values = [
|
||||||
|
{ value: 'rpath', normalized: 'rpath' },
|
||||||
|
{ value: 'C:', normalized: 'C:' },
|
||||||
|
{ value: 'C', normalized: 'C' },
|
||||||
|
{ value: 'rpath:C', normalized: 'rpath:C' }
|
||||||
|
]
|
||||||
|
|
||||||
|
it_behaves_like 'an option', valid_values, invalid_values, 'meterpreterdebuglogging'
|
||||||
|
end
|
Loading…
Reference in New Issue