38 lines
789 B
Ruby
38 lines
789 B
Ruby
# -*- coding: binary -*-
|
|
require 'rex/text'
|
|
|
|
module Rex
|
|
module Proto
|
|
module SMB
|
|
class Crypt
|
|
|
|
@@loaded_openssl = false
|
|
|
|
begin
|
|
require 'openssl'
|
|
@@loaded_openssl = true
|
|
rescue ::Exception
|
|
end
|
|
|
|
# Return a signed SMB packet
|
|
def self.sign_smb_packet(mackey, sequence_counter, data)
|
|
raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
|
|
seq = Rex::Text::pack_int64le(sequence_counter)
|
|
netbios_hdr = data.slice!(0,4)
|
|
data[14,8] = seq
|
|
signature = OpenSSL::Digest::MD5.digest(mackey + data)[0,8]
|
|
data[14,8] = signature
|
|
netbios_hdr + data
|
|
end
|
|
|
|
def self.is_signature_correct?(mackey, sequence_counter, data)
|
|
signature1 = data[18,8]
|
|
signature2 = sign_smb_packet(mackey, sequence_counter, data.dup)[18,8]
|
|
return signature1 == signature2
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|