mirror of
https://github.com/SpacehuhnTech/esp8266_deauther.git
synced 2025-12-23 06:59:59 +01:00
Splitted JS part of the HTML files
This commit is contained in:
@@ -11,7 +11,7 @@ void Attack::generate(){
|
|||||||
uint8_t _randomMacBuffer[6];
|
uint8_t _randomMacBuffer[6];
|
||||||
beaconAdrs._clear();
|
beaconAdrs._clear();
|
||||||
|
|
||||||
for(int i=0;i<macListLen;i++) channels[i] = random(1,12);
|
for(int i=0;i<macListLen;i++) channels[i] = random(1,maxChannel);
|
||||||
do{
|
do{
|
||||||
getRandomVendorMac(_randomMacBuffer);
|
getRandomVendorMac(_randomMacBuffer);
|
||||||
for(int i=0;i<6;i++) _randomBeaconMac.setAt(_randomMacBuffer[i],i);
|
for(int i=0;i<6;i++) _randomBeaconMac.setAt(_randomMacBuffer[i],i);
|
||||||
@@ -136,7 +136,7 @@ void Attack::run(){
|
|||||||
_selectedClients++;
|
_selectedClients++;
|
||||||
|
|
||||||
if(settings.channelHop){
|
if(settings.channelHop){
|
||||||
for(int j=1;j<12;j++){
|
for(int j=1;j<maxChannel;j++){
|
||||||
wifi_set_channel(j);
|
wifi_set_channel(j);
|
||||||
|
|
||||||
buildDeauth(_ap, clientScan.getClientMac(i), 0xc0, settings.deauthReason );
|
buildDeauth(_ap, clientScan.getClientMac(i), 0xc0, settings.deauthReason );
|
||||||
@@ -160,7 +160,7 @@ void Attack::run(){
|
|||||||
_client.set(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);
|
_client.set(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);
|
||||||
|
|
||||||
if(settings.channelHop){
|
if(settings.channelHop){
|
||||||
for(int j=1;j<12;j++){
|
for(int j=1;j<maxChannel;j++){
|
||||||
wifi_set_channel(j);
|
wifi_set_channel(j);
|
||||||
|
|
||||||
buildDeauth(_ap, _client, 0xc0, settings.deauthReason );
|
buildDeauth(_ap, _client, 0xc0, settings.deauthReason );
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#ifndef Attack_h
|
#ifndef Attack_h
|
||||||
#define Attack_h
|
#define Attack_h
|
||||||
|
|
||||||
|
#define maxChannel 11
|
||||||
|
|
||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ void Settings::load(){
|
|||||||
|
|
||||||
ssidHidden = (bool)EEPROM.read(ssidHiddenAdr);
|
ssidHidden = (bool)EEPROM.read(ssidHiddenAdr);
|
||||||
|
|
||||||
if((int)EEPROM.read(apChannelAdr) >= 1 && (int)EEPROM.read(apChannelAdr) <= 11){
|
if((int)EEPROM.read(apChannelAdr) >= 1 && (int)EEPROM.read(apChannelAdr) <= 14){
|
||||||
apChannel = (int)EEPROM.read(apChannelAdr);
|
apChannel = (int)EEPROM.read(apChannelAdr);
|
||||||
} else {
|
} else {
|
||||||
apChannel = 1;
|
apChannel = 1;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -74,12 +74,17 @@ void setup() {
|
|||||||
/* HTML sites */
|
/* HTML sites */
|
||||||
server.onNotFound(load404);
|
server.onNotFound(load404);
|
||||||
|
|
||||||
server.on("/", loadIndex);
|
server.on("/", loadIndexHTML);
|
||||||
server.on("/index.html", loadIndex);
|
server.on("/index", loadIndexHTML);
|
||||||
server.on("/clients.html", loadClients);
|
server.on("/clients", loadClientsHTML);
|
||||||
server.on("/attack.html", loadAttack);
|
server.on("/attack", loadAttackHTML);
|
||||||
server.on("/settings.html", loadSettings);
|
server.on("/settings", loadSettingsHTML);
|
||||||
server.on("/functions.js", loadFunctionsJS);
|
|
||||||
|
server.on("/js/index.js", loadIndexJS);
|
||||||
|
server.on("/js/clients.js", loadClientsJS);
|
||||||
|
server.on("/js/attack.js", loadAttackJS);
|
||||||
|
server.on("/js/settings.js", loadSettingsJS);
|
||||||
|
server.on("/js/functions.js", loadFunctionsJS);
|
||||||
|
|
||||||
/* header links */
|
/* header links */
|
||||||
server.on ("/style.css", loadStyle);
|
server.on ("/style.css", loadStyle);
|
||||||
@@ -123,31 +128,45 @@ void loop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void load404() {
|
void loadIndexHTML() {
|
||||||
server.send ( 200, "text/html", data_get404());
|
|
||||||
}
|
|
||||||
void loadIndex() {
|
|
||||||
server.send ( 200, "text/html", data_getIndexHTML());
|
server.send ( 200, "text/html", data_getIndexHTML());
|
||||||
}
|
}
|
||||||
void loadClients() {
|
void loadClientsHTML() {
|
||||||
server.send ( 200, "text/html", data_getClientsHTML());
|
server.send ( 200, "text/html", data_getClientsHTML());
|
||||||
}
|
}
|
||||||
void loadAttack() {
|
void loadAttackHTML() {
|
||||||
server.send ( 200, "text/html", data_getAttackHTML());
|
server.send ( 200, "text/html", data_getAttackHTML());
|
||||||
}
|
}
|
||||||
|
void loadSettingsHTML() {
|
||||||
|
server.send( 200, "text/html", data_getSettingsHTML());
|
||||||
|
}
|
||||||
|
void load404() {
|
||||||
|
server.send ( 404, "text/html", data_get404());
|
||||||
|
}
|
||||||
|
|
||||||
void loadFunctionsJS() {
|
void loadFunctionsJS() {
|
||||||
server.send( 200, "text/javascript", data_getFunctionsJS());
|
server.send( 200, "text/javascript", data_getFunctionsJS());
|
||||||
}
|
}
|
||||||
|
void loadIndexJS() {
|
||||||
|
server.send ( 200, "text/javascript", data_getIndexJS());
|
||||||
|
}
|
||||||
|
void loadClientsJS() {
|
||||||
|
server.send ( 200, "text/javascript", data_getClientsJS());
|
||||||
|
}
|
||||||
|
void loadAttackJS() {
|
||||||
|
server.send ( 200, "text/javascript", data_getAttackJS());
|
||||||
|
}
|
||||||
|
void loadSettingsJS() {
|
||||||
|
server.send( 200, "text/html", data_getSettingsJS());
|
||||||
|
}
|
||||||
|
|
||||||
void loadStyle() {
|
void loadStyle() {
|
||||||
server.send ( 200, "text/css", data_getStyle());
|
server.send ( 200, "text/css", data_getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadManifest() {
|
void loadManifest() {
|
||||||
server.send ( 200, "text/css", data_getManifest());
|
server.send ( 200, "text/css", data_getManifest());
|
||||||
}
|
}
|
||||||
void loadSettings() {
|
|
||||||
server.send( 200, "text/html", data_getSettingsHTML() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//==========AP-Scan==========
|
//==========AP-Scan==========
|
||||||
void startAPScan() {
|
void startAPScan() {
|
||||||
@@ -273,7 +292,7 @@ void saveSettings() {
|
|||||||
}
|
}
|
||||||
if (server.hasArg("password")) settings.password = server.arg("password");
|
if (server.hasArg("password")) settings.password = server.arg("password");
|
||||||
if (server.hasArg("apChannel")) {
|
if (server.hasArg("apChannel")) {
|
||||||
if(server.arg("apChannel").toInt() >= 1 && server.arg("apChannel").toInt() <= 11){
|
if(server.arg("apChannel").toInt() >= 1 && server.arg("apChannel").toInt() <= 14){
|
||||||
settings.apChannel = server.arg("apChannel").toInt();
|
settings.apChannel = server.arg("apChannel").toInt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,171 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link rel="stylesheet" href="style.css">
|
|
||||||
<script src="functions.js"></script>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav>
|
|
||||||
<a href="index.html">APs</a>
|
|
||||||
<a href="clients.html">Clients</a>
|
|
||||||
<a href="attack.html">Attack</a>
|
|
||||||
<a href="settings.html">Settings</a>
|
|
||||||
<ul class="nav right">
|
|
||||||
<a href="#" onclick="restartESP()">Restart</a>
|
|
||||||
<ul>
|
|
||||||
</nav>
|
|
||||||
<div id="content">
|
|
||||||
<h1>Attack</h1>
|
|
||||||
|
|
||||||
<p class="block bold">Selected AP:</p>
|
|
||||||
<ul id="selectedAPs">
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<p class="block bold">Selected Clients:</p>
|
|
||||||
<ul id="selectedClients">
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<table>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p class="small">
|
|
||||||
<br />
|
|
||||||
<b>deauth [deauthentication attack]:</b><br />
|
|
||||||
Sends deauthentication frames and dissociation frames to the selected client(s) in the selected WiFi access point(s).
|
|
||||||
<br />
|
|
||||||
<b>Note: </b>
|
|
||||||
If no client is selected, the packets are sent as broadcast!
|
|
||||||
<br /><br />
|
|
||||||
<b>beacon [beacon flood attack]:</b><br />
|
|
||||||
(clone:) Spams beacon frames with a similar SSID as the selected WiFi access point(s).<br />
|
|
||||||
(list:) Spams beacon frames with all SSIDs in the list below.
|
|
||||||
<br /><br />
|
|
||||||
<b>probe request [probe request flood attack]:</b><br />
|
|
||||||
Spams probe request frames with all SSIDs in the list below.<br />
|
|
||||||
Usefull to confuse and spam WiFi trackers.
|
|
||||||
</p>
|
|
||||||
<br />
|
|
||||||
<p class="block bold">SSIDs: <span id="ssidCounter">0/64</span> <button class="marginNull warnBtn" onclick="clearSSID()">clear</button> <button class="marginNull" onclick="randomSSID()">random</button> <button class="marginNull" onclick="cloneSSID()">clone</button> <button class="marginNull" onclick="addSSID()">add</button></p>
|
|
||||||
<br />
|
|
||||||
<table>
|
|
||||||
</table>
|
|
||||||
<br />
|
|
||||||
<button class="marginNull warnBtn" onclick="resetSSID()">reset</button> <button class="marginNull" onclick="saveSSID()">save</button> <p class="small" id="saved">saved</p>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
<script>
|
|
||||||
var selectedAPs = document.getElementById("selectedAPs");
|
|
||||||
var selectedClients = document.getElementById("selectedClients");
|
|
||||||
var table = document.getElementsByTagName("table")[0];
|
|
||||||
var ssidList = document.getElementsByTagName("table")[1];
|
|
||||||
var saved = document.getElementById("saved");
|
|
||||||
var ssidCounter = document.getElementById("ssidCounter");
|
|
||||||
var resultInterval;
|
|
||||||
var res;
|
|
||||||
|
|
||||||
function getResults(){
|
|
||||||
getResponse("attackInfo.json",function(responseText){
|
|
||||||
res = JSON.parse(responseText);
|
|
||||||
var aps = "";
|
|
||||||
var clients = "";
|
|
||||||
var tr = "<tr><th>Attack</th><th>Status</th><th>Start/Stop</th></tr>";
|
|
||||||
for(var i=0;i<res.aps.length;i++) aps += "<li>"+res.aps[i]+"</li>";
|
|
||||||
for(var i=0;i<res.clients.length;i++) clients += "<li>"+res.clients[i]+"</li>";
|
|
||||||
|
|
||||||
selectedAPs.innerHTML = aps;
|
|
||||||
selectedClients.innerHTML = clients;
|
|
||||||
|
|
||||||
for(var i=0;i<res.attacks.length;i++){
|
|
||||||
if(res.attacks[i].running) tr += "<tr class='selected'>";
|
|
||||||
else tr += "<tr>";
|
|
||||||
|
|
||||||
tr += "<td>"+res.attacks[i].name+"</td>";
|
|
||||||
if(res.attacks[i].status == "ready") tr += "<td style='color:#1ecb1e'>"+res.attacks[i].status+"</td>";
|
|
||||||
else tr += "<td style='color:#f00'>"+res.attacks[i].status+"</td>";
|
|
||||||
if(res.attacks[i].running) tr += "<td><button class='marginNull selectedBtn' onclick='startStop("+i+")'>stop</button></td>";
|
|
||||||
else tr += "<td><button class='marginNull' onclick='startStop("+i+")'>start</button></td>";
|
|
||||||
|
|
||||||
tr += "</tr>";
|
|
||||||
}
|
|
||||||
table.innerHTML = tr;
|
|
||||||
|
|
||||||
ssidCounter.innerHTML = res.ssid.length+"/64";
|
|
||||||
|
|
||||||
var tr = "<tr><th>Name</th><th>X</th></tr>";
|
|
||||||
for(var i=0;i<res.ssid.length;i++){
|
|
||||||
tr += "<tr>";
|
|
||||||
tr += "<td>"+res.ssid[i]+"</td>";
|
|
||||||
tr += '<td><button class="marginNull warnBtn" onclick="deleteSSID('+i+')">x</button></td>';
|
|
||||||
tr += "</tr>";
|
|
||||||
}
|
|
||||||
ssidList.innerHTML = tr;
|
|
||||||
|
|
||||||
},function(){
|
|
||||||
clearInterval(resultInterval);
|
|
||||||
location.reload();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function startStop(num){
|
|
||||||
getResponse("attackStart.json?num="+num,function(responseText){
|
|
||||||
if(responseText == "true") getResults();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function addSSID(){
|
|
||||||
saved.innerHTML = "";
|
|
||||||
if(res.ssid.length >= 64) alert("SSID list full :(");
|
|
||||||
else{
|
|
||||||
var _ssidName = prompt("new SSID:");
|
|
||||||
if(_ssidName != null) getResponse("addSSID.json?name="+_ssidName,getResults);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function cloneSSID(){
|
|
||||||
saved.innerHTML = "";
|
|
||||||
if(res.ssid.length >= 64) alert("SSID list full :(");
|
|
||||||
else{
|
|
||||||
var _ssidName = prompt("new SSID:");
|
|
||||||
if(_ssidName != null) getResponse("cloneSSID.json?name="+_ssidName,getResults);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function deleteSSID(num){
|
|
||||||
saved.innerHTML = "";
|
|
||||||
getResponse("deleteSSID.json?num="+num,getResults);
|
|
||||||
}
|
|
||||||
|
|
||||||
function randomSSID(){
|
|
||||||
saved.innerHTML = "";
|
|
||||||
getResponse("randomSSID.json",getResults);
|
|
||||||
}
|
|
||||||
function clearSSID(){
|
|
||||||
saved.innerHTML = "";
|
|
||||||
getResponse("clearSSID.json",getResults);
|
|
||||||
}
|
|
||||||
function saveSSID(){
|
|
||||||
saved.innerHTML = "saved";
|
|
||||||
getResponse("saveSSID.json",getResults);
|
|
||||||
}
|
|
||||||
function resetSSID(){
|
|
||||||
saved.innerHTML = "saved";
|
|
||||||
getResponse("resetSSID.json",getResults);
|
|
||||||
}
|
|
||||||
|
|
||||||
function restartESP(){
|
|
||||||
getResponse("restartESP.json", function(responseText){
|
|
||||||
if(responseText == "true") getData();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getResults();
|
|
||||||
resultInterval = setInterval(getResults,3000);
|
|
||||||
</script>
|
|
||||||
</html>
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link rel="stylesheet" href="style.css">
|
|
||||||
<script src="functions.js"></script>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav>
|
|
||||||
<a href="index.html">APs</a>
|
|
||||||
<a href="clients.html">Clients</a>
|
|
||||||
<a href="attack.html">Attack</a>
|
|
||||||
<a href="settings.html">Settings</a>
|
|
||||||
<ul class="nav right">
|
|
||||||
<a href="#" onclick="restartESP()">Restart</a>
|
|
||||||
<ul>
|
|
||||||
</nav>
|
|
||||||
<div id="content">
|
|
||||||
<h1>Scan for client devices</h1>
|
|
||||||
|
|
||||||
<label for="scanTime">Scan time:</label>
|
|
||||||
<input type="number" id="scanTime" value="10">s
|
|
||||||
|
|
||||||
<button onclick="scan()" id="startScan">start</button>
|
|
||||||
<a id="clientScanStatus">ready!</a>
|
|
||||||
<br />
|
|
||||||
<p class="warn" id="status">AP will be off while scanning!<p>
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<p class="block bold" id="clientsFound">Client devices found: 0</p>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
<script>
|
|
||||||
var table = document.getElementsByTagName('table')[0];
|
|
||||||
var scanBtn = document.getElementById("startScan");
|
|
||||||
var scanTime = document.getElementById("scanTime");
|
|
||||||
var clientsFound = document.getElementById("clientsFound");
|
|
||||||
var scanStatus = document.getElementById("clientScanStatus");
|
|
||||||
|
|
||||||
var res;
|
|
||||||
|
|
||||||
function compare(a,b) {
|
|
||||||
if (a.p > b.p) return -1;
|
|
||||||
if (a.p < b.p) return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleBtn(onoff){
|
|
||||||
if(onoff){
|
|
||||||
scanBtn.style.visibility = 'visible';
|
|
||||||
}else{
|
|
||||||
scanBtn.style.visibility = 'hidden';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getResults(reload){
|
|
||||||
if(reload === undefined){
|
|
||||||
reload = false;
|
|
||||||
}
|
|
||||||
getResponse("ClientScanResults.json",function(responseText){
|
|
||||||
res = JSON.parse(responseText);
|
|
||||||
res.clients = res.clients.sort(compare);
|
|
||||||
|
|
||||||
clientsFound.innerHTML = "Client devices found: "+res.clients.length;
|
|
||||||
|
|
||||||
var tr = '';
|
|
||||||
if(res.clients.length > 0) tr += '<tr><th>Pkts</th><th>Vendor</th><th>Name</th><th>MAC</th><th>AP</th><th>Select</th></tr>';
|
|
||||||
|
|
||||||
for(var i=0;i<res.clients.length;i++){
|
|
||||||
|
|
||||||
if(res.clients[i].s == 1) tr += '<tr class="selected">';
|
|
||||||
else tr += '<tr>';
|
|
||||||
tr += '<td>'+res.clients[i].p+'</td>';
|
|
||||||
tr += '<td>'+res.clients[i].v+'</td>';
|
|
||||||
tr += '<td>'+res.clients[i].n+' <a class="blue" onclick="changeName('+res.clients[i].i+')">edit</a></td>';
|
|
||||||
tr += '<td>'+res.clients[i].m+'</td>';
|
|
||||||
tr += '<td>'+res.clients[i].a+'</td>';
|
|
||||||
|
|
||||||
if(res.clients[i].s == 1) tr += '<td><button class="marginNull selectedBtn" onclick="select('+res.clients[i].i+')">deselect</button></td>';
|
|
||||||
else tr += '<td><button class="marginNull" onclick="select('+res.clients[i].i+')">select</button></td>';
|
|
||||||
|
|
||||||
tr += '</tr>';
|
|
||||||
}
|
|
||||||
table.innerHTML = tr;
|
|
||||||
toggleBtn(true);
|
|
||||||
scanStatus.innerHTML = "";
|
|
||||||
|
|
||||||
if(reload == true) location.reload();
|
|
||||||
|
|
||||||
},function(){
|
|
||||||
location.reload();
|
|
||||||
},6000);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function scan(){
|
|
||||||
getResponse("ClientScan.json?time="+scanTime.value,function(responseText){
|
|
||||||
if(responseText == "true"){
|
|
||||||
scanStatus.innerHTML = "scanning...";
|
|
||||||
toggleBtn(false);
|
|
||||||
setTimeout(function(){
|
|
||||||
scanStatus.innerHTML = "reconnecting...";
|
|
||||||
getResults(true);
|
|
||||||
},scanTime.value*1000);
|
|
||||||
}
|
|
||||||
else alert(responseText);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function select(num){
|
|
||||||
getResponse("clientSelect.json?num="+num,function(responseText){
|
|
||||||
if(responseText == "true") getResults();
|
|
||||||
else alert("error :/");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeName(id){
|
|
||||||
var newName = prompt("Name for "+res.clients[id].m);
|
|
||||||
if(newName != null){
|
|
||||||
getResponse("setName.json?id="+id+"&name="+newName,function(responseText){
|
|
||||||
if(responseText == "true") getResults();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function restartESP(){
|
|
||||||
getResponse("restartESP.json", function(responseText){
|
|
||||||
if(responseText == "true") getData();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getResponse("ClientScanTime.json",function(responseText){
|
|
||||||
scanTime.value = responseText;
|
|
||||||
});
|
|
||||||
|
|
||||||
getResults();
|
|
||||||
</script>
|
|
||||||
</html>
|
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link rel="stylesheet" href="style.css">
|
|
||||||
<script src="functions.js"></script>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav>
|
|
||||||
<a href="index.html">APs</a>
|
|
||||||
<a href="clients.html">Clients</a>
|
|
||||||
<a href="attack.html">Attack</a>
|
|
||||||
<a href="settings.html">Settings</a>
|
|
||||||
<ul class="nav right">
|
|
||||||
<a href="#" onclick="restartESP()">Restart</a>
|
|
||||||
<ul>
|
|
||||||
</nav>
|
|
||||||
<div id="content">
|
|
||||||
<h1>Scan for WiFi access points</h1>
|
|
||||||
|
|
||||||
<button onclick="scan()" id="apScanStart">scan</button>
|
|
||||||
<a id="scanInfo">scanning...</a>
|
|
||||||
|
|
||||||
<p class="block bold" id="networksFound">Networks found: 0</p>
|
|
||||||
<p class="small">
|
|
||||||
MAC: <span id="apMAC"></span>
|
|
||||||
</p>
|
|
||||||
<br />
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
</table>
|
|
||||||
<p class="small" id="wpa_info">
|
|
||||||
<br />
|
|
||||||
WPA* = WPA/WPA2 auto mode
|
|
||||||
<br>
|
|
||||||
continuous scan: <button onclick="startConScan()" id="startStopScan">start</button>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
<script>
|
|
||||||
var table = document.getElementsByTagName('table')[0];
|
|
||||||
var networkInfo = document.getElementById('networksFound');
|
|
||||||
var scanBtn = document.getElementById('apScanStart');
|
|
||||||
var scanInfo = document.getElementById('scanInfo');
|
|
||||||
var apMAC = document.getElementById('apMAC');
|
|
||||||
var startStopScan = document.getElementById('startStopScan');
|
|
||||||
var autoScan = false;
|
|
||||||
var canScan = true;
|
|
||||||
|
|
||||||
function toggleBtn(onoff){
|
|
||||||
if(onoff && !autoScan){
|
|
||||||
scanInfo.style.visibility = 'hidden';
|
|
||||||
scanBtn.style.visibility = 'visible';
|
|
||||||
}else{
|
|
||||||
scanInfo.style.visibility = 'visible';
|
|
||||||
scanBtn.style.visibility = 'hidden';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function compare(a,b) {
|
|
||||||
if (a.r > b.r) return -1;
|
|
||||||
if (a.r < b.r) return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getEncryption(num){
|
|
||||||
if(num == 8) return "WPA*";
|
|
||||||
else if(num == 4) return "WPA2";
|
|
||||||
else if(num == 2) return "WPA";
|
|
||||||
else if(num == 7) return "none";
|
|
||||||
else if(num == 5) return "WEP";
|
|
||||||
}
|
|
||||||
|
|
||||||
function getResults(){
|
|
||||||
toggleBtn(true);
|
|
||||||
getResponse("APScanResults.json",function(responseText){
|
|
||||||
var res = JSON.parse(responseText);
|
|
||||||
res.aps = res.aps.sort(compare);
|
|
||||||
networkInfo.innerHTML = "Networks found: "+res.aps.length;
|
|
||||||
apMAC.innerHTML = "";
|
|
||||||
|
|
||||||
var tr = '';
|
|
||||||
if(res.aps.length > 0) tr += '<tr><th>Ch</th><th>SSID</th><th>RSSI</th><th>Encrypt.</th><th>Select</th></tr>';
|
|
||||||
|
|
||||||
for(var i=0;i<res.aps.length;i++){
|
|
||||||
|
|
||||||
if(res.aps[i].se == 1) tr += '<tr class="selected">';
|
|
||||||
else tr += '<tr>';
|
|
||||||
tr += '<td>'+res.aps[i].c+'</td>';
|
|
||||||
tr += '<td>'+res.aps[i].ss+'</td>';
|
|
||||||
tr += '<td>'+res.aps[i].r+' <meter value="'+res.aps[i].r+'" max="-30" min="-100" low="-80" high="-60" optimum="-50"></meter></td>';
|
|
||||||
tr += '<td>'+getEncryption(res.aps[i].e)+'</td>';
|
|
||||||
|
|
||||||
if(res.aps[i].se){
|
|
||||||
tr += '<td><button class="marginNull selectedBtn" onclick="select('+res.aps[i].i+')">deselect</button></td>';
|
|
||||||
apMAC.innerHTML = res.aps[i].m;
|
|
||||||
}
|
|
||||||
else tr += '<td><button class="marginNull" onclick="select('+res.aps[i].i+')">select</button></td>';
|
|
||||||
tr += '</tr>';
|
|
||||||
}
|
|
||||||
table.innerHTML = tr;
|
|
||||||
canScan = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function scan(){
|
|
||||||
canScan = false;
|
|
||||||
toggleBtn(false);
|
|
||||||
getResponse("APScan.json",function(responseText){
|
|
||||||
if(responseText == "true") getResults();
|
|
||||||
else alert("error");
|
|
||||||
toggleBtn(true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function startConScan(){
|
|
||||||
if(autoScan){
|
|
||||||
autoScan = false;
|
|
||||||
startStopScan.innerHTML = "start";
|
|
||||||
toggleBtn(true);
|
|
||||||
}else{
|
|
||||||
autoScan = true;
|
|
||||||
startStopScan.innerHTML = "stop";
|
|
||||||
toggleBtn(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function select(num){
|
|
||||||
getResponse("APSelect.json?num="+num,function(responseText){
|
|
||||||
if(responseText == "true") getResults();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function restartESP(){
|
|
||||||
getResponse("restartESP.json", function(responseText){
|
|
||||||
if(responseText == "true") getData();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getResults();
|
|
||||||
|
|
||||||
setInterval(function(){
|
|
||||||
if(autoScan && canScan) scan();
|
|
||||||
},1000);
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</html>
|
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<link rel="stylesheet" href="style.css">
|
|
||||||
<script src="functions.js"></script>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav>
|
|
||||||
<a href="index.html">APs</a>
|
|
||||||
<a href="clients.html">Clients</a>
|
|
||||||
<a href="attack.html">Attack</a>
|
|
||||||
<a href="settings.html">Settings</a>
|
|
||||||
<ul class="right">
|
|
||||||
<a href="#" onclick="restartESP()">Restart</a>
|
|
||||||
<ul>
|
|
||||||
</nav>
|
|
||||||
<div id="content">
|
|
||||||
<h1>Settings</h1>
|
|
||||||
|
|
||||||
<p class="block bold">WiFi</p>
|
|
||||||
|
|
||||||
<label for="ssid">SSID:</label>
|
|
||||||
<input type="text" id="ssid" minlength="1" maxlength="32">
|
|
||||||
<br />
|
|
||||||
<label for="ssidHidden">hidden:</label>
|
|
||||||
<input type="checkbox" name="ssidHidden" id="ssidHidden" value="false">
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<label for="password">password:</label>
|
|
||||||
<input type="text" id="password" minlength="8" maxlength="32">
|
|
||||||
<p class="small">must have at least 8 characters! (needs restart)</p>
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<label for="apChannel">channel:</label>
|
|
||||||
<input type="number" id="apChannel" min="1" max="11">
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<p class="block bold">AP scan</p>
|
|
||||||
|
|
||||||
<label for="apScanHidden">scan for hidden APs:</label>
|
|
||||||
<input type="checkbox" name="apScanHidden" id="apScanHidden" value="false">
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<p class="block bold">Client Scan</p>
|
|
||||||
|
|
||||||
<label for="scanTime">default scan time:</label>
|
|
||||||
<input type="number" id="scanTime" min="1" max="255">s
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<p class="block bold">Attack</p>
|
|
||||||
|
|
||||||
<label for="timeout">timeout:</label>
|
|
||||||
<input type="number" id="timeout" min="-1" max="65536">s
|
|
||||||
<p class="small">0 = no timeout</p>
|
|
||||||
|
|
||||||
<label for="ssidEnc">WPA2 beacons:</label>
|
|
||||||
<input type="checkbox" name="ssidEnc" id="ssidEnc" value="false">
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<label for="useLed">use LED:</label>
|
|
||||||
<input type="checkbox" name="useLed" id="useLed" value="false">
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<label for="deauthReason">deauth reason:</label>
|
|
||||||
<input type="number" id="deauthReason" min="1" max="45">
|
|
||||||
<p class="small">reason codes: <a target="_blank" href="http://www.aboutcher.co.uk/2012/07/linux-wifi-deauthenticated-reason-codes/">click</a></p>
|
|
||||||
|
|
||||||
<label for="packetRate">packetrate:</label>
|
|
||||||
<input type="number" id="packetRate" min="1" max="100">pkts/s
|
|
||||||
<p class="small">only for deauth attack - may cause instability!</p>
|
|
||||||
|
|
||||||
<label for="channelHop">channel hopping:</label>
|
|
||||||
<input type="checkbox" name="channelHop" id="channelHop" value="false">
|
|
||||||
<p class="small">only for deauth attack - packetrate will be ignored!</p>
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<button class="warnBtn" onclick="resetSettings()">reset</button> <button onclick="saveSettings()">save</button><p class="small" id="saved"></p><br \>
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<p class="block bold" id="clientNames">Client Names</p>
|
|
||||||
<table id="nameList">
|
|
||||||
<tr><th>MAC</th><th>Vendor</th><th>Name</th><th>X</th></tr>
|
|
||||||
</table>
|
|
||||||
<br />
|
|
||||||
<button class="warnBtn" onclick="clearNameList()">clear</button></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
<script>
|
|
||||||
var nameListTable = document.getElementById('nameList');
|
|
||||||
var ssid = document.getElementById('ssid');
|
|
||||||
var ssidHidden = document.getElementById('ssidHidden');
|
|
||||||
var password = document.getElementById('password');
|
|
||||||
var apChannel = document.getElementById('apChannel');
|
|
||||||
var apScanHidden = document.getElementById('apScanHidden');
|
|
||||||
var scanTime = document.getElementById('scanTime');
|
|
||||||
var timeout = document.getElementById('timeout');
|
|
||||||
var deauthReason = document.getElementById('deauthReason');
|
|
||||||
var packetRate = document.getElementById('packetRate');
|
|
||||||
var saved = document.getElementById('saved');
|
|
||||||
var clientNames = document.getElementById('clientNames');
|
|
||||||
var ssidEnc = document.getElementById('ssidEnc');
|
|
||||||
var useLed = document.getElementById('useLed');
|
|
||||||
var channelHop = document.getElementById('channelHop');
|
|
||||||
var res;
|
|
||||||
|
|
||||||
function getData(){
|
|
||||||
getResponse("settings.json",function(responseText){
|
|
||||||
res = JSON.parse(responseText);
|
|
||||||
|
|
||||||
ssid.value = res.ssid;
|
|
||||||
ssidHidden.checked = res.ssidHidden;
|
|
||||||
password.value = res.password;
|
|
||||||
apChannel.value = res.apChannel;
|
|
||||||
apScanHidden.checked = res.apScanHidden;
|
|
||||||
scanTime.value = res.clientScanTime;
|
|
||||||
timeout.value = res.attackTimeout;
|
|
||||||
deauthReason.value = res.deauthReason;
|
|
||||||
packetRate.value = res.attackPacketRate;
|
|
||||||
ssidEnc.checked = res.attackEncrypted;
|
|
||||||
useLed.checked = res.useLed;
|
|
||||||
channelHop.checked = res.channelHop;
|
|
||||||
|
|
||||||
|
|
||||||
clientNames.innerHTML = "Client Names "+res.nameList.length+"/50";
|
|
||||||
|
|
||||||
var tr = '<tr><th>MAC</th><th>Vendor</th><th>Name</th><th>X</th></tr>';
|
|
||||||
|
|
||||||
for(var i=0;i<res.nameList.length;i++){
|
|
||||||
|
|
||||||
tr += '<tr>';
|
|
||||||
tr += '<td>'+res.nameList[i].m+'</td>';
|
|
||||||
tr += '<td>'+res.nameList[i].v+'</td>';
|
|
||||||
tr += '<td>'+res.nameList[i].n+' <a class="blue" onclick="changeName('+i+')">edit</a></td>';
|
|
||||||
tr += '<td><button class="marginNull warnBtn" onclick="deleteName('+i+')">x</button></td>';
|
|
||||||
|
|
||||||
tr += '</tr>';
|
|
||||||
}
|
|
||||||
|
|
||||||
nameListTable.innerHTML = tr;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeName(id){
|
|
||||||
var newName = prompt("Name for "+res.nameList[id].m);
|
|
||||||
if(newName != null){
|
|
||||||
getResponse("editNameList.json?id="+id+"&name="+newName,function(responseText){
|
|
||||||
if(responseText == "true") getData();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function deleteName(id){
|
|
||||||
getResponse("deleteName.json?num="+id,function(responseText){
|
|
||||||
if(responseText == "true") getData();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveSettings(){
|
|
||||||
saved.innerHTML = "saving...";
|
|
||||||
var url = "settingsSave.json";
|
|
||||||
url += "?ssid="+ssid.value;
|
|
||||||
url += "&ssidHidden="+ssidHidden.checked;
|
|
||||||
url += "&password="+password.value;
|
|
||||||
url += "&apChannel="+apChannel.value;
|
|
||||||
url += "&apScanHidden="+apScanHidden.checked;
|
|
||||||
url += "&scanTime="+scanTime.value;
|
|
||||||
url += "&timeout="+timeout.value;
|
|
||||||
url += "&deauthReason="+deauthReason.value;
|
|
||||||
url += "&packetRate="+packetRate.value;
|
|
||||||
url += "&ssidEnc="+ssidEnc.checked;
|
|
||||||
url += "&useLed="+useLed.checked;
|
|
||||||
url += "&channelHop="+channelHop.checked;
|
|
||||||
|
|
||||||
getResponse(url, function(responseText){
|
|
||||||
if(responseText == "true"){
|
|
||||||
getData();
|
|
||||||
saved.innerHTML = "saved";
|
|
||||||
}
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function resetSettings(){
|
|
||||||
getResponse("settingsReset.json", function(responseText){
|
|
||||||
if(responseText == "true"){
|
|
||||||
getData();
|
|
||||||
saved.innerHTML = "saved";
|
|
||||||
}
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearNameList(){
|
|
||||||
getResponse("clearNameList.json", function(responseText){
|
|
||||||
if(responseText == "true") getData();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function restartESP(){
|
|
||||||
getResponse("restartESP.json", function(responseText){
|
|
||||||
if(responseText == "true") getData();
|
|
||||||
else alert("error");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getData();
|
|
||||||
</script>
|
|
||||||
</html>
|
|
||||||
63
web_server/attack.html
Normal file
63
web_server/attack.html
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<a href="/">APs</a>
|
||||||
|
<a href="clients">Clients</a>
|
||||||
|
<a href="attack">Attack</a>
|
||||||
|
<a href="settings">Settings</a>
|
||||||
|
<ul class="nav right">
|
||||||
|
<a href="#" onclick="restartESP()">Restart</a>
|
||||||
|
<ul>
|
||||||
|
</nav>
|
||||||
|
<div id="content">
|
||||||
|
<h1>Attack</h1>
|
||||||
|
|
||||||
|
<p class="block bold">Selected AP:</p>
|
||||||
|
<ul id="selectedAPs">
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<p class="block bold">Selected Clients:</p>
|
||||||
|
<ul id="selectedClients">
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<table>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<p class="small">
|
||||||
|
<br />
|
||||||
|
<b>deauth [deauthentication attack]:</b><br />
|
||||||
|
Sends deauthentication frames and dissociation frames to the selected client(s) in the selected WiFi access point(s).
|
||||||
|
<br />
|
||||||
|
<b>Note: </b>
|
||||||
|
If no client is selected, the packets are sent as broadcast!
|
||||||
|
<br /><br />
|
||||||
|
<b>beacon [beacon flood attack]:</b><br />
|
||||||
|
(clone:) Spams beacon frames with a similar SSID as the selected WiFi access point(s).<br />
|
||||||
|
(list:) Spams beacon frames with all SSIDs in the list below.
|
||||||
|
<br /><br />
|
||||||
|
<b>probe request [probe request flood attack]:</b><br />
|
||||||
|
Spams probe request frames with all SSIDs in the list below.<br />
|
||||||
|
Usefull to confuse and spam WiFi trackers.
|
||||||
|
</p>
|
||||||
|
<br />
|
||||||
|
<p class="block bold">SSIDs: <span id="ssidCounter">0/64</span> <button class="marginNull warnBtn" onclick="clearSSID()">clear</button> <button class="marginNull" onclick="randomSSID()">random</button> <button class="marginNull" onclick="cloneSSID()">clone</button> <button class="marginNull" onclick="addSSID()">add</button></p>
|
||||||
|
<br />
|
||||||
|
<table>
|
||||||
|
</table>
|
||||||
|
<br />
|
||||||
|
<button class="marginNull warnBtn" onclick="resetSSID()">reset</button> <button class="marginNull" onclick="saveSSID()">save</button> <p class="small" id="saved">saved</p>
|
||||||
|
</div>
|
||||||
|
<script src="js/functions.js"></script>
|
||||||
|
<script src="js/attack.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
41
web_server/clients.html
Normal file
41
web_server/clients.html
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<a href="/">APs</a>
|
||||||
|
<a href="clients">Clients</a>
|
||||||
|
<a href="attack">Attack</a>
|
||||||
|
<a href="settings">Settings</a>
|
||||||
|
<ul class="nav right">
|
||||||
|
<a href="#" onclick="restartESP()">Restart</a>
|
||||||
|
<ul>
|
||||||
|
</nav>
|
||||||
|
<div id="content">
|
||||||
|
<h1>Scan for client devices</h1>
|
||||||
|
|
||||||
|
<label for="scanTime">Scan time:</label>
|
||||||
|
<input type="number" id="scanTime" value="10">s
|
||||||
|
|
||||||
|
<button onclick="scan()" id="startScan">start</button>
|
||||||
|
<a id="clientScanStatus">ready!</a>
|
||||||
|
<br />
|
||||||
|
<p class="warn" id="status">AP will be off while scanning!<p>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<p class="block bold" id="clientsFound">Client devices found: 0</p>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
</table>
|
||||||
|
<script src="js/functions.js"></script>
|
||||||
|
<script src="js/clients.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
43
web_server/index.html
Normal file
43
web_server/index.html
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<a href="/">APs</a>
|
||||||
|
<a href="clients">Clients</a>
|
||||||
|
<a href="attack">Attack</a>
|
||||||
|
<a href="settings">Settings</a>
|
||||||
|
<ul class="nav right">
|
||||||
|
<a href="#" onclick="restartESP()">Restart</a>
|
||||||
|
<ul>
|
||||||
|
</nav>
|
||||||
|
<div id="content">
|
||||||
|
<h1>Scan for WiFi access points</h1>
|
||||||
|
|
||||||
|
<button onclick="scan()" id="apScanStart">scan</button>
|
||||||
|
<a id="scanInfo">scanning...</a>
|
||||||
|
|
||||||
|
<p class="block bold" id="networksFound">Networks found: 0</p>
|
||||||
|
<p class="small">
|
||||||
|
MAC: <span id="apMAC"></span>
|
||||||
|
</p>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
</table>
|
||||||
|
<p class="small" id="wpa_info">
|
||||||
|
<br />
|
||||||
|
WPA* = WPA/WPA2 auto mode
|
||||||
|
<br>
|
||||||
|
continuous scan: <button onclick="startConScan()" id="startStopScan">start</button>
|
||||||
|
</p>
|
||||||
|
<script src="js/functions.js"></script>
|
||||||
|
<script src="js/index.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
101
web_server/js/attack.js
Normal file
101
web_server/js/attack.js
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
var selectedAPs = document.getElementById("selectedAPs");
|
||||||
|
var selectedClients = document.getElementById("selectedClients");
|
||||||
|
var table = document.getElementsByTagName("table")[0];
|
||||||
|
var ssidList = document.getElementsByTagName("table")[1];
|
||||||
|
var saved = document.getElementById("saved");
|
||||||
|
var ssidCounter = document.getElementById("ssidCounter");
|
||||||
|
var resultInterval;
|
||||||
|
var res;
|
||||||
|
|
||||||
|
function getResults() {
|
||||||
|
getResponse("attackInfo.json", function(responseText) {
|
||||||
|
res = JSON.parse(responseText);
|
||||||
|
var aps = "";
|
||||||
|
var clients = "";
|
||||||
|
var tr = "<tr><th>Attack</th><th>Status</th><th>Start/Stop</th></tr>";
|
||||||
|
for (var i = 0; i < res.aps.length; i++) aps += "<li>" + res.aps[i] + "</li>";
|
||||||
|
for (var i = 0; i < res.clients.length; i++) clients += "<li>" + res.clients[i] + "</li>";
|
||||||
|
|
||||||
|
selectedAPs.innerHTML = aps;
|
||||||
|
selectedClients.innerHTML = clients;
|
||||||
|
|
||||||
|
for (var i = 0; i < res.attacks.length; i++) {
|
||||||
|
if (res.attacks[i].running) tr += "<tr class='selected'>";
|
||||||
|
else tr += "<tr>";
|
||||||
|
|
||||||
|
tr += "<td>" + res.attacks[i].name + "</td>";
|
||||||
|
if (res.attacks[i].status == "ready") tr += "<td style='color:#1ecb1e'>" + res.attacks[i].status + "</td>";
|
||||||
|
else tr += "<td style='color:#f00'>" + res.attacks[i].status + "</td>";
|
||||||
|
if (res.attacks[i].running) tr += "<td><button class='marginNull selectedBtn' onclick='startStop(" + i + ")'>stop</button></td>";
|
||||||
|
else tr += "<td><button class='marginNull' onclick='startStop(" + i + ")'>start</button></td>";
|
||||||
|
|
||||||
|
tr += "</tr>";
|
||||||
|
}
|
||||||
|
table.innerHTML = tr;
|
||||||
|
|
||||||
|
ssidCounter.innerHTML = res.ssid.length + "/64";
|
||||||
|
|
||||||
|
var tr = "<tr><th>Name</th><th>X</th></tr>";
|
||||||
|
for (var i = 0; i < res.ssid.length; i++) {
|
||||||
|
tr += "<tr>";
|
||||||
|
tr += "<td>" + res.ssid[i] + "</td>";
|
||||||
|
tr += '<td><button class="marginNull warnBtn" onclick="deleteSSID(' + i + ')">x</button></td>';
|
||||||
|
tr += "</tr>";
|
||||||
|
}
|
||||||
|
ssidList.innerHTML = tr;
|
||||||
|
|
||||||
|
}, function() {
|
||||||
|
clearInterval(resultInterval);
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function startStop(num) {
|
||||||
|
getResponse("attackStart.json?num=" + num, function(responseText) {
|
||||||
|
if (responseText == "true") getResults();
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function addSSID() {
|
||||||
|
saved.innerHTML = "";
|
||||||
|
if (res.ssid.length >= 64) alert("SSID list full :(");
|
||||||
|
else {
|
||||||
|
var _ssidName = prompt("new SSID:");
|
||||||
|
if (_ssidName != null) getResponse("addSSID.json?name=" + _ssidName, getResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloneSSID() {
|
||||||
|
saved.innerHTML = "";
|
||||||
|
if (res.ssid.length >= 64) alert("SSID list full :(");
|
||||||
|
else {
|
||||||
|
var _ssidName = prompt("new SSID:");
|
||||||
|
if (_ssidName != null) getResponse("cloneSSID.json?name=" + _ssidName, getResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteSSID(num) {
|
||||||
|
saved.innerHTML = "";
|
||||||
|
getResponse("deleteSSID.json?num=" + num, getResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomSSID() {
|
||||||
|
saved.innerHTML = "";
|
||||||
|
getResponse("randomSSID.json", getResults);
|
||||||
|
}
|
||||||
|
function clearSSID() {
|
||||||
|
saved.innerHTML = "";
|
||||||
|
getResponse("clearSSID.json", getResults);
|
||||||
|
}
|
||||||
|
function saveSSID() {
|
||||||
|
saved.innerHTML = "saved";
|
||||||
|
getResponse("saveSSID.json", getResults);
|
||||||
|
}
|
||||||
|
function resetSSID() {
|
||||||
|
saved.innerHTML = "saved";
|
||||||
|
getResponse("resetSSID.json", getResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
getResults();
|
||||||
|
resultInterval = setInterval(getResults, 3000);
|
||||||
98
web_server/js/clients.js
Normal file
98
web_server/js/clients.js
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
var table = document.getElementsByTagName('table')[0];
|
||||||
|
var scanBtn = document.getElementById("startScan");
|
||||||
|
var scanTime = document.getElementById("scanTime");
|
||||||
|
var clientsFound = document.getElementById("clientsFound");
|
||||||
|
var scanStatus = document.getElementById("clientScanStatus");
|
||||||
|
|
||||||
|
var res;
|
||||||
|
|
||||||
|
function compare(a, b) {
|
||||||
|
if (a.p > b.p) return -1;
|
||||||
|
if (a.p < b.p) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleBtn(onoff) {
|
||||||
|
if (onoff) {
|
||||||
|
scanBtn.style.visibility = 'visible';
|
||||||
|
} else {
|
||||||
|
scanBtn.style.visibility = 'hidden';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getResults(reload) {
|
||||||
|
if (reload == undefined) {
|
||||||
|
reload = false;
|
||||||
|
}
|
||||||
|
getResponse("ClientScanResults.json", function(responseText) {
|
||||||
|
res = JSON.parse(responseText);
|
||||||
|
res.clients = res.clients.sort(compare);
|
||||||
|
|
||||||
|
clientsFound.innerHTML = "Client devices found: " + res.clients.length;
|
||||||
|
|
||||||
|
var tr = '';
|
||||||
|
if (res.clients.length > 0) tr += '<tr><th>Pkts</th><th>Vendor</th><th>Name</th><th>MAC</th><th>AP</th><th>Select</th></tr>';
|
||||||
|
|
||||||
|
for (var i = 0; i < res.clients.length; i++) {
|
||||||
|
|
||||||
|
if (res.clients[i].s == 1) tr += '<tr class="selected">';
|
||||||
|
else tr += '<tr>';
|
||||||
|
tr += '<td>' + res.clients[i].p + '</td>';
|
||||||
|
tr += '<td>' + res.clients[i].v + '</td>';
|
||||||
|
tr += '<td>' + res.clients[i].n + ' <a class="blue" onclick="changeName(' + res.clients[i].i + ')">edit</a></td>';
|
||||||
|
tr += '<td>' + res.clients[i].m + '</td>';
|
||||||
|
tr += '<td>' + res.clients[i].a + '</td>';
|
||||||
|
|
||||||
|
if (res.clients[i].s == 1) tr += '<td><button class="marginNull selectedBtn" onclick="select(' + res.clients[i].i + ')">deselect</button></td>';
|
||||||
|
else tr += '<td><button class="marginNull" onclick="select(' + res.clients[i].i + ')">select</button></td>';
|
||||||
|
|
||||||
|
tr += '</tr>';
|
||||||
|
}
|
||||||
|
table.innerHTML = tr;
|
||||||
|
toggleBtn(true);
|
||||||
|
scanStatus.innerHTML = "";
|
||||||
|
|
||||||
|
if (reload == true) location.reload();
|
||||||
|
|
||||||
|
}, function() {
|
||||||
|
location.reload();
|
||||||
|
}, 6000);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function scan() {
|
||||||
|
getResponse("ClientScan.json?time=" + scanTime.value, function(responseText) {
|
||||||
|
if (responseText == "true") {
|
||||||
|
scanStatus.innerHTML = "scanning...";
|
||||||
|
toggleBtn(false);
|
||||||
|
setTimeout(function() {
|
||||||
|
scanStatus.innerHTML = "reconnecting...";
|
||||||
|
getResults(true);
|
||||||
|
}, scanTime.value * 1000);
|
||||||
|
}
|
||||||
|
else alert(responseText);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function select(num) {
|
||||||
|
getResponse("clientSelect.json?num=" + num, function(responseText) {
|
||||||
|
if (responseText == "true") getResults();
|
||||||
|
else alert("error :/");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeName(id) {
|
||||||
|
var newName = prompt("Name for " + res.clients[id].m);
|
||||||
|
if (newName != null) {
|
||||||
|
getResponse("setName.json?id=" + id + "&name=" + newName, function(responseText) {
|
||||||
|
if (responseText == "true") getResults();
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getResponse("ClientScanTime.json", function(responseText) {
|
||||||
|
scanTime.value = responseText;
|
||||||
|
});
|
||||||
|
|
||||||
|
getResults();
|
||||||
@@ -19,3 +19,10 @@ function getResponse(adr, callback, timeoutCallback, timeout){
|
|||||||
xmlhttp.timeout = timeout;
|
xmlhttp.timeout = timeout;
|
||||||
xmlhttp.ontimeout = timeoutCallback;
|
xmlhttp.ontimeout = timeoutCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function restartESP() {
|
||||||
|
getResponse("restartESP.json", function(responseText) {
|
||||||
|
if (responseText == "true") getData();
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
99
web_server/js/index.js
Normal file
99
web_server/js/index.js
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
var table = document.getElementsByTagName('table')[0];
|
||||||
|
var networkInfo = document.getElementById('networksFound');
|
||||||
|
var scanBtn = document.getElementById('apScanStart');
|
||||||
|
var scanInfo = document.getElementById('scanInfo');
|
||||||
|
var apMAC = document.getElementById('apMAC');
|
||||||
|
var startStopScan = document.getElementById('startStopScan');
|
||||||
|
var autoScan = false;
|
||||||
|
var canScan = true;
|
||||||
|
|
||||||
|
function toggleBtn(onoff) {
|
||||||
|
if (onoff && !autoScan) {
|
||||||
|
scanInfo.style.visibility = 'hidden';
|
||||||
|
scanBtn.style.visibility = 'visible';
|
||||||
|
} else {
|
||||||
|
scanInfo.style.visibility = 'visible';
|
||||||
|
scanBtn.style.visibility = 'hidden';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function compare(a, b) {
|
||||||
|
if (a.r > b.r) return -1;
|
||||||
|
if (a.r < b.r) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEncryption(num) {
|
||||||
|
if (num == 8) return "WPA*";
|
||||||
|
else if (num == 4) return "WPA2";
|
||||||
|
else if (num == 2) return "WPA";
|
||||||
|
else if (num == 7) return "none";
|
||||||
|
else if (num == 5) return "WEP";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getResults() {
|
||||||
|
toggleBtn(true);
|
||||||
|
getResponse("APScanResults.json", function(responseText) {
|
||||||
|
var res = JSON.parse(responseText);
|
||||||
|
res.aps = res.aps.sort(compare);
|
||||||
|
networkInfo.innerHTML = "Networks found: " + res.aps.length;
|
||||||
|
apMAC.innerHTML = "";
|
||||||
|
|
||||||
|
var tr = '';
|
||||||
|
if (res.aps.length > 0) tr += '<tr><th>Ch</th><th>SSID</th><th>RSSI</th><th>Encrypt.</th><th>Select</th></tr>';
|
||||||
|
|
||||||
|
for (var i = 0; i < res.aps.length; i++) {
|
||||||
|
|
||||||
|
if (res.aps[i].se == 1) tr += '<tr class="selected">';
|
||||||
|
else tr += '<tr>';
|
||||||
|
tr += '<td>' + res.aps[i].c + '</td>';
|
||||||
|
tr += '<td>' + res.aps[i].ss + '</td>';
|
||||||
|
tr += '<td>' + res.aps[i].r + ' <meter value="' + res.aps[i].r + '" max="-30" min="-100" low="-80" high="-60" optimum="-50"></meter></td>';
|
||||||
|
tr += '<td>' + getEncryption(res.aps[i].e) + '</td>';
|
||||||
|
|
||||||
|
if (res.aps[i].se) {
|
||||||
|
tr += '<td><button class="marginNull selectedBtn" onclick="select(' + res.aps[i].i + ')">deselect</button></td>';
|
||||||
|
apMAC.innerHTML = res.aps[i].m;
|
||||||
|
}
|
||||||
|
else tr += '<td><button class="marginNull" onclick="select(' + res.aps[i].i + ')">select</button></td>';
|
||||||
|
tr += '</tr>';
|
||||||
|
}
|
||||||
|
table.innerHTML = tr;
|
||||||
|
canScan = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function scan() {
|
||||||
|
canScan = false;
|
||||||
|
toggleBtn(false);
|
||||||
|
getResponse("APScan.json", function(responseText) {
|
||||||
|
if (responseText == "true") getResults();
|
||||||
|
else alert("error");
|
||||||
|
toggleBtn(true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function startConScan() {
|
||||||
|
if (autoScan) {
|
||||||
|
autoScan = false;
|
||||||
|
startStopScan.innerHTML = "start";
|
||||||
|
toggleBtn(true);
|
||||||
|
} else {
|
||||||
|
autoScan = true;
|
||||||
|
startStopScan.innerHTML = "stop";
|
||||||
|
toggleBtn(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function select(num) {
|
||||||
|
getResponse("APSelect.json?num=" + num, function(responseText) {
|
||||||
|
if (responseText == "true") getResults();
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getResults();
|
||||||
|
|
||||||
|
setInterval(function() {
|
||||||
|
if (autoScan && canScan) scan();
|
||||||
|
}, 1000);
|
||||||
114
web_server/js/settings.js
Normal file
114
web_server/js/settings.js
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
var nameListTable = document.getElementById('nameList');
|
||||||
|
var ssid = document.getElementById('ssid');
|
||||||
|
var ssidHidden = document.getElementById('ssidHidden');
|
||||||
|
var password = document.getElementById('password');
|
||||||
|
var apChannel = document.getElementById('apChannel');
|
||||||
|
var apScanHidden = document.getElementById('apScanHidden');
|
||||||
|
var scanTime = document.getElementById('scanTime');
|
||||||
|
var timeout = document.getElementById('timeout');
|
||||||
|
var deauthReason = document.getElementById('deauthReason');
|
||||||
|
var packetRate = document.getElementById('packetRate');
|
||||||
|
var saved = document.getElementById('saved');
|
||||||
|
var clientNames = document.getElementById('clientNames');
|
||||||
|
var ssidEnc = document.getElementById('ssidEnc');
|
||||||
|
var useLed = document.getElementById('useLed');
|
||||||
|
var channelHop = document.getElementById('channelHop');
|
||||||
|
var res;
|
||||||
|
|
||||||
|
function getData() {
|
||||||
|
getResponse("settings.json", function(responseText) {
|
||||||
|
res = JSON.parse(responseText);
|
||||||
|
|
||||||
|
ssid.value = res.ssid;
|
||||||
|
ssidHidden.checked = res.ssidHidden;
|
||||||
|
password.value = res.password;
|
||||||
|
apChannel.value = res.apChannel;
|
||||||
|
apScanHidden.checked = res.apScanHidden;
|
||||||
|
scanTime.value = res.clientScanTime;
|
||||||
|
timeout.value = res.attackTimeout;
|
||||||
|
deauthReason.value = res.deauthReason;
|
||||||
|
packetRate.value = res.attackPacketRate;
|
||||||
|
ssidEnc.checked = res.attackEncrypted;
|
||||||
|
useLed.checked = res.useLed;
|
||||||
|
channelHop.checked = res.channelHop;
|
||||||
|
|
||||||
|
|
||||||
|
clientNames.innerHTML = "Client Names " + res.nameList.length + "/50";
|
||||||
|
|
||||||
|
var tr = '<tr><th>MAC</th><th>Vendor</th><th>Name</th><th>X</th></tr>';
|
||||||
|
|
||||||
|
for (var i = 0; i < res.nameList.length; i++) {
|
||||||
|
|
||||||
|
tr += '<tr>';
|
||||||
|
tr += '<td>' + res.nameList[i].m + '</td>';
|
||||||
|
tr += '<td>' + res.nameList[i].v + '</td>';
|
||||||
|
tr += '<td>' + res.nameList[i].n + ' <a class="blue" onclick="changeName(' + i + ')">edit</a></td>';
|
||||||
|
tr += '<td><button class="marginNull warnBtn" onclick="deleteName(' + i + ')">x</button></td>';
|
||||||
|
|
||||||
|
tr += '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
nameListTable.innerHTML = tr;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeName(id) {
|
||||||
|
var newName = prompt("Name for " + res.nameList[id].m);
|
||||||
|
if (newName != null) {
|
||||||
|
getResponse("editNameList.json?id=" + id + "&name=" + newName, function(responseText) {
|
||||||
|
if (responseText == "true") getData();
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteName(id) {
|
||||||
|
getResponse("deleteName.json?num=" + id, function(responseText) {
|
||||||
|
if (responseText == "true") getData();
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveSettings() {
|
||||||
|
saved.innerHTML = "saving...";
|
||||||
|
var url = "settingsSave.json";
|
||||||
|
url += "?ssid=" + ssid.value;
|
||||||
|
url += "&ssidHidden=" + ssidHidden.checked;
|
||||||
|
url += "&password=" + password.value;
|
||||||
|
url += "&apChannel=" + apChannel.value;
|
||||||
|
url += "&apScanHidden=" + apScanHidden.checked;
|
||||||
|
url += "&scanTime=" + scanTime.value;
|
||||||
|
url += "&timeout=" + timeout.value;
|
||||||
|
url += "&deauthReason=" + deauthReason.value;
|
||||||
|
url += "&packetRate=" + packetRate.value;
|
||||||
|
url += "&ssidEnc=" + ssidEnc.checked;
|
||||||
|
url += "&useLed=" + useLed.checked;
|
||||||
|
url += "&channelHop=" + channelHop.checked;
|
||||||
|
|
||||||
|
getResponse(url, function(responseText) {
|
||||||
|
if (responseText == "true") {
|
||||||
|
getData();
|
||||||
|
saved.innerHTML = "saved";
|
||||||
|
}
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetSettings() {
|
||||||
|
getResponse("settingsReset.json", function(responseText) {
|
||||||
|
if (responseText == "true") {
|
||||||
|
getData();
|
||||||
|
saved.innerHTML = "saved";
|
||||||
|
}
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearNameList() {
|
||||||
|
getResponse("clearNameList.json", function(responseText) {
|
||||||
|
if (responseText == "true") getData();
|
||||||
|
else alert("error");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getData();
|
||||||
99
web_server/settings.html
Normal file
99
web_server/settings.html
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<a href="/">APs</a>
|
||||||
|
<a href="clients">Clients</a>
|
||||||
|
<a href="attack">Attack</a>
|
||||||
|
<a href="settings">Settings</a>
|
||||||
|
<ul class="right">
|
||||||
|
<a href="#" onclick="restartESP()">Restart</a>
|
||||||
|
<ul>
|
||||||
|
</nav>
|
||||||
|
<div id="content">
|
||||||
|
<h1>Settings</h1>
|
||||||
|
|
||||||
|
<p class="block bold">WiFi</p>
|
||||||
|
|
||||||
|
<label for="ssid">SSID:</label>
|
||||||
|
<input type="text" id="ssid" minlength="1" maxlength="32">
|
||||||
|
<br />
|
||||||
|
<label for="ssidHidden">hidden:</label>
|
||||||
|
<input type="checkbox" name="ssidHidden" id="ssidHidden" value="false">
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<label for="password">password:</label>
|
||||||
|
<input type="text" id="password" minlength="8" maxlength="32">
|
||||||
|
<p class="small">must have at least 8 characters! (needs restart)</p>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<label for="apChannel">channel:</label>
|
||||||
|
<input type="number" id="apChannel" min="1" max="14">
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<p class="block bold">AP scan</p>
|
||||||
|
|
||||||
|
<label for="apScanHidden">scan for hidden APs:</label>
|
||||||
|
<input type="checkbox" name="apScanHidden" id="apScanHidden" value="false">
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<p class="block bold">Client Scan</p>
|
||||||
|
|
||||||
|
<label for="scanTime">default scan time:</label>
|
||||||
|
<input type="number" id="scanTime" min="1" max="255">s
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<p class="block bold">Attack</p>
|
||||||
|
|
||||||
|
<label for="timeout">timeout:</label>
|
||||||
|
<input type="number" id="timeout" min="-1" max="65536">s
|
||||||
|
<p class="small">0 = no timeout</p>
|
||||||
|
|
||||||
|
<label for="ssidEnc">WPA2 beacons:</label>
|
||||||
|
<input type="checkbox" name="ssidEnc" id="ssidEnc" value="false">
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<label for="useLed">use LED:</label>
|
||||||
|
<input type="checkbox" name="useLed" id="useLed" value="false">
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<label for="deauthReason">deauth reason:</label>
|
||||||
|
<input type="number" id="deauthReason" min="1" max="45">
|
||||||
|
<p class="small">reason codes: <a target="_blank" href="http://www.aboutcher.co.uk/2012/07/linux-wifi-deauthenticated-reason-codes/">click</a></p>
|
||||||
|
|
||||||
|
<label for="packetRate">packetrate:</label>
|
||||||
|
<input type="number" id="packetRate" min="1" max="100">pkts/s
|
||||||
|
<p class="small">only for deauth attack - may cause instability!</p>
|
||||||
|
|
||||||
|
<label for="channelHop">channel hopping:</label>
|
||||||
|
<input type="checkbox" name="channelHop" id="channelHop" value="false">
|
||||||
|
<p class="small">only for deauth attack - packetrate will be ignored!</p>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<button class="warnBtn" onclick="resetSettings()">reset</button> <button onclick="saveSettings()">save</button><p class="small" id="saved"></p><br \>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<p class="block bold" id="clientNames">Client Names</p>
|
||||||
|
<table id="nameList">
|
||||||
|
<tr><th>MAC</th><th>Vendor</th><th>Name</th><th>X</th></tr>
|
||||||
|
</table>
|
||||||
|
<br />
|
||||||
|
<button class="warnBtn" onclick="clearNameList()">clear</button></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
</table>
|
||||||
|
<script src="js/functions.js"></script>
|
||||||
|
<script src="js/settings.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user