Skip to content

Commit acfaf52

Browse files
committed
feat(meterpreter): display a warning when a weak encryption aes_key is used. skip module loading if encryption is weak.
1 parent 906a348 commit acfaf52

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

lib/msf/base/sessions/meterpreter.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,10 @@ def bootstrap(datastore = {}, handler = nil)
175175
end
176176

177177
session.commands.concat(session.core.get_loaded_extension_commands('core'))
178-
178+
if session.tlv_enc_key[:is_weak_key]
179+
print_warning('Meterpreter session is using a weak encryption key.')
180+
return nil
181+
end
179182
# Unhook the process prior to loading stdapi to reduce logging/inspection by any AV/PSP
180183
if datastore['AutoUnhookProcess'] == true
181184
console.run_single('load unhook')

lib/rex/post/meterpreter/client_core.rb

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ module Meterpreter
2525
#
2626
###
2727
class ClientCore < Extension
28-
28+
2929
METERPRETER_TRANSPORT_TCP = 0
3030
METERPRETER_TRANSPORT_HTTP = 1
3131
METERPRETER_TRANSPORT_HTTPS = 2
@@ -710,7 +710,7 @@ def migrate(target_pid, writable_dir = nil, opts = {})
710710

711711
# Renegotiate TLV encryption on the migrated session
712712
secure
713-
713+
714714
# Load all the extensions that were loaded in the previous instance (using the correct platform/binary_suffix)
715715
client.ext.aliases.keys.each { |e|
716716
client.core.use(e)
@@ -768,9 +768,16 @@ def negotiate_tlv_encryption(timeout: client.comm_timeout)
768768
response = client.send_request(request, timeout)
769769
key_enc = response.get_tlv_value(TLV_TYPE_ENC_SYM_KEY)
770770
key_type = response.get_tlv_value(TLV_TYPE_SYM_KEY_TYPE)
771-
771+
is_weak_key = false
772772
if key_enc
773-
sym_key = rsa_key.private_decrypt(key_enc, OpenSSL::PKey::RSA::PKCS1_PADDING)
773+
key_dec_data = rsa_key.private_decrypt(key_enc, OpenSSL::PKey::RSA::PKCS1_PADDING)
774+
775+
if key_dec_data.length == 17 || key_dec_data.length == 33
776+
sym_key = key_dec_data[0, key_dec_data.length - 1]
777+
is_weak_key = key_dec_data[key_dec_data.length - 1] == "\x01"
778+
else
779+
sym_key = key_dec_data
780+
end
774781
else
775782
sym_key = response.get_tlv_value(TLV_TYPE_SYM_KEY)
776783
end
@@ -781,7 +788,8 @@ def negotiate_tlv_encryption(timeout: client.comm_timeout)
781788

782789
{
783790
key: sym_key,
784-
type: key_type
791+
type: key_type,
792+
is_weak_key: is_weak_key
785793
}
786794
end
787795

0 commit comments

Comments
 (0)