Path: blob/master/modules/auxiliary/scanner/mqtt/connect.rb
19535 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45require 'metasploit/framework/credential_collection'6require 'metasploit/framework/login_scanner/mqtt'78class MetasploitModule < Msf::Auxiliary9include Msf::Exploit::Remote::Tcp10include Msf::Auxiliary::Scanner11include Msf::Auxiliary::MQTT12include Msf::Auxiliary::Report13include Msf::Auxiliary::AuthBrute1415def initialize16super(17'Name' => 'MQTT Authentication Scanner',18'Description' => %q(19This module attempts to authenticate to MQTT.20),21'Author' => [22'Jon Hart <jon_hart[at]rapid7.com>'23],24'References' => [25['URL', 'http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Table_3.1_-']26],27'License' => MSF_LICENSE,28'DefaultOptions' => {29'BLANK_PASSWORDS' => false,30'USER_AS_PASS' => true,31'USER_FILE' => 'data/wordlists/unix_users.txt',32'PASS_FILE' => 'data/wordlists/unix_passwords.txt'33}34)35end3637def test_login(username, password)38client_opts = {39username: username,40password: password,41read_timeout: read_timeout,42client_id: client_id43}44connect45client = Rex::Proto::MQTT::Client.new(sock, client_opts)46connect_res = client.connect47client.disconnect48connect_res.return_code.zero?49end5051def default_login52vprint_status("Testing without credentials")53if test_login('', '')54print_good("Does not require authentication")55end56end5758def run_host(_ip)59unless default_login60brute61end62end6364def brute65vprint_status("Starting MQTT login sweep")66cred_collection = build_credential_collection(67username: datastore['USERNAME'],68password: datastore['PASSWORD']69)7071scanner = Metasploit::Framework::LoginScanner::MQTT.new(72configure_login_scanner(73host: rhost,74port: rport,75read_timeout: datastore['READ_TIMEOUT'],76client_id: client_id,77proxies: datastore['PROXIES'],78cred_details: cred_collection,79stop_on_success: datastore['STOP_ON_SUCCESS'],80bruteforce_speed: datastore['BRUTEFORCE_SPEED'],81connection_timeout: datastore['ConnectTimeout'],82max_send_size: datastore['TCP::max_send_size'],83send_delay: datastore['TCP::send_delay'],84framework: framework,85framework_module: self,86ssl: datastore['SSL'],87ssl_version: datastore['SSLVersion'],88ssl_verify_mode: datastore['SSLVerifyMode'],89ssl_cipher: datastore['SSLCipher'],90local_port: datastore['CPORT'],91local_host: datastore['CHOST']92)93)9495scanner.scan! do |result|96credential_data = result.to_h97credential_data.merge!(98module_fullname: fullname,99workspace_id: myworkspace_id100)101password = result.credential.private102username = result.credential.public103if result.success?104credential_core = create_credential(credential_data)105credential_data[:core] = credential_core106create_credential_login(credential_data)107print_good("MQTT Login Successful: #{username}/#{password}")108else109invalidate_login(credential_data)110vprint_error("MQTT LOGIN FAILED: #{username}/#{password} (#{result.proof})")111end112end113end114end115116117