213 lines
6.7 KiB
Ruby
213 lines
6.7 KiB
Ruby
# -*- coding: binary -*-
|
|
# rubocop:disable Metrics/AbcSize
|
|
# rubocop:disable Metrics/ClassLength
|
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
module Msf
|
|
module Serializer
|
|
#
|
|
# This class formats information in a json format that
|
|
# is meant to be displayed on a console or some other non-GUI
|
|
# medium.
|
|
class Json
|
|
#
|
|
# Returns a formatted string that contains information about
|
|
# the supplied module instance.
|
|
#
|
|
# @param mod [Msf::Module] the module to dump information for.
|
|
# @param _indent [String] the indentation to use.
|
|
# @return [String] formatted text output of the dump.
|
|
def self.dump_module(mod, _indent = "")
|
|
case mod.type
|
|
when Msf::MODULE_PAYLOAD
|
|
return dump_payload_module(mod)
|
|
when Msf::MODULE_NOP
|
|
return dump_basic_module(mod)
|
|
when Msf::MODULE_ENCODER
|
|
return dump_basic_module(mod)
|
|
when Msf::MODULE_EXPLOIT
|
|
return dump_exploit_module(mod)
|
|
when Msf::MODULE_AUX
|
|
return dump_auxiliary_module(mod)
|
|
when Msf::MODULE_POST
|
|
return dump_post_module(mod)
|
|
else
|
|
return dump_basic_module(mod)
|
|
end
|
|
end
|
|
|
|
# Dumps an exploit's targets.
|
|
#
|
|
# @param mod [Msf::Exploit] the exploit module to dump targets
|
|
# for.
|
|
# @return [Array] the exploit targets
|
|
def self.dump_exploit_targets(mod)
|
|
list = []
|
|
|
|
mod.targets.each { |target| list.push(target.name || 'All') }
|
|
|
|
list
|
|
end
|
|
|
|
# Dumps a module's actions
|
|
#
|
|
# @param mod [Msf::Module] the module.
|
|
# @return [Array] the module actions
|
|
def self.dump_module_actions(mod)
|
|
list = []
|
|
|
|
mod.actions.each do |target|
|
|
list.push('name' => (target.name || 'All'),
|
|
'description' => (target.description || ''))
|
|
end
|
|
|
|
list
|
|
end
|
|
|
|
# Dumps the module's selected action
|
|
#
|
|
# @param mod [Msf::Module] the module.
|
|
# @return [Array] the module options
|
|
def self.dump_module_action(mod)
|
|
list = []
|
|
|
|
list.push('name' => (mod.action.name || 'All'),
|
|
'description' => (mod.action.description || ''))
|
|
|
|
list
|
|
end
|
|
|
|
# Dumps information common to all modules
|
|
def self.dump_common_module_info(mod)
|
|
{
|
|
'name' => mod.name,
|
|
'fullname' => mod.fullname,
|
|
'authors' => dump_authors(mod),
|
|
'rank' => mod.rank_to_s.capitalize,
|
|
'description' => Rex::Text.compress(mod.description),
|
|
'options' => dump_options(mod)
|
|
}
|
|
end
|
|
|
|
# Dumps information about an exploit module.
|
|
#
|
|
# @param mod [Msf::Exploit] the exploit module.
|
|
# @return [String] the json string form of the information.
|
|
def self.dump_exploit_module(mod)
|
|
# Return a json dump of exploit module data
|
|
{
|
|
'platform' => mod.platform_to_s,
|
|
'privileged' => (mod.privileged? ? "Yes" : "No"),
|
|
'license' => mod.license,
|
|
'disclosure_date' => (mod.disclosure_date if mod.disclosure_date),
|
|
'payload' => {
|
|
'space' => (mod.payload_space.to_s if mod.payload_space),
|
|
'badchars' => (mod.payload_badchars.length.to_s if mod.payload_badchars)
|
|
},
|
|
'references' => dump_references(mod)
|
|
}.merge(dump_common_module_info(mod)).to_json
|
|
end
|
|
|
|
# Dumps information about an auxiliary module.
|
|
#
|
|
# @param mod [Msf::Auxiliary] the auxiliary module.
|
|
# @return [String] the string form of the information.
|
|
def self.dump_auxiliary_module(mod)
|
|
# Return a json dump of auxiliary module data
|
|
{
|
|
'license' => mod.license,
|
|
'disclosure_date' => (mod.disclosure_date if mod.disclosure_date),
|
|
'actions' => dump_module_actions(mod),
|
|
'references' => dump_references(mod)
|
|
}.merge(dump_common_module_info(mod)).to_json
|
|
end
|
|
|
|
# Dumps information about a post module.
|
|
#
|
|
# @param mod [Msf::Post] the post module.
|
|
# @return [String] the string form of the information.
|
|
def self.dump_post_module(mod)
|
|
# Return a json dump of post module data
|
|
{
|
|
'platform' => mod.platform_to_s,
|
|
'arch' => mod.arch_to_s,
|
|
'disclosure_date' => (mod.disclosure_date if mod.disclosure_date),
|
|
'actions' => dump_module_actions(mod),
|
|
'references' => dump_references(mod)
|
|
}.merge(dump_common_module_info(mod)).to_json
|
|
end
|
|
|
|
# Dumps information about a payload module.
|
|
#
|
|
# @param mod [Msf::Payload] the payload module.
|
|
# @return [String] the string form of the information.
|
|
def self.dump_payload_module(mod)
|
|
# Return a json dump of post module data
|
|
{
|
|
'platform' => mod.platform_to_s,
|
|
'arch' => mod.arch_to_s,
|
|
'privileged' => (mod.privileged? ? "true" : "false"),
|
|
'size' => mod.size
|
|
}.merge(dump_common_module_info(mod)).to_json
|
|
end
|
|
|
|
# Returns an array of all authors
|
|
#
|
|
# @param mod [Msf::Module]
|
|
# @return [Array] an array of all authors
|
|
def self.dump_authors(mod)
|
|
# Authors
|
|
authors = []
|
|
mod.each_author { |author| authors.push(author.to_s) }
|
|
authors
|
|
end
|
|
|
|
# Dumps information about a module, just the basics.
|
|
#
|
|
# @param mod [Msf::Module] the module.
|
|
# @return [String] the string form of the information.
|
|
def self.dump_basic_module(mod)
|
|
{
|
|
'platform' => mod.platform_to_s,
|
|
'arch' => mod.arch_to_s,
|
|
'references' => dump_references(mod)
|
|
}.merge(dump_common_module_info(mod)).to_json
|
|
end
|
|
|
|
# Dumps the list of options associated with the
|
|
# supplied module.
|
|
#
|
|
# @param mod [Msf::Module] the module.
|
|
# @return [Array] the array of the information.
|
|
def self.dump_options(mod)
|
|
list = []
|
|
mod.options.sorted.each do |entry|
|
|
name, opt = entry
|
|
val = mod.datastore[name] || opt.default
|
|
|
|
next if opt.advanced? || opt.evasion?
|
|
|
|
list.push('name' => name,
|
|
'display_value' => opt.display_value(val),
|
|
'required' => opt.required? ? 'true' : 'false',
|
|
'description' => opt.desc.strip)
|
|
end
|
|
|
|
list
|
|
end
|
|
|
|
# Dumps the references associated with the supplied module.
|
|
#
|
|
# @param mod [Msf::Module] the module.
|
|
# @return [Array] the array of the information.
|
|
def self.dump_references(mod)
|
|
if (mod.respond_to? :references) && mod.references && (mod.references.length > 0)
|
|
refs = []
|
|
mod.references.each { |ref| refs.push(ref.to_s) }
|
|
end
|
|
|
|
refs
|
|
end
|
|
end
|
|
end
|
|
end
|