Adding the new msfweb tree, using rails 2.2.3 and newer prototype
git-svn-id: file:///home/svn/framework3/trunk@6651 4d416f70-5f16-0410-b530-b9f4589650da
@@ -0,0 +1,243 @@
|
||||
== Welcome to Rails
|
||||
|
||||
Rails is a web-application framework that includes everything needed to create
|
||||
database-backed web applications according to the Model-View-Control pattern.
|
||||
|
||||
This pattern splits the view (also called the presentation) into "dumb" templates
|
||||
that are primarily responsible for inserting pre-built data in between HTML tags.
|
||||
The model contains the "smart" domain objects (such as Account, Product, Person,
|
||||
Post) that holds all the business logic and knows how to persist themselves to
|
||||
a database. The controller handles the incoming requests (such as Save New Account,
|
||||
Update Product, Show Post) by manipulating the model and directing data to the view.
|
||||
|
||||
In Rails, the model is handled by what's called an object-relational mapping
|
||||
layer entitled Active Record. This layer allows you to present the data from
|
||||
database rows as objects and embellish these data objects with business logic
|
||||
methods. You can read more about Active Record in
|
||||
link:files/vendor/rails/activerecord/README.html.
|
||||
|
||||
The controller and view are handled by the Action Pack, which handles both
|
||||
layers by its two parts: Action View and Action Controller. These two layers
|
||||
are bundled in a single package due to their heavy interdependence. This is
|
||||
unlike the relationship between the Active Record and Action Pack that is much
|
||||
more separate. Each of these packages can be used independently outside of
|
||||
Rails. You can read more about Action Pack in
|
||||
link:files/vendor/rails/actionpack/README.html.
|
||||
|
||||
|
||||
== Getting Started
|
||||
|
||||
1. At the command prompt, start a new Rails application using the <tt>rails</tt> command
|
||||
and your application name. Ex: rails myapp
|
||||
2. Change directory into myapp and start the web server: <tt>script/server</tt> (run with --help for options)
|
||||
3. Go to http://localhost:3000/ and get "Welcome aboard: You're riding the Rails!"
|
||||
4. Follow the guidelines to start developing your application
|
||||
|
||||
|
||||
== Web Servers
|
||||
|
||||
By default, Rails will try to use Mongrel if it's are installed when started with script/server, otherwise Rails will use WEBrick, the webserver that ships with Ruby. But you can also use Rails
|
||||
with a variety of other web servers.
|
||||
|
||||
Mongrel is a Ruby-based webserver with a C component (which requires compilation) that is
|
||||
suitable for development and deployment of Rails applications. If you have Ruby Gems installed,
|
||||
getting up and running with mongrel is as easy as: <tt>gem install mongrel</tt>.
|
||||
More info at: http://mongrel.rubyforge.org
|
||||
|
||||
Say other Ruby web servers like Thin and Ebb or regular web servers like Apache or LiteSpeed or
|
||||
Lighttpd or IIS. The Ruby web servers are run through Rack and the latter can either be setup to use
|
||||
FCGI or proxy to a pack of Mongrels/Thin/Ebb servers.
|
||||
|
||||
== Apache .htaccess example for FCGI/CGI
|
||||
|
||||
# General Apache options
|
||||
AddHandler fastcgi-script .fcgi
|
||||
AddHandler cgi-script .cgi
|
||||
Options +FollowSymLinks +ExecCGI
|
||||
|
||||
# If you don't want Rails to look in certain directories,
|
||||
# use the following rewrite rules so that Apache won't rewrite certain requests
|
||||
#
|
||||
# Example:
|
||||
# RewriteCond %{REQUEST_URI} ^/notrails.*
|
||||
# RewriteRule .* - [L]
|
||||
|
||||
# Redirect all requests not available on the filesystem to Rails
|
||||
# By default the cgi dispatcher is used which is very slow
|
||||
#
|
||||
# For better performance replace the dispatcher with the fastcgi one
|
||||
#
|
||||
# Example:
|
||||
# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
|
||||
RewriteEngine On
|
||||
|
||||
# If your Rails application is accessed via an Alias directive,
|
||||
# then you MUST also set the RewriteBase in this htaccess file.
|
||||
#
|
||||
# Example:
|
||||
# Alias /myrailsapp /path/to/myrailsapp/public
|
||||
# RewriteBase /myrailsapp
|
||||
|
||||
RewriteRule ^$ index.html [QSA]
|
||||
RewriteRule ^([^.]+)$ $1.html [QSA]
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
|
||||
|
||||
# In case Rails experiences terminal errors
|
||||
# Instead of displaying this message you can supply a file here which will be rendered instead
|
||||
#
|
||||
# Example:
|
||||
# ErrorDocument 500 /500.html
|
||||
|
||||
ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"
|
||||
|
||||
|
||||
== Debugging Rails
|
||||
|
||||
Sometimes your application goes wrong. Fortunately there are a lot of tools that
|
||||
will help you debug it and get it back on the rails.
|
||||
|
||||
First area to check is the application log files. Have "tail -f" commands running
|
||||
on the server.log and development.log. Rails will automatically display debugging
|
||||
and runtime information to these files. Debugging info will also be shown in the
|
||||
browser on requests from 127.0.0.1.
|
||||
|
||||
You can also log your own messages directly into the log file from your code using
|
||||
the Ruby logger class from inside your controllers. Example:
|
||||
|
||||
class WeblogController < ActionController::Base
|
||||
def destroy
|
||||
@weblog = Weblog.find(params[:id])
|
||||
@weblog.destroy
|
||||
logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
|
||||
end
|
||||
end
|
||||
|
||||
The result will be a message in your log file along the lines of:
|
||||
|
||||
Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1
|
||||
|
||||
More information on how to use the logger is at http://www.ruby-doc.org/core/
|
||||
|
||||
Also, Ruby documentation can be found at http://www.ruby-lang.org/ including:
|
||||
|
||||
* The Learning Ruby (Pickaxe) Book: http://www.ruby-doc.org/docs/ProgrammingRuby/
|
||||
* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
|
||||
|
||||
These two online (and free) books will bring you up to speed on the Ruby language
|
||||
and also on programming in general.
|
||||
|
||||
|
||||
== Debugger
|
||||
|
||||
Debugger support is available through the debugger command when you start your Mongrel or
|
||||
Webrick server with --debugger. This means that you can break out of execution at any point
|
||||
in the code, investigate and change the model, AND then resume execution!
|
||||
You need to install ruby-debug to run the server in debugging mode. With gems, use 'gem install ruby-debug'
|
||||
Example:
|
||||
|
||||
class WeblogController < ActionController::Base
|
||||
def index
|
||||
@posts = Post.find(:all)
|
||||
debugger
|
||||
end
|
||||
end
|
||||
|
||||
So the controller will accept the action, run the first line, then present you
|
||||
with a IRB prompt in the server window. Here you can do things like:
|
||||
|
||||
>> @posts.inspect
|
||||
=> "[#<Post:0x14a6be8 @attributes={\"title\"=>nil, \"body\"=>nil, \"id\"=>\"1\"}>,
|
||||
#<Post:0x14a6620 @attributes={\"title\"=>\"Rails you know!\", \"body\"=>\"Only ten..\", \"id\"=>\"2\"}>]"
|
||||
>> @posts.first.title = "hello from a debugger"
|
||||
=> "hello from a debugger"
|
||||
|
||||
...and even better is that you can examine how your runtime objects actually work:
|
||||
|
||||
>> f = @posts.first
|
||||
=> #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
|
||||
>> f.
|
||||
Display all 152 possibilities? (y or n)
|
||||
|
||||
Finally, when you're ready to resume execution, you enter "cont"
|
||||
|
||||
|
||||
== Console
|
||||
|
||||
You can interact with the domain model by starting the console through <tt>script/console</tt>.
|
||||
Here you'll have all parts of the application configured, just like it is when the
|
||||
application is running. You can inspect domain models, change values, and save to the
|
||||
database. Starting the script without arguments will launch it in the development environment.
|
||||
Passing an argument will specify a different environment, like <tt>script/console production</tt>.
|
||||
|
||||
To reload your controllers and models after launching the console run <tt>reload!</tt>
|
||||
|
||||
== dbconsole
|
||||
|
||||
You can go to the command line of your database directly through <tt>script/dbconsole</tt>.
|
||||
You would be connected to the database with the credentials defined in database.yml.
|
||||
Starting the script without arguments will connect you to the development database. Passing an
|
||||
argument will connect you to a different database, like <tt>script/dbconsole production</tt>.
|
||||
Currently works for mysql, postgresql and sqlite.
|
||||
|
||||
== Description of Contents
|
||||
|
||||
app
|
||||
Holds all the code that's specific to this particular application.
|
||||
|
||||
app/controllers
|
||||
Holds controllers that should be named like weblogs_controller.rb for
|
||||
automated URL mapping. All controllers should descend from ApplicationController
|
||||
which itself descends from ActionController::Base.
|
||||
|
||||
app/models
|
||||
Holds models that should be named like post.rb.
|
||||
Most models will descend from ActiveRecord::Base.
|
||||
|
||||
app/views
|
||||
Holds the template files for the view that should be named like
|
||||
weblogs/index.html.erb for the WeblogsController#index action. All views use eRuby
|
||||
syntax.
|
||||
|
||||
app/views/layouts
|
||||
Holds the template files for layouts to be used with views. This models the common
|
||||
header/footer method of wrapping views. In your views, define a layout using the
|
||||
<tt>layout :default</tt> and create a file named default.html.erb. Inside default.html.erb,
|
||||
call <% yield %> to render the view using this layout.
|
||||
|
||||
app/helpers
|
||||
Holds view helpers that should be named like weblogs_helper.rb. These are generated
|
||||
for you automatically when using script/generate for controllers. Helpers can be used to
|
||||
wrap functionality for your views into methods.
|
||||
|
||||
config
|
||||
Configuration files for the Rails environment, the routing map, the database, and other dependencies.
|
||||
|
||||
db
|
||||
Contains the database schema in schema.rb. db/migrate contains all
|
||||
the sequence of Migrations for your schema.
|
||||
|
||||
doc
|
||||
This directory is where your application documentation will be stored when generated
|
||||
using <tt>rake doc:app</tt>
|
||||
|
||||
lib
|
||||
Application specific libraries. Basically, any kind of custom code that doesn't
|
||||
belong under controllers, models, or helpers. This directory is in the load path.
|
||||
|
||||
public
|
||||
The directory available for the web server. Contains subdirectories for images, stylesheets,
|
||||
and javascripts. Also contains the dispatchers and the default HTML files. This should be
|
||||
set as the DOCUMENT_ROOT of your web server.
|
||||
|
||||
script
|
||||
Helper scripts for automation and generation.
|
||||
|
||||
test
|
||||
Unit and functional tests along with fixtures. When using the script/generate scripts, template
|
||||
test files will be generated for you and placed in this directory.
|
||||
|
||||
vendor
|
||||
External libraries that the application depends on. Also includes the plugins subdirectory.
|
||||
If the app has frozen rails, those gems also go here, under vendor/rails/.
|
||||
This directory is in the load path.
|
||||
@@ -0,0 +1,10 @@
|
||||
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||
|
||||
require(File.join(File.dirname(__FILE__), 'config', 'boot'))
|
||||
|
||||
require 'rake'
|
||||
require 'rake/testtask'
|
||||
require 'rake/rdoctask'
|
||||
|
||||
require 'tasks/rails'
|
||||
@@ -0,0 +1,90 @@
|
||||
# Author: HDM <hdm@metasploit.com> and LMH <lmh@info-pull.com>
|
||||
# Description: Helper methods for the controllers, including search and other
|
||||
# functionality.
|
||||
|
||||
# Filters added to this controller will be run for all controllers in the application.
|
||||
# Likewise, all the methods added will be available for all controllers.
|
||||
class ApplicationController < ActionController::Base
|
||||
|
||||
# Search functionality for modules
|
||||
def search_modules(mlist, terms)
|
||||
res = {}
|
||||
|
||||
unless terms
|
||||
return nil
|
||||
end
|
||||
|
||||
terms.strip!
|
||||
|
||||
# Match search terms
|
||||
mlist.each do |m|
|
||||
|
||||
if (terms.length == 0)
|
||||
res[m.refname]=m
|
||||
next
|
||||
end
|
||||
|
||||
terms.split(/,/).each do |term|
|
||||
|
||||
if (m.name.downcase.index(term.downcase))
|
||||
res[m.refname]=m
|
||||
break
|
||||
end
|
||||
|
||||
if (m.refname.downcase.index(term.downcase))
|
||||
res[m.refname]=m
|
||||
break
|
||||
end
|
||||
|
||||
if (m.description.downcase.index(term.downcase))
|
||||
res[m.refname]=m
|
||||
break
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# Sort the modules by name
|
||||
list = []
|
||||
res.keys.sort{|a,b| res[a].name <=> res[b].name }.each do |n|
|
||||
list << res[n]
|
||||
end
|
||||
|
||||
list
|
||||
end
|
||||
|
||||
# Returns the module by id of specified type.
|
||||
def get_view_for_module(module_type, module_refname)
|
||||
@tmod = nil
|
||||
|
||||
# Get available moduls of specified type
|
||||
case module_type
|
||||
when "exploit"
|
||||
@mod_list = Exploit.find_all()
|
||||
when "auxiliary"
|
||||
@mod_list = Auxiliary.find_all()
|
||||
when "payload"
|
||||
@mod_list = Payload.find_all()
|
||||
when "nop"
|
||||
@mod_list = Nop.find_all()
|
||||
when "encoder"
|
||||
@mod_list = Encoder.find_all()
|
||||
else
|
||||
return @tmod
|
||||
end
|
||||
|
||||
# Return the module if found
|
||||
if module_refname
|
||||
@mod_list.each do |m|
|
||||
if m.refname.gsub('/', ':') == module_refname
|
||||
@tmod = m
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return @tmod
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,85 @@
|
||||
#
|
||||
# Original version is Copyright (c) 2006 LMH <lmh[at]info-pull.com>
|
||||
# Added to Metasploit under the terms of the Metasploit Framework License v1.2
|
||||
#
|
||||
# Description: The auxiliary controller of msfweb v.3. Handles views, listing
|
||||
# and other actions related to auxiliary modules. Code and processing goes here.
|
||||
# Instance variables, final values, etc, go into views.
|
||||
|
||||
class AuxiliariesController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def list
|
||||
end
|
||||
|
||||
def view
|
||||
@tmod = get_view_for_module("auxiliary", params[:refname])
|
||||
|
||||
unless @tmod
|
||||
render_text "Unknown module specified."
|
||||
end
|
||||
end
|
||||
|
||||
def config
|
||||
# Retrieve object to module with the given refname
|
||||
@tmod = get_view_for_module("auxiliary", params[:refname])
|
||||
unless @tmod
|
||||
render_text "Unknown module specified."
|
||||
end
|
||||
|
||||
if (@tmod.actions.length > 0)
|
||||
@act = @tmod.actions[params[:act].to_i]
|
||||
unless @act
|
||||
render_text "Unknown action specified."
|
||||
end
|
||||
end
|
||||
|
||||
@cur_step = nil
|
||||
if params[:step]
|
||||
@cur_step = params[:step]
|
||||
end
|
||||
|
||||
if @cur_step == "run"
|
||||
|
||||
# Always show the option page after an exploit is launched
|
||||
@cur_step = "config"
|
||||
|
||||
# Create a new console driver instance
|
||||
@cid = $msfweb.create_console()
|
||||
@con = $msfweb.consoles[@cid]
|
||||
|
||||
# Use the selected module
|
||||
@con.execute("use auxiliary/#{@tmod.refname}")
|
||||
|
||||
@aux = @con.active_module
|
||||
|
||||
if (@act)
|
||||
@aux.datastore['ACTION'] = @act.name
|
||||
end
|
||||
|
||||
# Configure the selected options
|
||||
params.each_key do |k|
|
||||
aopt = k.to_s.match(/^aopt_/) ? true : false
|
||||
name = k.to_s.gsub(/^.opt_/, '')
|
||||
|
||||
if (aopt)
|
||||
if (params[k] and params[k].to_s.length > 0)
|
||||
@aux.datastore[name] = params[k].to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
begin
|
||||
@aux.options.validate(@aux.datastore)
|
||||
@con.write("run\n")
|
||||
@aux_console = @cid
|
||||
rescue ::Exception => e
|
||||
$msfweb.destroy_console(@cid)
|
||||
@aux_error = e.to_s
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,109 @@
|
||||
#
|
||||
# Author: Metasploit LLC
|
||||
# Description: The AJAX console controller of msfweb
|
||||
#
|
||||
class ConsoleController < ApplicationController
|
||||
|
||||
#
|
||||
# Show the working shell and related facilities.
|
||||
#
|
||||
def index
|
||||
|
||||
cid = params[:id]
|
||||
|
||||
if (not (cid and $msfweb.consoles[cid]))
|
||||
cid = $msfweb.create_console
|
||||
|
||||
if (params[:sid])
|
||||
$msfweb.consoles[cid].write("sessions -i #{params[:sid]}\n")
|
||||
$msfweb.consoles[cid].write("\n\n")
|
||||
end
|
||||
|
||||
redirect_to :id => cid
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
script = "// Metasploit Web Console Data\n"
|
||||
out = ""
|
||||
|
||||
@cid = params[:id]
|
||||
@console = $msfweb.consoles[@cid]
|
||||
|
||||
|
||||
if(params[:cmd])
|
||||
@console.write(params[:cmd] + "\n")
|
||||
end
|
||||
|
||||
if(params[:read])
|
||||
out = @console.read() || ''
|
||||
end
|
||||
|
||||
|
||||
if(params[:special])
|
||||
case params[:special]
|
||||
when 'kill'
|
||||
@console.session_kill
|
||||
when 'detach'
|
||||
@console.session_detach
|
||||
end
|
||||
end
|
||||
|
||||
if(params[:tab])
|
||||
opts = []
|
||||
cmdl = params[:tab]
|
||||
out = ""
|
||||
|
||||
if (not @console.busy and params[:tab].strip.length > 0)
|
||||
opts = @console.tab_complete(params[:tab]) || []
|
||||
end
|
||||
|
||||
if (opts.length == 1)
|
||||
cmdl = opts[0]
|
||||
else
|
||||
if (opts.length == 0)
|
||||
# aint got nothin
|
||||
else
|
||||
|
||||
cmd_top = opts[0]
|
||||
depth = 0
|
||||
|
||||
while (depth < cmd_top.length)
|
||||
match = true
|
||||
opts.each do |line|
|
||||
next if line[depth] == cmd_top[depth]
|
||||
match = false
|
||||
break
|
||||
end
|
||||
break if not match
|
||||
depth += 1
|
||||
end
|
||||
|
||||
if (depth > 0)
|
||||
cmdl = cmd_top[0, depth]
|
||||
end
|
||||
|
||||
out << "\n" + opts.map{ |c| ">> " + c }.join("\n")
|
||||
end
|
||||
end
|
||||
|
||||
tln = cmdl.unpack('C*').map{|c| sprintf("%%%.2x", c)}.join
|
||||
script += "var con_tabbed = unescape('#{tln}');\n"
|
||||
end
|
||||
|
||||
if(params[:read])
|
||||
|
||||
out = out.unpack('C*').map{|c| sprintf("%%%.2x", c)}.join
|
||||
pro = @console.prompt.unpack('C*').map{|c| sprintf("%%%.2x", c)}.join
|
||||
if (@console.busy)
|
||||
pro = '(running)'.unpack('C*').map{|c| sprintf("%%%.2x", c)}.join
|
||||
end
|
||||
|
||||
script += "var con_prompt = unescape('#{pro}');\n"
|
||||
script += "var con_update = unescape('#{out}');\n"
|
||||
|
||||
send_data(script, :type => "text/javascript")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,22 @@
|
||||
# Author: LMH <lmh@info-pull.com>
|
||||
# Description: The encoder controller of msfweb v.3. Handles views, listing
|
||||
# and other actions related to encoder modules. Code and processing goes here.
|
||||
# Instance variables, final values, etc, go into views.
|
||||
|
||||
class EncodersController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def list
|
||||
end
|
||||
|
||||
def view
|
||||
@tmod = get_view_for_module("encoder", params[:refname])
|
||||
|
||||
unless @tmod
|
||||
render_text "Unknown module specified."
|
||||
end
|
||||
end
|
||||
|
||||
def encode
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,124 @@
|
||||
# Author: LMH <lmh@info-pull.com>
|
||||
# Description: The exploit controller of msfweb v.3. Handles views, listing
|
||||
# and other actions related to exploit modules. Code and processing goes here.
|
||||
# Instance variables, final values, etc, go into views.
|
||||
|
||||
class ExploitsController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def list
|
||||
end
|
||||
|
||||
def view
|
||||
@tmod = get_view_for_module("exploit", params[:refname])
|
||||
|
||||
unless @tmod
|
||||
render_text "Unknown module specified."
|
||||
end
|
||||
end
|
||||
|
||||
def config
|
||||
# Retrieve object to module with the given refname
|
||||
@tmod = get_view_for_module("exploit", params[:refname])
|
||||
unless @tmod
|
||||
render_text "Unknown module specified."
|
||||
end
|
||||
|
||||
# Get target, using index given in 'target' parameter
|
||||
@target = @tmod.targets[params[:target].to_i]
|
||||
unless @target
|
||||
render_text "Unknown target specified."
|
||||
end
|
||||
|
||||
@tmod.datastore['TARGET'] = params[:target].to_i
|
||||
|
||||
@cur_step = nil
|
||||
if params[:step]
|
||||
@cur_step = params[:step]
|
||||
end
|
||||
|
||||
|
||||
if (params[:payload])
|
||||
|
||||
if (params[:payload] =~ /^\d+$/ )
|
||||
@payload_ref = @tmod.compatible_payloads[params[:payload].to_i]
|
||||
else
|
||||
@tmod.compatible_payloads.each_with_index do |ref, i|
|
||||
|
||||
if(ref[0] == params[:payload])
|
||||
@payload_ref = ref
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if @cur_step == "exploit"
|
||||
|
||||
# Always show the option page after an exploit is launched
|
||||
@cur_step = "config"
|
||||
|
||||
unless @payload_ref
|
||||
render_text "Unknown payload specified or not supported."
|
||||
end
|
||||
|
||||
@payload_name, @payload_class = @payload_ref
|
||||
@payload_inst = @payload_class.new
|
||||
|
||||
# Create a new console driver instance
|
||||
@cid = $msfweb.create_console()
|
||||
@con = $msfweb.consoles[@cid]
|
||||
|
||||
# Use the selected module
|
||||
@con.execute("use exploit/#{@tmod.refname}")
|
||||
|
||||
# Configure the target and payload
|
||||
@exploit = @con.active_module
|
||||
@exploit.datastore['PAYLOAD'] = @payload_name
|
||||
@exploit.datastore['TARGET'] = params[:target].to_i
|
||||
|
||||
# Configure the selected options
|
||||
params.each_key do |k|
|
||||
eopt = k.to_s.match(/^eopt_/) ? true : false
|
||||
popt = k.to_s.match(/^popt_/) ? true : false
|
||||
name = k.to_s.gsub(/^.opt_/, '')
|
||||
|
||||
if (eopt or popt)
|
||||
if (params[k] and params[k].to_s.length > 0)
|
||||
@exploit.datastore[name] = params[k].to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Validate the exploit and payload options
|
||||
@payload_inst.share_datastore(@exploit.datastore)
|
||||
|
||||
begin
|
||||
@exploit.options.validate(@exploit.datastore)
|
||||
@payload_inst.options.validate(@payload_inst.datastore)
|
||||
@con.write("exploit\n")
|
||||
@exploit_console = @cid
|
||||
rescue ::Exception => e
|
||||
$msfweb.destroy_console(@cid)
|
||||
@exploit_error = e.to_s
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if @cur_step == "config"
|
||||
|
||||
unless @payload_ref
|
||||
render_text "Unknown payload specified or not supported."
|
||||
end
|
||||
|
||||
@payload_name, @payload_class = @payload_ref
|
||||
@payload_inst = @payload_class.new
|
||||
|
||||
else
|
||||
@payloads = @tmod.compatible_payloads
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -0,0 +1,49 @@
|
||||
# Author: LMH <lmh@info-pull.com>
|
||||
# Description: The IDE controller of msfweb v.3. Handles views, processing,
|
||||
# help and all actions related to the msfweb IDE for exploit development.
|
||||
# Now Metasploit has a multi-platform IDE. Find bug. Click. Profit. (tm)
|
||||
|
||||
class IdeController < ApplicationController
|
||||
layout 'msfide'
|
||||
|
||||
def index
|
||||
redirect_to :action => "start"
|
||||
end
|
||||
|
||||
def start
|
||||
end
|
||||
|
||||
def advanced
|
||||
end
|
||||
|
||||
def wizard
|
||||
if params[:exploit]
|
||||
@the_exploit = session[:exploit] = params[:exploit]
|
||||
@step = @the_exploit["step"].to_i
|
||||
elsif @step.nil?
|
||||
redirect_to :action => start
|
||||
end
|
||||
|
||||
flash[:error] = ""
|
||||
end
|
||||
|
||||
def dump_current()
|
||||
unless params[:format]
|
||||
render_text "Missing format parameter."
|
||||
return false
|
||||
end
|
||||
|
||||
unless session[:exploit]
|
||||
render_text "Missing exploit data."
|
||||
return false
|
||||
end
|
||||
|
||||
case params[:format]
|
||||
when "yaml"
|
||||
send_data YAML.dump(session[:exploit]), :type => "text/plain"
|
||||
else
|
||||
render_text "Missing format parameter."
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,10 @@
|
||||
class JobsController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def list
|
||||
@jobs = Job.find_all()
|
||||
end
|
||||
|
||||
def stop
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,47 @@
|
||||
#
|
||||
# Original version is Copyright (c) 2006 LMH <lmh[at]info-pull.com>
|
||||
# Added to Metasploit under the terms of the Metasploit Framework License v1.2
|
||||
# Additions Copyright (C) 2006-2007 Metasploit LLC
|
||||
#
|
||||
# Description: The main controller of msfweb v.3
|
||||
#
|
||||
|
||||
class MsfController < ApplicationController
|
||||
layout 'msfweb', :except => 'search'
|
||||
|
||||
def index
|
||||
end
|
||||
|
||||
# Generic search function as suggested by HDM
|
||||
def search
|
||||
if params[:module_type]
|
||||
@module_type = params[:module_type]
|
||||
if params[:clean_list] and params[:clean_list].to_i == 1
|
||||
@clean_list = true
|
||||
else
|
||||
@clean_list = false
|
||||
end
|
||||
if params[:terms]
|
||||
case @module_type
|
||||
when 'exploits'
|
||||
@results = search_modules(Exploit.find_all(), params[:terms])
|
||||
when 'auxiliaries'
|
||||
@results = search_modules(Auxiliary.find_all(), params[:terms])
|
||||
when 'payloads'
|
||||
@results = search_modules(Payload.find_all(), params[:terms])
|
||||
when 'nops'
|
||||
@results = search_modules(Nop.find_all(), params[:terms])
|
||||
when 'encoders'
|
||||
@results = search_modules(Encoder.find_all(), params[:terms])
|
||||
else
|
||||
render_text "Module type unknown."
|
||||
end
|
||||
else
|
||||
render_text "No search terms provided."
|
||||
end
|
||||
else
|
||||
render_text "Module type not specified."
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,22 @@
|
||||
# Author: LMH <lmh@info-pull.com>
|
||||
# Description: The nop controller of msfweb v.3. Handles views, listing
|
||||
# and other actions related to nop modules. Code and processing goes here.
|
||||
# Instance variables, final values, etc, go into views.
|
||||
|
||||
class NopsController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def list
|
||||
end
|
||||
|
||||
def view
|
||||
@tmod = get_view_for_module("nop", params[:refname])
|
||||
|
||||
unless @tmod
|
||||
render_text "Unknown module specified."
|
||||
end
|
||||
end
|
||||
|
||||
def generate
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,23 @@
|
||||
#
|
||||
# Original version is Copyright (c) 2007 Mike Whitehead <mwhite22[at]caledonian.ac.uk>
|
||||
# Added to Metasploit under the terms of the Metasploit Framework License v1.2
|
||||
#
|
||||
# Description: MSFWeb Options controller (Skinning, etc)
|
||||
#
|
||||
|
||||
class OptionsController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def index
|
||||
@force_reload = false
|
||||
|
||||
p params
|
||||
p cookies
|
||||
|
||||
if (params[:style])
|
||||
cookies[:style] = params[:style]
|
||||
@force_reload = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
# Author: LMH <lmh@info-pull.com>
|
||||
# Description: The payload controller of msfweb v.3. Handles views, listing
|
||||
# and other actions related to payload modules. Code and processing goes here.
|
||||
# Instance variables, final values, etc, go into views.
|
||||
|
||||
class PayloadsController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def list
|
||||
end
|
||||
|
||||
def view
|
||||
@tmod = get_view_for_module("payload", params[:refname])
|
||||
|
||||
unless @tmod
|
||||
render_text "Unknown module specified."
|
||||
end
|
||||
|
||||
# Catch non-standard payloads
|
||||
begin
|
||||
@tmod.generate
|
||||
rescue => e
|
||||
render_text "This interface does not support generic payloads."
|
||||
end
|
||||
|
||||
@module_step = (params[:step] || 0).to_i
|
||||
|
||||
if @module_step == 1
|
||||
modinst = Payload.create(@tmod.refname)
|
||||
badchars = params[:badchars]
|
||||
pencoder = params[:encoder]
|
||||
pformat = params[:format]
|
||||
max_size = (params[:max_size] || 0).to_i
|
||||
payload_opts = ''
|
||||
|
||||
params.each_pair { |k, v|
|
||||
next if (v == nil or v.length == 0)
|
||||
if (k =~ /^opt_(.*)$/)
|
||||
payload_opts += "#{$1}=#{v} "
|
||||
end
|
||||
}
|
||||
|
||||
|
||||
badchars_buff = ""
|
||||
badchars.split(/,|\s+/).each do |c|
|
||||
c.strip!
|
||||
next if c.length == 0
|
||||
if(c =~ /^0x/)
|
||||
badchars_buff << c.hex.chr
|
||||
else
|
||||
badchars_buff << c.to_i.chr
|
||||
end
|
||||
end
|
||||
|
||||
begin
|
||||
@generation = modinst.generate_simple(
|
||||
'Encoder' => (pencoder == '__default') ? nil : pencoder,
|
||||
'BadChars' => badchars_buff,
|
||||
'Format' => pformat || 'c',
|
||||
'OptionStr' => payload_opts,
|
||||
'MaxSize' => (max_size == 0) ? nil : max_size)
|
||||
rescue
|
||||
@generation = $!
|
||||
end
|
||||
end
|
||||
# end of view method
|
||||
end
|
||||
|
||||
def generate
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
#
|
||||
# Author: Metasploit LLC
|
||||
# Description: The AJAX console controller of msfweb
|
||||
#
|
||||
|
||||
class SessionsController < ApplicationController
|
||||
layout 'windows'
|
||||
|
||||
def list
|
||||
@sessions = Session.find_all()
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
# Copyright (c) 2006 L.M.H <lmh@info-pull.com>
|
||||
# All Rights Reserved.
|
||||
|
||||
# Methods added to this helper will be available to all templates in the application.
|
||||
module ApplicationHelper
|
||||
|
||||
# Returns a hash with ruby version, platform and Metasploit version.
|
||||
def return_env_info()
|
||||
ret = {}
|
||||
ret[:platform] = RUBY_PLATFORM
|
||||
ret[:rubyver] = RUBY_VERSION
|
||||
ret[:msfver] = Msf::Framework::Version
|
||||
return ret
|
||||
end
|
||||
|
||||
# Return the JavaScript code necessary for "supporting" :hover pseudo-class
|
||||
# in MSIE (ex. used in the top menu bar).
|
||||
def msie_hover_fix(css_class_name)
|
||||
return "onmouseover=\"this.className='#{css_class_name}'\" onmouseout=\"this.className=''\""
|
||||
end
|
||||
|
||||
# Adapted from old msfweb code, returns HTML necessary for displaying icons
|
||||
# associated with a specific module.
|
||||
# Added missing platform icons (HPUX, Irix, etc).
|
||||
def module_platform_icons(platform)
|
||||
return "" if (platform.nil?)
|
||||
|
||||
# If this module has no platforms, then we don't show any icons...
|
||||
return "" if (platform.empty?)
|
||||
|
||||
# Otherwise, get the platform specific information...
|
||||
html = ""
|
||||
[
|
||||
[ Msf::Module::Platform::Windows, "windows.png", "win32" ],
|
||||
[ Msf::Module::Platform::Linux, "linux.png", "linux" ],
|
||||
[ Msf::Module::Platform::Solaris, "sun.png", "solaris" ],
|
||||
[ Msf::Module::Platform::OSX, "apple.png", "osx" ],
|
||||
[ Msf::Module::Platform::BSD, "bsd.gif", "bsd" ],
|
||||
[ Msf::Module::Platform::BSDi, "bsd.gif", "bsdi" ],
|
||||
[ Msf::Module::Platform::HPUX, "hp.png", "hpux" ],
|
||||
[ Msf::Module::Platform::Irix, "sgi.png", "irix" ],
|
||||
[ Msf::Module::Platform::Unix, "unix.png", "unix" ]
|
||||
].each do |plat|
|
||||
if (platform.supports?(Msf::Module::PlatformList.new(plat[0])) == true)
|
||||
html += "<img src=\"/images/platform-icons/#{plat[1]}\" alt=\"#{plat[2]}\"/>"
|
||||
end
|
||||
end
|
||||
|
||||
return html
|
||||
end
|
||||
|
||||
# Returns a hash suitable for use with select method (FormHelper stuff) of
|
||||
# the available platforms.
|
||||
def return_selectable_platforms()
|
||||
all_platforms = Msf::Module::Platform::find_children
|
||||
select_list = {}
|
||||
all_platforms.each do |p|
|
||||
select_list[p.realname] = p
|
||||
end
|
||||
return select_list
|
||||
end
|
||||
|
||||
# Returns an array suitable for use with select method (FormHelper stuff) of
|
||||
# the supported architectures.
|
||||
def return_selectable_architectures()
|
||||
return ARCH_ALL
|
||||
end
|
||||
|
||||
# Returns an array suitable for the select form option helper,
|
||||
# of the available exploit mixins. thanks skape for the new method.
|
||||
def return_selectable_exploit_mixins()
|
||||
Msf::Exploit::mixins
|
||||
end
|
||||
|
||||
# Returns an array suitable for the select form option helper,
|
||||
# of the available module licenses.
|
||||
def return_selectable_licenses()
|
||||
LICENSES
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module AuxiliariesHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module EncodersHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module ExploitsHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module IdeHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module JobsHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module MsfHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module MsfconsoleHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module NopsHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module PayloadsHelper
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
module SessionsHelper
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
class Auxiliary
|
||||
def self.find_all()
|
||||
mods = []
|
||||
$msframework.auxiliary.each_module { |n,m| mods << m.new }
|
||||
mods
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
class Encoder
|
||||
def self.find_all()
|
||||
mods = []
|
||||
$msframework.encoders.each_module { |n,m| mods << m.new }
|
||||
mods
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
class Exploit
|
||||
def self.find_all()
|
||||
mods = []
|
||||
$msframework.exploits.each_module { |n,m| mods << $msframework.exploits.create(n) }
|
||||
mods
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class Job
|
||||
def self.find_all()
|
||||
$msframework.jobs
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
class Nop
|
||||
def self.find_all()
|
||||
mods = []
|
||||
$msframework.nops.each_module { |n,m| mods << m.new }
|
||||
mods
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,12 @@
|
||||
class Payload
|
||||
def self.find_all()
|
||||
mods = []
|
||||
$msframework.payloads.each_module { |n,m| mods << m.new }
|
||||
mods
|
||||
end
|
||||
|
||||
def self.create(refname)
|
||||
modinst = $msframework.payloads.create(refname)
|
||||
modinst
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class Session
|
||||
def self.find_all()
|
||||
$msframework.sessions
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,160 @@
|
||||
<%
|
||||
def draw_option(name, opt)
|
||||
|
||||
defval = h(opt.default || '')
|
||||
|
||||
if (params[name.to_sym])
|
||||
defval = params[name.to_sym].to_s
|
||||
end
|
||||
|
||||
case opt.class.to_s
|
||||
when 'Msf::OptEnum'
|
||||
ret = '<select name="' + name + '">' + "\n"
|
||||
|
||||
opt.enums.sort.each do |val|
|
||||
sel = (val == defval) ? 'SELECTED' : ''
|
||||
ret << '<option value="' + val + '"' + " #{sel}>" + h(val) + "</option>\n"
|
||||
end
|
||||
|
||||
ret << "</select>\n"
|
||||
|
||||
ret
|
||||
else
|
||||
'<input type="text" name="' + name + '" value="' + defval + '" />'
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%>
|
||||
|
||||
<table width="100%" align="center" cellspacing="0" cellpadding="3" border="0">
|
||||
<tr>
|
||||
<td width="100%" class="EAconf_moduleName" colspan="2">
|
||||
<%= h(@tmod.name) %> <br />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% if @aux_error %>
|
||||
|
||||
<tr>
|
||||
<td width="100%" class="moduleError" colspan="2">
|
||||
Validation Error: <%= h(@aux_error) %><br />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% end %>
|
||||
|
||||
|
||||
<% if @aux_console %>
|
||||
|
||||
<tr>
|
||||
<td width="100%" class="moduleError" colspan="2">
|
||||
Auxiliary launched. If the auxiliary console window does not appear, please click
|
||||
<a href="#" onclick="window.parent.openConsoleWindowExploit(<%= @aux_console %>);">here</a>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% end %>
|
||||
<p>Please enter all of the required options and press 'Launch Auxiliary' to continue.</p>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">
|
||||
CURRENT CONFIGURATION -
|
||||
<%= link_to "change action", :action => "view", :refname => h(params[:refname]) %>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="opt_name">AUXILIARY</td>
|
||||
<td><%= @tmod.refname %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="opt_name">ACTION</td>
|
||||
<td><%= h(@act ? @act.name : 'Default Action') %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">STANDARD OPTIONS</th>
|
||||
</tr>
|
||||
|
||||
<form action="/auxiliaries/config" method="post">
|
||||
<%= hidden_field_tag "refname", h(params[:refname]) %>
|
||||
<%= hidden_field_tag "step", "run" %>
|
||||
<%= hidden_field_tag "act", h(params[:act]) %>
|
||||
|
||||
<% @tmod.options.sort.each { |name, option|
|
||||
next if (option.advanced?)
|
||||
next if (option.evasion?) %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= html_escape(option.desc) %> (type: <%= option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('aopt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2"><br/><%= submit_tag "Launch Auxiliary" %><br/></th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">ADVANCED OPTIONS</th>
|
||||
</tr>
|
||||
|
||||
<% @tmod.options.sort.each { |name, option|
|
||||
next if not option.advanced? %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= html_escape(option.desc) %> (type: <%= option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('aopt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2"><br/><%= submit_tag "Launch Auxiliary" %><br/></th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">EVASION OPTIONS</th>
|
||||
</tr>
|
||||
|
||||
<% @tmod.options.sort.each { |name, option|
|
||||
next if not option.evasion? %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= html_escape(option.desc) %> (type: <%= option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('aopt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2"><br/><%= submit_tag "Launch Auxiliary" %><br/></th>
|
||||
</tr>
|
||||
|
||||
</form>
|
||||
|
||||
<% if @aux_console %>
|
||||
<script>
|
||||
window.parent.openConsoleWindowExploit(<%= @aux_console %>);
|
||||
</script>
|
||||
<% end %>
|
||||
|
||||
</table>
|
||||
@@ -0,0 +1,13 @@
|
||||
<div id="module-search-box">
|
||||
|
||||
<span>Search</span>
|
||||
<input id="module_search" name="terms" type="text" size="55" value=""/>
|
||||
<img alt="Spinner" id="search_spinner" src="/images/spinner.gif" style="display: none;" />
|
||||
</div>
|
||||
<div id="search_results">
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
document.getElementById('module_search').focus();
|
||||
generic_live_search('module_search', 'auxiliaries', 'search_spinner', 0);
|
||||
</script>
|
||||
@@ -0,0 +1,2 @@
|
||||
<h1>Auxiliaries#run</h1>
|
||||
<p>Find me in app/views/auxiliaries/run.rhtml</p>
|
||||
@@ -0,0 +1,75 @@
|
||||
<table align="center" cellspacing="0" cellpadding="0" border="0" class="EAview_moduleFull">
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleName">
|
||||
<%= h(@tmod.name) %> <br />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleDescription">
|
||||
<%= @tmod.description.split("\n\n").map{ |t| h(t) }.join("<br/><br/>") %>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleAuthor">
|
||||
This module (v<%= h @tmod.version.gsub(/\$Revision:\s+|\s+\$/, '') %>) was
|
||||
provided by <%= h @tmod.author.map{ |a| a.to_s.gsub(/\<.*/, '') }.join(' and ').strip %>,
|
||||
under the <%= @tmod.license %>.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleTargets_Title">
|
||||
Select a target to continue:
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleTargets">
|
||||
<ul>
|
||||
<% if @tmod.actions.length > 0 %>
|
||||
<% p @tmod.actions %>
|
||||
<% @tmod.actions.each_with_index { |act, idx| %>
|
||||
<li><%= link_to h(act.name), :action => "config", :refname => @tmod.refname.gsub('/', ':'), :act => idx %></a></li>
|
||||
<% } %>
|
||||
<% else %>
|
||||
<li><%= link_to 'Default Action', :action => "config", :refname => @tmod.refname.gsub('/', ':')%></a></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% if (@tmod.references.length > 0) %>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleReferences_Title">
|
||||
External references:
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleReferences">
|
||||
<ul>
|
||||
<% @tmod.references.each { |ref| %>
|
||||
<% if (ref.kind_of?(Msf::Module::SiteReference)) %>
|
||||
<li><a href="<%= ref.site %>" target="_blank"><%= h(ref.to_s) %></a></li>
|
||||
<% else %>
|
||||
<li><%= h(ref.to_s) %></li>
|
||||
<% end %>
|
||||
<% } %>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
@@ -0,0 +1,51 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="eng">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
|
||||
<meta name="Author" content="LMH (lmh@info-pull.com)" />
|
||||
<meta name="Copyright" content="(c) 2006, LMH (lmh@info-pull.com)" />
|
||||
<title>Metasploit Console</title>
|
||||
<% ["prototype","effects","controls","window","application","console","cookiecheck"].each do |js| %>
|
||||
<%= javascript_include_tag js %><% end %>
|
||||
<script>document.writeln('<link rel="stylesheet" type="text/css" href="' + consoleStyle +'">');</script>
|
||||
</head>
|
||||
|
||||
<body onload="console_init(<%=params[:id]%>)">
|
||||
|
||||
<div id="console_window">
|
||||
|
||||
<div id="console_output">
|
||||
Welcome to the Metasploit Web Console!
|
||||
<br/><br/>
|
||||
</div>
|
||||
|
||||
<table id="console_command_bar" border=0 padding=4 cellspacing=0 width='100%'>
|
||||
<tr>
|
||||
<td
|
||||
nowrap='true'
|
||||
valign='top'
|
||||
id="console_prompt"
|
||||
>
|
||||
<%=h @console.prompt %>
|
||||
</td>
|
||||
<td nowrap='true' width='100%'>
|
||||
|
||||
<textarea
|
||||
id="console_input"
|
||||
class="input"
|
||||
wrap="off"
|
||||
onkeydown="return console_keydown(event)"
|
||||
onkeypress="return console_keypress(event)"
|
||||
rows="1"
|
||||
></textarea>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<h1>Encoders#encode</h1>
|
||||
<p>Find me in app/views/encoders/encode.rhtml</p>
|
||||
@@ -0,0 +1,12 @@
|
||||
<div id="module-search-box">
|
||||
|
||||
<span>Search</span>
|
||||
<input id="module_search" name="terms" type="text" size="55" value=""/>
|
||||
<img alt="Spinner" id="search_spinner" src="/images/spinner.gif" style="display: none;" />
|
||||
<div id="search_results"></div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
document.getElementById('module_search').focus();
|
||||
generic_live_search('module_search', 'encoders', 'search_spinner', 0);
|
||||
</script>
|
||||
@@ -0,0 +1,46 @@
|
||||
<table align="center" width="100%" cellspacing="0" cellpadding="15" border="0">
|
||||
|
||||
<tr width="100%" align="center">
|
||||
<p class="moduleName">
|
||||
<%= h(@tmod.name) %> <br />
|
||||
</p>
|
||||
</tr>
|
||||
|
||||
<tr width="100%" align="center">
|
||||
<blockquote>
|
||||
<p class="moduleDescription">
|
||||
<%= h(@tmod.description) %>
|
||||
</p>
|
||||
</blockquote>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr width="100%" align="center">
|
||||
<blockquote>
|
||||
<p class="moduleDescription">
|
||||
This module (revision <%= h @tmod.version.gsub(/\$Revision:\s+|\s+\$/, '') %>) was provided by <%= h @tmod.author.map{ |a| a.to_s.gsub(/\<.*/, '') }.join(' and ').strip %>, under the <%= @tmod.license %>.
|
||||
</p>
|
||||
</blockquote>
|
||||
</tr>
|
||||
|
||||
<% if (@tmod.references.length > 0) %>
|
||||
<tr width="100%" align="center">
|
||||
<blockquote>
|
||||
<p class="moduleDescription">
|
||||
External references:
|
||||
<ul class="moduleReferences">
|
||||
<% @tmod.references.each { |ref| %>
|
||||
<% if (ref.kind_of?(Msf::Module::SiteReference)) %>
|
||||
<li><a href="<%= ref.site %>" target="_blank">
|
||||
<%= h(ref.to_s) %></a></li>
|
||||
<% else %>
|
||||
<li><%= h(ref.to_s) %></li>
|
||||
<% end %>
|
||||
<% } %>
|
||||
</ul>
|
||||
</p>
|
||||
</blockquote>
|
||||
</tr>
|
||||
<% end %>
|
||||
|
||||
</table>
|
||||
@@ -0,0 +1,264 @@
|
||||
<%
|
||||
def draw_option(name, opt)
|
||||
|
||||
defval = h(opt.default || '')
|
||||
|
||||
if (params[name.to_sym])
|
||||
defval = params[name.to_sym].to_s
|
||||
end
|
||||
|
||||
case opt.class.to_s
|
||||
when 'Msf::OptEnum'
|
||||
ret = '<select name="' + h(name) + '">' + "\n"
|
||||
|
||||
opt.enums.sort.each do |val|
|
||||
sel = (val == defval) ? 'SELECTED' : ''
|
||||
ret << '<option value="' + h(val) + '"' + " #{sel}>" + h(val) + "</option>\n"
|
||||
end
|
||||
|
||||
ret << "</select>\n"
|
||||
|
||||
ret
|
||||
else
|
||||
'<input type="text" name="' + h(name) + '" value="' + defval + '" />'
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%>
|
||||
|
||||
<table align="center" cellspacing="0" cellpadding="3" width="100%" class="EAconf_moduleFull">
|
||||
<tr>
|
||||
<td width="100%" class="EAconf_moduleName" colspan="2">
|
||||
<%= h(@tmod.name) %> <br />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" colspan="2">
|
||||
<p>Select payload for target <strong><%= h(@target.name) %></strong>:</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% if @exploit_error %>
|
||||
|
||||
<tr>
|
||||
<td width="100%" class="moduleError" colspan="2">
|
||||
Validation Error: <%= h(@exploit_error) %><br />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<% end %>
|
||||
|
||||
|
||||
<% if @exploit_console %>
|
||||
|
||||
<tr>
|
||||
<td width="100%" class="moduleError" colspan="2">
|
||||
Exploit launched. If the exploit console window does not appear, please click
|
||||
<a href="#" onclick="javascript:window.parent.openConsoleWindowExploit(<%= @exploit_console %>);">here</a>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% end %>
|
||||
|
||||
<% if @cur_step == nil %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">
|
||||
CURRENT CONFIGURATION - <%= link_to "change target", :action => "view", :refname => h(params[:refname]) %>
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="opt_name">EXPLOIT</td>
|
||||
<td><%= @tmod.refname %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="opt_name">TARGET</td>
|
||||
<td><%= @target.name %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th class="moduleOptionsHeader">Name</th>
|
||||
<th class="moduleOptionsHeader">Description</th>
|
||||
</tr>
|
||||
|
||||
<%
|
||||
rcol_a = 'item_row_col_a'
|
||||
rcol_b = 'item_row_col_b'
|
||||
rcol = rcol_b
|
||||
%>
|
||||
|
||||
<% @payloads.each_with_index do |p, idx| %>
|
||||
<tr class='<%=h rcol = (rcol == rcol_a) ? rcol_b : rcol_a %>'>
|
||||
<% o = p[1].new %>
|
||||
<td><%= link_to h(p[0]), :refname => @tmod.refname.gsub('/', ':'), :step => "config",
|
||||
:target => h(params[:target].to_i), :payload => idx %></td>
|
||||
<td><%= h(o.description) %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
|
||||
<% elsif @cur_step == "config" %>
|
||||
|
||||
<p>Please enter all of the required options and press 'Launch Exploit' to continue.</p>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">
|
||||
CURRENT CONFIGURATION -
|
||||
<%= link_to "change payload", :action => "config", :refname => h(params[:refname]) %>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="opt_name">EXPLOIT</td>
|
||||
<td><%= h @tmod.refname %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="opt_name">TARGET</td>
|
||||
<td><%= h @target.name %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="opt_name">PAYLOAD</td>
|
||||
<td><%= h @payload_name %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">STANDARD OPTIONS</th>
|
||||
</tr>
|
||||
|
||||
<form action="/exploits/config" method="post">
|
||||
<%= hidden_field_tag "refname", h(params[:refname]) %>
|
||||
<%= hidden_field_tag "step", "exploit" %>
|
||||
<%= hidden_field_tag "target", h(params[:target]) %>
|
||||
<%= hidden_field_tag "payload", h(params[:payload]) %>
|
||||
|
||||
<% @tmod.options.sort.each { |name, option|
|
||||
next if (option.advanced?)
|
||||
next if (option.evasion?) %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= h name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= h option.desc %> (type: <%= h option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('eopt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
<% @payload_inst.options.sort.each { |name, option|
|
||||
next if (option.advanced?)
|
||||
next if (option.evasion?) %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= h name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= h option.desc %> (type: <%= h option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('popt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2"><br/><%= submit_tag "Launch Exploit" %><br/></th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">ADVANCED OPTIONS</th>
|
||||
</tr>
|
||||
|
||||
<% @tmod.options.sort.each { |name, option|
|
||||
next if not option.advanced? %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= h name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= h option.desc %> (type: <%= h option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('eopt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
<% @payload_inst.options.sort.each { |name, option|
|
||||
next if not option.advanced? %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= h name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= h option.desc %> (type: <%= h option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('popt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2"><br/><%= submit_tag "Launch Exploit" %><br/></th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">EVASION OPTIONS</th>
|
||||
</tr>
|
||||
|
||||
<% @tmod.options.sort.each { |name, option|
|
||||
next if not option.evasion? %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= h option.desc %> (type: <%= h option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('eopt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
<% @payload_inst.options.sort.each { |name, option|
|
||||
next if not option.evasion? %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= h name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= html_escape(option.desc) %> (type: <%= option.type %>)</td>
|
||||
<td>
|
||||
<%= draw_option('popt_'+h(name), option) %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2"><br/><%= submit_tag "Launch Exploit" %><br/></th>
|
||||
</tr>
|
||||
|
||||
</form>
|
||||
|
||||
<% if @exploit_console %>
|
||||
<script>
|
||||
<% if params[:consoleOpen] and params[:consoleOpen] == "direct" %>
|
||||
window.location="/console/index/<%= @exploit_console %>"
|
||||
<% else %>
|
||||
window.parent.openConsoleWindowExploit(<%= @exploit_console %>);
|
||||
<% end %>
|
||||
</script>
|
||||
<% end %>
|
||||
|
||||
<% end %>
|
||||
|
||||
</table>
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
<div id="module-search-box">
|
||||
<span>Search</span>
|
||||
<input id="module_search" name="terms" type="text" size="50" value=""/>
|
||||
<img alt="Spinner" id="search_spinner" src="/images/spinner.gif" style="display: none;" />
|
||||
|
||||
</div>
|
||||
<div id="search_results">
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
document.getElementById('module_search').focus();
|
||||
generic_live_search('module_search', 'exploits', 'search_spinner', 0);
|
||||
</script>
|
||||
@@ -0,0 +1,70 @@
|
||||
<table align="center" cellspacing="0" cellpadding="0" border="0" class="EAview_moduleFull">
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleName">
|
||||
<%= h(@tmod.name) %> <br />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleDescription">
|
||||
<%= @tmod.description.split("\n\n").map{ |t| h(t) }.join("<br/><br/>") %>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleAuthor">
|
||||
This module (v<%= h @tmod.version.gsub(/\$Revision:\s+|\s+\$/, '') %>) was
|
||||
provided by <%= h @tmod.author.map{ |a| a.to_s.gsub(/\<.*/, '') }.join(' and ').strip %>,
|
||||
under the <%= @tmod.license %>.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleTargets_Title">
|
||||
Select a target to continue:
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleTargets">
|
||||
<ul>
|
||||
<% @tmod.targets.each_with_index { |tgt, idx| %>
|
||||
<li><%= link_to h(tgt.name), :action => "config", :refname => @tmod.refname.gsub('/', ':'), :target => idx %></a></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% if (@tmod.references.length > 0) %>
|
||||
<tr>
|
||||
<td height="10">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="EAview_moduleReferences_Title">
|
||||
External references:
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%">
|
||||
<ul class="EAview_moduleReferences">
|
||||
<% @tmod.references.each { |ref| %>
|
||||
<% if (ref.kind_of?(Msf::Module::SiteReference)) %>
|
||||
<li><a href="<%= ref.site %>" target="_blank"><%= h(ref.to_s) %></a></li>
|
||||
<% else %>
|
||||
<li><%= h(ref.to_s) %></li>
|
||||
<% end %>
|
||||
<% } %>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
@@ -0,0 +1,47 @@
|
||||
<div id="ide-start" class="wizard_page">
|
||||
<p class="motto">Find bug. Click. Profit.</p>
|
||||
|
||||
<table width="100%" align="center">
|
||||
<tr width="100%" align="center">
|
||||
<td>
|
||||
<a href="#"
|
||||
onclick="new Effect.Appear('edit_new'); new Effect.Fade('create_new');"
|
||||
onmouseout="document.getElementById('devil').src = '/images/ide/devil.png';"
|
||||
onmouseover="document.getElementById('devil').src = '/images/ide/devil_ne.png';">
|
||||
<img src="/images/ide/devil.png" alt="" id="devil" /> <br />
|
||||
<strong>edit existent<s/trong>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="#"
|
||||
onclick="new Effect.Appear('create_new'); new Effect.Fade('edit_new');"
|
||||
onmouseout="document.getElementById('doomed').src = '/images/ide/doomed.png';"
|
||||
onmouseover="document.getElementById('doomed').src = '/images/ide/doomed_ne.png';">
|
||||
<img src="/images/ide/doomed.png" alt="" id="doomed" /> <br />
|
||||
<strong>new exploit</strong>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div id="edit_new" style="display: none;">
|
||||
<p>Editing an existing exploit...</p>
|
||||
<div id="module_search_box">
|
||||
Type in name or keyword:
|
||||
<input id="exploit_search" name="terms" type="text" size="40" value="Edit me"/>
|
||||
<div id="search_results"></div>
|
||||
</div>
|
||||
<a href="#" onclick="new Effect.Fade('edit_new')"><strong>hide</strong></a>
|
||||
<script type="text/javascript">
|
||||
generic_live_search('exploit_search', 'exploits', 'spinner', 1);
|
||||
</script>
|
||||
</div>
|
||||
<div id="create_new" style="display: none;">
|
||||
<p>Select the exploit type from the options below:</p>
|
||||
<%= start_form_tag :action => "wizard" %>
|
||||
<%= hidden_field "exploit", "step", :value => 1 %>
|
||||
<%= select ("exploit", "mixin", return_selectable_exploit_mixins()) %>
|
||||
<%= submit_tag "Next" %>
|
||||
<%= end_form_tag %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,98 @@
|
||||
<div class="wizard_page">
|
||||
<% if flash[:error] and flash[:error].length > 0 %>
|
||||
<p class="error">
|
||||
<%= flash[:error] %>
|
||||
</p>
|
||||
<% end %>
|
||||
|
||||
<% if @step == 1 %>
|
||||
<h3>Step 1: Generic information</h3>
|
||||
<p>
|
||||
</p>
|
||||
<table width="100%">
|
||||
<%= start_form_tag %>
|
||||
<%= hidden_field "exploit", "step", :value => 2 %>
|
||||
<tr>
|
||||
<td>Name:</td>
|
||||
<td><%= text_field "exploit", "name" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Title:</td>
|
||||
<td><%= text_field "exploit", "title" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Description:</td>
|
||||
<td><%= text_area "exploit", "description", :cols => 40, :rows => 5 %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Authors:</td>
|
||||
<td><%= text_area "exploit", "authors", :cols => 40, :rows => 5 %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>References:</td>
|
||||
<td><%= text_area "exploit", "references", :cols => 40, :rows => 5 %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>License:</td>
|
||||
<td><%= select ("exploit", "license", return_selectable_licenses()) %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"><%= submit_tag "Next" %></td>
|
||||
</tr>
|
||||
<%= end_form_tag %>
|
||||
</table>
|
||||
<% elsif @step == 2 %>
|
||||
<h3>Step 2: Configure payload</h3>
|
||||
<p>
|
||||
</p>
|
||||
<table width="100%">
|
||||
<%= start_form_tag %>
|
||||
<%= hidden_field "exploit", "step", :value => 3 %>
|
||||
<tr>
|
||||
<td>Space for payload:</td>
|
||||
<td><%= text_field "exploit", "payload_space" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bad characters:</td>
|
||||
<td><%= text_field "exploit", "payload_badchars" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Prepend:</td>
|
||||
<td><%= text_field "exploit", "payload_prepend" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Append:</td>
|
||||
<td><%= text_field "exploit", "payload_append" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SaveRegisters:</td>
|
||||
<td><%= text_field "exploit", "payload_saveregs" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Previous</td>
|
||||
<td><%= submit_tag "Next" %></td>
|
||||
</tr>
|
||||
<%= end_form_tag %>
|
||||
</table>
|
||||
<% elsif @step == 3 %>
|
||||
<h3>Step 2: Configure targets</h3>
|
||||
<p>
|
||||
</p>
|
||||
<table width="100%">
|
||||
<%= start_form_tag %>
|
||||
<%= hidden_field "exploit", "step", :value => 4 %>
|
||||
<tr>
|
||||
<td>SaveRegisters:</td>
|
||||
<td><%= text_field "exploit", "payload_saveregs" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Previous</td>
|
||||
<td><%= submit_tag "Next" %></td>
|
||||
</tr>
|
||||
<%= end_form_tag %>
|
||||
</table>
|
||||
<% end %>
|
||||
<span class="wizard_subs">
|
||||
<%= link_to "Dump current exploit in YAML", :action => "dump_current", :format => "yaml" %>
|
||||
</span>
|
||||
</div>
|
||||
@@ -0,0 +1,13 @@
|
||||
<table cellpadding="0" cellspacing="0" border="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @jobs.each_pair do |n,m| %>
|
||||
<tr><td><%= n %></td><td><%= m %></td></tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,2 @@
|
||||
<h1>Jobs#stop</h1>
|
||||
<p>Find me in app/views/jobs/stop.rhtml</p>
|
||||
@@ -0,0 +1,23 @@
|
||||
<ul>
|
||||
<li class="menuButton" onclick="openExploitsWindow()">
|
||||
<img src="/images/bug.png" alt="" />Exploits
|
||||
</li>
|
||||
<li class="menuButton" onclick="openAuxiliariesWindow()">
|
||||
<img src="/images/zoom.png" alt="" />Auxiliaries
|
||||
</li>
|
||||
<li class="menuButton" onclick="openPayloadsWindow()">
|
||||
<img src="/images/bomb.png" alt="" />Payloads
|
||||
</li>
|
||||
<li class="menuButton" onclick="openConsoleWindow()">
|
||||
<img src="/images/terminal.png" alt="" />Console
|
||||
</li>
|
||||
<li class="menuButton" onclick="openSessionsWindow()">
|
||||
<img src="/images/star.png" alt="" />Sessions
|
||||
</li>
|
||||
<li class="menuButton" onclick="openOptionsWindow()">
|
||||
<img src="/images/wrench.png" alt="" />Options
|
||||
</li>
|
||||
<li class="menuButton" onclick="openAboutDialog()">
|
||||
<img src="/images/help.png" alt="" />About
|
||||
</li>
|
||||
</ul>
|
||||
@@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="eng">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
|
||||
<meta name="Author" content="LMH (lmh@info-pull.com)" />
|
||||
<meta name="Copyright" content="(c) 2006, LMH (lmh@info-pull.com)" />
|
||||
<title>Metasploit Framework Web IDE</title>
|
||||
<%= stylesheet_link_tag "msfide" %>
|
||||
<%= javascript_include_tag :defaults %>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="logo">
|
||||
<img src="/images/ide-logo.png" alt="Metasploit Framework Web IDE" />
|
||||
</div>
|
||||
<div id="spinner" style="display: none;">
|
||||
<img src="/images/spinner_alt.gif" alt="Loading" />
|
||||
</div>
|
||||
<%= @content_for_layout %>
|
||||
<div id="dyn_content"></div>
|
||||
<div id="footer">
|
||||
© Copyright 2006 LMH <lmh@info-pull.com>.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>Metasploit Framework Web Console <%=h ::Msf::Framework::Version %></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
|
||||
<meta name="Author" content="Mike Whitehead (mwhite22[at]caledonian.ac.uk), Metasploit LLC" />
|
||||
<meta name="Copyright" content="(c) 2007, Mike Whitehead (mwhite22[at]caledonian.ac.uk), (c) 2006-2007 Metasploit LLC" />
|
||||
<% ["prototype","effects","controls","window","application","cookiecheck"].each do |js| %>
|
||||
<%= javascript_include_tag js %><% end %>
|
||||
<script>
|
||||
document.writeln('<link rel="stylesheet" type="text/css" href="' + mainStyle + '">'); // MSFWeb main stylesheet
|
||||
document.writeln('<link rel="stylesheet" type="text/css" href="' + windowStyle + '">'); // Window frame stylesheet
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="menuBar">
|
||||
<%= render :partial => 'layouts/menu_bar' %>
|
||||
</div>
|
||||
|
||||
<div id="maincontent">
|
||||
<%= @content_for_layout %>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
run_tasks();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,22 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="eng">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
|
||||
<meta name="Author" content="LMH (lmh@info-pull.com)" />
|
||||
<meta name="Copyright" content="(c) 2006, LMH (lmh@info-pull.com)" />
|
||||
<% ["prototype","effects","dragdrop","controls","application","cookiecheck"].each do |js| %>
|
||||
<%= javascript_include_tag js %><% end %>
|
||||
|
||||
<script>
|
||||
document.writeln('<link rel="stylesheet" type="text/css" href="' + contentStyle +'">'); // Window content stylesheet
|
||||
</script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<%= @content_for_layout %>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,56 @@
|
||||
<% if @results %>
|
||||
<% unless @clean_list %>
|
||||
<table width="100%" class="EAconf_moduleFull">
|
||||
<tr>
|
||||
<td>
|
||||
<% if (params[:terms].strip.length > 0) %>
|
||||
<% if (@results.size > 0) %>
|
||||
Matched <%= @results.size %> modules for term <em><%=h params[:terms] %>
|
||||
<% else %>
|
||||
No matching modules for term <em><%=h params[:terms] %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
Showing all <%= @results.size %> modules
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<% else %>
|
||||
<ul>
|
||||
<% end %>
|
||||
<% @results.each do |m| %>
|
||||
<% unless @clean_list %>
|
||||
<tr>
|
||||
<td class="EAconf_moduleName">
|
||||
<span style="cursor:pointer;" onClick="window.parent.openModuleWindow('<%= @module_type %>', '<%= m.refname.gsub('/', ':') %>', '<%= m.name.gsub('"','').gsub("'","") %>')"><%= h(m.name) %></span>
|
||||
|
||||
<% if m.platform and @module_type =~ /(payloads|exploits)/ %>
|
||||
<%= module_platform_icons(m.platform) %>
|
||||
<% else %>
|
||||
<% if (m.arch.length > 0) %>
|
||||
(<%= h m.arch.join(', ') %>)
|
||||
<% end %>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="EAconf_moduleDescription" colspan="2">
|
||||
<%= m.description %>
|
||||
</td>
|
||||
</tr>
|
||||
<% else %>
|
||||
<li><%= h(m.name) %></li>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% unless @clean_list %>
|
||||
</table>
|
||||
<% else %>
|
||||
</ul>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<p>
|
||||
No results for terms <em><%= h(params[:terms]) %></em>.
|
||||
</p>
|
||||
<% end %>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<h1>Nops#generate</h1>
|
||||
<p>Find me in app/views/nops/generate.rhtml</p>
|
||||
@@ -0,0 +1,12 @@
|
||||
<div id="module-search-box">
|
||||
|
||||
<span>Search</span>
|
||||
<input id="module_search" name="terms" type="text" size="55" value=""/>
|
||||
<img alt="Spinner" id="search_spinner" src="/images/spinner.gif" style="display: none;" />
|
||||
<div id="search_results"></div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
document.getElementById('module_search').focus();
|
||||
generic_live_search('module_search', 'nops', 'search_spinner', 0);
|
||||
</script>
|
||||
@@ -0,0 +1,46 @@
|
||||
<table align="center" width="100%" cellspacing="0" cellpadding="15" border="0">
|
||||
|
||||
<tr width="100%" align="center">
|
||||
<p class="moduleName">
|
||||
<%= h(@tmod.name) %> <br />
|
||||
</p>
|
||||
</tr>
|
||||
|
||||
<tr width="100%" align="center">
|
||||
<blockquote>
|
||||
<p class="moduleDescription">
|
||||
<%= h(@tmod.description) %>
|
||||
</p>
|
||||
</blockquote>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr width="100%" align="center">
|
||||
<blockquote>
|
||||
<p class="moduleDescription">
|
||||
This module (revision <%= h @tmod.version.gsub(/\$Revision:\s+|\s+\$/, '') %>) was provided by <%= h @tmod.author.map{ |a| a.to_s.gsub(/\<.*/, '') }.join(' and ').strip %>, under the <%= @tmod.license %>.
|
||||
</p>
|
||||
</blockquote>
|
||||
</tr>
|
||||
|
||||
<% if (@tmod.references.length > 0) %>
|
||||
<tr width="100%" align="center">
|
||||
<blockquote>
|
||||
<p class="moduleDescription">
|
||||
External references:
|
||||
<ul class="moduleReferences">
|
||||
<% @tmod.references.each { |ref| %>
|
||||
<% if (ref.kind_of?(Msf::Module::SiteReference)) %>
|
||||
<li><a href="<%= ref.site %>" target="_blank">
|
||||
<%= h(ref.to_s) %></a></li>
|
||||
<% else %>
|
||||
<li><%= h(ref.to_s) %></li>
|
||||
<% end %>
|
||||
<% } %>
|
||||
</ul>
|
||||
</p>
|
||||
</blockquote>
|
||||
</tr>
|
||||
<% end %>
|
||||
|
||||
</table>
|
||||
@@ -0,0 +1,45 @@
|
||||
<%
|
||||
if (@force_reload)
|
||||
%>
|
||||
<script language="javascript">
|
||||
window.parent.location.reload();
|
||||
</script>
|
||||
<%
|
||||
end
|
||||
%>
|
||||
<form method="POST">
|
||||
<table cellpadding="0" border="0" width="100%" class="EAConf_moduleFull">
|
||||
<tr colspan="2">
|
||||
<th align="center" class="moduleOptionsHeader">Style Name</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="EAconf_moduleDescription">
|
||||
Use the drop-down menu to select the desired theme for the Metasploit Framework Web Console<br /><br />
|
||||
Current style: <strong><em><script language="javascript">document.writeln(styleName);</script></em></strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<select name="style">
|
||||
<option value="empty">Choose a skin</option>
|
||||
<%
|
||||
sbase = File.join(Msf::Config::InstallRoot, "data", "msfweb", "public", "stylesheets", "skins")
|
||||
sdirs = Dir.new(sbase).grep(/^[a-z0-9]+/i)
|
||||
sdirs.each do |style|
|
||||
next if not File.directory?(File.join(sbase, style))
|
||||
sname = style.capitalize + " Style"
|
||||
%>
|
||||
<option value="<%=h style%>"><%=h sname%></option>
|
||||
<%
|
||||
end
|
||||
%>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="submit" value="Save Skin" name="save">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
@@ -0,0 +1,2 @@
|
||||
<h1>Payloads#generate</h1>
|
||||
<p>Find me in app/views/payloads/generate.rhtml</p>
|
||||
@@ -0,0 +1,13 @@
|
||||
<div id="module-search-box">
|
||||
|
||||
<span>Search</span>
|
||||
<input id="module_search" name="terms" type="text" size="55" value=""/>
|
||||
<img alt="Spinner" id="search_spinner" src="/images/spinner.gif" style="display: none;" />
|
||||
</div>
|
||||
<div id="search_results">
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
document.getElementById('module_search').focus();
|
||||
generic_live_search('module_search', 'payloads', 'search_spinner', 0);
|
||||
</script>
|
||||
@@ -0,0 +1,155 @@
|
||||
<table align="center" cellspacing="0" cellpadding="0" border="0" class="Pview_moduleFull">
|
||||
<tr>
|
||||
<td width="100%" class="Pview_moduleName" colspan="2">
|
||||
<%= h(@tmod.name) %> <br />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="Pview_moduleDescription" colspan="2">
|
||||
<%= @tmod.description.split("\n\n").map{ |t| h(t) }.join("<br/><br/>") %>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="Pview_moduleAuthor" colspan="2">
|
||||
This module (v<%= h @tmod.version.gsub(/\$Revision:\s+|\s+\$/, '') %>) was
|
||||
provided by <%= h @tmod.author.map{ |a| a.to_s.gsub(/\<.*/, '') }.join(' and ').strip %>,
|
||||
under the <%= @tmod.license %>.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="10" colspan="2">
|
||||
</td>
|
||||
</tr>
|
||||
<% if (@tmod.references.length > 0) %>
|
||||
|
||||
<tr>
|
||||
<td width="100%" class="Pview_moduleReferences_Title" colspan="2">
|
||||
External references:
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="100%" class="Pview_moduleReferences" colspan="2">
|
||||
<ul>
|
||||
<% @tmod.references.each { |ref| %>
|
||||
<% if (ref.kind_of?(Msf::Module::SiteReference)) %>
|
||||
<li><a href="<%= ref.site %>" target="_blank"><%= h(ref.to_s) %></a></li>
|
||||
<% else %>
|
||||
<li><%= h(ref.to_s) %></li>
|
||||
<% end %>
|
||||
<% } %>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<% end %>
|
||||
|
||||
<tr>
|
||||
<td>Size:</td>
|
||||
<td><%= @tmod.generate.length %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Architecture:</td>
|
||||
<td><%= @tmod.arch_to_s %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Operating system:</td>
|
||||
<td><%= @tmod.platform_to_s %></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="2"></th>
|
||||
</tr>
|
||||
|
||||
<% if @module_step == 0 %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">OPTIONS</th>
|
||||
</tr>
|
||||
|
||||
<form action="/payloads/view" method="post">
|
||||
|
||||
<%= hidden_field_tag "refname", h(params[:refname]) %>
|
||||
<%= hidden_field_tag "step", "1" %>
|
||||
<% @tmod.options.each { |name, option|
|
||||
next if (option.advanced?)
|
||||
next if (option.evasion?) %>
|
||||
<tr>
|
||||
<td class="opt_name"><%= name %></td>
|
||||
<td class="opt_required"><%= (option.required?) ? "Required" : "" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><%= html_escape(option.desc) %> (type: <%= option.type %>)</td>
|
||||
<td>
|
||||
<input type="text" name="opt_<%= h(name) %>" value="<%= h(option.default || '') %>"/>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
|
||||
<tr>
|
||||
<td>Max Size:</td>
|
||||
<td><input type="text" name="max_size" size="10"/></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Restricted Characters (format: 0x00 0x01):</td>
|
||||
<td><input type="text" name="badchars" size="25" value="0x00 "/></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Selected Encoder:</td>
|
||||
<td>
|
||||
<select name="encoder" size="1">
|
||||
<option value="__default">Default
|
||||
<% @tmod.compatible_encoders.each { |encname, mod| %>
|
||||
<option><%= encname %></option>
|
||||
<% } %>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Format:</td>
|
||||
<td>
|
||||
<select name="format" size="1">
|
||||
<option value="c">C</option>
|
||||
<option value="ruby">Ruby</option>
|
||||
<option value="perl">Perl</option>
|
||||
<option value="js_<%= Rex::Arch.endian(@tmod.arch) == ENDIAN_BIG ? "b" : "l" %>e">Javascript</option>
|
||||
<option value="java">Java</option>
|
||||
<option value="raw">Raw</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><%= submit_tag "Generate" %></td>
|
||||
</tr>
|
||||
|
||||
</form>
|
||||
<% else %>
|
||||
|
||||
<tr>
|
||||
<th colspan="2" class="moduleOptionsHeader">
|
||||
Payload code
|
||||
(<%= link_to "back", :action => "view", :refname => h(params[:refname]) %>)
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<textarea cols="64" rows="10"><%=@generation%></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
|
||||
<% if(@sessions.length > 0) %>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="10">ID</th>
|
||||
<th width="40">Target</th>
|
||||
<th width="60">Payload</th>
|
||||
<th width="60">Exploit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @sessions.each_pair do |n,m| %>
|
||||
<tr>
|
||||
<td><%= n %></td>
|
||||
<td><a onclick="window.parent.openConsoleWindowSession(<%= n %>);" href="#"><%= m.tunnel_peer %></a></td>
|
||||
<td><%= m.via_payload %></td>
|
||||
<td><%= m.via_exploit %></td>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% else %>
|
||||
There are no active sessions, go exploit something ;-)
|
||||
<% end %>
|
||||
@@ -0,0 +1,110 @@
|
||||
# Don't change this file!
|
||||
# Configure your app in config/environment.rb and config/environments/*.rb
|
||||
|
||||
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
|
||||
|
||||
module Rails
|
||||
class << self
|
||||
def boot!
|
||||
unless booted?
|
||||
preinitialize
|
||||
pick_boot.run
|
||||
end
|
||||
end
|
||||
|
||||
def booted?
|
||||
defined? Rails::Initializer
|
||||
end
|
||||
|
||||
def pick_boot
|
||||
(vendor_rails? ? VendorBoot : GemBoot).new
|
||||
end
|
||||
|
||||
def vendor_rails?
|
||||
File.exist?("#{RAILS_ROOT}/vendor/rails")
|
||||
end
|
||||
|
||||
def preinitialize
|
||||
load(preinitializer_path) if File.exist?(preinitializer_path)
|
||||
end
|
||||
|
||||
def preinitializer_path
|
||||
"#{RAILS_ROOT}/config/preinitializer.rb"
|
||||
end
|
||||
end
|
||||
|
||||
class Boot
|
||||
def run
|
||||
load_initializer
|
||||
Rails::Initializer.run(:set_load_path)
|
||||
end
|
||||
end
|
||||
|
||||
class VendorBoot < Boot
|
||||
def load_initializer
|
||||
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
|
||||
Rails::Initializer.run(:install_gem_spec_stubs)
|
||||
Rails::GemDependency.add_frozen_gem_path
|
||||
end
|
||||
end
|
||||
|
||||
class GemBoot < Boot
|
||||
def load_initializer
|
||||
self.class.load_rubygems
|
||||
load_rails_gem
|
||||
require 'initializer'
|
||||
end
|
||||
|
||||
def load_rails_gem
|
||||
if version = self.class.gem_version
|
||||
gem 'rails', version
|
||||
else
|
||||
gem 'rails'
|
||||
end
|
||||
rescue Gem::LoadError => load_error
|
||||
$stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
|
||||
exit 1
|
||||
end
|
||||
|
||||
class << self
|
||||
def rubygems_version
|
||||
Gem::RubyGemsVersion rescue nil
|
||||
end
|
||||
|
||||
def gem_version
|
||||
if defined? RAILS_GEM_VERSION
|
||||
RAILS_GEM_VERSION
|
||||
elsif ENV.include?('RAILS_GEM_VERSION')
|
||||
ENV['RAILS_GEM_VERSION']
|
||||
else
|
||||
parse_gem_version(read_environment_rb)
|
||||
end
|
||||
end
|
||||
|
||||
def load_rubygems
|
||||
require 'rubygems'
|
||||
min_version = '1.3.1'
|
||||
unless rubygems_version >= min_version
|
||||
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
|
||||
exit 1
|
||||
end
|
||||
|
||||
rescue LoadError
|
||||
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
|
||||
exit 1
|
||||
end
|
||||
|
||||
def parse_gem_version(text)
|
||||
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
|
||||
end
|
||||
|
||||
private
|
||||
def read_environment_rb
|
||||
File.read("#{RAILS_ROOT}/config/environment.rb")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# All that for this:
|
||||
Rails.boot!
|
||||
@@ -0,0 +1,22 @@
|
||||
# SQLite version 3.x
|
||||
# gem install sqlite3-ruby (not necessary on OS X Leopard)
|
||||
development:
|
||||
adapter: sqlite3
|
||||
database: db/development.sqlite3
|
||||
pool: 5
|
||||
timeout: 5000
|
||||
|
||||
# Warning: The database defined as "test" will be erased and
|
||||
# re-generated from your development database when you run "rake".
|
||||
# Do not set this db to the same as development or production.
|
||||
test:
|
||||
adapter: sqlite3
|
||||
database: db/test.sqlite3
|
||||
pool: 5
|
||||
timeout: 5000
|
||||
|
||||
production:
|
||||
adapter: sqlite3
|
||||
database: db/production.sqlite3
|
||||
pool: 5
|
||||
timeout: 5000
|
||||
@@ -0,0 +1,102 @@
|
||||
#
|
||||
# Force the application into production mode
|
||||
#
|
||||
ENV['RAILS_ENV'] = 'production'
|
||||
|
||||
# Specifies gem version of Rails to use when vendor/rails is not present
|
||||
RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION
|
||||
|
||||
|
||||
msfbase = __FILE__
|
||||
while File.symlink?(msfbase)
|
||||
msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
|
||||
end
|
||||
|
||||
$:.unshift(File.join(File.dirname(msfbase), '..', '..', '..','lib'))
|
||||
|
||||
#
|
||||
# New versions of Rails force the KCODE to unicode. This breaks
|
||||
# binary string generation used by Metasploit for shellcode,
|
||||
# text generation, and encoding. We override the initialize_encoding
|
||||
# method and force KCODE to be 'NONE'
|
||||
#
|
||||
class Rails::Initializer
|
||||
def initialize_encoding
|
||||
if (RUBY_VERSION !~ /^1\.9\./)
|
||||
$KCODE = 'NONE'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Bootstrap the Rails environment, frameworks, and default configuration
|
||||
require File.join(File.dirname(__FILE__), 'boot')
|
||||
|
||||
Rails::Initializer.run do |config|
|
||||
config.frameworks -= [ :active_record ]
|
||||
config.action_controller.session =
|
||||
{
|
||||
:session_key => "_msfweb_session",
|
||||
:secret => ::Rex::Text.rand_text_alphanumeric(30)
|
||||
}
|
||||
|
||||
# Settings in config/environments/* take precedence over those specified here.
|
||||
# Application configuration should go into files in config/initializers
|
||||
# -- all .rb files in that directory are automatically loaded.
|
||||
|
||||
# Add additional load paths for your own custom dirs
|
||||
# config.load_paths += %W( #{RAILS_ROOT}/extras )
|
||||
|
||||
# Specify gems that this application depends on and have them installed with rake gems:install
|
||||
# config.gem "bj"
|
||||
# config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
|
||||
# config.gem "sqlite3-ruby", :lib => "sqlite3"
|
||||
# config.gem "aws-s3", :lib => "aws/s3"
|
||||
|
||||
# Only load the plugins named here, in the order given (default is alphabetical).
|
||||
# :all can be used as a placeholder for all plugins not explicitly named
|
||||
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
||||
|
||||
# Skip frameworks you're not going to use. To use Rails without a database,
|
||||
# you must remove the Active Record framework.
|
||||
# config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
|
||||
|
||||
# Activate observers that should always be running
|
||||
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
||||
|
||||
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
||||
# Run "rake -D time" for a list of tasks for finding time zone names.
|
||||
config.time_zone = 'UTC'
|
||||
|
||||
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
||||
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
|
||||
# config.i18n.default_locale = :de
|
||||
end
|
||||
|
||||
|
||||
#
|
||||
# Metasploit Initialization
|
||||
#
|
||||
|
||||
require 'rex'
|
||||
require 'msf/ui'
|
||||
require 'msf/base'
|
||||
|
||||
$msfweb = Msf::Ui::Web::Driver.new({'LogLevel' => 5})
|
||||
$msframework = $msfweb.framework
|
||||
|
||||
if ($browser_start)
|
||||
Thread.new do
|
||||
|
||||
select(nil, nil, nil, 0.5)
|
||||
|
||||
case RUBY_PLATFORM
|
||||
when /mswin32/
|
||||
system("start #{$browser_url}")
|
||||
when /darwin/
|
||||
system("open #{$browser_url}")
|
||||
else
|
||||
system("firefox #{$browser_url} &")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
# Settings specified here will take precedence over those in config/environment.rb
|
||||
|
||||
# In the development environment your application's code is reloaded on
|
||||
# every request. This slows down response time but is perfect for development
|
||||
# since you don't have to restart the webserver when you make code changes.
|
||||
config.cache_classes = false
|
||||
|
||||
# Log error messages when you accidentally call methods on nil.
|
||||
config.whiny_nils = true
|
||||
|
||||
# Show full error reports and disable caching
|
||||
config.action_controller.consider_all_requests_local = true
|
||||
config.action_view.debug_rjs = true
|
||||
config.action_controller.perform_caching = false
|
||||
|
||||
# Don't care if the mailer can't send
|
||||
config.action_mailer.raise_delivery_errors = false
|
||||
@@ -0,0 +1,28 @@
|
||||
# Settings specified here will take precedence over those in config/environment.rb
|
||||
|
||||
# The production environment is meant for finished, "live" apps.
|
||||
# Code is not reloaded between requests
|
||||
config.cache_classes = true
|
||||
|
||||
# Full error reports are disabled and caching is turned on
|
||||
config.action_controller.consider_all_requests_local = false
|
||||
config.action_controller.perform_caching = true
|
||||
config.action_view.cache_template_loading = true
|
||||
|
||||
# See everything in the log (default is :info)
|
||||
# config.log_level = :debug
|
||||
|
||||
# Use a different logger for distributed setups
|
||||
# config.logger = SyslogLogger.new
|
||||
|
||||
# Use a different cache store in production
|
||||
# config.cache_store = :mem_cache_store
|
||||
|
||||
# Enable serving of images, stylesheets, and javascripts from an asset server
|
||||
# config.action_controller.asset_host = "http://assets.example.com"
|
||||
|
||||
# Disable delivery errors, bad email addresses will be ignored
|
||||
# config.action_mailer.raise_delivery_errors = false
|
||||
|
||||
# Enable threaded mode
|
||||
# config.threadsafe!
|
||||
@@ -0,0 +1,28 @@
|
||||
# Settings specified here will take precedence over those in config/environment.rb
|
||||
|
||||
# The test environment is used exclusively to run your application's
|
||||
# test suite. You never need to work with it otherwise. Remember that
|
||||
# your test database is "scratch space" for the test suite and is wiped
|
||||
# and recreated between test runs. Don't rely on the data there!
|
||||
config.cache_classes = true
|
||||
|
||||
# Log error messages when you accidentally call methods on nil.
|
||||
config.whiny_nils = true
|
||||
|
||||
# Show full error reports and disable caching
|
||||
config.action_controller.consider_all_requests_local = true
|
||||
config.action_controller.perform_caching = false
|
||||
config.action_view.cache_template_loading = true
|
||||
|
||||
# Disable request forgery protection in test environment
|
||||
config.action_controller.allow_forgery_protection = false
|
||||
|
||||
# Tell Action Mailer not to deliver emails to the real world.
|
||||
# The :test delivery method accumulates sent emails in the
|
||||
# ActionMailer::Base.deliveries array.
|
||||
config.action_mailer.delivery_method = :test
|
||||
|
||||
# Use SQL instead of Active Record's schema dumper when creating the test database.
|
||||
# This is necessary if your schema can't be completely dumped by the schema dumper,
|
||||
# like if you have constraints or database-specific column types
|
||||
# config.active_record.schema_format = :sql
|
||||
@@ -0,0 +1,7 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
|
||||
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
|
||||
|
||||
# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code.
|
||||
# Rails.backtrace_cleaner.remove_silencers!
|
||||
@@ -0,0 +1,10 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Add new inflection rules using the following format
|
||||
# (all these examples are active by default):
|
||||
# ActiveSupport::Inflector.inflections do |inflect|
|
||||
# inflect.plural /^(ox)$/i, '\1en'
|
||||
# inflect.singular /^(ox)en/i, '\1'
|
||||
# inflect.irregular 'person', 'people'
|
||||
# inflect.uncountable %w( fish sheep )
|
||||
# end
|
||||
@@ -0,0 +1,5 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Add new mime types for use in respond_to blocks:
|
||||
# Mime::Type.register "text/richtext", :rtf
|
||||
# Mime::Type.register_alias "text/html", :iphone
|
||||
@@ -0,0 +1,19 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# These settings change the behavior of Rails 2 apps and will be defaults
|
||||
# for Rails 3. You can remove this initializer when Rails 3 is released.
|
||||
|
||||
if defined?(ActiveRecord)
|
||||
# Include Active Record class name as root for JSON serialized output.
|
||||
ActiveRecord::Base.include_root_in_json = true
|
||||
|
||||
# Store the full class name (including module namespace) in STI type column.
|
||||
ActiveRecord::Base.store_full_sti_class = true
|
||||
end
|
||||
|
||||
# Use ISO 8601 format for JSON serialized times and dates.
|
||||
ActiveSupport.use_standard_json_time_format = true
|
||||
|
||||
# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
|
||||
# if you're including raw json in an HTML page.
|
||||
ActiveSupport.escape_html_entities_in_json = false
|
||||
@@ -0,0 +1,15 @@
|
||||
# Be sure to restart your server when you modify this file.
|
||||
|
||||
# Your secret key for verifying cookie session data integrity.
|
||||
# If you change this key, all old sessions will become invalid!
|
||||
# Make sure the secret is at least 30 characters and all random,
|
||||
# no regular words or you'll be exposed to dictionary attacks.
|
||||
ActionController::Base.session = {
|
||||
:key => '_msfweb_session',
|
||||
:secret => 'f604cddb9e95fe02234d1ddb08f73f3c64e672998ff743cf80171429d6c985cafbb39698de70ee7f626ebc5aa9afdcd23d9da562fa70d942e83b6ba49e0046c4'
|
||||
}
|
||||
|
||||
# Use the database for sessions instead of the cookie-based default,
|
||||
# which shouldn't be used to store highly confidential information
|
||||
# (create the session table with "rake db:sessions:create")
|
||||
# ActionController::Base.session_store = :active_record_store
|
||||
@@ -0,0 +1,5 @@
|
||||
# Sample localization file for English. Add more files in this directory for other locales.
|
||||
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
||||
|
||||
en:
|
||||
hello: "Hello world"
|
||||
@@ -0,0 +1,43 @@
|
||||
ActionController::Routing::Routes.draw do |map|
|
||||
# The priority is based upon order of creation: first created -> highest priority.
|
||||
|
||||
# Sample of regular route:
|
||||
# map.connect 'products/:id', :controller => 'catalog', :action => 'view'
|
||||
# Keep in mind you can assign values other than :controller and :action
|
||||
|
||||
# Sample of named route:
|
||||
# map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase'
|
||||
# This route can be invoked with purchase_url(:id => product.id)
|
||||
|
||||
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
||||
# map.resources :products
|
||||
|
||||
# Sample resource route with options:
|
||||
# map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get }
|
||||
|
||||
# Sample resource route with sub-resources:
|
||||
# map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller
|
||||
|
||||
# Sample resource route with more complex sub-resources
|
||||
# map.resources :products do |products|
|
||||
# products.resources :comments
|
||||
# products.resources :sales, :collection => { :recent => :get }
|
||||
# end
|
||||
|
||||
# Sample resource route within a namespace:
|
||||
# map.namespace :admin do |admin|
|
||||
# # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb)
|
||||
# admin.resources :products
|
||||
# end
|
||||
|
||||
# You can have the root of your site routed with map.root -- just remember to delete public/index.html.
|
||||
map.root :controller => "msf"
|
||||
|
||||
# See how all your routes lay out with "rake routes"
|
||||
|
||||
# Install the default routes as the lowest priority.
|
||||
# Note: These default routes make all actions in every controller accessible via GET requests. You should
|
||||
# consider removing the them or commenting them out if you're using named routes and resources.
|
||||
map.connect ':controller/:action/:id'
|
||||
map.connect ':controller/:action/:id.:format'
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
Use this README file to introduce your application and point to useful places in the API for learning more.
|
||||
Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries.
|
||||
@@ -0,0 +1,40 @@
|
||||
# General Apache options
|
||||
AddHandler fastcgi-script .fcgi
|
||||
AddHandler cgi-script .cgi
|
||||
Options +FollowSymLinks +ExecCGI
|
||||
|
||||
# If you don't want Rails to look in certain directories,
|
||||
# use the following rewrite rules so that Apache won't rewrite certain requests
|
||||
#
|
||||
# Example:
|
||||
# RewriteCond %{REQUEST_URI} ^/notrails.*
|
||||
# RewriteRule .* - [L]
|
||||
|
||||
# Redirect all requests not available on the filesystem to Rails
|
||||
# By default the cgi dispatcher is used which is very slow
|
||||
#
|
||||
# For better performance replace the dispatcher with the fastcgi one
|
||||
#
|
||||
# Example:
|
||||
# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
|
||||
RewriteEngine On
|
||||
|
||||
# If your Rails application is accessed via an Alias directive,
|
||||
# then you MUST also set the RewriteBase in this htaccess file.
|
||||
#
|
||||
# Example:
|
||||
# Alias /myrailsapp /path/to/myrailsapp/public
|
||||
# RewriteBase /myrailsapp
|
||||
|
||||
RewriteRule ^$ index.html [QSA]
|
||||
RewriteRule ^([^.]+)$ $1.html [QSA]
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
|
||||
|
||||
# In case Rails experiences terminal errors
|
||||
# Instead of displaying this message you can supply a file here which will be rendered instead
|
||||
#
|
||||
# Example:
|
||||
# ErrorDocument 500 /500.html
|
||||
|
||||
ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"
|
||||
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>The page you were looking for doesn't exist (404)</title>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- This file lives in public/404.html -->
|
||||
<div class="dialog">
|
||||
<h1>The page you were looking for doesn't exist.</h1>
|
||||
<p>You may have mistyped the address or the page may have moved.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>The change you wanted was rejected (422)</title>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- This file lives in public/422.html -->
|
||||
<div class="dialog">
|
||||
<h1>The change you wanted was rejected.</h1>
|
||||
<p>Maybe you tried to change something you didn't have access to.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>We're sorry, but something went wrong (500)</title>
|
||||
<style type="text/css">
|
||||
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||
div.dialog {
|
||||
width: 25em;
|
||||
padding: 0 4em;
|
||||
margin: 4em auto 0 auto;
|
||||
border: 1px solid #ccc;
|
||||
border-right-color: #999;
|
||||
border-bottom-color: #999;
|
||||
}
|
||||
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- This file lives in public/500.html -->
|
||||
<div class="dialog">
|
||||
<h1>We're sorry, but something went wrong.</h1>
|
||||
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
|
||||
|
||||
# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
|
||||
# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
|
||||
require "dispatcher"
|
||||
|
||||
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
|
||||
Dispatcher.dispatch
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/ruby
|
||||
#
|
||||
# You may specify the path to the FastCGI crash log (a log of unhandled
|
||||
# exceptions which forced the FastCGI instance to exit, great for debugging)
|
||||
# and the number of requests to process before running garbage collection.
|
||||
#
|
||||
# By default, the FastCGI crash log is RAILS_ROOT/log/fastcgi.crash.log
|
||||
# and the GC period is nil (turned off). A reasonable number of requests
|
||||
# could range from 10-100 depending on the memory footprint of your app.
|
||||
#
|
||||
# Example:
|
||||
# # Default log path, normal GC behavior.
|
||||
# RailsFCGIHandler.process!
|
||||
#
|
||||
# # Default log path, 50 requests between GC.
|
||||
# RailsFCGIHandler.process! nil, 50
|
||||
#
|
||||
# # Custom log path, normal GC behavior.
|
||||
# RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log'
|
||||
#
|
||||
require File.dirname(__FILE__) + "/../config/environment"
|
||||
require 'fcgi_handler'
|
||||
|
||||
RailsFCGIHandler.process!
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/ruby
|
||||
|
||||
require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
|
||||
|
||||
# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
|
||||
# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
|
||||
require "dispatcher"
|
||||
|
||||
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
|
||||
Dispatcher.dispatch
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 793 B |
|
After Width: | Height: | Size: 774 B |
|
After Width: | Height: | Size: 410 B |
|
After Width: | Height: | Size: 448 B |
|
After Width: | Height: | Size: 818 B |
|
After Width: | Height: | Size: 786 B |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 612 B |
|
After Width: | Height: | Size: 700 B |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 819 B |