2005-07-09 21:26:44 +00:00
|
|
|
module Msf
|
|
|
|
module Serializer
|
|
|
|
|
|
|
|
###
|
|
|
|
#
|
|
|
|
# This class formats information in a plain-text format that
|
|
|
|
# is meant to be displayed on a console or some other non-GUI
|
|
|
|
# medium.
|
|
|
|
#
|
|
|
|
###
|
|
|
|
class ReadableText
|
|
|
|
|
2006-10-29 17:31:53 +00:00
|
|
|
DefaultColumnWrap = 70
|
|
|
|
DefaultIndent = 2
|
2005-07-17 02:04:39 +00:00
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
#
|
|
|
|
# Returns a formatted string that contains information about
|
|
|
|
# the supplied module instance.
|
|
|
|
#
|
2006-10-29 17:31:53 +00:00
|
|
|
def self.dump_module(mod, indent = " ")
|
2005-07-09 21:26:44 +00:00
|
|
|
case mod.type
|
|
|
|
when MODULE_PAYLOAD
|
2005-07-10 00:49:12 +00:00
|
|
|
return dump_payload_module(mod, indent)
|
|
|
|
when MODULE_NOP
|
2005-07-10 21:01:05 +00:00
|
|
|
return dump_basic_module(mod, indent)
|
|
|
|
when MODULE_ENCODER
|
|
|
|
return dump_basic_module(mod, indent)
|
2005-07-09 21:26:44 +00:00
|
|
|
when MODULE_EXPLOIT
|
2005-07-10 00:49:12 +00:00
|
|
|
return dump_exploit_module(mod, indent)
|
2006-01-24 03:59:44 +00:00
|
|
|
when MODULE_AUX
|
|
|
|
return dump_auxiliary_module(mod, indent)
|
2005-07-09 21:26:44 +00:00
|
|
|
else
|
2005-07-10 00:49:12 +00:00
|
|
|
return dump_generic_module(mod, indent)
|
2005-07-09 21:26:44 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2005-10-02 05:48:05 +00:00
|
|
|
#
|
|
|
|
# Dumps an exploit's targets.
|
|
|
|
#
|
|
|
|
def self.dump_exploit_targets(mod, indent = '', h = nil)
|
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => indent.length,
|
|
|
|
'Header' => h,
|
|
|
|
'Columns' =>
|
|
|
|
[
|
2009-12-06 14:35:16 +00:00
|
|
|
'Id',
|
2005-10-02 05:48:05 +00:00
|
|
|
'Name',
|
|
|
|
])
|
|
|
|
|
|
|
|
mod.targets.each_with_index { |target, idx|
|
2009-12-06 14:35:16 +00:00
|
|
|
tbl << [ idx.to_s, target.name || 'All' ]
|
2005-10-02 05:48:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
tbl.to_s + "\n"
|
|
|
|
end
|
|
|
|
|
2007-01-31 00:08:52 +00:00
|
|
|
#
|
|
|
|
# Dumps the exploit's selected target
|
|
|
|
#
|
|
|
|
def self.dump_exploit_target(mod, indent = '', h = nil)
|
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => indent.length,
|
|
|
|
'Header' => h,
|
|
|
|
'Columns' =>
|
|
|
|
[
|
2009-12-06 14:35:16 +00:00
|
|
|
'Id',
|
2007-01-31 00:08:52 +00:00
|
|
|
'Name',
|
|
|
|
])
|
|
|
|
|
|
|
|
tbl << [ mod.target_index, mod.target.name || 'All' ]
|
|
|
|
|
|
|
|
tbl.to_s + "\n"
|
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2006-04-02 22:33:34 +00:00
|
|
|
#
|
|
|
|
# Dumps an auxiliary's actions
|
|
|
|
#
|
|
|
|
def self.dump_auxiliary_actions(mod, indent = '', h = nil)
|
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => indent.length,
|
|
|
|
'Header' => h,
|
|
|
|
'Columns' =>
|
|
|
|
[
|
|
|
|
'Name',
|
|
|
|
'Description'
|
|
|
|
])
|
|
|
|
|
|
|
|
mod.actions.each_with_index { |target, idx|
|
2009-12-06 14:35:16 +00:00
|
|
|
tbl << [ target.name || 'All' , target.description || '' ]
|
2006-04-02 22:33:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
tbl.to_s + "\n"
|
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Dumps the table of payloads that are compatible with the supplied
|
|
|
|
# exploit.
|
|
|
|
#
|
2005-10-02 05:48:05 +00:00
|
|
|
def self.dump_compatible_payloads(exploit, indent = '', h = nil)
|
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => indent.length,
|
|
|
|
'Header' => h,
|
|
|
|
'Columns' =>
|
|
|
|
[
|
2009-12-06 14:35:16 +00:00
|
|
|
'Name',
|
2005-10-02 05:48:05 +00:00
|
|
|
'Description',
|
|
|
|
])
|
|
|
|
|
|
|
|
exploit.compatible_payloads.each { |entry|
|
|
|
|
tbl << [ entry[0], entry[1].new.description ]
|
|
|
|
}
|
|
|
|
|
|
|
|
tbl.to_s + "\n"
|
|
|
|
end
|
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
#
|
|
|
|
# Dumps information about an exploit module.
|
|
|
|
#
|
|
|
|
def self.dump_exploit_module(mod, indent = '')
|
|
|
|
output = "\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << " Name: #{mod.name}\n"
|
|
|
|
output << " Version: #{mod.version}\n"
|
|
|
|
output << " Platform: #{mod.platform_to_s}\n"
|
|
|
|
output << " Privileged: " + (mod.privileged? ? "Yes" : "No") + "\n"
|
|
|
|
output << " License: #{mod.license}\n"
|
2009-12-06 14:35:16 +00:00
|
|
|
output << " Rank: #{mod.rank_to_s.capitalize}\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-07-11 15:34:31 +00:00
|
|
|
|
|
|
|
# Authors
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Provided by:\n"
|
2005-07-11 15:34:31 +00:00
|
|
|
mod.each_author { |author|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + author.to_s + "\n"
|
2005-07-11 15:34:31 +00:00
|
|
|
}
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-07-11 15:34:31 +00:00
|
|
|
|
|
|
|
# Targets
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Available targets:\n"
|
|
|
|
output << dump_exploit_targets(mod, indent)
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
# Options
|
|
|
|
if (mod.options.has_options?)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Basic options:\n"
|
|
|
|
output << dump_options(mod, indent)
|
|
|
|
output << "\n"
|
2005-07-11 15:34:31 +00:00
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
# Payload information
|
2005-07-16 16:06:44 +00:00
|
|
|
if (mod.payload_info.length)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Payload information:\n"
|
2005-07-14 07:32:11 +00:00
|
|
|
if (mod.payload_space)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + "Space: " + mod.payload_space.to_s + "\n"
|
2005-07-14 07:32:11 +00:00
|
|
|
end
|
|
|
|
if (mod.payload_badchars)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + "Avoid: " + mod.payload_badchars.length.to_s + " characters\n"
|
2005-07-14 07:32:11 +00:00
|
|
|
end
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-07-11 15:34:31 +00:00
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
# Description
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Description:\n"
|
|
|
|
output << word_wrap(Rex::Text.compress(mod.description))
|
|
|
|
output << "\n"
|
2005-07-11 16:46:47 +00:00
|
|
|
|
|
|
|
# References
|
2005-07-14 07:32:11 +00:00
|
|
|
if (mod.references.length > 0)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "References:\n"
|
2005-07-14 07:32:11 +00:00
|
|
|
mod.references.each { |ref|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + ref.to_s + "\n"
|
2005-07-14 07:32:11 +00:00
|
|
|
}
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-07-14 07:32:11 +00:00
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
return output
|
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
end
|
|
|
|
|
2005-10-29 13:47:07 +00:00
|
|
|
#
|
2006-01-24 03:59:44 +00:00
|
|
|
# Dumps information about an auxiliary module.
|
2005-10-29 13:47:07 +00:00
|
|
|
#
|
2006-01-24 03:59:44 +00:00
|
|
|
def self.dump_auxiliary_module(mod, indent = '')
|
2005-10-29 13:47:07 +00:00
|
|
|
output = "\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << " Name: #{mod.name}\n"
|
|
|
|
output << " Version: #{mod.version}\n"
|
2009-04-08 20:53:04 +00:00
|
|
|
output << " License: #{mod.license}\n"
|
2009-12-06 14:35:16 +00:00
|
|
|
output << " Rank: #{mod.rank_to_s.capitalize}\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-10-29 13:47:07 +00:00
|
|
|
|
|
|
|
# Authors
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Provided by:\n"
|
2005-10-29 13:47:07 +00:00
|
|
|
mod.each_author { |author|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + author.to_s + "\n"
|
2005-10-29 13:47:07 +00:00
|
|
|
}
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-10-29 13:47:07 +00:00
|
|
|
|
|
|
|
# Options
|
|
|
|
if (mod.options.has_options?)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Basic options:\n"
|
|
|
|
output << dump_options(mod, indent)
|
|
|
|
output << "\n"
|
2005-10-29 13:47:07 +00:00
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-10-29 13:47:07 +00:00
|
|
|
# Description
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Description:\n"
|
|
|
|
output << word_wrap(Rex::Text.compress(mod.description))
|
|
|
|
output << "\n"
|
2005-10-29 13:47:07 +00:00
|
|
|
|
2009-01-09 07:02:03 +00:00
|
|
|
# References
|
|
|
|
if (mod.references.length > 0)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "References:\n"
|
2009-01-09 07:02:03 +00:00
|
|
|
mod.references.each { |ref|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + ref.to_s + "\n"
|
2009-01-09 07:02:03 +00:00
|
|
|
}
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2009-01-09 07:02:03 +00:00
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-10-29 13:47:07 +00:00
|
|
|
return output
|
|
|
|
end
|
|
|
|
|
2009-12-06 14:35:16 +00:00
|
|
|
#
|
2005-07-09 21:26:44 +00:00
|
|
|
# Dumps information about a payload module.
|
|
|
|
#
|
2005-07-11 15:34:31 +00:00
|
|
|
def self.dump_payload_module(mod, indent = '')
|
2005-07-09 21:26:44 +00:00
|
|
|
# General
|
|
|
|
output = "\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << " Name: #{mod.name}\n"
|
|
|
|
output << " Version: #{mod.version}\n"
|
|
|
|
output << " Platform: #{mod.platform_to_s}\n"
|
|
|
|
output << " Arch: #{mod.arch_to_s}\n"
|
|
|
|
output << "Needs Admin: " + (mod.privileged? ? "Yes" : "No") + "\n"
|
|
|
|
output << " Total size: #{mod.size}\n"
|
2009-12-06 14:35:16 +00:00
|
|
|
output << " Rank: #{mod.rank_to_s.capitalize}\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-07-09 21:26:44 +00:00
|
|
|
|
|
|
|
# Authors
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Provided by:\n"
|
2005-07-09 21:26:44 +00:00
|
|
|
mod.each_author { |author|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + author.to_s + "\n"
|
2005-07-09 21:26:44 +00:00
|
|
|
}
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-07-09 21:26:44 +00:00
|
|
|
|
|
|
|
# Options
|
2005-07-10 00:49:12 +00:00
|
|
|
if (mod.options.has_options?)
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Basic options:\n"
|
|
|
|
output << dump_options(mod)
|
|
|
|
output << "\n"
|
2005-07-10 00:49:12 +00:00
|
|
|
end
|
2005-07-09 21:26:44 +00:00
|
|
|
|
2005-07-10 00:49:12 +00:00
|
|
|
# Description
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Description:\n"
|
|
|
|
output << word_wrap(Rex::Text.compress(mod.description))
|
|
|
|
output << "\n\n"
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-10 00:49:12 +00:00
|
|
|
return output
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
2005-07-10 21:01:05 +00:00
|
|
|
# Dumps information about a module, just the basics.
|
2005-07-10 00:49:12 +00:00
|
|
|
#
|
2005-07-11 15:34:31 +00:00
|
|
|
def self.dump_basic_module(mod, indent = '')
|
2005-07-10 00:49:12 +00:00
|
|
|
# General
|
|
|
|
output = "\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << " Name: #{mod.name}\n"
|
|
|
|
output << " Version: #{mod.version}\n"
|
|
|
|
output << " Platform: #{mod.platform_to_s}\n"
|
|
|
|
output << " Arch: #{mod.arch_to_s}\n"
|
2009-12-06 14:35:16 +00:00
|
|
|
output << " Rank: #{mod.rank_to_s.capitalize}\n"
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2005-07-10 00:49:12 +00:00
|
|
|
|
|
|
|
# Authors
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Provided by:\n"
|
2005-07-10 00:49:12 +00:00
|
|
|
mod.each_author { |author|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << indent + author.to_s + "\n"
|
2005-07-10 00:49:12 +00:00
|
|
|
}
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "\n"
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
# Description
|
2009-03-08 07:55:47 +00:00
|
|
|
output << "Description:\n"
|
|
|
|
output << word_wrap(Rex::Text.compress(mod.description))
|
|
|
|
output << "\n\n"
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
return output
|
2005-07-10 00:49:12 +00:00
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
end
|
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
def self.dump_generic_module(mod, indent = '')
|
2005-07-09 21:26:44 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Dumps the list of options associated with the
|
|
|
|
# supplied module.
|
|
|
|
#
|
2005-10-02 05:48:05 +00:00
|
|
|
def self.dump_options(mod, indent = '')
|
2005-07-09 21:26:44 +00:00
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
2005-10-02 05:48:05 +00:00
|
|
|
'Indent' => indent.length,
|
2005-07-09 21:26:44 +00:00
|
|
|
'Columns' =>
|
|
|
|
[
|
2009-12-06 14:35:16 +00:00
|
|
|
'Name',
|
2006-01-20 19:15:27 +00:00
|
|
|
'Current Setting',
|
2005-07-11 05:44:36 +00:00
|
|
|
'Required',
|
2005-07-09 21:26:44 +00:00
|
|
|
'Description'
|
|
|
|
])
|
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
mod.options.sorted.each { |entry|
|
|
|
|
name, opt = entry
|
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
next if (opt.advanced?)
|
2006-01-05 03:57:12 +00:00
|
|
|
next if (opt.evasion?)
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2007-10-02 03:36:45 +00:00
|
|
|
val = mod.datastore[name] || opt.default.to_s
|
2005-07-09 21:26:44 +00:00
|
|
|
|
2005-07-11 05:44:36 +00:00
|
|
|
tbl << [ name, val.to_s, opt.required? ? "yes" : "no", opt.desc ]
|
2005-07-09 21:26:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return tbl.to_s
|
|
|
|
end
|
|
|
|
|
2005-11-15 15:11:43 +00:00
|
|
|
#
|
|
|
|
# Dumps the advanced options associated with the supplied module.
|
|
|
|
#
|
2005-10-02 05:48:05 +00:00
|
|
|
def self.dump_advanced_options(mod, indent = '')
|
2005-07-11 05:49:04 +00:00
|
|
|
output = ''
|
2005-10-02 05:48:05 +00:00
|
|
|
pad = indent
|
2005-07-09 21:26:44 +00:00
|
|
|
|
2005-07-11 15:34:31 +00:00
|
|
|
mod.options.sorted.each { |entry|
|
|
|
|
name, opt = entry
|
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
next if (!opt.advanced?)
|
|
|
|
|
2007-10-02 03:36:45 +00:00
|
|
|
val = mod.datastore[name] || opt.default.to_s
|
2006-01-11 22:15:04 +00:00
|
|
|
desc = word_wrap(opt.desc, indent.length + 3)
|
|
|
|
desc = desc.slice(indent.length + 3, desc.length)
|
2005-07-09 21:26:44 +00:00
|
|
|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << pad + "Name : #{name}\n"
|
|
|
|
output << pad + "Current Setting: #{val}\n"
|
|
|
|
output << pad + "Description : #{desc}\n"
|
2005-07-09 21:26:44 +00:00
|
|
|
}
|
|
|
|
|
2005-07-11 05:49:04 +00:00
|
|
|
return output
|
2005-07-09 21:26:44 +00:00
|
|
|
end
|
|
|
|
|
2006-01-05 03:57:12 +00:00
|
|
|
#
|
|
|
|
# Dumps the evasion options associated with the supplied module.
|
|
|
|
#
|
|
|
|
def self.dump_evasion_options(mod, indent = '')
|
|
|
|
output = ''
|
|
|
|
pad = indent
|
|
|
|
|
|
|
|
mod.options.sorted.each { |entry|
|
|
|
|
name, opt = entry
|
|
|
|
|
|
|
|
next if (!opt.evasion?)
|
|
|
|
|
|
|
|
val = mod.datastore[name] || opt.default || ''
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2006-01-11 22:15:04 +00:00
|
|
|
desc = word_wrap(opt.desc, indent.length + 3)
|
|
|
|
desc = desc.slice(indent.length + 3, desc.length)
|
2006-01-05 03:57:12 +00:00
|
|
|
|
2009-03-08 07:55:47 +00:00
|
|
|
output << pad + "Name : #{name}\n"
|
|
|
|
output << pad + "Current Setting: #{val}\n"
|
|
|
|
output << pad + "Description : #{desc}\n"
|
2006-01-05 03:57:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return output
|
|
|
|
end
|
2009-12-06 14:35:16 +00:00
|
|
|
|
2005-07-14 06:34:58 +00:00
|
|
|
#
|
2005-11-15 15:11:43 +00:00
|
|
|
# Dumps the contents of a datastore.
|
2005-07-14 06:34:58 +00:00
|
|
|
#
|
2005-07-17 02:04:39 +00:00
|
|
|
def self.dump_datastore(name, ds, indent = DefaultIndent, col = DefaultColumnWrap)
|
2005-07-14 06:34:58 +00:00
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => indent,
|
|
|
|
'Header' => name,
|
|
|
|
'Columns' =>
|
|
|
|
[
|
2009-12-06 14:35:16 +00:00
|
|
|
'Name',
|
2005-07-14 06:34:58 +00:00
|
|
|
'Value'
|
|
|
|
])
|
|
|
|
|
2005-07-15 22:30:04 +00:00
|
|
|
ds.keys.sort.each { |k|
|
2005-11-15 21:50:10 +00:00
|
|
|
tbl << [ k, (ds[k] != nil) ? ds[k].to_s : '' ]
|
2005-07-14 06:34:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return ds.length > 0 ? tbl.to_s : "#{tbl.header_to_s}No entries in data store.\n"
|
|
|
|
end
|
|
|
|
|
2005-07-17 02:04:39 +00:00
|
|
|
#
|
2005-11-15 15:11:43 +00:00
|
|
|
# Dumps the list of active sessions.
|
2005-07-17 02:04:39 +00:00
|
|
|
#
|
2006-10-28 01:50:04 +00:00
|
|
|
def self.dump_sessions(framework, verbose = false, indent = DefaultIndent, col = DefaultColumnWrap)
|
2009-12-06 14:35:16 +00:00
|
|
|
columns =
|
2006-10-28 01:50:04 +00:00
|
|
|
[
|
|
|
|
'Id',
|
2010-03-10 22:02:27 +00:00
|
|
|
'Type',
|
|
|
|
'Information',
|
|
|
|
'Connection'
|
2006-10-28 01:50:04 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
columns << 'Via' if verbose
|
|
|
|
|
2005-07-17 02:04:39 +00:00
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => indent,
|
|
|
|
'Header' => "Active sessions",
|
2006-10-28 01:50:04 +00:00
|
|
|
'Columns' => columns)
|
2005-07-17 02:04:39 +00:00
|
|
|
|
|
|
|
framework.sessions.each_sorted { |k|
|
|
|
|
session = framework.sessions[k]
|
|
|
|
|
2010-03-10 22:02:27 +00:00
|
|
|
row = [ session.sid.to_s, session.type.to_s, session.info.to_s, session.tunnel_to_s ]
|
2006-10-28 01:50:04 +00:00
|
|
|
row << session.via_exploit if verbose and session.via_exploit
|
|
|
|
|
|
|
|
tbl << row
|
2005-07-17 02:04:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return framework.sessions.length > 0 ? tbl.to_s : "#{tbl.header_to_s}No active sessions.\n"
|
|
|
|
end
|
|
|
|
|
2005-09-22 04:53:46 +00:00
|
|
|
#
|
2005-11-15 15:11:43 +00:00
|
|
|
# Dumps the list of running jobs.
|
2005-09-22 04:53:46 +00:00
|
|
|
#
|
2009-12-02 03:32:48 +00:00
|
|
|
# If verbose is true, also prints the payload, LPORT, URIPATH and start
|
|
|
|
# time, if they exist, for each job.
|
|
|
|
#
|
|
|
|
def self.dump_jobs(framework, verbose = false, indent = DefaultIndent, col = DefaultColumnWrap)
|
|
|
|
columns = [ 'Id', 'Name' ]
|
|
|
|
|
|
|
|
if (verbose)
|
|
|
|
columns << "Payload"
|
|
|
|
columns << "LPORT"
|
|
|
|
columns << "URIPATH"
|
|
|
|
columns << "Start Time"
|
|
|
|
end
|
|
|
|
|
2005-09-22 04:53:46 +00:00
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => indent,
|
|
|
|
'Header' => "Jobs",
|
2009-12-02 03:32:48 +00:00
|
|
|
'Columns' => columns
|
|
|
|
)
|
2005-09-22 04:53:46 +00:00
|
|
|
|
2010-07-04 23:40:11 +00:00
|
|
|
|
2009-12-02 03:32:48 +00:00
|
|
|
# jobs are stored as a hash with the keys being a numeric job_id.
|
2009-11-10 17:16:49 +00:00
|
|
|
framework.jobs.keys.sort{|a,b| a.to_i <=> b.to_i }.each { |k|
|
2009-12-02 03:32:48 +00:00
|
|
|
row = [ k, framework.jobs[k].name ]
|
|
|
|
if (verbose)
|
2010-07-01 22:02:46 +00:00
|
|
|
ctx = framework.jobs[k].ctx
|
2010-07-15 03:27:02 +00:00
|
|
|
uripath = ctx[0].get_resource if ctx[0].respond_to?(:get_resource)
|
|
|
|
uripath = ctx[0].datastore['URIPATH'] if uripath.nil?
|
2010-07-04 23:40:11 +00:00
|
|
|
row << (ctx[1].nil? ? (ctx[0].datastore['PAYLOAD'] || "") : ctx[1].refname)
|
2010-07-15 03:27:02 +00:00
|
|
|
row << (ctx[0].datastore['LPORT'] || "")
|
|
|
|
row << (uripath || "")
|
2009-12-02 03:32:48 +00:00
|
|
|
row << (framework.jobs[k].start_time || "")
|
|
|
|
end
|
|
|
|
|
|
|
|
tbl << row
|
2005-09-22 04:53:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return framework.jobs.keys.length > 0 ? tbl.to_s : "#{tbl.header_to_s}No active jobs.\n"
|
|
|
|
end
|
|
|
|
|
2005-07-09 21:26:44 +00:00
|
|
|
#
|
2005-07-10 00:49:12 +00:00
|
|
|
# Jacked from Ernest Ellingson <erne [at] powernav.com>, modified
|
|
|
|
# a bit to add indention
|
2005-07-09 21:26:44 +00:00
|
|
|
#
|
2006-10-29 17:31:53 +00:00
|
|
|
def self.word_wrap(str, indent = DefaultIndent, col = DefaultColumnWrap)
|
2005-07-10 07:15:20 +00:00
|
|
|
return Rex::Text.wordwrap(str, indent, col)
|
2005-07-09 21:26:44 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2009-03-08 07:55:47 +00:00
|
|
|
end end
|
2009-12-06 14:35:16 +00:00
|
|
|
|