Merge branch 'master' of github.com:rapid7/metasploit-framework into upstream-master
commit
650b65250f
|
@ -39,7 +39,6 @@ SimpleCov.configure do
|
||||||
# Other library groups
|
# Other library groups
|
||||||
#
|
#
|
||||||
|
|
||||||
add_group 'Fastlib', 'lib/fastlib'
|
|
||||||
add_group 'Metasm', 'lib/metasm'
|
add_group 'Metasm', 'lib/metasm'
|
||||||
add_group 'PacketFu', 'lib/packetfu'
|
add_group 'PacketFu', 'lib/packetfu'
|
||||||
add_group 'Rex', 'lib/rex'
|
add_group 'Rex', 'lib/rex'
|
||||||
|
|
4
LICENSE
4
LICENSE
|
@ -87,10 +87,6 @@ Files: lib/bit-struct.rb lib/bit-struct/*
|
||||||
Copyright: 2005-2009, Joel VanderWerf
|
Copyright: 2005-2009, Joel VanderWerf
|
||||||
License: Ruby
|
License: Ruby
|
||||||
|
|
||||||
Files: lib/fastlib.rb
|
|
||||||
Copyright: 2011, Rapid7, Inc.
|
|
||||||
License: Ruby
|
|
||||||
|
|
||||||
Files: lib/metasm.rb lib/metasm/* data/cpuinfo/*
|
Files: lib/metasm.rb lib/metasm/* data/cpuinfo/*
|
||||||
Copyright: 2006-2010 Yoann GUILLOT
|
Copyright: 2006-2010 Yoann GUILLOT
|
||||||
License: LGPL-2.1
|
License: LGPL-2.1
|
||||||
|
|
433
lib/fastlib.rb
433
lib/fastlib.rb
|
@ -1,433 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
#
|
|
||||||
# FASTLIB is a mechanism for loading large sets of libraries in a way that is
|
|
||||||
# faster and much more flexible than typical disk structures. FASTLIB includes
|
|
||||||
# hooks that can be used for both compression and encoding of Ruby libraries.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# This format was specifically created to improve the performance and
|
|
||||||
# AV-resistance of the Metasploit Framework and Rex libraries.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# This library is still in its early form; a large number of performance and
|
|
||||||
# compatiblity improvements are not yet included. Do not depend on the FASTLIB
|
|
||||||
# file format at this time.
|
|
||||||
#
|
|
||||||
|
|
||||||
require "find"
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Copyright (C) 2011 Rapid7. You can redistribute it and/or
|
|
||||||
# modify it under the terms of the ruby license.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Roughly based on the rubyzip zip/ziprequire library:
|
|
||||||
# >> Copyright (C) 2002 Thomas Sondergaard
|
|
||||||
# >> rubyzip is free software; you can redistribute it and/or
|
|
||||||
# >> modify it under the terms of the ruby license.
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# The FastLib class implements the meat of the FASTLIB archive format
|
|
||||||
#
|
|
||||||
class FastLib
|
|
||||||
|
|
||||||
VERSION = "0.0.8"
|
|
||||||
|
|
||||||
FLAG_COMPRESS = 0x01
|
|
||||||
FLAG_ENCRYPT = 0x02
|
|
||||||
|
|
||||||
@@cache = {}
|
|
||||||
@@has_zlib = false
|
|
||||||
|
|
||||||
#
|
|
||||||
# Load zlib support if possible
|
|
||||||
#
|
|
||||||
begin
|
|
||||||
require 'zlib'
|
|
||||||
@@has_zlib = true
|
|
||||||
rescue ::LoadError
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method returns the version of the fastlib library
|
|
||||||
#
|
|
||||||
def self.version
|
|
||||||
VERSION
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method loads content from a specific archive file by name. If the
|
|
||||||
# noprocess argument is set to true, the contents will not be expanded to
|
|
||||||
# include workarounds for things such as __FILE__. This is useful when
|
|
||||||
# loading raw binary data where these strings may occur
|
|
||||||
#
|
|
||||||
def self.load(lib, name, noprocess=false)
|
|
||||||
data = ""
|
|
||||||
load_cache(lib)
|
|
||||||
|
|
||||||
return unless ( @@cache[lib] and @@cache[lib][name] )
|
|
||||||
|
|
||||||
|
|
||||||
::File.open(lib, "rb") do |fd|
|
|
||||||
fd.seek(
|
|
||||||
@@cache[lib][:fastlib_header][0] +
|
|
||||||
@@cache[lib][:fastlib_header][1] +
|
|
||||||
@@cache[lib][name][0]
|
|
||||||
)
|
|
||||||
data = fastlib_filter_decode( lib, fd.read(@@cache[lib][name][1] ))
|
|
||||||
end
|
|
||||||
|
|
||||||
# Return the contents in raw or processed form
|
|
||||||
noprocess ? data : post_process(lib, name, data)
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method caches the file list and offsets within the archive
|
|
||||||
#
|
|
||||||
def self.load_cache(lib)
|
|
||||||
return if @@cache[lib]
|
|
||||||
@@cache[lib] = {}
|
|
||||||
|
|
||||||
return if not ::File.exists?(lib)
|
|
||||||
|
|
||||||
::File.open(lib, 'rb') do |fd|
|
|
||||||
dict = {}
|
|
||||||
head = fd.read(4)
|
|
||||||
return if head != "FAST"
|
|
||||||
hlen = fd.read(4).unpack("N")[0]
|
|
||||||
flag = fd.read(4).unpack("N")[0]
|
|
||||||
|
|
||||||
@@cache[lib][:fastlib_header] = [12, hlen, fd.stat.mtime.utc.to_i ]
|
|
||||||
@@cache[lib][:fastlib_flags] = flag
|
|
||||||
|
|
||||||
nlen, doff, dlen, tims = fd.read(16).unpack("N*")
|
|
||||||
|
|
||||||
while nlen > 0
|
|
||||||
name = fastlib_filter_decode( lib, fd.read(nlen) )
|
|
||||||
dict[name] = [doff, dlen, tims]
|
|
||||||
|
|
||||||
nlen, doff, dlen, tims = fd.read(16).unpack("N*")
|
|
||||||
end
|
|
||||||
|
|
||||||
@@cache[lib].merge!(dict)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method provides compression and encryption capabilities
|
|
||||||
# for the fastlib archive format.
|
|
||||||
#
|
|
||||||
def self.fastlib_filter_decode(lib, buff)
|
|
||||||
|
|
||||||
if (@@cache[lib][:fastlib_flags] & FLAG_ENCRYPT) != 0
|
|
||||||
|
|
||||||
@@cache[lib][:fastlib_decrypt] ||= ::Proc.new do |data|
|
|
||||||
stub = "decrypt_%.8x" % ( @@cache[lib][:fastlib_flags] & 0xfffffff0 )
|
|
||||||
FastLib.send(stub, data)
|
|
||||||
end
|
|
||||||
|
|
||||||
buff = @@cache[lib][:fastlib_decrypt].call( buff )
|
|
||||||
end
|
|
||||||
|
|
||||||
if (@@cache[lib][:fastlib_flags] & FLAG_COMPRESS) != 0
|
|
||||||
if not @@has_zlib
|
|
||||||
raise ::RuntimeError, "zlib is required to open this archive"
|
|
||||||
end
|
|
||||||
|
|
||||||
z = Zlib::Inflate.new
|
|
||||||
buff = z.inflate(buff)
|
|
||||||
buff << z.finish
|
|
||||||
z.close
|
|
||||||
end
|
|
||||||
|
|
||||||
buff
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method provides compression and encryption capabilities
|
|
||||||
# for the fastlib archive format.
|
|
||||||
#
|
|
||||||
def self.fastlib_filter_encode(lib, buff)
|
|
||||||
|
|
||||||
if (@@cache[lib][:fastlib_flags] & FLAG_COMPRESS) != 0
|
|
||||||
if not @@has_zlib
|
|
||||||
raise ::RuntimeError, "zlib is required to open this archive"
|
|
||||||
end
|
|
||||||
|
|
||||||
z = Zlib::Deflate.new
|
|
||||||
buff = z.deflate(buff)
|
|
||||||
buff << z.finish
|
|
||||||
z.close
|
|
||||||
end
|
|
||||||
|
|
||||||
if (@@cache[lib][:fastlib_flags] & FLAG_ENCRYPT) != 0
|
|
||||||
|
|
||||||
@@cache[lib][:fastlib_encrypt] ||= ::Proc.new do |data|
|
|
||||||
stub = "encrypt_%.8x" % ( @@cache[lib][:fastlib_flags] & 0xfffffff0 )
|
|
||||||
FastLib.send(stub, data)
|
|
||||||
end
|
|
||||||
|
|
||||||
buff = @@cache[lib][:fastlib_encrypt].call( buff )
|
|
||||||
end
|
|
||||||
|
|
||||||
buff
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# This method provides a way to create a FASTLIB archive programatically.
|
|
||||||
#
|
|
||||||
# @param [String] lib the output path for the archive
|
|
||||||
# @param [String] flag a string containing the hex values for the
|
|
||||||
# flags ({FLAG_COMPRESS} and {FLAG_ENCRYPT}).
|
|
||||||
# @param [String] bdir the path to the base directory which will be
|
|
||||||
# stripped from all paths included in the archive
|
|
||||||
# @param [Array<String>] dirs list of directories/files to pack into
|
|
||||||
# the archive. All dirs should be under bdir so that the paths are
|
|
||||||
# stripped correctly.
|
|
||||||
# @return [void]
|
|
||||||
def self.dump(lib, flag, bdir, *dirs)
|
|
||||||
head = ""
|
|
||||||
data = ""
|
|
||||||
hidx = 0
|
|
||||||
didx = 0
|
|
||||||
|
|
||||||
bdir = bdir.gsub(/\/$/, '')
|
|
||||||
brex = /^#{Regexp.escape(bdir)}\//
|
|
||||||
|
|
||||||
@@cache[lib] = {
|
|
||||||
:fastlib_flags => flag.to_i(16)
|
|
||||||
}
|
|
||||||
|
|
||||||
dirs.each do |dir|
|
|
||||||
::Find.find(dir) do |path|
|
|
||||||
next if not ::File.file?(path)
|
|
||||||
name = fastlib_filter_encode( lib, path.sub( brex, "" ) )
|
|
||||||
|
|
||||||
buff = ""
|
|
||||||
::File.open(path, "rb") do |fd|
|
|
||||||
buff = fastlib_filter_encode(lib, fd.read(fd.stat.size))
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
head << [ name.length, didx, buff.length, ::File.stat(path).mtime.utc.to_i ].pack("NNNN")
|
|
||||||
head << name
|
|
||||||
hidx = hidx + 16 + name.length
|
|
||||||
|
|
||||||
data << buff
|
|
||||||
didx = didx + buff.length
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
head << [0,0,0].pack("NNN")
|
|
||||||
|
|
||||||
::File.open(lib, "wb") do |fd|
|
|
||||||
fd.write("FAST")
|
|
||||||
fd.write( [ head.length, flag.to_i(16) ].pack("NN") )
|
|
||||||
fd.write( head )
|
|
||||||
fd.write( data )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This archive provides a way to list the contents of an archive
|
|
||||||
# file, returning the names only in sorted order.
|
|
||||||
#
|
|
||||||
def self.list(lib)
|
|
||||||
load_cache(lib)
|
|
||||||
( @@cache[lib] || {} ).keys.map{|x| x.to_s }.sort.select{ |x| @@cache[lib][x] }
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method is called on the loaded is required to expand __FILE__
|
|
||||||
# and other inline dynamic constants to map to the correct location.
|
|
||||||
#
|
|
||||||
def self.post_process(lib, name, data)
|
|
||||||
data.gsub('__FILE__', "'#{ ::File.expand_path(::File.join(::File.dirname(lib), name)) }'")
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This is a stub crypto handler that performs a basic XOR
|
|
||||||
# operation against a fixed one byte key. The two usable IDs
|
|
||||||
# are 12345600 and 00000000
|
|
||||||
#
|
|
||||||
def self.encrypt_12345600(data)
|
|
||||||
encrypt_00000000(data)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.decrypt_12345600(data)
|
|
||||||
encrypt_00000000(data)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.encrypt_00000000(data)
|
|
||||||
data.unpack("C*").map{ |c| c ^ 0x90 }.pack("C*")
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.decrypt_00000000(data)
|
|
||||||
encrypt_00000000(data)
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# Expose the cache to callers
|
|
||||||
#
|
|
||||||
def self.cache
|
|
||||||
@@cache
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Allow this library to be used as an executable to create and list
|
|
||||||
# FASTLIB archives
|
|
||||||
#
|
|
||||||
if __FILE__ == $0
|
|
||||||
cmd = ARGV.shift
|
|
||||||
unless ["store", "list", "version"].include?(cmd)
|
|
||||||
$stderr.puts "Usage: #{$0} [dump|list|version] <arguments>"
|
|
||||||
exit(0)
|
|
||||||
end
|
|
||||||
|
|
||||||
case cmd
|
|
||||||
when "store"
|
|
||||||
dst = ARGV.shift
|
|
||||||
flg = ARGV.shift
|
|
||||||
dir = ARGV.shift
|
|
||||||
src = ARGV
|
|
||||||
unless dst and dir and src.length > 0
|
|
||||||
$stderr.puts "Usage: #{$0} store destination.fastlib flags base_dir src1 src2 ... src99"
|
|
||||||
exit(0)
|
|
||||||
end
|
|
||||||
FastLib.dump(dst, flg, dir, *src)
|
|
||||||
|
|
||||||
when "list"
|
|
||||||
src = ARGV.shift
|
|
||||||
unless src
|
|
||||||
$stderr.puts "Usage: #{$0} list"
|
|
||||||
exit(0)
|
|
||||||
end
|
|
||||||
$stdout.puts "Library: #{src}"
|
|
||||||
$stdout.puts "====================================================="
|
|
||||||
FastLib.list(src).each do |name|
|
|
||||||
fsize = FastLib.cache[src][name][1]
|
|
||||||
ftime = ::Time.at(FastLib.cache[src][name][2]).strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
$stdout.puts sprintf("%9d\t%20s\t%s\n", fsize, ftime, name)
|
|
||||||
end
|
|
||||||
$stdout.puts ""
|
|
||||||
|
|
||||||
when "version"
|
|
||||||
$stdout.puts "FastLib Version #{FastLib.version}"
|
|
||||||
end
|
|
||||||
|
|
||||||
exit(0)
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# FASTLIB archive format (subject to change without notice)
|
|
||||||
#
|
|
||||||
=begin
|
|
||||||
|
|
||||||
* All integers are 32-bit and in network byte order (big endian / BE)
|
|
||||||
* The file signature is 0x46415354 (big endian, use htonl() if necessary)
|
|
||||||
* The header is always 12 bytes into the archive (magic + header length)
|
|
||||||
* The data section is always 12 + header length into the archive
|
|
||||||
* The header entries always start with 'fastlib_header'
|
|
||||||
* The header entries always consist of 16 bytes + name length (no alignment)
|
|
||||||
* The header name data may be encoded, compressed, or transformed
|
|
||||||
* The data entries may be encoded, compressed, or transformed too
|
|
||||||
|
|
||||||
|
|
||||||
4 bytes: "FAST"
|
|
||||||
4 bytes: NBO header length
|
|
||||||
4 bytes: NBO flags (24-bit crypto ID, 8 bit modes)
|
|
||||||
[
|
|
||||||
4 bytes: name length (0 = End of Names)
|
|
||||||
4 bytes: data offset
|
|
||||||
4 bytes: data length
|
|
||||||
4 bytes: timestamp
|
|
||||||
]
|
|
||||||
[ Raw Data ]
|
|
||||||
|
|
||||||
=end
|
|
||||||
|
|
||||||
|
|
||||||
module Kernel #:nodoc:all
|
|
||||||
alias :fastlib_original_require :require
|
|
||||||
|
|
||||||
#
|
|
||||||
# Store the CWD when were initially loaded
|
|
||||||
# required for resolving relative paths
|
|
||||||
#
|
|
||||||
@@fastlib_base_cwd = ::Dir.pwd
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method hooks the original Kernel.require to support
|
|
||||||
# loading files within FASTLIB archives
|
|
||||||
#
|
|
||||||
def require(name)
|
|
||||||
fastlib_require(name) || fastlib_original_require(name)
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method handles the loading of FASTLIB archives
|
|
||||||
#
|
|
||||||
def fastlib_require(name)
|
|
||||||
if name.respond_to? :to_path
|
|
||||||
name = name.to_path
|
|
||||||
end
|
|
||||||
|
|
||||||
name = name + ".rb" if not name =~ /\.rb$/
|
|
||||||
return false if fastlib_already_loaded?(name)
|
|
||||||
return false if fastlib_already_tried?(name)
|
|
||||||
|
|
||||||
# XXX Implement relative search paths within archives
|
|
||||||
$:.map{ |path|
|
|
||||||
(path =~ /^([A-Za-z]\:|\/)/ ) ? path : ::File.expand_path( ::File.join(@@fastlib_base_cwd, path) )
|
|
||||||
}.map{ |path| ::Dir["#{path}/*.fastlib"] }.flatten.uniq.each do |lib|
|
|
||||||
data = FastLib.load(lib, name)
|
|
||||||
next if not data
|
|
||||||
$" << name
|
|
||||||
|
|
||||||
Object.class_eval(data, lib + "::" + name)
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
$fastlib_miss << name
|
|
||||||
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method determines whether the specific file name
|
|
||||||
# has already been loaded ($LOADED_FEATURES aka $")
|
|
||||||
#
|
|
||||||
def fastlib_already_loaded?(name)
|
|
||||||
re = Regexp.new("^" + Regexp.escape(name) + "$")
|
|
||||||
$".detect { |e| e =~ re } != nil
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# This method determines whether the specific file name
|
|
||||||
# has already been attempted with the included FASTLIB
|
|
||||||
# archives.
|
|
||||||
#
|
|
||||||
# TODO: Ensure that this only applies to known FASTLIB
|
|
||||||
# archives and that newly included archives will
|
|
||||||
# be searched appropriately.
|
|
||||||
#
|
|
||||||
def fastlib_already_tried?(name)
|
|
||||||
$fastlib_miss ||= []
|
|
||||||
$fastlib_miss.include?(name)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -366,7 +366,9 @@ class DBManager
|
||||||
ActiveRecord::Base.connection_pool.with_connection do
|
ActiveRecord::Base.connection_pool.with_connection do
|
||||||
|
|
||||||
refresh = []
|
refresh = []
|
||||||
skipped = []
|
skip_reference_name_set_by_module_type = Hash.new { |hash, module_type|
|
||||||
|
hash[module_type] = Set.new
|
||||||
|
}
|
||||||
|
|
||||||
Mdm::Module::Detail.find_each do |md|
|
Mdm::Module::Detail.find_each do |md|
|
||||||
|
|
||||||
|
@ -385,7 +387,8 @@ class DBManager
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
|
|
||||||
skipped << [md.mtype, md.refname]
|
skip_reference_name_set = skip_reference_name_set_by_module_type[md.mtype]
|
||||||
|
skip_reference_name_set.add(md.refname)
|
||||||
end
|
end
|
||||||
|
|
||||||
refresh.each { |md| md.destroy }
|
refresh.each { |md| md.destroy }
|
||||||
|
@ -398,8 +401,10 @@ class DBManager
|
||||||
['encoder', framework.encoders],
|
['encoder', framework.encoders],
|
||||||
['nop', framework.nops]
|
['nop', framework.nops]
|
||||||
].each do |mt|
|
].each do |mt|
|
||||||
|
skip_reference_name_set = skip_reference_name_set_by_module_type[mt[0]]
|
||||||
|
|
||||||
mt[1].keys.sort.each do |mn|
|
mt[1].keys.sort.each do |mn|
|
||||||
next if skipped.include?([mt[0], mn])
|
next if skip_reference_name_set.include? mn
|
||||||
obj = mt[1].create(mn)
|
obj = mt[1].create(mn)
|
||||||
next if not obj
|
next if not obj
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -7,7 +7,6 @@ require 'pathname'
|
||||||
#
|
#
|
||||||
# Project
|
# Project
|
||||||
#
|
#
|
||||||
require 'fastlib'
|
|
||||||
require 'msf/core'
|
require 'msf/core'
|
||||||
require 'msf/core/module_set'
|
require 'msf/core/module_set'
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ require 'active_support/concern'
|
||||||
#
|
#
|
||||||
# Project
|
# Project
|
||||||
#
|
#
|
||||||
require 'msf/core/modules/loader/archive'
|
|
||||||
require 'msf/core/modules/loader/directory'
|
require 'msf/core/modules/loader/directory'
|
||||||
|
|
||||||
# Deals with loading modules for the {Msf::ModuleManager}
|
# Deals with loading modules for the {Msf::ModuleManager}
|
||||||
|
@ -20,7 +19,6 @@ module Msf::ModuleManager::Loading
|
||||||
|
|
||||||
# Classes that can be used to load modules.
|
# Classes that can be used to load modules.
|
||||||
LOADER_CLASSES = [
|
LOADER_CLASSES = [
|
||||||
Msf::Modules::Loader::Archive,
|
|
||||||
Msf::Modules::Loader::Directory
|
Msf::Modules::Loader::Directory
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -103,7 +101,7 @@ module Msf::ModuleManager::Loading
|
||||||
|
|
||||||
# Load all of the modules from the supplied directory or archive
|
# Load all of the modules from the supplied directory or archive
|
||||||
#
|
#
|
||||||
# @param [String] path Path to a directory or Fastlib archive
|
# @param [String] path Path to a directory
|
||||||
# @param [Hash] options
|
# @param [Hash] options
|
||||||
# @option options [Boolean] :force Whether the force loading the modules even if they are unchanged and already
|
# @option options [Boolean] :force Whether the force loading the modules even if they are unchanged and already
|
||||||
# loaded.
|
# loaded.
|
||||||
|
|
|
@ -24,30 +24,14 @@ module Msf::ModuleManager::ModulePaths
|
||||||
|
|
||||||
# Make the path completely canonical
|
# Make the path completely canonical
|
||||||
pathname = Pathname.new(path_without_trailing_file_separator).expand_path
|
pathname = Pathname.new(path_without_trailing_file_separator).expand_path
|
||||||
extension = pathname.extname
|
|
||||||
|
|
||||||
if extension == Msf::Modules::Loader::Archive::ARCHIVE_EXTENSION
|
# Make sure the path is a valid directory
|
||||||
unless pathname.exist?
|
unless pathname.directory?
|
||||||
raise ArgumentError, "The path supplied does not exist", caller
|
raise ArgumentError, "The path supplied is not a valid directory.", caller
|
||||||
end
|
|
||||||
|
|
||||||
nested_paths << pathname.to_s
|
|
||||||
else
|
|
||||||
# Make sure the path is a valid directory
|
|
||||||
unless pathname.directory?
|
|
||||||
raise ArgumentError, "The path supplied is not a valid directory.", caller
|
|
||||||
end
|
|
||||||
|
|
||||||
nested_paths << pathname.to_s
|
|
||||||
|
|
||||||
# Identify any fastlib archives inside of this path
|
|
||||||
fastlib_glob = pathname.join('**', "*#{Msf::Modules::Loader::Archive::ARCHIVE_EXTENSION}")
|
|
||||||
|
|
||||||
Dir.glob(fastlib_glob).each do |fastlib_path|
|
|
||||||
nested_paths << fastlib_path
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
nested_paths << pathname.to_s
|
||||||
|
|
||||||
# Update the module paths appropriately
|
# Update the module paths appropriately
|
||||||
self.module_paths = (module_paths + nested_paths).flatten.uniq
|
self.module_paths = (module_paths + nested_paths).flatten.uniq
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
# -*- coding: binary -*-
|
# -*- coding: binary -*-
|
||||||
require 'msf/core'
|
require 'msf/core'
|
||||||
require 'fastlib'
|
|
||||||
require 'pathname'
|
require 'pathname'
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
# -*- coding: binary -*-
|
|
||||||
require 'msf/core/modules/loader/base'
|
|
||||||
|
|
||||||
# Concerns loading modules form fastlib archives
|
|
||||||
class Msf::Modules::Loader::Archive < Msf::Modules::Loader::Base
|
|
||||||
#
|
|
||||||
# CONSTANTS
|
|
||||||
#
|
|
||||||
|
|
||||||
# The extension for Fastlib archives.
|
|
||||||
ARCHIVE_EXTENSION = '.fastlib'
|
|
||||||
|
|
||||||
# Returns true if the path is a Fastlib archive.
|
|
||||||
#
|
|
||||||
# @param (see Msf::Modules::Loader::Base#loadable?)
|
|
||||||
# @return [true] if path has the {ARCHIVE_EXTENSION} extname.
|
|
||||||
# @return [false] otherwise
|
|
||||||
def loadable?(path)
|
|
||||||
if File.extname(path) == ARCHIVE_EXTENSION
|
|
||||||
true
|
|
||||||
else
|
|
||||||
false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
# Yields the module_reference_name for each module file in the Fastlib archive at path.
|
|
||||||
#
|
|
||||||
# @param path [String] The path to the Fastlib archive file.
|
|
||||||
# @param opts [Hash] Additional options
|
|
||||||
# @yield (see Msf::Modules::Loader::Base#each_module_reference_name)
|
|
||||||
# @yieldparam (see Msf::Modules::Loader::Base#each_module_reference_name)
|
|
||||||
# @return (see Msf::Modules::Loader::Base#each_module_reference_name)
|
|
||||||
def each_module_reference_name(path, opts={})
|
|
||||||
whitelist = opts[:whitelist] || []
|
|
||||||
entries = ::FastLib.list(path)
|
|
||||||
|
|
||||||
entries.each do |entry|
|
|
||||||
if entry.include?('.svn/')
|
|
||||||
next
|
|
||||||
end
|
|
||||||
|
|
||||||
type = entry.split('/', 2)[0]
|
|
||||||
type = type.singularize
|
|
||||||
|
|
||||||
unless module_manager.type_enabled?(type)
|
|
||||||
next
|
|
||||||
end
|
|
||||||
|
|
||||||
if whitelist.empty?
|
|
||||||
|
|
||||||
if module_path?(entry)
|
|
||||||
# The module_reference_name doesn't have a file extension
|
|
||||||
module_reference_name = module_reference_name_from_path(entry)
|
|
||||||
|
|
||||||
yield path, type, module_reference_name
|
|
||||||
end
|
|
||||||
else
|
|
||||||
whitelist.each do |pattern|
|
|
||||||
if entry =~ pattern
|
|
||||||
yield path, type, module_reference_name
|
|
||||||
else
|
|
||||||
next
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns the path to the module inside the Fastlib archive. The path to the archive is separated from the path to
|
|
||||||
# the file inside the archive by '::'.
|
|
||||||
#
|
|
||||||
# @param (see Msf::Modules::Loader::Base#module_path)
|
|
||||||
# @return [String] Path to module file inside the Fastlib archive.
|
|
||||||
def module_path(parent_path, type, module_reference_name)
|
|
||||||
file_path = typed_path(type, module_reference_name)
|
|
||||||
module_path = "#{parent_path}::#{file_path}"
|
|
||||||
|
|
||||||
module_path
|
|
||||||
end
|
|
||||||
|
|
||||||
# Loads the module content from the Fastlib archive.
|
|
||||||
#
|
|
||||||
# @return (see Msf::Modules::Loader::Base#read_module_content)
|
|
||||||
def read_module_content(path, type, module_reference_name)
|
|
||||||
file_path = typed_path(type, module_reference_name)
|
|
||||||
|
|
||||||
::FastLib.load(path, file_path)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,4 +1,8 @@
|
||||||
# -*- coding: binary -*-
|
# -*- coding: binary -*-
|
||||||
|
|
||||||
|
require 'msf/core/modules/loader'
|
||||||
|
require 'msf/core/modules/loader/base'
|
||||||
|
|
||||||
# Concerns loading module from a directory
|
# Concerns loading module from a directory
|
||||||
class Msf::Modules::Loader::Directory < Msf::Modules::Loader::Base
|
class Msf::Modules::Loader::Directory < Msf::Modules::Loader::Base
|
||||||
# Returns true if the path is a directory
|
# Returns true if the path is a directory
|
||||||
|
|
|
@ -11,7 +11,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
1
msfcli
1
msfcli
|
@ -535,7 +535,6 @@ class Msfcli
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'msf/ui'
|
require 'msf/ui'
|
||||||
require 'msf/base'
|
require 'msf/base'
|
||||||
|
|
26
msfconsole
26
msfconsole
|
@ -11,6 +11,32 @@
|
||||||
|
|
||||||
require 'pathname'
|
require 'pathname'
|
||||||
|
|
||||||
|
if ENV['METASPLOIT_FRAMEWORK_PROFILE'] == 'true'
|
||||||
|
gem 'perftools.rb'
|
||||||
|
require 'perftools'
|
||||||
|
|
||||||
|
formatted_time = Time.now.strftime('%Y%m%d%H%M%S')
|
||||||
|
root = Pathname.new(__FILE__).parent
|
||||||
|
profile_pathname = root.join('tmp', 'profiles', 'msfconsole', formatted_time)
|
||||||
|
|
||||||
|
profile_pathname.parent.mkpath
|
||||||
|
PerfTools::CpuProfiler.start(profile_pathname.to_path)
|
||||||
|
|
||||||
|
at_exit {
|
||||||
|
PerfTools::CpuProfiler.stop
|
||||||
|
|
||||||
|
puts "Generating pdf"
|
||||||
|
|
||||||
|
pdf_path = "#{profile_pathname}.pdf"
|
||||||
|
|
||||||
|
if Bundler.clean_system("pprof.rb --pdf #{profile_pathname} > #{pdf_path}")
|
||||||
|
puts "PDF saved to #{pdf_path}"
|
||||||
|
|
||||||
|
Rex::Compat.open_file(pdf_path)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# Project
|
# Project
|
||||||
#
|
#
|
||||||
|
|
1
msfd
1
msfd
|
@ -17,7 +17,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
1
msfrop
1
msfrop
|
@ -14,7 +14,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
1
msfrpc
1
msfrpc
|
@ -15,7 +15,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
1
msfrpcd
1
msfrpcd
|
@ -15,7 +15,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
|
|
||||||
|
|
1
msfvenom
1
msfvenom
|
@ -7,7 +7,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -1,234 +0,0 @@
|
||||||
# -*- coding:binary -*-
|
|
||||||
require 'spec_helper'
|
|
||||||
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
describe FastLib do
|
|
||||||
let(:archived_paths) do
|
|
||||||
[
|
|
||||||
File.join('auxiliary', 'scanner', 'portscan', 'xmas.rb'),
|
|
||||||
File.join('exploits', 'windows', 'smb', 'ms08_067_netapi.rb')
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:base_path) do
|
|
||||||
File.join(Msf::Config.install_root, 'modules')
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:extension) do
|
|
||||||
'.fastlib'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:flag_compress) do
|
|
||||||
0x01
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:flag_encrypt) do
|
|
||||||
0x02
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:unarchived_paths) do
|
|
||||||
archived_paths.collect { |archived_path|
|
|
||||||
File.join(base_path, archived_path)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'CONSTANTS' do
|
|
||||||
context 'flags' do
|
|
||||||
it 'should have compression' do
|
|
||||||
described_class::FLAG_COMPRESS.should == flag_compress
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should have encryption' do
|
|
||||||
described_class::FLAG_ENCRYPT.should == flag_encrypt
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'class methods' do
|
|
||||||
context 'dump' do
|
|
||||||
let(:flag_string) do
|
|
||||||
flags.to_s(16)
|
|
||||||
end
|
|
||||||
|
|
||||||
before(:each) do
|
|
||||||
FastLib.cache.clear
|
|
||||||
end
|
|
||||||
|
|
||||||
around(:each) do |example|
|
|
||||||
Dir.mktmpdir do |directory|
|
|
||||||
@destination_path = File.join(directory, "rspec#{extension}")
|
|
||||||
|
|
||||||
example.run
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'without compression and without encryption' do
|
|
||||||
let(:flags) do
|
|
||||||
0x0
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should create an archive' do
|
|
||||||
File.exist?(@destination_path).should be_falsey
|
|
||||||
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
File.exist?(@destination_path).should be_truthy
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'cache' do
|
|
||||||
it 'should populate' do
|
|
||||||
FastLib.cache[@destination_path].should be_nil
|
|
||||||
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
FastLib.cache[@destination_path].should be_a Hash
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should include flags' do
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
FastLib.cache[@destination_path][:fastlib_flags].should == flags
|
|
||||||
end
|
|
||||||
|
|
||||||
skip "Fix https://www.pivotaltracker.com/story/show/38730815" do
|
|
||||||
it 'should include header' do
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
header = FastLib.cache[@destination_path][:fastlib_header]
|
|
||||||
modification_time = File.mtime(@destination_path).utc.to_i
|
|
||||||
|
|
||||||
header.should be_a Array
|
|
||||||
# @todo figure out why 12 before header length
|
|
||||||
header[0].should == 12
|
|
||||||
# @todo figure out why header length is 0
|
|
||||||
header[1].should == 0
|
|
||||||
header[2].should == modification_time
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should include archived paths' do
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
cache = FastLib.cache[@destination_path]
|
|
||||||
|
|
||||||
archived_path = File.join('exploits', 'windows', 'smb', 'ms08_067_netapi.rb')
|
|
||||||
unarchived_path = File.join(base_path, archived_path)
|
|
||||||
|
|
||||||
# make sure that the unarchived module exists and hasn't be deleted or renamed before expecting it to be
|
|
||||||
# in the archive.
|
|
||||||
File.exist?(unarchived_path).should be_truthy
|
|
||||||
cache[archived_path].should_not be_nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with compression and without encryption' do
|
|
||||||
let(:flags) do
|
|
||||||
flag_compress
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should create an archive' do
|
|
||||||
File.exist?(@destination_path).should be_falsey
|
|
||||||
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
File.exist?(@destination_path).should be_truthy
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should be smaller than the uncompressed archive' do
|
|
||||||
uncompressed_path = "#{@destination_path}.uncompressed"
|
|
||||||
compressed_path = "#{@destination_path}.compressed"
|
|
||||||
|
|
||||||
File.exist?(uncompressed_path).should be_falsey
|
|
||||||
File.exist?(compressed_path).should be_falsey
|
|
||||||
|
|
||||||
described_class.dump(uncompressed_path, '', base_path, *unarchived_paths)
|
|
||||||
described_class.dump(compressed_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
File.exist?(uncompressed_path).should be_truthy
|
|
||||||
File.exist?(compressed_path).should be_truthy
|
|
||||||
|
|
||||||
File.size(compressed_path).should < File.size(uncompressed_path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'without compression and with encryption' do
|
|
||||||
let(:flags) do
|
|
||||||
flag_encrypt
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should create an archive' do
|
|
||||||
File.exist?(@destination_path).should be_falsey
|
|
||||||
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
File.exist?(@destination_path).should be_truthy
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with compression and with encryption' do
|
|
||||||
let(:flags) do
|
|
||||||
flag_compress | flag_encrypt
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should create an archive' do
|
|
||||||
File.exist?(@destination_path).should be_falsey
|
|
||||||
|
|
||||||
described_class.dump(@destination_path, flag_string, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
File.exist?(@destination_path).should be_truthy
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'list' do
|
|
||||||
around(:each) do |example|
|
|
||||||
Dir.mktmpdir do |directory|
|
|
||||||
@destination_path = File.join(directory, "rspec#{extension}")
|
|
||||||
|
|
||||||
FastLib.dump(@destination_path, FastLib::FLAG_COMPRESS.to_s, base_path, *unarchived_paths)
|
|
||||||
|
|
||||||
example.run
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# ensure modules expected to be listed actually exist
|
|
||||||
it 'should use existent unarchived modules' do
|
|
||||||
unarchived_paths.each do |unarchived_path|
|
|
||||||
File.exist?(unarchived_path).should be_truthy
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
skip "Fix https://www.pivotaltracker.com/story/show/38730815" do
|
|
||||||
context 'with cached dump' do
|
|
||||||
it 'should have dump cached' do
|
|
||||||
FastLib.cache[@destination_path].should_not be_nil
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should list archived paths' do
|
|
||||||
paths = FastLib.list(@destination_path)
|
|
||||||
|
|
||||||
paths.length.should == archived_paths.length
|
|
||||||
paths.should == archived_paths
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'without cached dump' do
|
|
||||||
before(:each) do
|
|
||||||
FastLib.cache.clear
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should not have dump cache' do
|
|
||||||
FastLib.cache[@destination_path].should be_nil
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should list archived paths' do
|
|
||||||
paths = FastLib.list(@destination_path)
|
|
||||||
|
|
||||||
paths.length.should == archived_paths.length
|
|
||||||
paths.should == archived_paths
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -19,14 +19,6 @@ require 'msf/core'
|
||||||
describe Msf::ModuleManager do
|
describe Msf::ModuleManager do
|
||||||
include_context 'Msf::Simple::Framework'
|
include_context 'Msf::Simple::Framework'
|
||||||
|
|
||||||
let(:archive_basename) do
|
|
||||||
[basename_prefix, archive_extension]
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:archive_extension) do
|
|
||||||
'.fastlib'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:basename_prefix) do
|
let(:basename_prefix) do
|
||||||
'rspec'
|
'rspec'
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,276 +0,0 @@
|
||||||
# -*- coding:binary -*-
|
|
||||||
require 'spec_helper'
|
|
||||||
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
describe Msf::Modules::Loader::Archive do
|
|
||||||
let(:archive_extension) do
|
|
||||||
'.fastlib'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'CONSTANTS' do
|
|
||||||
it 'should have extension' do
|
|
||||||
described_class::ARCHIVE_EXTENSION.should == archive_extension
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'instance methods' do
|
|
||||||
let(:enabled_type) do
|
|
||||||
'exploit'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:enabled_type_directory) do
|
|
||||||
'exploits'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:framework) do
|
|
||||||
double('Framework')
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:module_extension) do
|
|
||||||
'.rb'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:module_manager) do
|
|
||||||
# DO NOT mock module_manager to ensure that no protected methods are being called.
|
|
||||||
Msf::ModuleManager.new(framework, [enabled_type])
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:module_reference_name) do
|
|
||||||
'module/reference/name'
|
|
||||||
end
|
|
||||||
|
|
||||||
subject do
|
|
||||||
described_class.new(module_manager)
|
|
||||||
end
|
|
||||||
|
|
||||||
context '#each_module_reference_name' do
|
|
||||||
let(:disabled_module_content) do
|
|
||||||
<<-EOS
|
|
||||||
class Metasploit3 < Msf::Auxiliary
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:disabled_type) do
|
|
||||||
'auxiliary'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:disabled_type_directory) do
|
|
||||||
'auxiliary'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:enabled_module_content) do
|
|
||||||
<<-EOS
|
|
||||||
class Metasploit3 < Msf::Exploit::Remote
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
end
|
|
||||||
|
|
||||||
around(:each) do |example|
|
|
||||||
Dir.mktmpdir do |directory|
|
|
||||||
@base_path = directory
|
|
||||||
|
|
||||||
# make a .svn directory to be ignored
|
|
||||||
subversion_path = File.join(@base_path, '.svn')
|
|
||||||
FileUtils.mkdir_p subversion_path
|
|
||||||
|
|
||||||
# make a type directory that should be ignored because it's not enabled
|
|
||||||
disabled_type_path = File.join(@base_path, disabled_type_directory)
|
|
||||||
FileUtils.mkdir_p disabled_type_path
|
|
||||||
|
|
||||||
#
|
|
||||||
# create a valid module in the disabled type directory to make sure it's the enablement that's preventing the
|
|
||||||
# yield
|
|
||||||
#
|
|
||||||
|
|
||||||
disabled_module_path = File.join(disabled_type_path, "#{disabled_type}#{module_extension}")
|
|
||||||
|
|
||||||
File.open(disabled_module_path, 'wb') do |f|
|
|
||||||
f.write(disabled_module_content)
|
|
||||||
end
|
|
||||||
|
|
||||||
# make a type directory that should not be ignored because it is enabled
|
|
||||||
enabled_module_path = File.join(
|
|
||||||
@base_path,
|
|
||||||
enabled_type_directory,
|
|
||||||
"#{module_reference_name}#{module_extension}"
|
|
||||||
)
|
|
||||||
enabled_module_directory = File.dirname(enabled_module_path)
|
|
||||||
FileUtils.mkdir_p enabled_module_directory
|
|
||||||
|
|
||||||
File.open(enabled_module_path, 'wb') do |f|
|
|
||||||
f.write(enabled_module_content)
|
|
||||||
end
|
|
||||||
|
|
||||||
Dir.mktmpdir do |archive_directory|
|
|
||||||
@archive_path = File.join(archive_directory, "rspec#{archive_extension}")
|
|
||||||
FastLib.dump(@archive_path, FastLib::FLAG_COMPRESS.to_s(16), @base_path, @base_path)
|
|
||||||
|
|
||||||
# @todo Fix https://www.pivotaltracker.com/story/show/38730815 and the cache won't need to be cleared as a work-around
|
|
||||||
FastLib.cache.clear
|
|
||||||
|
|
||||||
example.run
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# this checks that the around(:each) is working
|
|
||||||
it 'should have an existent FastLib' do
|
|
||||||
File.exist?(@archive_path).should be_truthy
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should ignore .svn directories' do
|
|
||||||
subject.send(:each_module_reference_name, @archive_path) do |parent_path, type, module_reference_name|
|
|
||||||
parent_path.should_not include('.svn')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should ignore types that are not enabled' do
|
|
||||||
module_manager.type_enabled?(disabled_type).should be_falsey
|
|
||||||
|
|
||||||
subject.send(:each_module_reference_name, @archive_path) do |parent_path, type, module_reference_name|
|
|
||||||
type.should_not == disabled_type
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should yield (parent_path, type, module_reference_name) with parent_path equal to the archive path' do
|
|
||||||
subject.send(:each_module_reference_name, @archive_path) do |parent_path, type, module_reference_name|
|
|
||||||
parent_path.should == @archive_path
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should yield (parent_path, type, module_reference_name) with type equal to enabled type' do
|
|
||||||
module_manager.type_enabled?(enabled_type).should be_truthy
|
|
||||||
|
|
||||||
subject.send(:each_module_reference_name, @archive_path) do |parent_path, type, module_reference_name|
|
|
||||||
type.should == enabled_type
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should yield (path, type, module_reference_name) with module_reference_name without extension' do
|
|
||||||
subject.send(:each_module_reference_name, @archive_path) do |parent_path, type, module_reference_name|
|
|
||||||
module_reference_name.should_not match(/#{Regexp.escape(module_extension)}$/)
|
|
||||||
module_reference_name.should == module_reference_name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# ensure that the block is actually being run so that shoulds in the block aren't just being skipped
|
|
||||||
it 'should yield the correct number of tuples' do
|
|
||||||
actual_count = 0
|
|
||||||
|
|
||||||
subject.send(:each_module_reference_name, @archive_path) do |parent_path, type, module_reference_name|
|
|
||||||
actual_count += 1
|
|
||||||
end
|
|
||||||
|
|
||||||
actual_count.should == 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context '#loadable?' do
|
|
||||||
it 'should return true if the path has ARCHIVE_EXTENSION as file extension' do
|
|
||||||
path = "path/to/archive#{archive_extension}"
|
|
||||||
|
|
||||||
File.extname(path).should == described_class::ARCHIVE_EXTENSION
|
|
||||||
subject.loadable?(path).should be_truthy
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should return false if the path contains ARCHIVE_EXTENSION, but it is not the file extension' do
|
|
||||||
path = "path/to/archive#{archive_extension}.bak"
|
|
||||||
|
|
||||||
path.should include(described_class::ARCHIVE_EXTENSION)
|
|
||||||
File.extname(path).should_not == described_class::ARCHIVE_EXTENSION
|
|
||||||
subject.loadable?(path).should be_falsey
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context '#module_path' do
|
|
||||||
let(:parent_path) do
|
|
||||||
"path/to/archive#{archive_extension}"
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:type) do
|
|
||||||
'exploit'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:type_directory) do
|
|
||||||
'exploits'
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should use typed_path to convert the type name to a type directory' do
|
|
||||||
subject.should_receive(:typed_path).with(type, module_reference_name)
|
|
||||||
|
|
||||||
subject.send(:module_path, parent_path, type, module_reference_name)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should separate the archive path from the entry path with '::'" do
|
|
||||||
module_path = subject.send(:module_path, parent_path, type, module_reference_name)
|
|
||||||
|
|
||||||
module_path.should == "#{parent_path}::#{type_directory}/#{module_reference_name}.rb"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context '#read_module_path' do
|
|
||||||
let(:module_reference_name) do
|
|
||||||
'windows/smb/ms08_067_netapi'
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:type) do
|
|
||||||
enabled_type
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:type_directory) do
|
|
||||||
enabled_type_directory
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:archived_path) do
|
|
||||||
File.join(type_directory, "#{module_reference_name}#{module_extension}")
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:base_path) do
|
|
||||||
File.join(Msf::Config.install_root, 'modules')
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:flag_string) do
|
|
||||||
flags.to_s(16)
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:flags) do
|
|
||||||
0x0
|
|
||||||
end
|
|
||||||
|
|
||||||
let(:unarchived_path) do
|
|
||||||
File.join(base_path, archived_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should read modules that exist' do
|
|
||||||
File.exist?(unarchived_path).should be_truthy
|
|
||||||
end
|
|
||||||
|
|
||||||
around(:each) do |example|
|
|
||||||
Dir.mktmpdir do |directory|
|
|
||||||
@parent_path = File.join(directory, 'rspec.fastlib')
|
|
||||||
|
|
||||||
FastLib.dump(@parent_path, flag_string, base_path, unarchived_path)
|
|
||||||
|
|
||||||
# @todo Fix https://www.pivotaltracker.com/story/show/38730815 so cache from dump is correct
|
|
||||||
FastLib.cache.clear
|
|
||||||
|
|
||||||
example.run
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with uncompressed archive' do
|
|
||||||
it_should_behave_like 'Msf::Modules::Loader::Archive#read_module_content'
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with compressed archive' do
|
|
||||||
let(:flags) do
|
|
||||||
FastLib::FLAG_COMPRESS
|
|
||||||
end
|
|
||||||
|
|
||||||
it_should_behave_like 'Msf::Modules::Loader::Archive#read_module_content'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,5 +1,4 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'msf/base'
|
require 'msf/base'
|
||||||
require 'rex/proto/pjl'
|
require 'rex/proto/pjl'
|
||||||
|
|
|
@ -2,7 +2,6 @@ require 'spec_helper'
|
||||||
|
|
||||||
load Metasploit::Framework.root.join('msfcli').to_path
|
load Metasploit::Framework.root.join('msfcli').to_path
|
||||||
|
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'msf/ui'
|
require 'msf/ui'
|
||||||
require 'msf/base'
|
require 'msf/base'
|
||||||
|
|
|
@ -14,33 +14,6 @@ shared_examples_for 'Msf::ModuleManager::ModulePaths' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with Fastlib archive' do
|
|
||||||
it 'should raise an ArgumentError unless the File exists' do
|
|
||||||
file = Tempfile.new(archive_basename)
|
|
||||||
# unlink will clear path, so copy it to a variable
|
|
||||||
path = file.path
|
|
||||||
file.unlink
|
|
||||||
|
|
||||||
File.exist?(path).should be_falsey
|
|
||||||
|
|
||||||
expect {
|
|
||||||
module_manager.add_module_path(path)
|
|
||||||
}.to raise_error(ArgumentError, "The path supplied does not exist")
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should add the path to #module_paths if the File exists' do
|
|
||||||
Tempfile.open(archive_basename) do |temporary_file|
|
|
||||||
path = temporary_file.path
|
|
||||||
|
|
||||||
File.exist?(path).should be_truthy
|
|
||||||
|
|
||||||
module_manager.add_module_path(path)
|
|
||||||
|
|
||||||
module_paths.should include(path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with directory' do
|
context 'with directory' do
|
||||||
it 'should add path to #module_paths' do
|
it 'should add path to #module_paths' do
|
||||||
Dir.mktmpdir do |path|
|
Dir.mktmpdir do |path|
|
||||||
|
@ -49,19 +22,6 @@ shared_examples_for 'Msf::ModuleManager::ModulePaths' do
|
||||||
module_paths.should include(path)
|
module_paths.should include(path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'containing Fastlib archives' do
|
|
||||||
it 'should add each Fastlib archive to #module_paths' do
|
|
||||||
Dir.mktmpdir do |directory|
|
|
||||||
Tempfile.open(archive_basename, directory) do |file|
|
|
||||||
module_manager.add_module_path(directory)
|
|
||||||
|
|
||||||
module_paths.should include(directory)
|
|
||||||
module_paths.should include(file.path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with other file' do
|
context 'with other file' do
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
# -*- coding:binary -*-
|
|
||||||
shared_examples_for 'Msf::Modules::Loader::Archive#read_module_content' do
|
|
||||||
it 'should be able to read the module content' do
|
|
||||||
archived_module_content = subject.send(:read_module_content, @parent_path, type, module_reference_name)
|
|
||||||
unarchived_module_content = ''
|
|
||||||
|
|
||||||
File.open(unarchived_path) do |f|
|
|
||||||
unarchived_module_content = f.read
|
|
||||||
end
|
|
||||||
|
|
||||||
unarchived_module_content.should_not be_empty
|
|
||||||
archived_module_content.should == unarchived_module_content
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -2,7 +2,6 @@ require 'spec_helper'
|
||||||
|
|
||||||
load Metasploit::Framework.root.join('tools/cpassword_decrypt.rb').to_path
|
load Metasploit::Framework.root.join('tools/cpassword_decrypt.rb').to_path
|
||||||
|
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'msf/base'
|
require 'msf/base'
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ require 'spec_helper'
|
||||||
|
|
||||||
load Metasploit::Framework.root.join('tools/virustotal.rb').to_path
|
load Metasploit::Framework.root.join('tools/virustotal.rb').to_path
|
||||||
|
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'msf/base'
|
require 'msf/base'
|
||||||
require 'digest/sha2'
|
require 'digest/sha2'
|
||||||
|
|
|
@ -11,7 +11,6 @@ end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', '..', 'lib')))
|
||||||
|
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'msf/base'
|
require 'msf/base'
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'rex'
|
require 'rex'
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -14,7 +14,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -16,7 +16,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -16,7 +16,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -15,7 +15,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -14,7 +14,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -21,7 +21,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -8,7 +8,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -12,7 +12,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -10,7 +10,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -15,7 +15,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
mkdir fastlib-archived
|
|
||||||
./lib/fastlib.rb store modules.fastlib 12345603 modules/ modules/*
|
|
||||||
./lib/fastlib.rb store lib/metasploit.fastlib 12345603 lib lib/msf/ lib/rex*
|
|
||||||
mv lib/msf lib/rex* modules/ fastlib-archived
|
|
|
@ -10,7 +10,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -8,7 +8,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -10,7 +10,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -13,7 +13,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
|
|
||||||
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
|
||||||
|
|
|
@ -34,7 +34,6 @@ while File.symlink?(msfbase)
|
||||||
end
|
end
|
||||||
|
|
||||||
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
$:.unshift(File.expand_path(File.join(File.dirname(msfbase), '..', 'lib')))
|
||||||
require 'fastlib'
|
|
||||||
require 'msfenv'
|
require 'msfenv'
|
||||||
require 'rex'
|
require 'rex'
|
||||||
require 'msf/core'
|
require 'msf/core'
|
||||||
|
|
Loading…
Reference in New Issue