See #4986, make unicode encoding optional
git-svn-id: file:///home/svn/framework3/trunk@13275 4d416f70-5f16-0410-b530-b9f4589650daunstable
parent
f6e3065a51
commit
7dfb74be10
|
@ -36,7 +36,7 @@ class File < Rex::Post::Meterpreter::Channels::Pool
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
'type' => Rex::Post::Meterpreter::Extensions::Stdapi::TLV_TYPE_FILE_PATH,
|
'type' => Rex::Post::Meterpreter::Extensions::Stdapi::TLV_TYPE_FILE_PATH,
|
||||||
'value' => Rex::Text.unicode_filter_decode( name )
|
'value' => client.unicode_filter_decode( name )
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
'type' => Rex::Post::Meterpreter::Extensions::Stdapi::TLV_TYPE_FILE_MODE,
|
'type' => Rex::Post::Meterpreter::Extensions::Stdapi::TLV_TYPE_FILE_MODE,
|
||||||
|
|
|
@ -115,6 +115,7 @@ class Client
|
||||||
|
|
||||||
self.response_timeout = opts[:timeout] || self.class.default_timeout
|
self.response_timeout = opts[:timeout] || self.class.default_timeout
|
||||||
self.send_keepalives = true
|
self.send_keepalives = true
|
||||||
|
self.encode_unicode = opts.has_key?(:encode_unicode) ? opts[:encode_unicode] : true
|
||||||
|
|
||||||
if opts[:passive_dispatcher]
|
if opts[:passive_dispatcher]
|
||||||
initialize_passive_dispatcher
|
initialize_passive_dispatcher
|
||||||
|
@ -367,6 +368,20 @@ class Client
|
||||||
return items.sort
|
return items.sort
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Encodes (or not) a UTF-8 string
|
||||||
|
#
|
||||||
|
def unicode_filter_encode(str)
|
||||||
|
self.encode_unicode ? client.unicode_filter_encode(str) : str
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Decodes (or not) a UTF-8 string
|
||||||
|
#
|
||||||
|
def unicode_filter_decode(str)
|
||||||
|
self.encode_unicode ? client.unicode_filter_decode(str) : str
|
||||||
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# The extension alias under which all extensions can be accessed by name.
|
# The extension alias under which all extensions can be accessed by name.
|
||||||
# For example:
|
# For example:
|
||||||
|
@ -424,6 +439,10 @@ class Client
|
||||||
# The Passive Dispatcher
|
# The Passive Dispatcher
|
||||||
#
|
#
|
||||||
attr_accessor :passive_dispatcher
|
attr_accessor :passive_dispatcher
|
||||||
|
#
|
||||||
|
# Flag indicating whether to hex-encode UTF-8 file names and other strings
|
||||||
|
#
|
||||||
|
attr_accessor :encode_unicode
|
||||||
|
|
||||||
protected
|
protected
|
||||||
attr_accessor :parser, :ext_aliases # :nodoc:
|
attr_accessor :parser, :ext_aliases # :nodoc:
|
||||||
|
|
|
@ -56,12 +56,12 @@ class Dir < Rex::Post::Dir
|
||||||
request = Packet.create_request('stdapi_fs_ls')
|
request = Packet.create_request('stdapi_fs_ls')
|
||||||
files = []
|
files = []
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, Rex::Text.unicode_filter_decode(name))
|
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, client.unicode_filter_decode(name))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
response.each(TLV_TYPE_FILE_NAME) { |file_name|
|
response.each(TLV_TYPE_FILE_NAME) { |file_name|
|
||||||
files << Rex::Text.unicode_filter_encode( file_name.value )
|
files << client.unicode_filter_encode( file_name.value )
|
||||||
}
|
}
|
||||||
|
|
||||||
return files
|
return files
|
||||||
|
@ -74,7 +74,7 @@ class Dir < Rex::Post::Dir
|
||||||
request = Packet.create_request('stdapi_fs_ls')
|
request = Packet.create_request('stdapi_fs_ls')
|
||||||
files = []
|
files = []
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, Rex::Text.unicode_filter_decode(name))
|
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, client.unicode_filter_decode(name))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
|
@ -96,8 +96,8 @@ class Dir < Rex::Post::Dir
|
||||||
|
|
||||||
files <<
|
files <<
|
||||||
{
|
{
|
||||||
'FileName' => Rex::Text.unicode_filter_encode( file_name.value ),
|
'FileName' => client.unicode_filter_encode( file_name.value ),
|
||||||
'FilePath' => Rex::Text.unicode_filter_encode( fpath[idx].value ),
|
'FilePath' => client.unicode_filter_encode( fpath[idx].value ),
|
||||||
'StatBuf' => st,
|
'StatBuf' => st,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ class Dir < Rex::Post::Dir
|
||||||
def Dir.chdir(path)
|
def Dir.chdir(path)
|
||||||
request = Packet.create_request('stdapi_fs_chdir')
|
request = Packet.create_request('stdapi_fs_chdir')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, Rex::Text.unicode_filter_decode( path ))
|
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, client.unicode_filter_decode( path ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ class Dir < Rex::Post::Dir
|
||||||
def Dir.mkdir(path)
|
def Dir.mkdir(path)
|
||||||
request = Packet.create_request('stdapi_fs_mkdir')
|
request = Packet.create_request('stdapi_fs_mkdir')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, Rex::Text.unicode_filter_decode( path ))
|
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, client.unicode_filter_decode( path ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ class Dir < Rex::Post::Dir
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
return Rex::Text.unicode_filter_encode( response.get_tlv(TLV_TYPE_DIRECTORY_PATH).value )
|
return client.unicode_filter_encode( response.get_tlv(TLV_TYPE_DIRECTORY_PATH).value )
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -161,7 +161,7 @@ class Dir < Rex::Post::Dir
|
||||||
def Dir.delete(path)
|
def Dir.delete(path)
|
||||||
request = Packet.create_request('stdapi_fs_delete_dir')
|
request = Packet.create_request('stdapi_fs_delete_dir')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, Rex::Text.unicode_filter_decode( path ))
|
request.add_tlv(TLV_TYPE_DIRECTORY_PATH, client.unicode_filter_decode( path ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
|
@ -195,8 +195,8 @@ class Dir < Rex::Post::Dir
|
||||||
def Dir.download(dst, src, recursive = false, force = true, &stat)
|
def Dir.download(dst, src, recursive = false, force = true, &stat)
|
||||||
|
|
||||||
self.entries(src).each { |src_sub|
|
self.entries(src).each { |src_sub|
|
||||||
dst_item = dst + ::File::SEPARATOR + Rex::Text.unicode_filter_encode( src_sub )
|
dst_item = dst + ::File::SEPARATOR + client.unicode_filter_encode( src_sub )
|
||||||
src_item = src + File::SEPARATOR + Rex::Text.unicode_filter_encode( src_sub )
|
src_item = src + File::SEPARATOR + client.unicode_filter_encode( src_sub )
|
||||||
|
|
||||||
if (src_sub == '.' or src_sub == '..')
|
if (src_sub == '.' or src_sub == '..')
|
||||||
next
|
next
|
||||||
|
@ -240,8 +240,8 @@ class Dir < Rex::Post::Dir
|
||||||
#
|
#
|
||||||
def Dir.upload(dst, src, recursive = false, &stat)
|
def Dir.upload(dst, src, recursive = false, &stat)
|
||||||
::Dir.entries(src).each { |src_sub|
|
::Dir.entries(src).each { |src_sub|
|
||||||
dst_item = dst + File::SEPARATOR + Rex::Text.unicode_filter_encode( src_sub )
|
dst_item = dst + File::SEPARATOR + client.unicode_filter_encode( src_sub )
|
||||||
src_item = src + ::File::SEPARATOR + Rex::Text.unicode_filter_encode( src_sub )
|
src_item = src + ::File::SEPARATOR + client.unicode_filter_encode( src_sub )
|
||||||
|
|
||||||
if (src_sub == '.' or src_sub == '..')
|
if (src_sub == '.' or src_sub == '..')
|
||||||
next
|
next
|
||||||
|
|
|
@ -44,7 +44,7 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
|
||||||
|
|
||||||
request = Packet.create_request( 'stdapi_fs_search' )
|
request = Packet.create_request( 'stdapi_fs_search' )
|
||||||
|
|
||||||
root = Rex::Text.unicode_filter_decode(root) if root
|
root = client.unicode_filter_decode(root) if root
|
||||||
root = root.chomp( '\\' ) if root
|
root = root.chomp( '\\' ) if root
|
||||||
|
|
||||||
request.add_tlv( TLV_TYPE_SEARCH_ROOT, root )
|
request.add_tlv( TLV_TYPE_SEARCH_ROOT, root )
|
||||||
|
@ -57,8 +57,8 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
|
||||||
if( response.result == 0 )
|
if( response.result == 0 )
|
||||||
response.each( TLV_TYPE_SEARCH_RESULTS ) do | results |
|
response.each( TLV_TYPE_SEARCH_RESULTS ) do | results |
|
||||||
files << {
|
files << {
|
||||||
'path' => Rex::Text.unicode_filter_encode( results.get_tlv_value( TLV_TYPE_FILE_PATH ).chomp( '\\' ) ),
|
'path' => client.unicode_filter_encode( results.get_tlv_value( TLV_TYPE_FILE_PATH ).chomp( '\\' ) ),
|
||||||
'name' => Rex::Text.unicode_filter_encode( results.get_tlv_value( TLV_TYPE_FILE_NAME ) ),
|
'name' => client.unicode_filter_encode( results.get_tlv_value( TLV_TYPE_FILE_NAME ) ),
|
||||||
'size' => results.get_tlv_value( TLV_TYPE_FILE_SIZE )
|
'size' => results.get_tlv_value( TLV_TYPE_FILE_SIZE )
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -88,11 +88,11 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
|
||||||
def File.expand_path(path)
|
def File.expand_path(path)
|
||||||
request = Packet.create_request('stdapi_fs_file_expand_path')
|
request = Packet.create_request('stdapi_fs_file_expand_path')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_FILE_PATH, Rex::Text.unicode_filter_decode( path ))
|
request.add_tlv(TLV_TYPE_FILE_PATH, client.unicode_filter_decode( path ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
return Rex::Text.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_FILE_PATH) )
|
return client.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_FILE_PATH) )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
|
||||||
def File.md5(path)
|
def File.md5(path)
|
||||||
request = Packet.create_request('stdapi_fs_md5')
|
request = Packet.create_request('stdapi_fs_md5')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_FILE_PATH, Rex::Text.unicode_filter_decode( path ))
|
request.add_tlv(TLV_TYPE_FILE_PATH, client.unicode_filter_decode( path ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
|
||||||
def File.sha1(path)
|
def File.sha1(path)
|
||||||
request = Packet.create_request('stdapi_fs_sha1')
|
request = Packet.create_request('stdapi_fs_sha1')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_FILE_PATH, Rex::Text.unicode_filter_decode( path ))
|
request.add_tlv(TLV_TYPE_FILE_PATH, client.unicode_filter_decode( path ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ class File < Rex::Post::Meterpreter::Extensions::Stdapi::Fs::IO
|
||||||
def File.rm(name)
|
def File.rm(name)
|
||||||
request = Packet.create_request('stdapi_fs_delete_file')
|
request = Packet.create_request('stdapi_fs_delete_file')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_FILE_PATH, Rex::Text.unicode_filter_decode( name ))
|
request.add_tlv(TLV_TYPE_FILE_PATH, client.unicode_filter_decode( name ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@ protected
|
||||||
def stat(file)
|
def stat(file)
|
||||||
request = Packet.create_request('stdapi_fs_stat')
|
request = Packet.create_request('stdapi_fs_stat')
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_FILE_PATH, Rex::Text.unicode_filter_decode( file ))
|
request.add_tlv(TLV_TYPE_FILE_PATH, client.unicode_filter_decode( file ))
|
||||||
|
|
||||||
response = self.class.client.send_request(request)
|
response = self.class.client.send_request(request)
|
||||||
stat_buf = response.get_tlv(TLV_TYPE_STAT_BUF).value
|
stat_buf = response.get_tlv(TLV_TYPE_STAT_BUF).value
|
||||||
|
|
|
@ -30,7 +30,7 @@ class Config
|
||||||
def getuid
|
def getuid
|
||||||
request = Packet.create_request('stdapi_sys_config_getuid')
|
request = Packet.create_request('stdapi_sys_config_getuid')
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
return Rex::Text.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_USER_NAME) )
|
return client.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_USER_NAME) )
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -62,7 +62,7 @@ class Config
|
||||||
req = Packet.create_request('stdapi_sys_config_steal_token')
|
req = Packet.create_request('stdapi_sys_config_steal_token')
|
||||||
req.add_tlv(TLV_TYPE_PID, pid.to_i)
|
req.add_tlv(TLV_TYPE_PID, pid.to_i)
|
||||||
res = client.send_request(req)
|
res = client.send_request(req)
|
||||||
return Rex::Text.unicode_filter_encode( res.get_tlv_value(TLV_TYPE_USER_NAME) )
|
return client.unicode_filter_encode( res.get_tlv_value(TLV_TYPE_USER_NAME) )
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -71,7 +71,7 @@ class Config
|
||||||
def drop_token
|
def drop_token
|
||||||
req = Packet.create_request('stdapi_sys_config_drop_token')
|
req = Packet.create_request('stdapi_sys_config_drop_token')
|
||||||
res = client.send_request(req)
|
res = client.send_request(req)
|
||||||
return Rex::Text.unicode_filter_encode( res.get_tlv_value(TLV_TYPE_USER_NAME) )
|
return client.unicode_filter_encode( res.get_tlv_value(TLV_TYPE_USER_NAME) )
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -151,7 +151,7 @@ class Process < Rex::Post::Process
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
request.add_tlv(TLV_TYPE_PROCESS_PATH, Rex::Text.unicode_filter_decode( path ));
|
request.add_tlv(TLV_TYPE_PROCESS_PATH, client.unicode_filter_decode( path ));
|
||||||
|
|
||||||
# If process arguments were supplied
|
# If process arguments were supplied
|
||||||
if (arguments != nil)
|
if (arguments != nil)
|
||||||
|
@ -237,10 +237,10 @@ class Process < Rex::Post::Process
|
||||||
{
|
{
|
||||||
'pid' => p.get_tlv_value(TLV_TYPE_PID),
|
'pid' => p.get_tlv_value(TLV_TYPE_PID),
|
||||||
'parentid' => p.get_tlv_value(TLV_TYPE_PARENT_PID),
|
'parentid' => p.get_tlv_value(TLV_TYPE_PARENT_PID),
|
||||||
'name' => Rex::Text.unicode_filter_encode( p.get_tlv_value(TLV_TYPE_PROCESS_NAME) ),
|
'name' => client.unicode_filter_encode( p.get_tlv_value(TLV_TYPE_PROCESS_NAME) ),
|
||||||
'path' => Rex::Text.unicode_filter_encode( p.get_tlv_value(TLV_TYPE_PROCESS_PATH) ),
|
'path' => client.unicode_filter_encode( p.get_tlv_value(TLV_TYPE_PROCESS_PATH) ),
|
||||||
'session' => p.get_tlv_value(TLV_TYPE_PROCESS_SESSION),
|
'session' => p.get_tlv_value(TLV_TYPE_PROCESS_SESSION),
|
||||||
'user' => Rex::Text.unicode_filter_encode( p.get_tlv_value(TLV_TYPE_USER_NAME) ),
|
'user' => client.unicode_filter_encode( p.get_tlv_value(TLV_TYPE_USER_NAME) ),
|
||||||
'arch' => arch
|
'arch' => arch
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -358,8 +358,8 @@ protected
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
|
|
||||||
# Populate the hash
|
# Populate the hash
|
||||||
info['name'] = Rex::Text.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_PROCESS_NAME) )
|
info['name'] = client.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_PROCESS_NAME) )
|
||||||
info['path'] = Rex::Text.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_PROCESS_PATH) )
|
info['path'] = client.unicode_filter_encode( response.get_tlv_value(TLV_TYPE_PROCESS_PATH) )
|
||||||
|
|
||||||
return info
|
return info
|
||||||
end
|
end
|
||||||
|
|
|
@ -44,7 +44,7 @@ class Registry
|
||||||
request = Packet.create_request('stdapi_registry_load_key')
|
request = Packet.create_request('stdapi_registry_load_key')
|
||||||
request.add_tlv(TLV_TYPE_ROOT_KEY, root_key)
|
request.add_tlv(TLV_TYPE_ROOT_KEY, root_key)
|
||||||
request.add_tlv(TLV_TYPE_BASE_KEY, base_key)
|
request.add_tlv(TLV_TYPE_BASE_KEY, base_key)
|
||||||
request.add_tlv(TLV_TYPE_FILE_PATH, Rex::Text.unicode_filter_decode( hive_file ))
|
request.add_tlv(TLV_TYPE_FILE_PATH, client.unicode_filter_decode( hive_file ))
|
||||||
|
|
||||||
response = client.send_request(request)
|
response = client.send_request(request)
|
||||||
return response.get_tlv(TLV_TYPE_RESULT).value
|
return response.get_tlv(TLV_TYPE_RESULT).value
|
||||||
|
|
|
@ -58,6 +58,8 @@ class Console::CommandDispatcher::Core
|
||||||
"bgkill" => "Kills a background meterpreter script",
|
"bgkill" => "Kills a background meterpreter script",
|
||||||
"bglist" => "Lists running background scripts",
|
"bglist" => "Lists running background scripts",
|
||||||
"write" => "Writes data to a channel",
|
"write" => "Writes data to a channel",
|
||||||
|
"enable_unicode_encoding" => "Enables encoding of unicode strings",
|
||||||
|
"disable_unicode_encoding" => "Disables encoding of unicode strings"
|
||||||
}
|
}
|
||||||
if (msf_loaded?)
|
if (msf_loaded?)
|
||||||
c["info"] = "Displays information about a Post module"
|
c["info"] = "Displays information about a Post module"
|
||||||
|
@ -707,7 +709,15 @@ class Console::CommandDispatcher::Core
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cmd_enable_unicode_encoding
|
||||||
|
client.encode_unicode = true
|
||||||
|
print_status("Unicode encoding is enabled")
|
||||||
|
end
|
||||||
|
|
||||||
|
def cmd_disable_unicode_encoding
|
||||||
|
client.encode_unicode = false
|
||||||
|
print_status("Unicode encoding is disabled")
|
||||||
|
end
|
||||||
|
|
||||||
@@client_extension_search_paths = [ ::File.join(Rex::Root, "post", "meterpreter", "ui", "console", "command_dispatcher") ]
|
@@client_extension_search_paths = [ ::File.join(Rex::Root, "post", "meterpreter", "ui", "console", "command_dispatcher") ]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue