functional settings site

This commit is contained in:
Stefan Kremser
2017-02-26 12:18:08 +01:00
parent 8a5b3d3357
commit 1ee13c516c
13 changed files with 235 additions and 37 deletions

View File

@@ -144,10 +144,11 @@ void Attack::run(){
stati[0] = (String)packetsCounter[0]+"pkts/s";
packetsCounter[0] = 0;
attackTimeoutCounter[0]++;
if(debug) Serial.println(" done");
attackTimeoutCounter[0]++;
if(attackTimeoutCounter[0] > settings.attackTimeout) stop(1);
if(settings.attackTimeout > 0){
attackTimeoutCounter[0]++;
if(attackTimeoutCounter[0] > settings.attackTimeout) stop(1);
}
}
/* =============== Beacon Attack =============== */
@@ -198,8 +199,10 @@ void Attack::run(){
macListChangeCounter = 0;
}
if(debug) Serial.println(" done ");
attackTimeoutCounter[1]++;
if(attackTimeoutCounter[1]/10 > settings.attackTimeout) stop(1);
if(settings.attackTimeout > 0){
attackTimeoutCounter[1]++;
if(attackTimeoutCounter[1]/10 > settings.attackTimeout) stop(1);
}
}
}

View File

@@ -55,4 +55,9 @@ void MacList::remove(Mac adr){
macAdrs[i].set(0x00,0x00,0x00,0x00,0x00,0x00);
}
}
}
}
void MacList::set(int num, Mac adr){
macAdrs[num].setMac(adr);
}

View File

@@ -11,6 +11,7 @@ class MacList
MacList();
int add(Mac adr);
void remove(Mac adr);
void set(int num, Mac adr);
void info();
bool contains(Mac adr);
int getNum(Mac adr);

View File

@@ -45,7 +45,7 @@ void NameList::add(Mac client, String name){
name.getBytes(_buf,nameLength);
for(int i=0;i<nameLength;i++){
if(i<name.length()) names[clients.getNum(client)][i] = _buf[i];
else names[clients.getNum(client)][i] = 32;
else names[clients.getNum(client)][i] = 0x00;
}
NameList::save();
}
@@ -59,4 +59,28 @@ String NameList::get(Mac client){
}
}
return returnStr;
}
}
String NameList::getName(int num){
String returnStr;
for(int h=0;h<nameLength;h++){
if(names[num][h] != 0x00) returnStr += (char)names[num][h];
}
return returnStr;
}
Mac NameList::getMac(int num){
return clients._get(num);
}
void NameList::remove(int num){
for(int i=num;i<len-1;i++){
clients.set(num, clients._get(num+1));
for(int h=0;h<nameLength;h++) names[num][h] = names[num+1][h];
}
clients.remove(clients._get(len));
clients.num--;
len--;
save();
}

View File

@@ -25,10 +25,13 @@ class NameList
void clear();
void add(Mac client, String name);
String get(Mac client);
String getName(int num);
Mac getMac(int num);
void remove(int num);
int len = 0;
private:
void save();
int len = 0;
MacList clients;
uint8_t names[listLength][nameLength];
};

View File

@@ -10,6 +10,8 @@ void Settings::load(){
if(ssidLen < 1 || ssidLen > 32 || passwordLen < 8 || passwordLen > 32) reset();
else{
ssid = "";
password = "";
for(int i=0;i<ssidLen;i++) ssid += (char)EEPROM.read(ssidAdr+i);
for(int i=0;i<passwordLen;i++) password += (char)EEPROM.read(passwordAdr+i);
@@ -40,7 +42,8 @@ void Settings::reset(){
}
void Settings::save(){
if(debug) Serial.print("saving settings...");
ssidLen = ssid.length();
passwordLen = password.length();
EEPROM.write(ssidLenAdr,ssidLen);
EEPROM.write(passwordLenAdr,passwordLen);
@@ -48,19 +51,18 @@ void Settings::save(){
for(int i=0;i<ssidLen;i++) EEPROM.write(ssidAdr+i,ssid[i]);
for(int i=0;i<passwordLen;i++) EEPROM.write(passwordAdr+i,password[i]);
EEPROM.write(deauthReasonAdr, deauthReason);
EEPROM.write(deauthReasonAdr, deauthReason);
eepromWriteInt(attackTimeoutAdr, attackTimeout);
EEPROM.write(attackPacketRateAdr, attackPacketRate);
EEPROM.write(clientScanTimeAdr, clientScanTime);
EEPROM.commit();
if(debug){
info();
Serial.println("done");
Serial.println("settings saved");
}
}
void Settings::info(){
@@ -74,4 +76,29 @@ void Settings::info(){
Serial.println("attack packet rate: "+(String)attackPacketRate);
Serial.println("client scan time: "+(String)clientScanTime);
}
String Settings::get(){
String json = "{";
//\"
json += "\"ssid\":\""+ssid+"\",";
json += "\"password\":\""+password+"\",";
json += "\"deauthReason\":"+(String)(int)deauthReason+",";
json += "\"attackTimeout\":"+(String)attackTimeout+",";
json += "\"attackPacketRate\":"+(String)attackPacketRate+",";
json += "\"clientScanTime\":"+(String)clientScanTime+",";
json += "\"nameList\":[";
for(int i=0;i<nameList.len;i++){
json += "{";
json += "\"id\":"+(String)i+",";
json += "\"name\":\""+nameList.getName(i)+"\",";
json += "\"mac\":\""+nameList.getMac(i).toString()+"\",";
json += "\"vendor\":\""+data_getVendor(nameList.getMac(i)._get(0), nameList.getMac(i)._get(1), nameList.getMac(i)._get(2))+"\"";
json += "}";
if(i!=nameList.len-1) json += ",";
}
json += "]";
json += "}";
return json;
}

View File

@@ -4,10 +4,13 @@
#include <EEPROM.h>
#include "Mac.h"
#include "MacList.h"
#include "NameList.h"
extern const bool debug;
extern String data_getVendor(uint8_t first,uint8_t second,uint8_t third);
extern void eepromWriteInt(int adr, int val);
extern int eepromReadInt(int adr);
extern NameList nameList;
#define ssidLenAdr 1024
#define ssidAdr 1025
@@ -25,6 +28,7 @@ class Settings
void load();
void reset();
void save();
String get();
void info();
int ssidLen;
@@ -33,7 +37,7 @@ class Settings
String password = "";
uint8_t deauthReason;
int attackTimeout;
unsigned int attackTimeout;
int attackPacketRate;
int clientScanTime;

File diff suppressed because one or more lines are too long

View File

@@ -16,7 +16,7 @@ extern "C" {
#include "Attack.h"
#include "Settings.h"
const bool debug = false;
const bool debug = true;
ESP8266WebServer server(80);
@@ -56,6 +56,7 @@ void setup(){
EEPROM.begin(4096);
settings.load();
if(debug) settings.info();
nameList.load();
Serial.println("");
@@ -74,6 +75,7 @@ void setup(){
server.on("/index.html", loadIndex);
server.on("/clients.html", loadClients);
server.on("/attack.html", loadAttack);
server.on("/settings.html", loadSettings);
server.on("/functions.js", loadFunctionsJS);
/* header links */
@@ -90,6 +92,9 @@ void setup(){
server.on("/setName.json", setClientName);
server.on("/attackInfo.json", sendAttackInfo);
server.on("/attackStart.json", startAttack);
server.on("/settings.json", getSettings);
server.on("/settingsSave.json", saveSettings);
server.on("/deleteName.json", deleteName);
server.begin();
}
@@ -109,6 +114,8 @@ void loadClients(){ server.send ( 200, "text/html", data_getClientsHTML()); }
void loadAttack(){ server.send ( 200, "text/html", data_getAttackHTML() ); }
void loadFunctionsJS(){ server.send( 200, "text/javascript", data_getFunctionsJS() ); }
void loadStyle(){ server.send ( 200, "text/css", data_getStyle() ); }
void loadSettings(){ server.send( 200, "text/html", data_getSettingsHTML() ); }
//==========AP-Scan==========
void startAPScan(){
@@ -166,4 +173,28 @@ void startAttack(){
server.send ( 200, "text/json", "true");
}else server.send ( 200, "text/json", "false");
}
}
}
//==========Settings==========
void getSettings(){ server.send ( 200, "text/json", settings.get() ); }
void saveSettings(){
if(server.hasArg("ssid")) settings.ssid = server.arg("ssid");
if(server.hasArg("password")) settings.password = server.arg("password");
if(server.hasArg("scanTime")) settings.clientScanTime = server.arg("scanTime").toInt();
if(server.hasArg("timeout")) settings.attackTimeout = server.arg("timeout").toInt();
if(server.hasArg("deauthReason")) settings.deauthReason = server.arg("deauthReason").toInt();
if(server.hasArg("packetRate")) settings.attackPacketRate = server.arg("packetRate").toInt();
settings.save();
server.send ( 200, "text/json", "true" );
}
void deleteName(){
if(server.hasArg("num")) {
int _num = server.arg("num").toInt();
nameList.remove(_num);
server.send ( 200, "text/json", "true");
}
}

View File

@@ -16,6 +16,7 @@
<a href="index.html">APs</a>
<a href="clients.html">Clients</a>
<a href="attack.html">Attack</a>
<a href="settings.html">Settings</a>
</nav>
<div id="content">
<h1>Attack</h1>

View File

@@ -13,7 +13,7 @@
#clientScanStart{
margin-left: 30px;
}
#clientScanTime{
#scanTime{
width: 60px;
}
</style>
@@ -25,11 +25,12 @@
<a href="index.html">APs</a>
<a href="clients.html">Clients</a>
<a href="attack.html">Attack</a>
<a href="settings.html">Settings</a>
</nav>
<div id="content">
<h1>Scan for client devices</h1>
<label for="clientScanTime">Scan time:</label>
<label for="scanTime">Scan time:</label>
<input type="number" id="scanTime" value="10">s
<button onclick="scan()" id="startScan">start</button>

View File

@@ -33,6 +33,7 @@
<a href="index.html">APs</a>
<a href="clients.html">Clients</a>
<a href="attack.html">Attack</a>
<a href="settings.html">Settings</a>
</nav>
<div id="content">
<h1>Scan for WiFi access points</h1>

View File

@@ -11,6 +11,10 @@
display: inline-block;
width: 135px;
}
#saved{
display: inline;
margin-left: 20px;
}
</style>
<script src="functions.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=0.8">
@@ -27,36 +31,44 @@
<p class="block bold">WiFi</p>
<label for="clientScanTime">SSID:</label>
<input type="text" id="scanTime" minlength="1" maxlength="32">
<label for="ssid">SSID:</label>
<input type="text" id="ssid" minlength="1" maxlength="32">
<br />
<label for="clientScanTime">password:</label>
<input type="text" id="scanTime" minlength="8" maxlength="32">
<p class="small">must have at least 8 characters!</p>
<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 />
<p class="block bold">Client Scan</p>
<label for="clientScanTime">default scan time:</label>
<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="clientScanTime">timeout:</label>
<input type="number" id="scanTime" min="-1" max="32768">s
<p class="small">-1 for no timeout</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="clientScanTime">deauth reason:</label>
<input type="number" id="scanTime" min="1" max="45">
<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="clientScanTime">packetrate:</label>
<input type="number" id="scanTime" min="1" max="100">pkts/s
<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>
<br />
<br />
<button onclick="saveSettings()">save</button><p class="small" id="saved"></p>
<br />
<br />
<p class="block bold">Client Names</p>
<table id="nameList">
</table>
</div>
<table>
@@ -64,6 +76,81 @@
</body>
<script>
var nameListTable = document.getElementById('nameList');
var ssid = document.getElementById('ssid');
var password = document.getElementById('password');
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 res;
function getData(){
getResponse("settings.json",function(responseText){
res = JSON.parse(responseText);
ssid.value = res.ssid;
password.value = res.password;
scanTime.value = res.clientScanTime;
timeout.value = res.attackTimeout;
deauthReason.value = res.deauthReason;
packetRate.value = res.attackPacketRate;
var tr = '';
if(res.nameList.length > 0) 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].mac+'</td>';
tr += '<td>'+res.nameList[i].vendor+'</td>';
tr += '<td>'+res.nameList[i].name+' <a class="blue" onclick="changeName('+res.nameList[i].id+')">edit</a></td>';
tr += '<td><button class="marginNull warnBtn" onclick="deleteName('+res.nameList[i].id+')">x</button></td>';
tr += '</tr>';
}
nameListTable.innerHTML = tr;
});
}
function changeName(id){
var newName = prompt("Name for "+res.nameList[id].mac);
if(newName != null){
getResponse("setName.json?id="+id+"&name="+newName,function(responseText){
if(responseText == "true") getResults();
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 += "&password="+password.value;
url += "&scanTime="+scanTime.value;
url += "&timeout="+timeout.value;
url += "&deauthReason="+deauthReason.value;
url += "&packetRate="+packetRate.value;
getResponse(url, function(responseText){
if(responseText == "true"){
getData();
saved.innerHTML = "saved";
}
else alert("error");
});
}
getData();
</script>
</html>