From 82f41d56a668eff8eae1c3966ae962a06866bc9b Mon Sep 17 00:00:00 2001 From: Spencer McIntyre Date: Fri, 24 Oct 2014 10:52:05 -0400 Subject: [PATCH 1/3] Add [user_]logos_directory to Msf::Config --- {lib/msf/ui => data}/logos/3kom-superhack.txt | 0 .../ui => data}/logos/branded-longhorn.txt | 0 {lib/msf/ui => data}/logos/cow-head.txt | 0 {lib/msf/ui => data}/logos/cowsay.txt | 0 {lib/msf/ui => data}/logos/figlet.txt | 0 {lib/msf/ui => data}/logos/i-heart-shells.txt | 0 .../msf/ui => data}/logos/metasploit-park.txt | 0 .../ui => data}/logos/metasploit-shield.txt | 0 .../msf/ui => data}/logos/missile-command.txt | 0 {lib/msf/ui => data}/logos/ninja.txt | 0 .../ui => data}/logos/null-pointer-deref.txt | 0 {lib/msf/ui => data}/logos/r7-metasploit.txt | 0 {lib/msf/ui => data}/logos/test.rb | 0 {lib/msf/ui => data}/logos/wake-up-neo.txt | 0 {lib/msf/ui => data}/logos/workflow.txt | 0 lib/msf/base/config.rb | 30 +++++++++++++++++++ lib/msf/ui/banner.rb | 8 +++-- 17 files changed, 35 insertions(+), 3 deletions(-) rename {lib/msf/ui => data}/logos/3kom-superhack.txt (100%) rename {lib/msf/ui => data}/logos/branded-longhorn.txt (100%) rename {lib/msf/ui => data}/logos/cow-head.txt (100%) rename {lib/msf/ui => data}/logos/cowsay.txt (100%) rename {lib/msf/ui => data}/logos/figlet.txt (100%) rename {lib/msf/ui => data}/logos/i-heart-shells.txt (100%) rename {lib/msf/ui => data}/logos/metasploit-park.txt (100%) rename {lib/msf/ui => data}/logos/metasploit-shield.txt (100%) rename {lib/msf/ui => data}/logos/missile-command.txt (100%) rename {lib/msf/ui => data}/logos/ninja.txt (100%) rename {lib/msf/ui => data}/logos/null-pointer-deref.txt (100%) rename {lib/msf/ui => data}/logos/r7-metasploit.txt (100%) rename {lib/msf/ui => data}/logos/test.rb (100%) rename {lib/msf/ui => data}/logos/wake-up-neo.txt (100%) rename {lib/msf/ui => data}/logos/workflow.txt (100%) diff --git a/lib/msf/ui/logos/3kom-superhack.txt b/data/logos/3kom-superhack.txt similarity index 100% rename from lib/msf/ui/logos/3kom-superhack.txt rename to data/logos/3kom-superhack.txt diff --git a/lib/msf/ui/logos/branded-longhorn.txt b/data/logos/branded-longhorn.txt similarity index 100% rename from lib/msf/ui/logos/branded-longhorn.txt rename to data/logos/branded-longhorn.txt diff --git a/lib/msf/ui/logos/cow-head.txt b/data/logos/cow-head.txt similarity index 100% rename from lib/msf/ui/logos/cow-head.txt rename to data/logos/cow-head.txt diff --git a/lib/msf/ui/logos/cowsay.txt b/data/logos/cowsay.txt similarity index 100% rename from lib/msf/ui/logos/cowsay.txt rename to data/logos/cowsay.txt diff --git a/lib/msf/ui/logos/figlet.txt b/data/logos/figlet.txt similarity index 100% rename from lib/msf/ui/logos/figlet.txt rename to data/logos/figlet.txt diff --git a/lib/msf/ui/logos/i-heart-shells.txt b/data/logos/i-heart-shells.txt similarity index 100% rename from lib/msf/ui/logos/i-heart-shells.txt rename to data/logos/i-heart-shells.txt diff --git a/lib/msf/ui/logos/metasploit-park.txt b/data/logos/metasploit-park.txt similarity index 100% rename from lib/msf/ui/logos/metasploit-park.txt rename to data/logos/metasploit-park.txt diff --git a/lib/msf/ui/logos/metasploit-shield.txt b/data/logos/metasploit-shield.txt similarity index 100% rename from lib/msf/ui/logos/metasploit-shield.txt rename to data/logos/metasploit-shield.txt diff --git a/lib/msf/ui/logos/missile-command.txt b/data/logos/missile-command.txt similarity index 100% rename from lib/msf/ui/logos/missile-command.txt rename to data/logos/missile-command.txt diff --git a/lib/msf/ui/logos/ninja.txt b/data/logos/ninja.txt similarity index 100% rename from lib/msf/ui/logos/ninja.txt rename to data/logos/ninja.txt diff --git a/lib/msf/ui/logos/null-pointer-deref.txt b/data/logos/null-pointer-deref.txt similarity index 100% rename from lib/msf/ui/logos/null-pointer-deref.txt rename to data/logos/null-pointer-deref.txt diff --git a/lib/msf/ui/logos/r7-metasploit.txt b/data/logos/r7-metasploit.txt similarity index 100% rename from lib/msf/ui/logos/r7-metasploit.txt rename to data/logos/r7-metasploit.txt diff --git a/lib/msf/ui/logos/test.rb b/data/logos/test.rb similarity index 100% rename from lib/msf/ui/logos/test.rb rename to data/logos/test.rb diff --git a/lib/msf/ui/logos/wake-up-neo.txt b/data/logos/wake-up-neo.txt similarity index 100% rename from lib/msf/ui/logos/wake-up-neo.txt rename to data/logos/wake-up-neo.txt diff --git a/lib/msf/ui/logos/workflow.txt b/data/logos/workflow.txt similarity index 100% rename from lib/msf/ui/logos/workflow.txt rename to data/logos/workflow.txt diff --git a/lib/msf/base/config.rb b/lib/msf/base/config.rb index beaac2a5b8..4878180280 100644 --- a/lib/msf/base/config.rb +++ b/lib/msf/base/config.rb @@ -65,6 +65,7 @@ class Config < Hash 'ModuleDirectory' => "modules", 'ScriptDirectory' => "scripts", 'LogDirectory' => "logs", + 'LogosDirectory' => "logos", 'SessionLogDirectory' => "logs/sessions", 'PluginDirectory' => "plugins", 'DataDirectory' => "data", @@ -92,6 +93,13 @@ class Config < Hash self.new.config_directory end + # Return the directory that logo files should be loaded from. + # + # @return [String] path to the logos directory. + def self.logos_directory + self.new.logos_directory + end + # Returns the global module directory. # # @return [String] path to global module directory. @@ -148,6 +156,13 @@ class Config < Hash self.new.local_directory end + # Return the user-specific directory that logo files should be loaded from. + # + # @return [String] path to the logos directory. + def self.user_logos_directory + self.new.user_logos_directory + end + # Returns the user-specific module base path # # @return [String] path to user-specific modules directory. @@ -231,6 +246,13 @@ class Config < Hash InstallRoot end + # Return the directory that logo files should be loaded from. + # + # @return [String] path to the logos directory. + def logos_directory + data_directory + FileSep + self['LogosDirectory'] + end + # Returns the configuration directory default. # # @return [String] the root configuration directory. @@ -301,6 +323,13 @@ class Config < Hash config_directory + FileSep + self['LocalDirectory'] end + # Return the user-specific directory that logo files should be loaded from. + # + # @return [String] path to the logos directory. + def user_logos_directory + config_directory + FileSep + self['LogosDirectory'] + end + # Returns the user-specific module base path # # @return [String] path to user-specific modules directory. @@ -339,6 +368,7 @@ class Config < Hash FileUtils.mkdir_p(session_log_directory) FileUtils.mkdir_p(loot_directory) FileUtils.mkdir_p(local_directory) + FileUtils.mkdir_p(user_logos_directory) FileUtils.mkdir_p(user_module_directory) FileUtils.mkdir_p(user_plugin_directory) end diff --git a/lib/msf/ui/banner.rb b/lib/msf/ui/banner.rb index d175af1b92..197b1bc8dc 100644 --- a/lib/msf/ui/banner.rb +++ b/lib/msf/ui/banner.rb @@ -31,9 +31,11 @@ module Banner # Returns a random metasploit logo. # def self.readfile(fname) - base = File.expand_path(File.dirname(__FILE__)) - pathname = File.join(base, "logos", fname) - fdata = "<< Missing banner: #{fname} >>" + pathname = fname + unless File.absolute_path(pathname) == pathname + pathname = File.join(::Msf::Config.logos_directory, fname) + end + fdata = "<< Missing banner: #{pathname} >>" begin raise ArgumentError unless File.readable?(pathname) raise ArgumentError unless File.stat(pathname).size < 4096 From c1a61e3b4efcdd3f5c94ba89552c15345f70456b Mon Sep 17 00:00:00 2001 From: Spencer McIntyre Date: Fri, 24 Oct 2014 13:07:28 -0400 Subject: [PATCH 2/3] Support an MSFLOGO env var and logo enumeration --- ...-longhorn.txt => cow-branded-longhorn.txt} | 0 lib/msf/ui/banner.rb | 52 +++++++------------ 2 files changed, 19 insertions(+), 33 deletions(-) rename data/logos/{branded-longhorn.txt => cow-branded-longhorn.txt} (100%) diff --git a/data/logos/branded-longhorn.txt b/data/logos/cow-branded-longhorn.txt similarity index 100% rename from data/logos/branded-longhorn.txt rename to data/logos/cow-branded-longhorn.txt diff --git a/lib/msf/ui/banner.rb b/lib/msf/ui/banner.rb index 197b1bc8dc..af031e477a 100644 --- a/lib/msf/ui/banner.rb +++ b/lib/msf/ui/banner.rb @@ -8,33 +8,22 @@ module Ui # ### module Banner - - Logos = - %w{ - branded-longhorn.txt - cow-head.txt - cowsay.txt - figlet.txt - i-heart-shells.txt - metasploit-shield.txt - missile-command.txt - ninja.txt - null-pointer-deref.txt - r7-metasploit.txt - wake-up-neo.txt - workflow.txt - 3kom-superhack.txt - metasploit-park.txt - } - # - # Returns a random metasploit logo. + # Returns a specific metasploit logo. If the specified file is a relative path + # then the file will be searched for first in the included local directory, + # then in the user-specific directory. # def self.readfile(fname) pathname = fname + unless File.absolute_path(pathname) == pathname - pathname = File.join(::Msf::Config.logos_directory, fname) + if File.readable?(File.join(::Msf::Config.logos_directory, fname)) + pathname = File.join(::Msf::Config.logos_directory, fname) + elsif File.readable?(File.join(::Msf::Config.user_logos_directory, fname)) + pathname = File.join(::Msf::Config.user_logos_directory, fname) + end end + fdata = "<< Missing banner: #{pathname} >>" begin raise ArgumentError unless File.readable?(pathname) @@ -47,22 +36,19 @@ module Banner end def self.to_s + return self.readfile ENV['MSFLOGO'] if ENV['MSFLOGO'] + + logos = [] # Easter egg (always a cow themed logo): export/set GOCOW=1 if ENV['GOCOW'] - case rand(3) - when 0 - # branded-longhorn - self.readfile Logos[0] - when 1 - # cow-head - self.readfile Logos[1] - else - # cowsay - self.readfile Logos[2] - end + logos.concat(Dir.glob(::Msf::Config.logos_directory + File::SEPARATOR + 'cow*.txt')) else - self.readfile Logos[rand(Logos.length)] + logos.concat(Dir.glob(::Msf::Config.logos_directory + File::SEPARATOR + '*.txt')) + logos.concat(Dir.glob(::Msf::Config.user_logos_directory + File::SEPARATOR + '*.txt')) end + + logos = logos.map { |f| File.absolute_path(f) } + self.readfile logos[rand(logos.length)] end end From 91dc875af5dced6386e4d5401b5d28e491bdd7a2 Mon Sep 17 00:00:00 2001 From: Spencer McIntyre Date: Fri, 24 Oct 2014 13:11:58 -0400 Subject: [PATCH 3/3] Remove seemingly useless file among banners --- data/logos/test.rb | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 data/logos/test.rb diff --git a/data/logos/test.rb b/data/logos/test.rb deleted file mode 100644 index 5a30e29eb1..0000000000 --- a/data/logos/test.rb +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: binary -*- - -here = File.expand_path(File.dirname(__FILE__)) - -puts "Hi I live #{here}!" -