version 1.4

- changed webinterface design
- improved error handling
- can add clients manually
- added settings reset via console command "reset" and GPIO 4
- improved default settings for more stability
- added warning at the beginning
- added info page
This commit is contained in:
Stefan Kremser
2017-05-01 20:05:41 +02:00
parent 9c88c6b11e
commit 6cd3a46144
44 changed files with 1872 additions and 1363 deletions

View File

@@ -0,0 +1,74 @@
var table = document.getElementsByTagName('table')[0];
var networkInfo = getE('networksFound');
var scanInfo = getE('scanInfo');
var apMAC = getE('apMAC');
var startStopScan = getE('startStopScan');
var autoScan = false;
function toggleScan(onoff) {
if (onoff && !autoScan) scanInfo.style.visibility = 'hidden';
else scanInfo.style.visibility = 'visible';
}
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() {
toggleScan(true);
getResponse("APScanResults.json", function(responseText) {
var res = JSON.parse(responseText);
res.aps = res.aps.sort(compare);
networkInfo.innerHTML = 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;
});
}
function scan() {
toggleScan(false);
getResponse("APScan.json", function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error APScan.json");
toggleScan(true);
});
}
function select(num) {
getResponse("APSelect.json?num=" + num, function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error APSelect.json");
});
}
getResults();

View File

@@ -0,0 +1,98 @@
var selectedAPs = getE("selectedAPs");
var selectedClients = getE("selectedClients");
var table = document.getElementsByTagName("table")[0];
var ssidList = document.getElementsByTagName("table")[1];
var saved = getE("saved");
var ssidCounter = getE("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] + " <button onclick='cloneSSID(\""+res.aps[i]+"\")'>clone</button></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 class='green'>" + res.attacks[i].status + "</td>";
else tr += "<td class='red'>" + 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 + "/48";
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 button-warn" onclick="deleteSSID(' + i + ')">x</button></td>';
tr += "</tr>";
}
ssidList.innerHTML = tr;
}, function() {
clearInterval(resultInterval);
showMessage("error loading attackInfo.json");
});
}
function startStop(num) {
getResponse("attackStart.json?num=" + num, function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error attackStart.json");
});
}
function addSSID() {
saved.innerHTML = "";
if (res.ssid.length >= 64) showMessage("SSID list full :(", 2500);
else {
var _ssidName = prompt("new SSID:");
if (_ssidName != null) getResponse("addSSID.json?name=" + _ssidName, getResults);
}
}
function cloneSSID(_ssidName) {
saved.innerHTML = "";
if (res.ssid.length >= 64) showMessage("SSID list full :(", 2500);
else 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, 1000);

View File

@@ -0,0 +1,36 @@
function showMessage(msg, closeAfter){
document.getElementById("error").innerHTML = msg;
if(closeAfter !== undefined){
setTimeout(function(){
document.getElementById("error").innerHTML = "";
},closeAfter);
}
}
function getE(name){
return document.getElementById(name);
}
function getResponse(adr, callback, timeoutCallback, timeout, method){
if(timeoutCallback === undefined) {
timeoutCallback = function(){
showMessage("error loading "+adr);
};
}
if(timeout === undefined) timeout = 8000;
if(method === undefined) method = "GET";
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4){
if(xmlhttp.status == 200){
showMessage("");
callback(xmlhttp.responseText);
}
else timeoutCallback();
}
};
xmlhttp.open(method, adr, true);
xmlhttp.send();
xmlhttp.timeout = timeout;
xmlhttp.ontimeout = timeoutCallback;
}

View File

@@ -0,0 +1,84 @@
var ssid = getE('ssid');
var ssidHidden = getE('ssidHidden');
var password = getE('password');
var apChannel = getE('apChannel');
var apScanHidden = getE('apScanHidden');
var scanTime = getE('scanTime');
var timeout = getE('timeout');
var deauthReason = getE('deauthReason');
var packetRate = getE('packetRate');
var saved = getE('saved');
var clientNames = getE('clientNames');
var ssidEnc = getE('ssidEnc');
var useLed = getE('useLed');
/*var channelHop = getE('channelHop');*/
var multiAPs = getE('multiAPs');
var cMac = getE('cMac');
var cName = getE('cName');
var res;
function getData() {
getResponse("settings.json", function(responseText) {
try {
res = JSON.parse(responseText);
} catch(e) {
showMessage("Error: reset the settings.");
return;
}
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;*/
multiAPs.checked = res.multiAPs;
});
}
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;*/
url += "&multiAPs="+ multiAPs.checked;
getResponse(url, function(responseText) {
if (responseText == "true") {
getData();
saved.innerHTML = "saved";
}
else showMessage("response error settingsSave.json");
});
}
function resetSettings() {
getResponse("settingsReset.json", function(responseText) {
if (responseText == "true") {
getData();
saved.innerHTML = "saved";
}
else showMessage("response error settingsReset.json");
});
}
function restart(){
getResponse("restartESP.json?", function(){});
}
getData();

View File

@@ -0,0 +1,142 @@
var table = document.getElementsByTagName('table')[0];
var scanBtn = getE("startScan");
var scanTime = getE("scanTime");
var clientsFound = getE("clientsFound");
var scanStatus = getE("clientScanStatus");
var clientNames = getE('clientNames');
var nameListTable = getE('nameList');
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) {
scanStatus.style.visibility = 'visible';
} else {
scanStatus.style.visibility = 'hidden';
}
}
function getResults() {
getResponse("ClientScanResults.json", function(responseText) {
try{
res = JSON.parse(responseText);
}catch(e){
showMessage("Error: clear the client list.");
return;
}
res.clients = res.clients.sort(compare);
clientsFound.innerHTML = 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 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;
clientNames.innerHTML = res.nameList.length + "/50";
var tr = '<tr><th>MAC</th><th>Name</th><th>X</th><th>Add</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].n + ' <a onclick="changeName(' + i + ')">edit</a></td>';
tr += '<td><button class="marginNull button-warn" onclick="deleteName(' + i + ')">x</button></td>';
tr += '<td><button class="marginNull button-primary" onclick="add(' + i + ')">add</button></td>';
tr += '</tr>';
}
nameListTable.innerHTML = tr;
}, function() {
showMessage("reconnect and reload the site");
}, 6000);
}
function scan() {
toggleBtn(true);
getResponse("ClientScan.json?time=" + scanTime.value, function(responseText) {
if(responseText == "true") {
setTimeout(function() {
toggleBtn(true);
getResults();
}, scanTime.value * 1000);
}
else showMessage("response error ClientScan.json");
});
}
function select(num) {
getResponse("clientSelect.json?num=" + num, function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error clientSelect.json");
});
}
function clearNameList() {
getResponse("clearNameList.json", function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error clearNameList.json");
});
}
function addClient(){
getResponse("addClient.json?mac="+cMac.value+"&name="+cName.value, function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error addClient.json");
});
}
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") getResults();
else showMessage("response error editNameList.json");
});
}
}
function deleteName(id) {
getResponse("deleteName.json?num=" + id, function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error deleteName.json");
});
}
function add(id){
getResponse("addClientFromList.json?num=" + id, function(responseText) {
if (responseText == "true") getResults();
else showMessage("response error addClientFromList.json");
});
}
getResponse("ClientScanTime.json", function(responseText) {
scanTime.value = responseText;
});
getResults();
toggleBtn(false);