Splitted JS part of the HTML files

This commit is contained in:
N0vaPixel
2017-03-12 23:31:16 +01:00
parent 038fe10b21
commit 6a52e70ea7
22 changed files with 1075 additions and 1036 deletions

View File

@@ -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 );

View File

@@ -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" {

View File

@@ -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

View File

@@ -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()); server.send ( 200, "text/html", data_getIndexHTML());
} }
void loadIndex() { void loadClientsHTML() {
server.send ( 200, "text/html", data_getIndexHTML() );
}
void loadClients() {
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 loadFunctionsJS() { void loadSettingsHTML() {
server.send( 200, "text/javascript", data_getFunctionsJS() ); server.send( 200, "text/html", data_getSettingsHTML());
} }
void loadStyle() { void load404() {
server.send ( 200, "text/css", data_getStyle() ); server.send ( 404, "text/html", data_get404());
}
void loadManifest() {
server.send ( 200, "text/css", data_getManifest() );
}
void loadSettings() {
server.send( 200, "text/html", data_getSettingsHTML() );
} }
void loadFunctionsJS() {
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() {
server.send ( 200, "text/css", data_getStyle());
}
void loadManifest() {
server.send ( 200, "text/css", data_getManifest());
}
//==========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();
} }
} }

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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
View 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
View 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
View 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
View 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
View 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();

View File

@@ -1,21 +1,28 @@
function getResponse(adr, callback, timeoutCallback, timeout){ function getResponse(adr, callback, timeoutCallback, timeout){
if(timeoutCallback === undefined) { if(timeoutCallback === undefined) {
timeoutCallback = function(){ timeoutCallback = function(){
location.reload() location.reload()
}; };
} }
if(timeout === undefined) { if(timeout === undefined) {
timeout = 8000; timeout = 8000;
} }
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() { xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4){ if(xmlhttp.readyState == 4){
if(xmlhttp.status == 200) callback(xmlhttp.responseText); if(xmlhttp.status == 200) callback(xmlhttp.responseText);
else timeoutCallback(); else timeoutCallback();
} }
}; };
xmlhttp.open("GET", adr, true); xmlhttp.open("GET", adr, true);
xmlhttp.send(); xmlhttp.send();
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
View 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
View 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();

View File

@@ -1,38 +1,38 @@
{ {
"sites":[ "sites":[
"error404.html", "error404.html",
"style.css", "style.css",
"functions.js", "functions.js",
"index.html", "index.html",
"clients.html", "clients.html",
"attack.html", "attack.html",
"settings.html" "settings.html"
], ],
"json":[ "json":[
"APScanResults.json", "APScanResults.json",
"ClientScanResults.json", "ClientScanResults.json",
"settings.json", "settings.json",
"attackInfo.json" "attackInfo.json"
], ],
"commands":[ "commands":[
"APScan.json", "APScan.json",
"APSelect.json", "APSelect.json",
"ClientScan.json", "ClientScan.json",
"ClientScanTime.json", "ClientScanTime.json",
"clientSelect.json", "clientSelect.json",
"setName.json", "setName.json",
"attackStart.json", "attackStart.json",
"settingsSave.json", "settingsSave.json",
"settingsReset.json", "settingsReset.json",
"deleteName.json", "deleteName.json",
"clearNameList.json", "clearNameList.json",
"editNameList.json", "editNameList.json",
"addSSID.json", "addSSID.json",
"cloneSSID.json", "cloneSSID.json",
"deleteSSID.json", "deleteSSID.json",
"randomSSID.json", "randomSSID.json",
"clearSSID.json", "clearSSID.json",
"resetSSID.json", "resetSSID.json",
"saveSSID.json" "saveSSID.json"
] ]
} }

View File

@@ -1,50 +1,50 @@
<html> <html>
<head> <head>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script> <script>
function miniEsc(){ function miniEsc(){
var input = $('#input').val().replace(/\r\n|\r|\n/g," ").replace( /\s\s+/g, ' ' ).replace(/"/g, '\\"' ); var input = $('#input').val().replace(/\r\n|\r|\n/g," ").replace( /\s\s+/g, ' ' ).replace(/"/g, '\\"' );
$('#output').val(input); $('#output').val(input);
$('#info1').html($('#input').val().length); $('#info1').html($('#input').val().length);
$('#info2').html(input.length); $('#info2').html(input.length);
} }
function mini(){ function mini(){
var input = $('#input').val().replace(/\r\n|\r|\n/g," ").replace( /\s\s+/g, ' ' ); var input = $('#input').val().replace(/\r\n|\r|\n/g," ").replace( /\s\s+/g, ' ' );
$('#output').val(input); $('#output').val(input);
$('#info1').html($('#input').val().length); $('#info1').html($('#input').val().length);
$('#info2').html(input.length); $('#info2').html(input.length);
} }
String.prototype.convertToHex = function (delim) { String.prototype.convertToHex = function (delim) {
return this.split("").map(function(c) { return this.split("").map(function(c) {
return ("0" + c.charCodeAt(0).toString(16)).slice(-2); return ("0" + c.charCodeAt(0).toString(16)).slice(-2);
}).join(delim || ""); }).join(delim || "");
}; };
function byte(){ function byte(){
var input = $('#input').val().convertToHex(",0x"); var input = $('#input').val().convertToHex(",0x");
$('#output').val("0x"+input); $('#output').val("0x"+input);
$('#info1').html($('#input').val().length); $('#info1').html($('#input').val().length);
$('#info2').html(input.length); $('#info2').html(input.length);
} }
function byteAndmini(){ function byteAndmini(){
var input = "0x"+$('#input').val().replace(/\r\n|\r|\n/g," ").replace( /\s\s+/g, ' ' ).convertToHex(",0x");; var input = "0x"+$('#input').val().replace(/\r\n|\r|\n/g," ").replace( /\s\s+/g, ' ' ).convertToHex(",0x");;
$('#output').val(input); $('#output').val(input);
$('#info1').html($('#input').val().length); $('#info1').html($('#input').val().length);
$('#info2').html(input.length); $('#info2').html(input.length);
} }
</script> </script>
</head> </head>
<body> <body>
<textarea id="input" rows="50" cols="100"></textarea><br /> <textarea id="input" rows="50" cols="100"></textarea><br />
<p id="info1"></p> <p id="info1"></p>
<button onclick="mini()">minify</button> <button onclick="mini()">minify</button>
<button onclick="miniEsc()">minify + escape</button> <button onclick="miniEsc()">minify + escape</button>
<button onclick="byte()">byte-ify</button> <button onclick="byte()">byte-ify</button>
<button onclick="byteAndmini()">minify + byte-ify</button><br /> <button onclick="byteAndmini()">minify + byte-ify</button><br />
<textarea id="output" rows="50" cols="100"></textarea><br /> <textarea id="output" rows="50" cols="100"></textarea><br />
<p id="info2"></p> <p id="info2"></p>
</body> </body>
</html> </html>

View File

@@ -1,7 +1,7 @@
**1** open minifier.html **1** open minifier.html
**2** paste the html code in the upper textfield **2** paste the html code in the upper textfield
**3** click on `minifiy + byte-ify` **3** click on `minifiy + byte-ify`
**4** copy the results **4** copy the results
**5** go to data.h and replace the array (of the changed html file) with the copied bytes **5** go to data.h and replace the array (of the changed html file) with the copied bytes
** now upload your new sketch :)** ** now upload your new sketch :)**

99
web_server/settings.html Normal file
View 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>

View File

@@ -1,161 +1,161 @@
/* Global */ /* Global */
*, *,
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
font-family: arial; font-family: arial;
color: #432929; color: #432929;
} }
h1 { h1 {
font-size: 22px; font-size: 22px;
margin-bottom: 0.6em; margin-bottom: 0.6em;
background: #00B0FF; background: #00B0FF;
color: #fff; color: #fff;
padding: 0.2em; padding: 0.2em;
border-radius: 4px; border-radius: 4px;
} }
button { button {
background: #00B0FF; background: #00B0FF;
color: #fff; color: #fff;
border: 1px solid #8F8F8F; border: 1px solid #8F8F8F;
border-radius: 14px; border-radius: 14px;
padding: 0.34em 0.3em; padding: 0.34em 0.3em;
margin-bottom: 0.6em; margin-bottom: 0.6em;
} }
button:hover { button:hover {
color: #000; color: #000;
} }
label { label {
display: inline-block; display: inline-block;
width: 135px; width: 135px;
} }
input { input {
height: 22px; height: 22px;
width: 120px; width: 120px;
border: 1px solid #A99D9D; border: 1px solid #A99D9D;
border-radius: 5px; border-radius: 5px;
padding: 0.2em; padding: 0.2em;
margin: 2px; margin: 2px;
} }
input[type="checkbox"] { input[type="checkbox"] {
height: 15px; height: 15px;
width: auto; width: auto;
} }
.warn { .warn {
color: #c20000; color: #c20000;
} }
.warnBtn { .warnBtn {
background: #c20000; background: #c20000;
color: #fff; color: #fff;
} }
.warnBtn:hover { .warnBtn:hover {
background: #f00; background: #f00;
color: #000; color: #000;
} }
.selectedBtn { .selectedBtn {
background: #fff; background: #fff;
color: #000; color: #000;
} }
.selectedBtn:hover { .selectedBtn:hover {
background: #00B0FF; background: #00B0FF;
color: #fff; color: #fff;
} }
.right { .right {
float: right; float: right;
} }
.bold { .bold {
font-weight: bold; font-weight: bold;
} }
.block { .block {
display: block; display: block;
} }
.marginNull { .marginNull {
margin: 0 margin: 0
} }
.blue { .blue {
color: #00B0FF color: #00B0FF
} }
.small { .small {
font-size: 14px; font-size: 14px;
color: #727272 color: #727272
} }
/* Navigation */ /* Navigation */
nav { nav {
background: #222; background: #222;
} }
nav a { nav a {
background: #222; background: #222;
color: #999; color: #999;
padding: 0.5em; padding: 0.5em;
display: inline-block; display: inline-block;
text-decoration: none; text-decoration: none;
} }
nav a:hover { nav a:hover {
background: #000; background: #000;
color: #f0f0f0; color: #f0f0f0;
} }
/* Content */ /* Content */
#content { #content {
padding: 0.34em; padding: 0.34em;
} }
table { table {
padding: 0; padding: 0;
width: 100%; width: 100%;
max-width: 960px; max-width: 960px;
margin: 0 auto; margin: 0 auto;
border-spacing: 0; border-spacing: 0;
background: #222222; background: #222222;
} }
table th { table th {
background: #222222; background: #222222;
color: #f0f0f0; color: #f0f0f0;
} }
table td { table td {
font-size: 14px; font-size: 14px;
background: #f0f0f0; background: #f0f0f0;
} }
table th, table th,
table td { table td {
text-align: center; text-align: center;
padding: 0.1em 0; padding: 0.1em 0;
} }
table .selected td { table .selected td {
background: #11a4cc; background: #11a4cc;
} }
/* Specific */ /* Specific */
#saved { #saved {
display: inline; display: inline;
} }
#clientScanStatus { #clientScanStatus {
margin-left: 1em; margin-left: 1em;
} }
#clientScanStart { #clientScanStart {
margin-left: 30px; margin-left: 30px;
} }
#scanTime { #scanTime {
width: 60px; width: 60px;
} }
#apScanStatus { #apScanStatus {
margin-left: 1em; margin-left: 1em;
} }
#rssiBar { #rssiBar {
width: 100px; width: 100px;
height: 15px; height: 15px;
background: #fff; background: #fff;
} }
#rssiBar > div { #rssiBar > div {
width: 52px; width: 52px;
height: 15px; height: 15px;
background: #c20000; background: #c20000;
} }
#wpa_info { #wpa_info {
padding-left: 0.34em; padding-left: 0.34em;
} }
#saved { #saved {
display: inline; display: inline;
margin-left: 20px; margin-left: 20px;
} }