Added SSID List

This commit is contained in:
Stefan Kremser
2017-02-26 18:11:49 +01:00
parent 1ee13c516c
commit 5718ba1abf
13 changed files with 274 additions and 34 deletions

View File

@@ -20,7 +20,10 @@ bool APScan::start(){
channels[i] = WiFi.channel(i); channels[i] = WiFi.channel(i);
rssi[i] = WiFi.RSSI(i); rssi[i] = WiFi.RSSI(i);
getEncryption(WiFi.encryptionType(i)).toCharArray(encryption[i],5); getEncryption(WiFi.encryptionType(i)).toCharArray(encryption[i],5);
WiFi.SSID(i).toCharArray(names[i],33); String _ssid;
_ssid = WiFi.SSID(i);
_ssid.replace("\"","\\\"");
_ssid.toCharArray(names[i],33);
data_getVendor(WiFi.BSSID(i)[0],WiFi.BSSID(i)[1],WiFi.BSSID(i)[2]).toCharArray(vendors[i],9); data_getVendor(WiFi.BSSID(i)[0],WiFi.BSSID(i)[1],WiFi.BSSID(i)[2]).toCharArray(vendors[i],9);
if(debug){ if(debug){
_ap._print(); _ap._print();
@@ -58,6 +61,8 @@ String APScan::getEncryption(int code){
case ENC_TYPE_AUTO: case ENC_TYPE_AUTO:
return "WPA*"; return "WPA*";
break; break;
default:
return "?";
} }
} }

View File

@@ -2,7 +2,6 @@
Attack::Attack(){ Attack::Attack(){
randomSeed(os_random()); randomSeed(os_random());
for(int i=0;i<attacksNum;i++) stati[i] = "ready";
} }
void Attack::generate(){ void Attack::generate(){
@@ -235,6 +234,11 @@ String Attack::getResults(){
if(debug) Serial.print("getting attacks JSON..."); if(debug) Serial.print("getting attacks JSON...");
if(apScan.getFirstTarget() < 0) stati[0] = stati[1] = "no AP"; if(apScan.getFirstTarget() < 0) stati[0] = stati[1] = "no AP";
else {
for(int i=0;i<attacksNum;i++){
if(!isRunning[i]) stati[i] = "ready";
}
}
int _selected; int _selected;
String json = "{ \"aps\": ["; String json = "{ \"aps\": [";
@@ -265,11 +269,19 @@ String Attack::getResults(){
json += "{"; json += "{";
json += "\"name\": \""+attackNames[i]+"\","; json += "\"name\": \""+attackNames[i]+"\",";
json += "\"status\": \""+stati[i]+"\","; json += "\"status\": \""+stati[i]+"\",";
json += "\"running\": "+(String)isRunning[i]; json += "\"running\": "+(String)isRunning[i]+"";
json += "}"; json += "}";
if(i != attacksNum-1) json += ","; if(i != attacksNum-1) json += ",";
} }
json += "] }"; json += "],";
json += "\"ssid\": [";
for(int i=0;i<ssidList.len;i++){
json += "\""+ssidList.get(i)+"\"";
if(i != ssidList.len-1) json += ",";
}
json += "]";
json += "}";
if(debug) Serial.println("done "); if(debug) Serial.println("done ");
return json; return json;
} }

View File

@@ -12,9 +12,10 @@ extern "C" {
#include "APScan.h" #include "APScan.h"
#include "ClientScan.h" #include "ClientScan.h"
#include "Settings.h" #include "Settings.h"
#include "SSIDList.h"
#define attacksNum 2 #define attacksNum 2
#define macListLen 80 #define macListLen 64
#define macChangeInterval 4 #define macChangeInterval 4
extern void PrintHex8(uint8_t *data, uint8_t length); extern void PrintHex8(uint8_t *data, uint8_t length);
@@ -25,6 +26,7 @@ extern const bool debug;
extern APScan apScan; extern APScan apScan;
extern ClientScan clientScan; extern ClientScan clientScan;
extern Settings settings; extern Settings settings;
extern SSIDList ssidList;
class Attack class Attack
{ {

View File

@@ -24,7 +24,7 @@ void NameList::clear(){
clients._clear(); clients._clear();
EEPROM.write(romAdr,len); EEPROM.write(romAdr,len);
EEPROM.commit(); EEPROM.commit();
Serial.println("EEPROM cleared"); Serial.println("nameList cleared");
} }
void NameList::save(){ void NameList::save(){
@@ -84,3 +84,10 @@ void NameList::remove(int num){
save(); save();
} }
void NameList::edit(int num, String name){
for(int i=0;i<nameLength;i++){
if(i<name.length()) names[num][i] = name[i];
else names[num][i] = 0x00;
}
}

View File

@@ -7,7 +7,7 @@
#define romAdr 0 #define romAdr 0
#define maxSize 1024 #define maxSize 1024
#define listLength 30 #define listLength 50
#define nameLength 18 #define nameLength 18
/* /*
@@ -24,6 +24,7 @@ class NameList
void load(); void load();
void clear(); void clear();
void add(Mac client, String name); void add(Mac client, String name);
void edit(int num, String name);
String get(Mac client); String get(Mac client);
String getName(int num); String getName(int num);
Mac getMac(int num); Mac getMac(int num);

View File

@@ -0,0 +1,80 @@
#include "SSIDList.h"
SSIDList::SSIDList(){
if(listAdr+SSIDListLength*SSIDLength > 4096) Serial.println("WARNING: EEPROM overflow!");
}
void SSIDList::load(){
len = EEPROM.read(lenAdr);
for(int i=0;i<len;i++){
for(int h=0;h<SSIDLength;h++){
char _nextChar = EEPROM.read(listAdr+(i*SSIDLength)+h);
names[i][h] = _nextChar;
}
}
}
void SSIDList::clear(){
len = 0;
}
void SSIDList::add(String name){
if(len < SSIDListLength){
for(int i=0;i<SSIDLength;i++){
if(i<name.length()) names[len][i] = name[i];
else names[len][i] = 0x00;
}
len++;
}
}
void SSIDList::edit(int num, String name){
for(int i=0;i<SSIDLength;i++){
if(i<name.length()) names[num][i] = name[i];
else names[num][i] = 0x00;
}
}
String SSIDList::get(int num){
String _name = "";
for(int i=0;i<SSIDLength;i++){
if(names[num][i] != 0x00) _name += names[num][i];
}
return _name;
}
void SSIDList::remove(int num){
if(num >= 0 && num < len){
for(int i=num;i<len-1;i++){
for(int h=0;h<SSIDLength;h++){
names[i][h] = names[i+1][h];
}
}
len--;
}
}
void SSIDList::save(){
if(debug) Serial.print("saving SSIDList...");
EEPROM.write(lenAdr, len);
for(int i=0;i<len;i++){
for(int h=0;h<SSIDLength;h++){
EEPROM.write(listAdr+(i*SSIDLength)+h, names[i][h]);
}
}
EEPROM.commit();
if(debug) Serial.println("done");
}
void SSIDList::_random(){
String _rName;
for(int i=len;i<SSIDListLength;i++){
_rName = "";
//_rName = "a"+(String)(int)random(0,99);
for(int h=0; h < SSIDLength; h++) _rName += letters[random(0,sizeof(letters))];
add(_rName);
}
}

View File

@@ -0,0 +1,35 @@
#ifndef SSIDList_h
#define SSIDList_h
#include <EEPROM.h>
#include "Mac.h"
#include "MacList.h"
#define listAdr 2048
#define lenAdr 2047
#define SSIDListLength 64
#define SSIDLength 32
extern const bool debug;
class SSIDList
{
public:
SSIDList();
void load();
void clear();
void add(String name);
void edit(int num, String name);
String get(int num);
void remove(int num);
void _random();
int len = 0;
private:
void save();
char letters[67] = {0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x20,0x2c,0x2e,0x2d,0x5f};
char names[SSIDListLength][SSIDLength];
};
#endif

File diff suppressed because one or more lines are too long

View File

@@ -15,8 +15,9 @@ extern "C" {
#include "ClientScan.h" #include "ClientScan.h"
#include "Attack.h" #include "Attack.h"
#include "Settings.h" #include "Settings.h"
#include "SSIDList.h"
const bool debug = true; const bool debug = false;
ESP8266WebServer server(80); ESP8266WebServer server(80);
@@ -32,6 +33,7 @@ APScan apScan;
ClientScan clientScan; ClientScan clientScan;
Attack attack; Attack attack;
Settings settings; Settings settings;
SSIDList ssidList;
void sniffer(uint8_t *buf, uint16_t len){ void sniffer(uint8_t *buf, uint16_t len){
clientScan.packetSniffer(buf,len); clientScan.packetSniffer(buf,len);
@@ -66,6 +68,10 @@ void setup(){
attack.stopAll(); attack.stopAll();
attack.generate(); attack.generate();
ssidList._random();
for(int i=0;i<ssidList.len;i++) Serial.println(ssidList.get(i));
Serial.println(attack.getResults());
/* ========== Web Server ========== */ /* ========== Web Server ========== */
/* HTML sites */ /* HTML sites */
@@ -94,7 +100,13 @@ void setup(){
server.on("/attackStart.json", startAttack); server.on("/attackStart.json", startAttack);
server.on("/settings.json", getSettings); server.on("/settings.json", getSettings);
server.on("/settingsSave.json", saveSettings); server.on("/settingsSave.json", saveSettings);
server.on("/settingsReset.json", resetSettings);
server.on("/deleteName.json", deleteName); server.on("/deleteName.json", deleteName);
server.on("/clearNameList.json", clearNameList);
server.on("/editNameList.json", editClientName);
server.on("/addSSID.json", addSSID);
server.on("/deleteSSID.json", deleteSSID);
server.on("/randomSSID.json", randomSSID);
server.begin(); server.begin();
} }
@@ -175,9 +187,24 @@ void startAttack(){
} }
} }
void addSSID(){
ssidList.add(server.arg("name"));
server.send( 200, "text/json", "true");
}
void deleteSSID(){
ssidList.remove(server.arg("num").toInt());
server.send( 200, "text/json", "true");
}
void randomSSID(){
ssidList._random();
server.send( 200, "text/json", "true");
}
//==========Settings========== //==========Settings==========
void getSettings(){ server.send ( 200, "text/json", settings.get() ); } void getSettings(){ server.send ( 200, "text/json", settings.get() ); }
void saveSettings(){ void saveSettings(){
if(server.hasArg("ssid")) settings.ssid = server.arg("ssid"); if(server.hasArg("ssid")) settings.ssid = server.arg("ssid");
if(server.hasArg("password")) settings.password = server.arg("password"); if(server.hasArg("password")) settings.password = server.arg("password");
@@ -190,6 +217,11 @@ void saveSettings(){
server.send( 200, "text/json", "true" ); server.send( 200, "text/json", "true" );
} }
void resetSettings(){
settings.reset();
server.send( 200, "text/json", "true" );
}
void deleteName(){ void deleteName(){
if(server.hasArg("num")) { if(server.hasArg("num")) {
int _num = server.arg("num").toInt(); int _num = server.arg("num").toInt();
@@ -198,3 +230,15 @@ void deleteName(){
} }
} }
void clearNameList(){
nameList.clear();
server.send( 200, "text/json", "true" );
}
void editClientName(){
if(server.hasArg("id") && server.hasArg("name")) {
nameList.edit(server.arg("id").toInt(),server.arg("name"));
server.send( 200, "text/json", "true");
}
}

View File

@@ -47,6 +47,11 @@
<b>beacon [beacon flood attack]:</b><br> <b>beacon [beacon flood attack]:</b><br>
Spams beacon frames with a similar SSID as the selected WiFi access point(s). Spams beacon frames with a similar SSID as the selected WiFi access point(s).
</p> </p>
<br />
<p class="block bold">SSIDs: <button class="marginNull warnBtn">clear</button> <button class="marginNull" onclick="randomSSID()">random</button> <button class="marginNull" onclick="addSSID()">add</button></p>
<br />
<table>
</table>
</div> </div>
</body> </body>
@@ -54,11 +59,13 @@
var selectedAPs = document.getElementById("selectedAPs"); var selectedAPs = document.getElementById("selectedAPs");
var selectedClients = document.getElementById("selectedClients"); var selectedClients = document.getElementById("selectedClients");
var table = document.getElementsByTagName("table")[0]; var table = document.getElementsByTagName("table")[0];
var ssidList = document.getElementsByTagName("table")[1];
var resultInterval; var resultInterval;
var res;
function getResults(){ function getResults(){
getResponse("attackInfo.json",function(responseText){ getResponse("attackInfo.json",function(responseText){
var res = JSON.parse(responseText); res = JSON.parse(responseText);
var aps = ""; var aps = "";
var clients = ""; var clients = "";
var tr = "<tr><th>Attack</th><th>Status</th><th>Start/Stop</th></tr>"; var tr = "<tr><th>Attack</th><th>Status</th><th>Start/Stop</th></tr>";
@@ -81,22 +88,45 @@
tr += "</tr>"; tr += "</tr>";
} }
table.innerHTML = tr; table.innerHTML = tr;
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(){ },function(){
clearInterval(resultInterval); clearInterval(resultInterval);
alert("timeout error. Please reload the site"); location.reload();
}); });
} }
function startStop(num){ function startStop(num){
getResponse("attackStart.json?num="+num,function(responseText){ getResponse("attackStart.json?num="+num,function(responseText){
if(responseText == "true") { if(responseText == "true") getResults();
getResults();
setTimeout(getResults,3000);
}
else alert("error"); else alert("error");
}); });
} }
function addSSID(){
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 deleteSSID(num){
getResponse("deleteSSID.json?num="+num,getResults);
}
function randomSSID(){
getResponse("randomSSID.json",getResults);
}
getResults(); getResults();
resultInterval = setInterval(getResults,3000); resultInterval = setInterval(getResults,3000);
</script> </script>

View File

@@ -1,4 +1,4 @@
function getResponse(adr, callback, timeoutCallback = function(){alert("timeout error. Please reload the site");}, timeout = 5000){ function getResponse(adr, callback, timeoutCallback = function(){location.reload()}, timeout = 5000){
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() { xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4){ if(xmlhttp.readyState == 4){

View File

@@ -121,6 +121,8 @@
if(responseText == "true") getResults(); if(responseText == "true") getResults();
else alert("error"); else alert("error");
toggleBtn(true); toggleBtn(true);
},function(){
location.reload();
}); });
} }

View File

@@ -62,13 +62,16 @@
<p class="small">only for deauth attack - may cause instability!</p> <p class="small">only for deauth attack - may cause instability!</p>
<br /> <br />
<br /> <br />
<button onclick="saveSettings()">save</button><p class="small" id="saved"></p> <button class="warnBtn" onclick="resetSettings()">reset</button> <button onclick="saveSettings()">save</button><p class="small" id="saved"></p>
<br /> <br />
<br /> <br />
<p class="block bold">Client Names</p> <p class="block bold" id="clientNames">Client Names</p>
<table id="nameList"> <table id="nameList">
<tr><th>MAC</th><th>Vendor</th><th>Name</th><th>X</th></tr>
</table> </table>
<br />
<button class="warnBtn" onclick="clearNameList()">clear</button></p>
</div> </div>
<table> <table>
@@ -84,6 +87,7 @@
var deauthReason = document.getElementById('deauthReason'); var deauthReason = document.getElementById('deauthReason');
var packetRate = document.getElementById('packetRate'); var packetRate = document.getElementById('packetRate');
var saved = document.getElementById('saved'); var saved = document.getElementById('saved');
var clientNames = document.getElementById('clientNames');
var res; var res;
function getData(){ function getData(){
@@ -97,8 +101,9 @@
deauthReason.value = res.deauthReason; deauthReason.value = res.deauthReason;
packetRate.value = res.attackPacketRate; packetRate.value = res.attackPacketRate;
var tr = ''; clientNames.innerHTML = "Client Names "+res.nameList.length+"/50";
if(res.nameList.length > 0) tr += '<tr><th>MAC</th><th>Vendor</th><th>Name</th><th>X</th></tr>';
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++){ for(var i=0;i<res.nameList.length;i++){
@@ -118,8 +123,8 @@
function changeName(id){ function changeName(id){
var newName = prompt("Name for "+res.nameList[id].mac); var newName = prompt("Name for "+res.nameList[id].mac);
if(newName != null){ if(newName != null){
getResponse("setName.json?id="+id+"&name="+newName,function(responseText){ getResponse("editNameList.json?id="+id+"&name="+newName,function(responseText){
if(responseText == "true") getResults(); if(responseText == "true") getData();
else alert("error"); else alert("error");
}); });
} }
@@ -151,6 +156,23 @@
}); });
} }
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(); getData();
</script> </script>
</html> </html>