Skip to content

Commit 80e942b

Browse files
committed
fix: better implementation of negotiate_tlv_encryption
1 parent 1a8746f commit 80e942b

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

lib/rex/post/meterpreter/client_core.rb

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -761,22 +761,24 @@ def negotiate_tlv_encryption(timeout: client.comm_timeout)
761761
rsa_key = OpenSSL::PKey::RSA.new(2048)
762762
rsa_pub_key = rsa_key.public_key
763763

764-
request = Packet.create_request(COMMAND_ID_CORE_NEGOTIATE_TLV_ENCRYPTION)
764+
request = Packet.create_request(COMMAND_ID_CORE_NEGOTIATE_TLV_ENCRYPTION)
765765
request.add_tlv(TLV_TYPE_RSA_PUB_KEY, rsa_pub_key.to_der)
766766

767767
begin
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+
key_length = { Packet::ENC_FLAG_AES128 => 16, Packet::ENC_FLAG_AES256 => 32 }[key_type]
771772
is_weak_key = false
772773
if key_enc
773774
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] != "\x00"
778-
else
779-
sym_key = key_dec_data
775+
sym_key = key_dec_data[0..key_length - 1]
776+
if key_dec_data.length > key_length
777+
key_dec_data = key_dec_data[key_length...]
778+
if key_dec_data.length > 0
779+
key_strength = key_dec_data[0]
780+
is_weak_key = key_strength != "\x00"
781+
end
780782
end
781783
else
782784
sym_key = response.get_tlv_value(TLV_TYPE_SYM_KEY)

0 commit comments

Comments
 (0)