Files
metasploit-gs/lib/msf/core/auxiliary/web/target.rb
T
2017-07-24 06:26:21 -07:00

144 lines
2.8 KiB
Ruby

# -*- coding: binary -*-
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# https://metasploit.com/framework/
require 'net/https'
require 'net/http'
require 'uri'
module Msf
#
# Represents a targeted web application and holds service, host, post etc. info.
#
class Auxiliary::Web::Target
# Original URL as a String.
attr_accessor :original
# Service information as an Mdm::Service object.
attr_accessor :service
# Mdm::WebSite object.
attr_accessor :site
# True if HTTPS, False otherwise.
attr_accessor :ssl
# IP address as a String.
attr_accessor :host
# Virtual host as a String.
attr_accessor :vhost
# String URI path.
attr_accessor :path
# String URI query.
attr_accessor :query
# Port Number.
attr_accessor :port
# Port Number.
attr_accessor :username
# Port Number.
attr_accessor :password
# Array of Web::Form objects.
attr_accessor :forms
# Array of Web::Path objects.
attr_accessor :paths
#
# options - Hash with which to populate self (keys must correspond to attributes):
# :service
# :ssl
# :host
# :vhost
# :path
# :port
# :forms
# :auditable
#
def initialize( options = {} )
update( options )
end
#
# options - Hash with which to update self (keys must correspond to attributes):
# :service
# :ssl
# :host
# :vhost
# :path
# :port
# :forms
# :auditable
#
def update( options = {} )
options.each { |k, v| send( "#{k}=", v ) }
@forms ||= []
@paths ||= []
self
end
#
# Pushes an auditable element.
#
# element - Web::Form or Web::Path or Mdm::WebForm
#
def <<( element )
case element
when Auxiliary::Web::Path
@paths << element
when Auxiliary::Web::Form
@forms << element
when Mdm::WebForm
self.<< element.method.to_s.downcase == 'path' ?
Auxiliary::Web::Path.from_model( element ) :
Auxiliary::Web::Form.from_model( element )
end
end
#
# Array of accumulated auditable elements.
#
def auditable
self.forms | self.paths
end
def host
return if !@host
Rex::Socket.is_ipv6?( @host ) ? "[#{@host}]" : @host
end
# String protocol representation (http or https).
def proto
ssl? ? 'https' : 'http'
end
# True if HTTPS, False otherwise.
def ssl?
!!@ssl
end
# String URL to the webapp.
def to_url
"#{proto}://#{vhost || host}:#{port}#{path}"
end
def dup
Marshal.load( Marshal.dump( self ) )
end
end
end