2021-02-27 00:56:41 +00:00
<!doctype html>
< html lang = "en" >
2021-03-14 21:55:08 +00:00
2021-02-27 00:56:41 +00:00
< head >
2021-03-10 00:10:56 +00:00
< title > Online - Reverse Shell Generator< / title >
2021-02-27 00:56:41 +00:00
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no" >
< link rel = "icon" href = "favicon.ico" type = "image/ico" sizes = "16x16" >
< link href = "assets/bootstrap.min.css" rel = "stylesheet" >
< script src = "assets/jquery-3.5.1.slim.min.js" > < / script >
< script src = "assets/popper-1.16.1.min.js" > < / script >
< script src = "assets/bootstrap-4.5.2.min.js" > < / script >
2021-02-28 21:06:23 +00:00
< link rel = "stylesheet" href = "css/dark-mode.min.css" >
< link rel = "stylesheet" href = "css/light-mode.min.css" >
2021-03-22 16:02:31 +00:00
< meta name = "description" content = "Online Reverse Shell generator with Local Storage functionality, URI & Base64 Encoding, MSFVenom Generator, and Raw Mode. Great for CTFs." / >
2021-03-10 00:10:56 +00:00
< meta name = "title" content = "Online - Reverse Shell Generator" >
<!-- Open Graph / Facebook -->
< meta property = "og:type" content = "website" >
< meta property = "og:url" content = "https://www.revshells.com/" >
< meta property = "og:title" content = "Online - Reverse Shell Generator" >
2021-03-22 16:02:31 +00:00
< meta property = "og:description" content = "Online Reverse Shell generator with Local Storage functionality, URI & Base64 Encoding, MSFVenom Generator, and Raw Mode. Great for CTFs." >
2021-03-14 21:55:08 +00:00
< meta property = "og:image"
2021-03-16 01:46:01 +00:00
content="https://user-images.githubusercontent.com/58673953/111243529-9d646f80-85d7-11eb-986c-9842747dc2e7.png">
2021-03-10 00:10:56 +00:00
<!-- Twitter -->
< meta property = "twitter:card" content = "summary_large_image" >
< meta property = "twitter:url" content = "https://www.revshells.com/" >
< meta property = "twitter:title" content = "Online - Reverse Shell Generator" >
2021-03-22 16:02:31 +00:00
< meta property = "twitter:description" content = "Online Reverse Shell generator with Local Storage functionality, URI & Base64 Encoding, MSFVenom Generator, and Raw Mode. Great for CTFs." >
2021-03-14 21:55:08 +00:00
< meta property = "twitter:image"
2021-03-16 01:46:01 +00:00
content="https://user-images.githubusercontent.com/58673953/111243529-9d646f80-85d7-11eb-986c-9842747dc2e7.png">
2021-03-13 22:49:51 +00:00
2021-03-10 00:10:56 +00:00
<!-- GitHub Ribbon -->
2021-03-14 21:55:08 +00:00
< a href = "https://github.com/0dayCTF/reverse-shell-generator" class = "github-corner"
aria-label="View source on GitHub">< svg width = "80" height = "80" viewBox = "0 0 250 250"
style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true">
< path d = "M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" > < / path >
< path
d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm">< / path >
< path
d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
fill="currentColor" class="octo-body">< / path >
< / svg > < / a >
< style >
.github-corner:hover .octo-arm {
animation: octocat-wave 560ms ease-in-out
}
@keyframes octocat-wave {
0%,
100% {
transform: rotate(0)
}
20%,
60% {
transform: rotate(-25deg)
}
40%,
80% {
transform: rotate(10deg)
}
}
@media (max-width:500px) {
.github-corner:hover .octo-arm {
animation: none
}
.github-corner .octo-arm {
animation: octocat-wave 560ms ease-in-out
}
}
< / style >
2021-02-27 00:56:41 +00:00
< / head >
2021-02-28 00:34:59 +00:00
< body class = "bg-black" >
< div class = "container d-flex flex-column vh-100" >
2021-02-27 21:19:33 +00:00
< div class = "custom-control custom-switch float-right" >
2021-02-28 21:06:23 +00:00
< input id = "lightSwitch" type = "checkbox" class = "custom-control-input" >
< label for = "lightSwitch" class = "custom-control-label small pr-2 pb-1" style = "padding-top:2px"
data-toggle="tooltip" title="Toggle Light Mode">Light Mode 🌓
2021-02-27 21:19:33 +00:00
< / label >
2021-02-28 00:34:59 +00:00
< / div >
2021-02-27 00:56:41 +00:00
<!-- Header -->
2021-02-28 00:34:59 +00:00
< div class = "mb-auto row justify-content-center mt-3 mb-5" >
< h2 class = "rainbow" > Reverse Shell Generator< / h2 >
2021-02-27 21:19:33 +00:00
2021-02-27 00:56:41 +00:00
< / div >
< div class = "row" >
2021-03-13 22:46:18 +00:00
<!-- IP & Port Configuration -->
2021-02-27 00:56:41 +00:00
< div class = "col-12 col-md-6 mb-4" >
< div class = "card shadow h-100" >
< div class = "card-body" >
< h5 class = "card-title mb-0" >
2021-03-13 22:46:18 +00:00
< b > IP & Port< / b >
2021-02-27 00:56:41 +00:00
< / h5 >
2021-03-13 22:46:18 +00:00
<!-- card - text -->
2021-02-27 00:56:41 +00:00
< div class = "card-text h-100" >
< form class = "row justify-content-center align-items-center h-100" >
<!-- IP -->
< div class = "col-auto mt-4" >
< div class = "input-group" >
< div class = "input-group-prepend" >
< span id = "ip-label" class = "input-group-text" > IP< / span >
< / div >
< input id = "ip" type = "text" class = "form-control form-control-lg text-center px-1"
2021-03-20 18:38:52 +00:00
size="12VW" maxlength="15" aria-label="IP"
2021-02-27 00:56:41 +00:00
aria-describedby="ip-label">
< / div >
< / div >
<!-- Port -->
< div class = "col-auto mt-4" >
< div class = "input-group" data-toggle = "tooltip" >
< div class = "input-group-prepend" >
< span id = "port-label" class = "input-group-text" > Port< / span >
< / div >
< input id = "port" type = "text" class = "form-control form-control-lg text-center"
2021-03-20 18:38:52 +00:00
size="4vw" maxlength="5" aria-label="Port"
2021-02-27 00:56:41 +00:00
aria-describedby="port-label">
< div class = "input-group-append" >
< button id = "inc-port" class = "btn btn-secondary btn-sm" type = "button"
2021-03-13 22:46:18 +00:00
style="font-size: 1rem" data-toggle="tooltip"
2021-02-27 00:56:41 +00:00
title="Increase port number by one">
+1
< / button >
< / div >
< / div >
< / div >
< div id = "port-privileges-warning" class = "col-12 small text-center"
style="visibility: hidden">
< span class = "highlighted-warning" > root< / span >
privileges required.
< / div >
< / form >
< / div >
<!-- /card - text -->
< / div >
< / div >
< / div >
2021-03-13 22:46:18 +00:00
<!-- /IP & Port Configuration -->
2021-02-27 00:56:41 +00:00
2021-02-28 21:06:23 +00:00
<!-- Listener -->
2021-02-27 00:56:41 +00:00
< div class = "col-12 col-md-6 mb-4" >
< div class = "card shadow h-100" >
< div class = "card-body" >
<!-- Advanced switch -->
< div class = "custom-control custom-switch float-right" >
2021-02-28 21:06:23 +00:00
< input id = "listener-advanced-switch" type = "checkbox" class = "custom-control-input" checked >
< label for = "listener-advanced-switch" class = "custom-control-label small pr-2 pb-1"
2021-02-27 00:56:41 +00:00
style="padding-top:2px" data-toggle="tooltip" title="Display advanced settings">
Advanced
< / label >
< / div >
< h5 class = "card-title" > < b > Listener< / b > < / h5 >
< div class = "card-text" >
<!-- Command -->
< div class = "row justify-content-center" >
2021-03-13 22:46:18 +00:00
< div class = "col-auto position-relative" style = "min-width: 15vw" >
2021-02-28 21:06:23 +00:00
< pre class = "prompt-sign" > 🚀< / pre >
2021-02-27 00:56:41 +00:00
< pre id = "listener-command" class = "bg-dark border text-wrap text-break p-4 pl-5 mb-2"
style="outline: none; font-size:1em;" contenteditable="true">< / pre >
< / div >
< / div >
<!-- Advanced section -->
2021-02-28 21:06:23 +00:00
< form class = "row justify-content-center collapse" id = "listener-advanced" >
2021-02-27 00:56:41 +00:00
< label for = "listener-selection" class = "col-auto col-form-label" > Type< / label >
< div class = "col-auto" >
< select class = "custom-select" id = "listener-selection" >
<!-- filled by init() -->
< / select >
< / div >
< / form >
< / div >
<!-- /card - text -->
<!-- Copy button -->
< button id = "copy-listener" type = "button" class = "btn btn-primary float-right"
data-toggle="tooltip" title="Copy to clipboard">
Copy
< / button >
< / div >
< / div >
< / div >
2021-03-14 21:55:08 +00:00
<!-- /listener -->
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
< / div >
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
< ul class = "nav nav-tabs" id = "myTab" role = "tablist" >
< li class = "nav-item" >
2021-03-15 23:09:02 +00:00
< a class = "nav-link active" id = "reverse-tab" data-toggle = "tab" href = "#reverse" role = "tab"
2021-03-14 21:55:08 +00:00
aria-controls="reverse" aria-selected="true">Reverse< / a >
2021-03-13 22:46:18 +00:00
< / li >
< li class = "nav-item" >
2021-03-14 21:55:08 +00:00
< a class = "nav-link" id = "bind-tab" data-toggle = "tab" href = "#bind" role = "tab" aria-controls = "bind"
aria-selected="false">Bind< / a >
2021-03-13 22:46:18 +00:00
< / li >
< li class = "nav-item" >
2021-03-14 21:55:08 +00:00
< a class = "nav-link" id = "msfvenom-tab" data-toggle = "tab" href = "#msfvenom" role = "tab"
aria-controls="msfvenom" aria-selected="false">MSFVenom< / a >
2021-03-13 22:46:18 +00:00
< / li >
2021-03-16 01:46:01 +00:00
<!-- <li class="nav - item">
2021-03-14 21:55:08 +00:00
< a class = "nav-link disabled" id = "settings-tab" data-toggle = "tab" href = "#settings" role = "tab"
aria-controls="settings" aria-selected="false" aria-disabled="true">Settings< / a >
2021-03-16 01:46:01 +00:00
< / li > -->
2021-03-13 22:46:18 +00:00
< / ul >
< div class = "tab-content" >
2021-03-14 21:55:08 +00:00
<!-- Reverse Shell Tab -->
< div class = "tab-pane active" id = "reverse" role = "tabpanel" aria-labelledby = "reverse-tab" >
2021-03-13 22:46:18 +00:00
< div class = "card shadow mb-5" >
< div class = "card-body" >
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
<!-- Show all advanced switch -->
< div class = "custom-control custom-switch float-right" >
< input id = "revshell-advanced-switch" type = "checkbox" class = "custom-control-input" checked >
< label for = "revshell-advanced-switch" class = "custom-control-label small pr-2 pb-1"
style="padding-top:2px" data-toggle="tooltip" title="Display all advanced settings">
2021-03-14 21:55:08 +00:00
Show Advanced
2021-03-13 22:46:18 +00:00
< / label >
< / div >
2021-03-14 21:55:08 +00:00
<!-- /Show all advanced switch -->
<!-- - Filter OS -->
< div class = "row" >
< label for = "os-options" class = "col-auto col-form-label float-left"
style="font-size:1rem">OS< / label >
< div class = "col-auto" >
< select id = "os-options" class = "custom-select" >
< option class = "os-item" value = "all" > All< / option >
< option class = "os-item" value = "linux" > Linux< / option >
< option class = "os-item" value = "windows" > Windows< / option >
< option class = "os-item" value = "mac" > Mac< / option >
< / select >
< / div >
2021-03-13 22:46:18 +00:00
< / div >
2021-03-14 21:55:08 +00:00
<!-- - /Filter OS -->
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
< div class = "card-text mt-4" >
< div class = "row" >
<!-- Left column: Reverse shell selection -->
< div class = "col-12 col-md-3" >
< div id = "reverse-shell-selection" class = "list-group overflow-auto"
style="max-height: 520px">
<!-- filled by init() -->
2021-02-27 00:56:41 +00:00
< / div >
< / div >
2021-03-13 22:46:18 +00:00
<!-- Right column -->
< div class = "col-12 col-md-9 d-flex flex-column" >
2021-03-14 21:55:08 +00:00
<!-- Reverse Shell Command -->
2021-03-13 22:46:18 +00:00
< div class = "row flex-grow-1" >
< div class = "col position-relative" >
< pre class = "prompt-sign" > 🚀< / pre >
< pre id = "reverse-shell-command"
class="bg-dark border pre-wrap text-break p-4 pl-5"
style="outline: none; font-size:1em;" contenteditable="true">< / pre >
2021-02-27 00:56:41 +00:00
< / div >
< / div >
2021-03-13 22:46:18 +00:00
<!-- Advanced section -->
< form class = "row justify-content-center collapse" id = "revshell-advanced" >
<!-- Shell -->
< div class = "col-auto mr-3" >
< div class = "row" >
< label for = "shell" class = "col-auto col-form-label" > Shell< / label >
< div class = "col-auto" >
< select id = "shell" class = "custom-select" >
<!-- filled by init() -->
< / select >
< / div >
< / div >
< / div >
<!-- Encoding -->
< div class = "col-auto ml-3" >
< div class = "form-group row" >
< label for = "encoding" class = "col-auto col-form-label" > Encoding< / label >
< div class = "col-auto" >
< select id = "encoding" class = "custom-select" >
2021-03-20 18:38:52 +00:00
< option value = "None" > None< / option >
< option value = "encodingURI" > encodeURI< / option >
< option value = "encodeURIComponent" > encodeURIComponent< / option >
< option value = "Base64" > Base64< / option >
2021-03-13 22:46:18 +00:00
< / select >
< / div >
< / div >
< / div >
< / form >
<!-- /Advanced section -->
< div class = "row justify-content-end mr-1" >
2021-03-16 01:46:01 +00:00
<!-- Toasts for Reverse Shell Auto Copy -->
< div id = "clipboard-toast" class = "toast position-fixed text-white" data-delay = "1200"
style="bottom: 16px; left: 50%; transform: translateX(-50%); background: rgba(32, 32, 32, .85)">
< div class = "toast-body" >
Copied to clipboard
< / div >
< / div >
< div id = "clipboard-failure-toast" class = "toast position-fixed text-white" data-delay = "1200"
style="bottom: 16px; left: 50%; transform: translateX(-50%); background: rgba(255, 0, 0, .85)">
< div class = "toast-body" >
Error copying to clipboard
< / div >
< / div >
<!-- Auto - copy switch -->
<!-- <div class="custom - control custom - switch mt - 2 mr - 3" data - toggle="tooltip"
2021-03-13 22:46:18 +00:00
title="Auto-copy to clipboard when selecting a new shell type">
< input id = "auto-copy-switch" class = "custom-control-input" type = "checkbox"
checked>
< label for = "auto-copy-switch" class = "custom-control-label small pr-2 pb-1"
style="padding-top: 2px">Auto-copy< / label >
2021-03-16 01:46:01 +00:00
< / div > -->
2021-03-20 18:38:52 +00:00
<!-- Raw button -->
< button type = "button" class = "raw-listener btn btn-primary float-right mr-3"
data-toggle="tooltip" title="View raw">
Raw
< / button >
2021-03-13 22:46:18 +00:00
<!-- Copy button -->
< button id = "copy-reverse-shell-command" data-toggle = "tooltip"
title="Copy to clipboard" type="button" class="btn btn-primary float-right">
Copy
< / button >
2021-03-02 01:17:16 +00:00
< / div >
2021-02-27 00:56:41 +00:00
< / div >
2021-03-13 22:46:18 +00:00
<!-- /Right column -->
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
< / div >
2021-02-27 00:56:41 +00:00
< / div >
2021-03-13 22:46:18 +00:00
<!-- /card - text -->
2021-02-27 00:56:41 +00:00
< / div >
< / div >
< / div >
2021-03-14 21:55:08 +00:00
<!-- /Reverse Shell Tab -->
2021-03-13 22:46:18 +00:00
2021-03-14 21:55:08 +00:00
<!-- Bind Shell Tab -->
< div class = "tab-pane" id = "bind" role = "tabpanel" aria-labelledby = "bind-tab" >
< div class = "card shadow mb-5" >
< div class = "card-body" >
< div class = "card-text mt-4" >
< div class = "row" >
<!-- Left column: Bind selection -->
< div class = "col-12 col-md-3" >
< div id = "bind-shell-selection" class = "list-group overflow-auto" style = "max-height: 520px" >
<!-- filled by init() -->
< / div >
< / div >
<!-- Right column -->
< div class = "col-12 col-md-9 d-flex flex-column" >
<!-- Command -->
< div class = "row flex-grow-1" >
< div class = "col position-relative" >
< pre class = "prompt-sign" > 🚀< / pre >
< pre id = "bind-shell-command" class = "bg-dark border pre-wrap text-break p-4 pl-5"
style="outline: none; font-size:1em;" contenteditable="true">< / pre >
< / div >
< / div >
< div class = "row justify-content-end mr-1" >
<!-- Auto - copy switch -->
<!-- <div class="custom - control custom - switch mt - 2 mr - 3" data - toggle="tooltip"
title="Auto-copy to clipboard when selecting a new shell type">
< input id = "auto-copy-switch" class = "custom-control-input" type = "checkbox" checked >
< label for = "auto-copy-switch" class = "custom-control-label small pr-2 pb-1"
style="padding-top: 2px">Auto-copy< / label >
< / div > -->
2021-03-20 18:38:52 +00:00
<!-- Raw button -->
< button type = "button" class = "raw-listener btn btn-primary float-right mr-3"
data-toggle="tooltip" title="View raw">
Raw
< / button >
2021-03-14 21:55:08 +00:00
<!-- Copy button -->
< button id = "copy-bind-shell-command" data-toggle = "tooltip" title = "Copy to clipboard"
type="button" class="btn btn-primary float-right">
Copy
< / button >
< / div >
< / div >
<!-- /Right column -->
< / div >
< / div >
< / div >
< / div >
< / div >
<!-- /Bind Shell Tab -->
<!-- MSFVenom Tab -->
< div class = "tab-pane" id = "msfvenom" role = "tabpanel" aria-labelledby = "msfvenom-tab" >
< div class = "card shadow mb-5" >
< div class = "card-body" >
< div class = "card-text mt-4" >
< div class = "row" >
<!-- Left column: MSFVenom selection -->
< div class = "col-12 col-md-3" >
< div id = "msfvenom-selection" class = "list-group overflow-auto"
style="max-height: 520px">
<!-- filled by init() -->
< / div >
< / div >
<!-- Right column -->
< div class = "col-12 col-md-9 d-flex flex-column" >
<!-- Command -->
< div class = "row flex-grow-1" >
< div class = "col position-relative" >
< pre class = "prompt-sign" > 🚀< / pre >
< pre id = "msfvenom-command"
class="bg-dark border pre-wrap text-break p-4 pl-5"
style="outline: none; font-size:1em;" contenteditable="true">< / pre >
< / div >
< / div >
< div class = "row justify-content-end mr-1" >
<!-- Auto - copy switch -->
<!-- <div class="custom - control custom - switch mt - 2 mr - 3" data - toggle="tooltip"
title="Auto-copy to clipboard when selecting a new shell type">
< input id = "auto-copy-switch" class = "custom-control-input"
type="checkbox" checked>
< label for = "auto-copy-switch"
class="custom-control-label small pr-2 pb-1"
style="padding-top: 2px">Auto-copy< / label >
< / div > -->
2021-03-20 18:38:52 +00:00
<!-- Raw button -->
< button type = "button" class = "raw-listener btn btn-primary float-right mr-3"
data-toggle="tooltip" title="View raw">
Raw
< / button >
2021-03-14 21:55:08 +00:00
<!-- Copy button -->
< button id = "copy-msfvenom-command" data-toggle = "tooltip"
title="Copy to clipboard" type="button"
class="btn btn-primary float-right">
Copy
< / button >
< / div >
< / div >
<!-- /Right column -->
< / div >
< / div >
< / div >
< / div >
<!-- /MSFVenom Tab -->
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
< script >
$(function () {
$('#myTab li:first-child a').tab('show')
})
< / script >
<!-- /NEW -->
2021-02-27 00:56:41 +00:00
< / div >
<!-- RSG data -->
2021-02-28 00:34:59 +00:00
< script src = "js/data.js" > < / script >
2021-02-27 00:56:41 +00:00
2021-03-20 18:38:52 +00:00
<!-- RSG raw link generator -->
< script src = "js/raw-link.js" > < / script >
2021-02-27 00:56:41 +00:00
<!-- RSG logic -->
< script >
2021-03-13 22:46:18 +00:00
// Element selectors
const ipInput = document.querySelector("#ip");
const portInput = document.querySelector("#port");
const listenerSelect = document.querySelector("#listener-selection");
const shellSelect = document.querySelector("#shell");
2021-03-16 02:03:58 +00:00
// const autoCopySwitch = document.querySelector("#auto-copy-switch");
2021-03-13 22:46:18 +00:00
const encodingSelect = document.querySelector('#encoding');
const listenerCommand = document.querySelector("#listener-command");
const reverseShellCommand = document.querySelector("#reverse-shell-command");
2021-03-14 21:55:08 +00:00
const bindShellCommand = document.querySelector("#bind-shell-command");
const msfVenomCommand = document.querySelector("#msfvenom-command");
2021-03-13 22:46:18 +00:00
2021-03-15 23:09:02 +00:00
const FilterType = {
'All': 'all',
'Windows': 'windows',
'Linux': 'linux',
'Mac': 'mac'
};
2021-03-13 22:46:18 +00:00
document.querySelector("#os-options").addEventListener("change", (event) => {
const selectedOS = event.target.value;
2021-03-15 23:09:02 +00:00
rsg.setState({
filter: selectedOS,
});
});
2021-03-13 22:46:18 +00:00
2021-03-15 23:09:02 +00:00
document.querySelector("#reverse-tab").addEventListener("click", () => {
rsg.setState({
commandType: CommandType.ReverseShell
2021-03-13 22:46:18 +00:00
});
2021-03-15 23:09:02 +00:00
})
2021-03-13 22:46:18 +00:00
2021-03-15 23:09:02 +00:00
document.querySelector("#bind-tab").addEventListener("click", () => {
rsg.setState({
commandType: CommandType.BindShell
});
})
2021-03-13 22:46:18 +00:00
2021-03-14 21:55:08 +00:00
document.querySelector("#bind-tab").addEventListener("click", () => {
document.querySelector("#bind-shell-selection").innerHTML = "";
2021-03-15 23:09:02 +00:00
rsg.setState({
commandType: CommandType.BindShell
});
2021-03-14 21:55:08 +00:00
})
document.querySelector("#msfvenom-tab").addEventListener("click", () => {
document.querySelector("#msfvenom-selection").innerHTML = "";
2021-03-15 23:09:02 +00:00
rsg.setState({
commandType: CommandType.MSFVenom
});
});
2021-03-20 18:38:52 +00:00
var rawLinkButtons = document.querySelectorAll('.raw-listener');
for (const button of rawLinkButtons) {
button.addEventListener("click", () => {
const rawLink = RawLink.generate(rsg);
window.location = rawLink;
});
}
2021-03-15 23:09:02 +00:00
const filterCommandData = function (data, { commandType, filter }) {
return data.filter(item => {
if (!item.meta.includes(commandType)) {
return false;
}
if (!filter) {
return true;
}
if (filter === FilterType.All) {
return true;
}
return item.meta.includes(filter);
});
}
2021-03-14 21:55:08 +00:00
2021-02-27 00:56:41 +00:00
const rsg = {
2021-03-20 18:38:52 +00:00
ip: localStorage.getItem('ip') || '10.10.10.10',
port: localStorage.getItem('port') || 9001,
shell: localStorage.getItem('shell') || rsgData.shells[0],
listener: localStorage.getItem('listener') || rsgData.listenerCommands[0][1],
encoding: localStorage.getItem('encoding') || 'None',
2021-03-15 23:09:02 +00:00
selectedValues: {
[CommandType.ReverseShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.ReverseShell })[0].name,
[CommandType.BindShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.BindShell })[0].name,
[CommandType.MSFVenom]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.MSFVenom })[0].name,
},
commandType: CommandType.ReverseShell,
filter: FilterType.All,
2021-02-27 00:56:41 +00:00
2021-03-20 18:38:52 +00:00
uiElements: {
[CommandType.ReverseShell]: {
listSelection: '#reverse-shell-selection',
command: '#reverse-shell-command'
},
[CommandType.BindShell]: {
listSelection: '#bind-shell-selection',
command: '#bind-shell-command',
},
[CommandType.MSFVenom]: {
listSelection: '#msfvenom-selection',
command: '#msfvenom-command'
}
},
2021-03-13 22:46:18 +00:00
copyToClipboard: (text) => {
2021-03-16 00:14:01 +00:00
if (navigator ?.clipboard ?.writeText) {
navigator.clipboard.writeText(text)
$('#clipboard-toast').toast('show')
} else if (window ?.clipboardData ?.setData) {
window.clipboardData.setData('Text', text);
$('#clipboard-toast').toast('show')
} else {
$('#clipboard-failure-toast').toast('show')
}
2021-02-27 00:56:41 +00:00
},
2021-03-13 22:46:18 +00:00
escapeHTML: (text) => String(text).replace(/< /, '< ').replace(/>/, '> '),
2021-02-27 00:56:41 +00:00
2021-03-20 18:38:52 +00:00
getIP: () => rsg.ip,
getPort: () => Number(rsg.port),
getShell: () => rsg.shell,
2021-02-27 00:56:41 +00:00
2021-03-20 18:38:52 +00:00
getEncoding: () => rsg.encoding,
2021-02-27 00:56:41 +00:00
2021-03-15 23:09:02 +00:00
getSelectedCommandName: () => {
return rsg.selectedValues[rsg.commandType];
2021-03-14 21:55:08 +00:00
},
2021-03-15 23:09:02 +00:00
getReverseShellCommand: () => {
const reverseShellData = rsgData.reverseShellCommands.find((item) => item.name === rsg.getSelectedCommandName());
2021-03-14 00:42:11 +00:00
return reverseShellData.command;
2021-02-27 00:56:41 +00:00
},
2021-03-20 18:38:52 +00:00
generateReverseShellCommand: () => {
let command
if (rsg.getSelectedCommandName() === 'PowerShell #3 (Base64)') {
const encoder = (text) => text;
const payload = rsg.insertParameters(rsgData.specialCommands['PowerShell payload'], encoder)
command = "powershell -e " + btoa(payload)
} else {
command = rsg.getReverseShellCommand()
}
const encoding = rsg.getEncoding();
if (encoding === 'Base64') {
command = btoa(command)
} else {
function encoder(string) {
return (encoding === 'encodeURI' || encoding === 'encodeURIComponent') ? window[
encoding](string) : string
}
command = rsg.insertParameters(
rsg.highlightParameters(
encoder(command), encoder),
encoder
)
}
return command;
},
2021-03-13 22:46:18 +00:00
highlightParameters: (text, encoder) => {
2021-03-14 21:55:08 +00:00
const parameters = ['{ip}', '{port}', '{shell}', encodeURI('{ip}'), encodeURI('{port}'),
encodeURI('{shell}')
];
2021-03-20 18:38:52 +00:00
2021-03-13 22:46:18 +00:00
parameters.forEach((param) => {
2021-02-27 00:56:41 +00:00
if (encoder) param = encoder(param)
2021-03-20 18:38:52 +00:00
text = text.replace(param, `< span class = "highlighted-parameter" > ${param}< / span > `)
2021-02-27 00:56:41 +00:00
})
return text
},
2021-03-13 22:46:18 +00:00
init: () => {
2021-02-27 00:56:41 +00:00
rsg.initListenerSelection()
rsg.initShells()
},
2021-03-13 22:46:18 +00:00
initListenerSelection: () => {
rsgData.listenerCommands.forEach((listenerData, i) => {
const type = listenerData[0];
const command = listenerData[1];
const option = document.createElement("option");
option.value = command;
2021-03-20 18:38:52 +00:00
option.selected = rsg.listener === option.value;
2021-03-13 22:46:18 +00:00
option.classList.add("listener-option");
option.innerText = type;
listenerSelect.appendChild(option);
2021-02-27 00:56:41 +00:00
})
},
2021-03-13 22:46:18 +00:00
initShells: () => {
rsgData.shells.forEach((shell, i) => {
const option = document.createElement("option");
2021-03-20 18:38:52 +00:00
option.selected = rsg.shell === shell;
2021-03-13 22:46:18 +00:00
option.classList.add("shell-option");
option.innerText = shell;
shellSelect.appendChild(option);
2021-02-27 00:56:41 +00:00
})
},
2021-03-15 23:09:02 +00:00
// Updates the rsg state, and forces a re-render
2021-03-20 18:38:52 +00:00
setState: (newState = {}) => {
Object.keys(newState).forEach((key) => {
const value = newState[key];
rsg[key] = value;
localStorage.setItem(key, value)
});
Object.assign(rsg, newState);
2021-03-13 22:46:18 +00:00
2021-03-15 23:09:02 +00:00
rsg.update();
2021-02-27 00:56:41 +00:00
},
2021-03-15 23:09:02 +00:00
insertParameters: (command, encoder) => {
return command
2021-03-16 01:46:01 +00:00
.replaceAll(encoder('{ip}'), rsg.escapeHTML(encoder(rsg.getIP())))
.replaceAll(encoder('{port}'), encoder(String(rsg.getPort())))
2021-03-20 18:38:52 +00:00
.replaceAll(encoder('{shell}'), encoder(rsg.getShell()))
2021-03-15 23:09:02 +00:00
},
2021-03-14 21:55:08 +00:00
2021-03-15 23:09:02 +00:00
update: () => {
rsg.updateListenerCommand()
rsg.updateTabList()
rsg.updateReverseShellCommand()
2021-03-20 18:38:52 +00:00
rsg.updateValues()
},
updateValues: () => {
const listenerOptions = listenerSelect.querySelectorAll(".listener-option");
listenerOptions.forEach((option) => {
option.selected = rsg.listener === option.value;
});
const shellOptions = shellSelect.querySelectorAll(".shell-option");
shellOptions.forEach((option) => {
option.selected = rsg.shell === option.value;
});
const encodingOptions = encodingSelect.querySelectorAll("option");
encodingOptions.forEach((option) => {
option.selected = rsg.encoding === option.value;
});
ipInput.value = rsg.ip;
portInput.value = rsg.port;
2021-03-15 23:09:02 +00:00
},
2021-03-14 21:55:08 +00:00
2021-03-15 23:09:02 +00:00
updateTabList: () => {
const data = rsgData.reverseShellCommands;
const filteredItems = filterCommandData(
data,
{
filter: rsg.filter,
commandType: rsg.commandType
2021-03-14 21:55:08 +00:00
}
2021-03-15 23:09:02 +00:00
);
2021-03-14 21:55:08 +00:00
2021-03-15 23:09:02 +00:00
const documentFragment = document.createDocumentFragment()
filteredItems.forEach((item, index) => {
2021-03-14 21:55:08 +00:00
const {
name,
command
} = item;
const selectionButton = document.createElement("button");
2021-03-15 23:09:02 +00:00
if (rsg.getSelectedCommandName() === item.name) {
2021-03-14 21:55:08 +00:00
selectionButton.classList.add("active");
}
const clickEvent = () => {
2021-03-15 23:09:02 +00:00
rsg.selectedValues[rsg.commandType] = name;
rsg.update();
2021-03-14 21:55:08 +00:00
2021-03-16 01:46:01 +00:00
// if (document.querySelector('#auto-copy-switch').checked) {
// rsg.copyToClipboard(reverseShellCommand.innerText)
// }
2021-03-14 21:55:08 +00:00
}
selectionButton.innerText = name;
selectionButton.classList.add("list-group-item", "list-group-item-action");
selectionButton.addEventListener("click", clickEvent);
2021-03-15 23:09:02 +00:00
documentFragment.appendChild(selectionButton);
2021-03-14 21:55:08 +00:00
})
2021-02-27 00:56:41 +00:00
2021-03-20 18:38:52 +00:00
const listSelectionSelector = rsg.uiElements[rsg.commandType].listSelection;
document.querySelector(listSelectionSelector).replaceChildren(documentFragment)
2021-02-27 00:56:41 +00:00
},
2021-03-13 22:46:18 +00:00
updateListenerCommand: () => {
const privilegeWarning = document.querySelector("#port-privileges-warning");
let command = listenerSelect.value;
2021-02-27 00:56:41 +00:00
command = rsg.highlightParameters(command)
command = command.replace('{port}', rsg.getPort())
if (rsg.getPort() < 1024 ) {
2021-03-13 22:46:18 +00:00
privilegeWarning.style.visibility = "visible";
command = `< span class = "highlighted-warning" > sudo< / span > ${command}`
2021-02-27 00:56:41 +00:00
} else {
2021-03-13 22:46:18 +00:00
privilegeWarning.style.visibility = "hidden";
2021-02-27 00:56:41 +00:00
}
2021-03-13 22:46:18 +00:00
listenerCommand.innerHTML = command;
2021-02-27 00:56:41 +00:00
},
2021-03-13 22:46:18 +00:00
updateReverseShellSelection: () => {
2021-03-14 21:55:08 +00:00
document.querySelector(".list-group-item.active") ?.classList.remove("active");
2021-03-13 22:46:18 +00:00
const elements = Array.from(document.querySelectorAll(".list-group-item"));
2021-03-15 23:09:02 +00:00
const selectedElement = elements.find((item) => item.innerText === rsg.currentCommandName);
selectedElement?.classList.add("active");
2021-02-27 00:56:41 +00:00
},
2021-03-13 22:46:18 +00:00
updateReverseShellCommand: () => {
2021-03-20 18:38:52 +00:00
const command = rsg.generateReverseShellCommand();
const commandSelector = rsg.uiElements[rsg.commandType].command;
document.querySelector(commandSelector).innerHTML = command;
2021-03-14 21:55:08 +00:00
},
2021-03-13 22:46:18 +00:00
updateSwitchStates: () => {
2021-02-28 21:06:23 +00:00
$('#listener-advanced').collapse($('#listener-advanced-switch').prop('checked') ? 'show' :
'hide')
$('#revshell-advanced').collapse($('#revshell-advanced-switch').prop('checked') ? 'show' :
'hide')
2021-02-27 00:56:41 +00:00
}
}
/*
2021-03-13 22:46:18 +00:00
* Init
*/
rsg.init();
rsg.update();
/*
* Event handlers/functions
2021-02-27 00:56:41 +00:00
*/
2021-03-20 18:38:52 +00:00
ipInput.addEventListener("input", (e) => {
rsg.setState({
ip: e.target.value
})
});
2021-03-13 22:46:18 +00:00
2021-03-20 18:38:52 +00:00
portInput.addEventListener("input", (e) => {
rsg.setState({
port: Number(e.target.value)
})
});
listenerSelect.addEventListener("change", (e) => {
rsg.setState({
listener: e.target.value
})
});
shellSelect.addEventListener("change", (e) => {
rsg.setState({
shell: e.target.value
})
});
encodingSelect.addEventListener("change", (e) => {
rsg.setState({
encoding: e.target.value
})
});
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
document.querySelector('#inc-port').addEventListener('click', () => {
2021-03-20 18:38:52 +00:00
rsg.setState({
port: rsg.getPort() + 1
})
2021-02-27 00:56:41 +00:00
})
2021-03-13 22:46:18 +00:00
document.querySelector('#listener-advanced-switch').addEventListener('change', rsg.updateSwitchStates);
document.querySelector('#revshell-advanced-switch').addEventListener('change', rsg.updateSwitchStates);
2021-03-16 02:03:58 +00:00
setInterval(rsg.updateSwitchStates, 500) // fix switch changes in rapid succession
2021-02-27 00:56:41 +00:00
2021-03-13 22:46:18 +00:00
document.querySelector('#copy-listener').addEventListener('click', () => {
rsg.copyToClipboard(listenerCommand.innerText)
2021-02-27 00:56:41 +00:00
})
2021-03-13 22:46:18 +00:00
document.querySelector('#copy-reverse-shell-command').addEventListener('click', () => {
rsg.copyToClipboard(reverseShellCommand.innerText)
2021-02-27 00:56:41 +00:00
})
2021-03-14 21:55:08 +00:00
document.querySelector('#copy-bind-shell-command').addEventListener('click', () => {
rsg.copyToClipboard(bindShellCommand.innerText)
})
document.querySelector('#copy-msfvenom-command').addEventListener('click', () => {
rsg.copyToClipboard(msfVenomCommand.innerText)
})
2021-03-16 01:46:01 +00:00
// autoCopySwitch.addEventListener("change", () => {
// setLocalStorage(autoCopySwitch, "auto-copy", "checked");
// });
2021-02-27 00:56:41 +00:00
// Popper tooltips
$(function () {
$('[data-toggle="tooltip"]').tooltip()
2021-03-13 22:46:18 +00:00
});
// TODO: add a random fifo for netcat mkfifo
2021-03-16 01:46:01 +00:00
//let randomId = Math.random().toString(36).substring(2, 4);
2021-02-27 00:56:41 +00:00
< / script >
2021-02-28 21:06:23 +00:00
< script src = "js/light-mode-switch.min.js" > < / script >
2021-02-27 00:56:41 +00:00
< / body >
2021-03-14 00:42:11 +00:00
< / html >