mirror of
https://github.com/0dayCTF/reverse-shell-generator.git
synced 2024-12-29 16:05:26 +00:00
de34757604
Updated Meta Description to include MSFVenom Generator.
913 lines
42 KiB
HTML
913 lines
42 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<title>Online - Reverse Shell Generator</title>
|
|
<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>
|
|
<link rel="stylesheet" href="css/dark-mode.min.css">
|
|
<link rel="stylesheet" href="css/light-mode.min.css">
|
|
<meta name="description" content="Online Reverse Shell generator with Local Storage functionality, URI & Base64 Encoding, MSFVenom Generator, and Raw Mode. Great for CTFs." />
|
|
<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">
|
|
<meta property="og:description" content="Online Reverse Shell generator with Local Storage functionality, URI & Base64 Encoding, MSFVenom Generator, and Raw Mode. Great for CTFs.">
|
|
<meta property="og:image"
|
|
content="https://user-images.githubusercontent.com/58673953/111243529-9d646f80-85d7-11eb-986c-9842747dc2e7.png">
|
|
<!-- 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">
|
|
<meta property="twitter:description" content="Online Reverse Shell generator with Local Storage functionality, URI & Base64 Encoding, MSFVenom Generator, and Raw Mode. Great for CTFs.">
|
|
<meta property="twitter:image"
|
|
content="https://user-images.githubusercontent.com/58673953/111243529-9d646f80-85d7-11eb-986c-9842747dc2e7.png">
|
|
|
|
<!-- GitHub Ribbon -->
|
|
<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>
|
|
</head>
|
|
|
|
<body class="bg-black">
|
|
<div class="container d-flex flex-column vh-100">
|
|
<div class="custom-control custom-switch float-right">
|
|
<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 🌓
|
|
</label>
|
|
</div>
|
|
|
|
<!-- Header -->
|
|
<div class="mb-auto row justify-content-center mt-3 mb-5">
|
|
<h2 class="rainbow">Reverse Shell Generator</h2>
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
<!-- IP & Port Configuration -->
|
|
<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">
|
|
<b>IP & Port</b>
|
|
</h5>
|
|
|
|
<!-- card-text -->
|
|
<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"
|
|
size="12VW" maxlength="15" aria-label="IP"
|
|
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"
|
|
size="4vw" maxlength="5" aria-label="Port"
|
|
aria-describedby="port-label">
|
|
<div class="input-group-append">
|
|
<button id="inc-port" class="btn btn-secondary btn-sm" type="button"
|
|
style="font-size: 1rem" data-toggle="tooltip"
|
|
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>
|
|
<!-- /IP & Port Configuration -->
|
|
|
|
<!-- Listener -->
|
|
<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">
|
|
<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"
|
|
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">
|
|
<div class="col-auto position-relative" style="min-width: 15vw">
|
|
<pre class="prompt-sign">🚀</pre>
|
|
<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-->
|
|
<form class="row justify-content-center collapse" id="listener-advanced">
|
|
<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>
|
|
<!-- /listener -->
|
|
|
|
</div>
|
|
|
|
<ul class="nav nav-tabs" id="myTab" role="tablist">
|
|
<li class="nav-item">
|
|
<a class="nav-link active" id="reverse-tab" data-toggle="tab" href="#reverse" role="tab"
|
|
aria-controls="reverse" aria-selected="true">Reverse</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" id="bind-tab" data-toggle="tab" href="#bind" role="tab" aria-controls="bind"
|
|
aria-selected="false">Bind</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" id="msfvenom-tab" data-toggle="tab" href="#msfvenom" role="tab"
|
|
aria-controls="msfvenom" aria-selected="false">MSFVenom</a>
|
|
</li>
|
|
<!-- <li class="nav-item">
|
|
<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>
|
|
</li> -->
|
|
</ul>
|
|
|
|
<div class="tab-content">
|
|
<!-- Reverse Shell Tab-->
|
|
<div class="tab-pane active" id="reverse" role="tabpanel" aria-labelledby="reverse-tab">
|
|
<div class="card shadow mb-5">
|
|
<div class="card-body">
|
|
|
|
<!-- 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">
|
|
Show Advanced
|
|
</label>
|
|
</div>
|
|
<!-- /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>
|
|
</div>
|
|
<!---/Filter OS-->
|
|
|
|
<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()-->
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right column -->
|
|
<div class="col-12 col-md-9 d-flex flex-column">
|
|
|
|
<!-- Reverse Shell Command -->
|
|
<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>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 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">
|
|
<option value="None">None</option>
|
|
<option value="encodingURI">encodeURI</option>
|
|
<option value="encodeURIComponent">encodeURIComponent</option>
|
|
<option value="Base64">Base64</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</form>
|
|
<!-- /Advanced section -->
|
|
|
|
<div class="row justify-content-end mr-1">
|
|
<!-- 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"
|
|
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> -->
|
|
<!-- Raw button -->
|
|
<button type="button" class="raw-listener btn btn-primary float-right mr-3"
|
|
data-toggle="tooltip" title="View raw">
|
|
Raw
|
|
</button>
|
|
|
|
<!-- 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>
|
|
</div>
|
|
|
|
</div>
|
|
<!-- /Right column -->
|
|
|
|
</div>
|
|
</div>
|
|
<!-- /card-text -->
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- /Reverse Shell Tab -->
|
|
|
|
<!-- 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> -->
|
|
<!-- Raw button -->
|
|
<button type="button" class="raw-listener btn btn-primary float-right mr-3"
|
|
data-toggle="tooltip" title="View raw">
|
|
Raw
|
|
</button>
|
|
|
|
<!-- 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> -->
|
|
|
|
<!-- Raw button -->
|
|
<button type="button" class="raw-listener btn btn-primary float-right mr-3"
|
|
data-toggle="tooltip" title="View raw">
|
|
Raw
|
|
</button>
|
|
|
|
<!-- 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 -->
|
|
|
|
<script>
|
|
$(function () {
|
|
$('#myTab li:first-child a').tab('show')
|
|
})
|
|
</script>
|
|
<!-- /NEW -->
|
|
</div>
|
|
|
|
|
|
|
|
<!-- RSG data -->
|
|
<script src="js/data.js"></script>
|
|
|
|
<!-- RSG raw link generator -->
|
|
<script src="js/raw-link.js"></script>
|
|
|
|
<!-- RSG logic -->
|
|
<script>
|
|
// Element selectors
|
|
const ipInput = document.querySelector("#ip");
|
|
const portInput = document.querySelector("#port");
|
|
const listenerSelect = document.querySelector("#listener-selection");
|
|
const shellSelect = document.querySelector("#shell");
|
|
// const autoCopySwitch = document.querySelector("#auto-copy-switch");
|
|
const encodingSelect = document.querySelector('#encoding');
|
|
const listenerCommand = document.querySelector("#listener-command");
|
|
const reverseShellCommand = document.querySelector("#reverse-shell-command");
|
|
const bindShellCommand = document.querySelector("#bind-shell-command");
|
|
const msfVenomCommand = document.querySelector("#msfvenom-command");
|
|
|
|
const FilterType = {
|
|
'All': 'all',
|
|
'Windows': 'windows',
|
|
'Linux': 'linux',
|
|
'Mac': 'mac'
|
|
};
|
|
|
|
document.querySelector("#os-options").addEventListener("change", (event) => {
|
|
const selectedOS = event.target.value;
|
|
rsg.setState({
|
|
filter: selectedOS,
|
|
});
|
|
});
|
|
|
|
document.querySelector("#reverse-tab").addEventListener("click", () => {
|
|
rsg.setState({
|
|
commandType: CommandType.ReverseShell
|
|
});
|
|
})
|
|
|
|
document.querySelector("#bind-tab").addEventListener("click", () => {
|
|
rsg.setState({
|
|
commandType: CommandType.BindShell
|
|
});
|
|
})
|
|
|
|
document.querySelector("#bind-tab").addEventListener("click", () => {
|
|
document.querySelector("#bind-shell-selection").innerHTML = "";
|
|
rsg.setState({
|
|
commandType: CommandType.BindShell
|
|
});
|
|
})
|
|
|
|
document.querySelector("#msfvenom-tab").addEventListener("click", () => {
|
|
document.querySelector("#msfvenom-selection").innerHTML = "";
|
|
rsg.setState({
|
|
commandType: CommandType.MSFVenom
|
|
});
|
|
});
|
|
|
|
var rawLinkButtons = document.querySelectorAll('.raw-listener');
|
|
for (const button of rawLinkButtons) {
|
|
button.addEventListener("click", () => {
|
|
const rawLink = RawLink.generate(rsg);
|
|
window.location = rawLink;
|
|
});
|
|
}
|
|
|
|
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);
|
|
});
|
|
}
|
|
|
|
const rsg = {
|
|
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',
|
|
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,
|
|
|
|
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'
|
|
}
|
|
},
|
|
|
|
copyToClipboard: (text) => {
|
|
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')
|
|
}
|
|
},
|
|
|
|
escapeHTML: (text) => String(text).replace(/</, '<').replace(/>/, '>'),
|
|
|
|
getIP: () => rsg.ip,
|
|
|
|
getPort: () => Number(rsg.port),
|
|
|
|
getShell: () => rsg.shell,
|
|
|
|
getEncoding: () => rsg.encoding,
|
|
|
|
getSelectedCommandName: () => {
|
|
return rsg.selectedValues[rsg.commandType];
|
|
},
|
|
|
|
getReverseShellCommand: () => {
|
|
const reverseShellData = rsgData.reverseShellCommands.find((item) => item.name === rsg.getSelectedCommandName());
|
|
return reverseShellData.command;
|
|
},
|
|
|
|
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;
|
|
},
|
|
|
|
highlightParameters: (text, encoder) => {
|
|
const parameters = ['{ip}', '{port}', '{shell}', encodeURI('{ip}'), encodeURI('{port}'),
|
|
encodeURI('{shell}')
|
|
];
|
|
|
|
parameters.forEach((param) => {
|
|
if (encoder) param = encoder(param)
|
|
text = text.replace(param, `<span class="highlighted-parameter">${param}</span>`)
|
|
})
|
|
return text
|
|
},
|
|
|
|
init: () => {
|
|
rsg.initListenerSelection()
|
|
rsg.initShells()
|
|
},
|
|
|
|
initListenerSelection: () => {
|
|
rsgData.listenerCommands.forEach((listenerData, i) => {
|
|
const type = listenerData[0];
|
|
const command = listenerData[1];
|
|
|
|
const option = document.createElement("option");
|
|
|
|
option.value = command;
|
|
option.selected = rsg.listener === option.value;
|
|
option.classList.add("listener-option");
|
|
option.innerText = type;
|
|
|
|
listenerSelect.appendChild(option);
|
|
})
|
|
},
|
|
|
|
initShells: () => {
|
|
rsgData.shells.forEach((shell, i) => {
|
|
const option = document.createElement("option");
|
|
|
|
option.selected = rsg.shell === shell;
|
|
option.classList.add("shell-option");
|
|
option.innerText = shell;
|
|
|
|
shellSelect.appendChild(option);
|
|
})
|
|
},
|
|
|
|
// Updates the rsg state, and forces a re-render
|
|
setState: (newState = {}) => {
|
|
Object.keys(newState).forEach((key) => {
|
|
const value = newState[key];
|
|
rsg[key] = value;
|
|
localStorage.setItem(key, value)
|
|
});
|
|
Object.assign(rsg, newState);
|
|
|
|
rsg.update();
|
|
},
|
|
|
|
insertParameters: (command, encoder) => {
|
|
return command
|
|
.replaceAll(encoder('{ip}'), rsg.escapeHTML(encoder(rsg.getIP())))
|
|
.replaceAll(encoder('{port}'), encoder(String(rsg.getPort())))
|
|
.replaceAll(encoder('{shell}'), encoder(rsg.getShell()))
|
|
},
|
|
|
|
update: () => {
|
|
rsg.updateListenerCommand()
|
|
rsg.updateTabList()
|
|
rsg.updateReverseShellCommand()
|
|
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;
|
|
},
|
|
|
|
updateTabList: () => {
|
|
const data = rsgData.reverseShellCommands;
|
|
const filteredItems = filterCommandData(
|
|
data,
|
|
{
|
|
filter: rsg.filter,
|
|
commandType: rsg.commandType
|
|
}
|
|
);
|
|
|
|
const documentFragment = document.createDocumentFragment()
|
|
filteredItems.forEach((item, index) => {
|
|
const {
|
|
name,
|
|
command
|
|
} = item;
|
|
|
|
const selectionButton = document.createElement("button");
|
|
|
|
if (rsg.getSelectedCommandName() === item.name) {
|
|
selectionButton.classList.add("active");
|
|
}
|
|
|
|
const clickEvent = () => {
|
|
rsg.selectedValues[rsg.commandType] = name;
|
|
rsg.update();
|
|
|
|
// if (document.querySelector('#auto-copy-switch').checked) {
|
|
// rsg.copyToClipboard(reverseShellCommand.innerText)
|
|
// }
|
|
}
|
|
|
|
selectionButton.innerText = name;
|
|
selectionButton.classList.add("list-group-item", "list-group-item-action");
|
|
selectionButton.addEventListener("click", clickEvent);
|
|
|
|
documentFragment.appendChild(selectionButton);
|
|
})
|
|
|
|
const listSelectionSelector = rsg.uiElements[rsg.commandType].listSelection;
|
|
document.querySelector(listSelectionSelector).replaceChildren(documentFragment)
|
|
},
|
|
|
|
updateListenerCommand: () => {
|
|
const privilegeWarning = document.querySelector("#port-privileges-warning");
|
|
let command = listenerSelect.value;
|
|
command = rsg.highlightParameters(command)
|
|
command = command.replace('{port}', rsg.getPort())
|
|
|
|
if (rsg.getPort() < 1024) {
|
|
privilegeWarning.style.visibility = "visible";
|
|
command = `<span class="highlighted-warning">sudo</span> ${command}`
|
|
} else {
|
|
privilegeWarning.style.visibility = "hidden";
|
|
}
|
|
|
|
listenerCommand.innerHTML = command;
|
|
},
|
|
|
|
updateReverseShellSelection: () => {
|
|
document.querySelector(".list-group-item.active") ?.classList.remove("active");
|
|
const elements = Array.from(document.querySelectorAll(".list-group-item"));
|
|
const selectedElement = elements.find((item) => item.innerText === rsg.currentCommandName);
|
|
selectedElement?.classList.add("active");
|
|
},
|
|
|
|
updateReverseShellCommand: () => {
|
|
const command = rsg.generateReverseShellCommand();
|
|
const commandSelector = rsg.uiElements[rsg.commandType].command;
|
|
document.querySelector(commandSelector).innerHTML = command;
|
|
},
|
|
|
|
updateSwitchStates: () => {
|
|
$('#listener-advanced').collapse($('#listener-advanced-switch').prop('checked') ? 'show' :
|
|
'hide')
|
|
$('#revshell-advanced').collapse($('#revshell-advanced-switch').prop('checked') ? 'show' :
|
|
'hide')
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Init
|
|
*/
|
|
rsg.init();
|
|
rsg.update();
|
|
|
|
/*
|
|
* Event handlers/functions
|
|
*/
|
|
ipInput.addEventListener("input", (e) => {
|
|
rsg.setState({
|
|
ip: e.target.value
|
|
})
|
|
});
|
|
|
|
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
|
|
})
|
|
});
|
|
|
|
document.querySelector('#inc-port').addEventListener('click', () => {
|
|
rsg.setState({
|
|
port: rsg.getPort() + 1
|
|
})
|
|
})
|
|
|
|
document.querySelector('#listener-advanced-switch').addEventListener('change', rsg.updateSwitchStates);
|
|
document.querySelector('#revshell-advanced-switch').addEventListener('change', rsg.updateSwitchStates);
|
|
|
|
setInterval(rsg.updateSwitchStates, 500) // fix switch changes in rapid succession
|
|
|
|
document.querySelector('#copy-listener').addEventListener('click', () => {
|
|
rsg.copyToClipboard(listenerCommand.innerText)
|
|
})
|
|
|
|
document.querySelector('#copy-reverse-shell-command').addEventListener('click', () => {
|
|
rsg.copyToClipboard(reverseShellCommand.innerText)
|
|
})
|
|
|
|
document.querySelector('#copy-bind-shell-command').addEventListener('click', () => {
|
|
rsg.copyToClipboard(bindShellCommand.innerText)
|
|
})
|
|
|
|
document.querySelector('#copy-msfvenom-command').addEventListener('click', () => {
|
|
rsg.copyToClipboard(msfVenomCommand.innerText)
|
|
})
|
|
|
|
// autoCopySwitch.addEventListener("change", () => {
|
|
// setLocalStorage(autoCopySwitch, "auto-copy", "checked");
|
|
// });
|
|
|
|
// Popper tooltips
|
|
$(function () {
|
|
$('[data-toggle="tooltip"]').tooltip()
|
|
});
|
|
|
|
// TODO: add a random fifo for netcat mkfifo
|
|
//let randomId = Math.random().toString(36).substring(2, 4);
|
|
</script>
|
|
|
|
<script src="js/light-mode-switch.min.js"></script>
|
|
|
|
</body>
|
|
|
|
</html>
|