From 96b568d65b83db343c2b8ff85a80afb817cd059a Mon Sep 17 00:00:00 2001 From: James Lee Date: Mon, 6 Jun 2011 22:47:55 +0000 Subject: [PATCH] add a tool for list all modules by rank, fixes #4333, fixes #4334, thanks David Maloney! git-svn-id: file:///home/svn/framework3/trunk@12876 4d416f70-5f16-0410-b530-b9f4589650da --- lib/rex/ui/text/table.rb | 9 ++ tools/module_rank.rb | 175 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100755 tools/module_rank.rb diff --git a/lib/rex/ui/text/table.rb b/lib/rex/ui/text/table.rb index 2c3f79499f..d0c0038e0d 100644 --- a/lib/rex/ui/text/table.rb +++ b/lib/rex/ui/text/table.rb @@ -171,6 +171,14 @@ class Table rows << fields end + # + # Sorts the rows based on the supplied index of sub-arrays + # + def sort_rows(index) + rows.sort!{|a,b| a[index].nil? ? -1 : b[index].nil? ? 1 : a[index] <=> b[index]} + end + + # # Adds a horizontal line. # @@ -272,6 +280,7 @@ protected return val end + end end diff --git a/tools/module_rank.rb b/tools/module_rank.rb new file mode 100755 index 0000000000..49142679c4 --- /dev/null +++ b/tools/module_rank.rb @@ -0,0 +1,175 @@ +#!/usr/bin/env ruby +# +# $Id$ +# +# This script lists each module with its rank +# +# $Revision$ +# + +msfbase = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ +$:.unshift(File.join(File.dirname(msfbase), '..', 'lib')) + +require 'rex' +require 'msf/ui' +require 'msf/base' + +ranks= Hash.new + +ranks['Manual'] = 0 +ranks['Low'] = 100 +ranks['Average'] = 200 +ranks['Normal'] = 300 +ranks['Good'] = 400 +ranks['Great'] = 500 +ranks['Excellent'] = 600 + +minrank= 0 +maxrank= 600 +sort = 0 +filter= 'All' +filters= ['All','Exploit','Payload','Post','NOP','Encoder','Auxiliary'] +ranks = ['Manual','Low','Average','Normal','Good','Great','Excellent'] + + + +opts = Rex::Parser::Arguments.new( + "-h" => [ false, "Help menu." ], + "-M" => [ true, "Set Maxmimum Rank [Manual,Low,Average,Normal,Good,Great,Excellent] (Default = Excellent)." ], + "-m" => [ true, "Set Minimum Rank [Manual,Low,Average,Normal,Good,Great,Excellent] (Default = Manual)."], + "-s" => [ false, "Sort by Rank instead of Module Type."], + "-r" => [ false, "Reverse Sort by Rank"], + "-f" => [ true, "Filter based on Module Type [All,Exploit,Payload,Post,NOP,Encoder,Auxiliary] (Default = All)."] +) + +opts.parse(ARGV) { |opt, idx, val| + case opt + when "-h" + puts "\nMetasploit Script for Displaying Module Rank information." + puts "==========================================================" + puts opts.usage + exit + when "-M" + unless ranks.include?(val) + puts "Invalid Rank Supplied: #{val}" + puts "Please use one of these: [Manual,Low,Average,Normal,Good,Great,Excellent]" + exit + end + puts "Maximum Rank: #{val}" + maxrank = ranks[val] + when "-m" + unless ranks.include?(val) + puts "Invalid Rank Supplied: #{val}" + puts "Please use one of these: [Manual,Low,Average,Normal,Good,Great,Excellent]" + exit + end + puts "Minimum Rank: #{val}" + minrank = ranks[val] + when "-s" + puts "Sorting by Rank" + sort = 1 + when "-r" + puts "Reverse Sorting by Rank" + sort = 2 + when "-f" + unless filters.include?(val) + puts "Invalid Filter Supplied: #{val}" + puts "Please use one of these: [All,Exploit,Payload,Post,NOP,Encoder,Auxiliary]" + exit + end + puts "Module Filter: #{val}" + filter = val + + end + +} + + +Indent = ' ' + +# Initialize the simplified framework instance. +$framework = Msf::Simple::Framework.create('DisableDatabase' => true) + +tbl = Rex::Ui::Text::Table.new( + 'Header' => 'Module Ranks', + 'Indent' => Indent.length, + 'Columns' => [ 'Module', 'Rank' ] +) + +if filter=='Payload' or filter=='All' + $framework.payloads.each_module { |name, mod| + x = mod.new + modrank = x.rank + if modrank >= minrank and modrank<= maxrank + tbl << [ 'payload/' + name, modrank ] + end + + } +end + +if filter=='Exploit' or filter=='All' + $framework.exploits.each_module { |name, mod| + x = mod.new + modrank = x.rank + if modrank >= minrank and modrank<= maxrank + tbl << [ 'exploit/' + name, modrank ] + end + + + } +end + +if filter=='NOP' or filter=='All' + $framework.nops.each_module { |name, mod| + x = mod.new + modrank = x.rank + if modrank >= minrank and modrank<= maxrank + tbl << [ 'nop/' + name, modrank ] + end + + } +end + +if filter=='Encoder' or filter=='All' + $framework.encoders.each_module { |name, mod| + x = mod.new + modrank = x.rank + if modrank >= minrank and modrank<= maxrank + tbl << [ 'encoder/' + name, modrank ] + end + + } +end + +if filter=='Auxiliary' or filter=='All' + $framework.auxiliary.each_module { |name, mod| + x = mod.new + modrank = x.rank + if modrank >= minrank and modrank<= maxrank + tbl << [ 'auxiliary/' + name, modrank ] + end + + } +end + +if filter=='Post' or filter=='All' + $framework.post.each_module { |name, mod| + x = mod.new + modrank = x.rank + if modrank >= minrank and modrank<= maxrank + tbl << [ 'post/' + name, modrank ] + end + + } +end + +if sort==1 + tbl.sort_rows(1) +end + +if sort=2 + tbl.sort_rows(1) + tbl.rows.reverse +end + +puts tbl.to_s