|
|
|
|
@@ -5,7 +5,7 @@
|
|
|
|
|
#include <ESP8266mDNS.h>
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
#include "user_interface.h"
|
|
|
|
|
#include "user_interface.h"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#include <EEPROM.h>
|
|
|
|
|
@@ -31,30 +31,33 @@ Attack attack;
|
|
|
|
|
Settings settings;
|
|
|
|
|
SSIDList ssidList;
|
|
|
|
|
|
|
|
|
|
void sniffer(uint8_t *buf, uint16_t len){
|
|
|
|
|
clientScan.packetSniffer(buf,len);
|
|
|
|
|
void sniffer(uint8_t *buf, uint16_t len) {
|
|
|
|
|
clientScan.packetSniffer(buf, len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void startWifi(){
|
|
|
|
|
void startWifi() {
|
|
|
|
|
Serial.println("starting WiFi AP");
|
|
|
|
|
WiFi.mode(WIFI_STA);
|
|
|
|
|
wifi_set_promiscuous_rx_cb(sniffer);
|
|
|
|
|
WiFi.softAP((const char*)settings.ssid.c_str(), (const char*)settings.password.c_str(), settings.apChannel, settings.ssidHidden); //for an open network without a password change to: WiFi.softAP(ssid);
|
|
|
|
|
Serial.println("SSID: "+settings.ssid);
|
|
|
|
|
Serial.println("Password: "+settings.password);
|
|
|
|
|
if(settings.password.length()<8) Serial.println("WARNING: password must have at least 8 characters!");
|
|
|
|
|
if(settings.ssid.length()<1 || settings.ssid.length()>32) Serial.println("WARNING: SSID length must be between 1 and 32 characters!");
|
|
|
|
|
Serial.println("SSID: " + settings.ssid);
|
|
|
|
|
Serial.println("Password: " + settings.password);
|
|
|
|
|
if (settings.password.length() < 8) Serial.println("WARNING: password must have at least 8 characters!");
|
|
|
|
|
if (settings.ssid.length() < 1 || settings.ssid.length() > 32) Serial.println("WARNING: SSID length must be between 1 and 32 characters!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setup(){
|
|
|
|
|
void setup() {
|
|
|
|
|
|
|
|
|
|
Serial.begin(115200);
|
|
|
|
|
delay(2000);
|
|
|
|
|
|
|
|
|
|
EEPROM.begin(4096);
|
|
|
|
|
|
|
|
|
|
pinMode(BUILTIN_LED, OUTPUT);
|
|
|
|
|
digitalWrite(BUILTIN_LED, HIGH);
|
|
|
|
|
|
|
|
|
|
settings.load();
|
|
|
|
|
if(debug) settings.info();
|
|
|
|
|
if (debug) settings.info();
|
|
|
|
|
nameList.load();
|
|
|
|
|
ssidList.load();
|
|
|
|
|
|
|
|
|
|
@@ -105,39 +108,56 @@ void setup(){
|
|
|
|
|
server.on("/clearSSID.json", clearSSID);
|
|
|
|
|
server.on("/resetSSID.json", resetSSID);
|
|
|
|
|
server.on("/saveSSID.json", saveSSID);
|
|
|
|
|
server.on("/restartESP.json", restartESP);
|
|
|
|
|
|
|
|
|
|
server.begin();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void loop(){
|
|
|
|
|
if(clientScan.sniffing){
|
|
|
|
|
if(clientScan.stop()) startWifi();
|
|
|
|
|
} else{
|
|
|
|
|
void loop() {
|
|
|
|
|
if (clientScan.sniffing) {
|
|
|
|
|
if (clientScan.stop()) startWifi();
|
|
|
|
|
} else {
|
|
|
|
|
server.handleClient();
|
|
|
|
|
attack.run();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void load404(){ server.send ( 200, "text/html", data_get404()); }
|
|
|
|
|
void loadIndex(){ server.send ( 200, "text/html", data_getIndexHTML() ); }
|
|
|
|
|
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 loadManifest(){ server.send ( 200, "text/css", data_getManifest() ); }
|
|
|
|
|
void loadSettings(){ server.send( 200, "text/html", data_getSettingsHTML() ); }
|
|
|
|
|
void load404() {
|
|
|
|
|
server.send ( 200, "text/html", data_get404());
|
|
|
|
|
}
|
|
|
|
|
void loadIndex() {
|
|
|
|
|
server.send ( 200, "text/html", data_getIndexHTML() );
|
|
|
|
|
}
|
|
|
|
|
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 loadManifest() {
|
|
|
|
|
server.send ( 200, "text/css", data_getManifest() );
|
|
|
|
|
}
|
|
|
|
|
void loadSettings() {
|
|
|
|
|
server.send( 200, "text/html", data_getSettingsHTML() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//==========AP-Scan==========
|
|
|
|
|
void startAPScan(){
|
|
|
|
|
if(apScan.start()){
|
|
|
|
|
void startAPScan() {
|
|
|
|
|
if (apScan.start()) {
|
|
|
|
|
server.send ( 200, "text/json", "true");
|
|
|
|
|
attack.stopAll();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void sendAPResults(){
|
|
|
|
|
if(server.hasArg("apid")) {
|
|
|
|
|
void sendAPResults() {
|
|
|
|
|
if (server.hasArg("apid")) {
|
|
|
|
|
int apid = server.arg("apid").toInt();
|
|
|
|
|
server.send ( 200, "text/json", apScan.getResult(apid));
|
|
|
|
|
} else {
|
|
|
|
|
@@ -145,8 +165,8 @@ void sendAPResults(){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void selectAP(){
|
|
|
|
|
if(server.hasArg("num")) {
|
|
|
|
|
void selectAP() {
|
|
|
|
|
if (server.hasArg("num")) {
|
|
|
|
|
apScan.select(server.arg("num").toInt());
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
attack.stopAll();
|
|
|
|
|
@@ -154,129 +174,151 @@ void selectAP(){
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//==========Client-Scan==========
|
|
|
|
|
void startClientScan(){
|
|
|
|
|
if(server.hasArg("time") && apScan.getFirstTarget() > -1 && !clientScan.sniffing) {
|
|
|
|
|
void startClientScan() {
|
|
|
|
|
if (server.hasArg("time") && apScan.getFirstTarget() > -1 && !clientScan.sniffing) {
|
|
|
|
|
server.send(200, "text/json", "true");
|
|
|
|
|
clientScan.start(server.arg("time").toInt());
|
|
|
|
|
attack.stopAll();
|
|
|
|
|
} else server.send( 200, "text/json", "Error: no selected access point");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void sendClientResults(){ server.send( 200, "text/json", clientScan.getResults() ); }
|
|
|
|
|
void sendClientScanTime(){ server.send( 200, "text/json", (String)settings.clientScanTime ); }
|
|
|
|
|
void sendClientResults() {
|
|
|
|
|
server.send( 200, "text/json", clientScan.getResults() );
|
|
|
|
|
}
|
|
|
|
|
void sendClientScanTime() {
|
|
|
|
|
server.send( 200, "text/json", (String)settings.clientScanTime );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void selectClient(){
|
|
|
|
|
if(server.hasArg("num")) {
|
|
|
|
|
void selectClient() {
|
|
|
|
|
if (server.hasArg("num")) {
|
|
|
|
|
clientScan.select(server.arg("num").toInt());
|
|
|
|
|
attack.stop(0);
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setClientName(){
|
|
|
|
|
if(server.hasArg("id") && server.hasArg("name")) {
|
|
|
|
|
nameList.add(clientScan.getClientMac(server.arg("id").toInt()),server.arg("name"));
|
|
|
|
|
void setClientName() {
|
|
|
|
|
if (server.hasArg("id") && server.hasArg("name")) {
|
|
|
|
|
nameList.add(clientScan.getClientMac(server.arg("id").toInt()), server.arg("name"));
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//==========Attack==========
|
|
|
|
|
void sendAttackInfo(){ server.send( 200, "text/json", attack.getResults()); }
|
|
|
|
|
void sendAttackInfo() {
|
|
|
|
|
server.send( 200, "text/json", attack.getResults());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void startAttack(){
|
|
|
|
|
if(server.hasArg("num")) {
|
|
|
|
|
void startAttack() {
|
|
|
|
|
if (server.hasArg("num")) {
|
|
|
|
|
int _attackNum = server.arg("num").toInt();
|
|
|
|
|
if(apScan.getFirstTarget() > -1 || _attackNum == 2){
|
|
|
|
|
if (apScan.getFirstTarget() > -1 || _attackNum == 2) {
|
|
|
|
|
attack.start(server.arg("num").toInt());
|
|
|
|
|
server.send ( 200, "text/json", "true");
|
|
|
|
|
}else server.send( 200, "text/json", "false");
|
|
|
|
|
} else server.send( 200, "text/json", "false");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void addSSID(){
|
|
|
|
|
void addSSID() {
|
|
|
|
|
ssidList.add(server.arg("name"));
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void cloneSSID(){
|
|
|
|
|
void cloneSSID() {
|
|
|
|
|
ssidList.addClone(server.arg("name"));
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void deleteSSID(){
|
|
|
|
|
void deleteSSID() {
|
|
|
|
|
ssidList.remove(server.arg("num").toInt());
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void randomSSID(){
|
|
|
|
|
void randomSSID() {
|
|
|
|
|
ssidList._random();
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void clearSSID(){
|
|
|
|
|
void clearSSID() {
|
|
|
|
|
ssidList.clear();
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void resetSSID(){
|
|
|
|
|
void resetSSID() {
|
|
|
|
|
ssidList.load();
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void saveSSID(){
|
|
|
|
|
void saveSSID() {
|
|
|
|
|
ssidList.save();
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//==========Settings==========
|
|
|
|
|
void getSettings(){ server.send ( 200, "text/json", settings.get() ); }
|
|
|
|
|
void restartESP() {
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
ESP.reset();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void saveSettings(){
|
|
|
|
|
if(server.hasArg("ssid")) settings.ssid = server.arg("ssid");
|
|
|
|
|
if(server.hasArg("ssidHidden")){
|
|
|
|
|
if(server.arg("ssidHidden") == "false") settings.ssidHidden = 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("ssidHidden")) {
|
|
|
|
|
if (server.arg("ssidHidden") == "false") settings.ssidHidden = false;
|
|
|
|
|
else settings.ssidHidden = true;
|
|
|
|
|
}
|
|
|
|
|
if(server.hasArg("password")) settings.password = server.arg("password");
|
|
|
|
|
if(server.hasArg("apChannel")) settings.apChannel = server.arg("apChannel").toInt();
|
|
|
|
|
if(server.hasArg("ssidEnc")){
|
|
|
|
|
if(server.arg("ssidEnc") == "false") settings.attackEncrypted = false;
|
|
|
|
|
if (server.hasArg("password")) settings.password = server.arg("password");
|
|
|
|
|
if (server.hasArg("apChannel")) {
|
|
|
|
|
if(server.arg("apChannel").toInt() >= 1 && server.arg("apChannel").toInt() <= 11){
|
|
|
|
|
settings.apChannel = server.arg("apChannel").toInt();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (server.hasArg("ssidEnc")) {
|
|
|
|
|
if (server.arg("ssidEnc") == "false") settings.attackEncrypted = false;
|
|
|
|
|
else settings.attackEncrypted = true;
|
|
|
|
|
}
|
|
|
|
|
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();
|
|
|
|
|
if(server.hasArg("apScanHidden")){
|
|
|
|
|
if(server.arg("apScanHidden") == "false") settings.apScanHidden = false;
|
|
|
|
|
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();
|
|
|
|
|
if (server.hasArg("apScanHidden")) {
|
|
|
|
|
if (server.arg("apScanHidden") == "false") settings.apScanHidden = false;
|
|
|
|
|
else settings.apScanHidden = true;
|
|
|
|
|
}
|
|
|
|
|
if (server.hasArg("useLed")) {
|
|
|
|
|
if (server.arg("useLed") == "false") settings.useLed = false;
|
|
|
|
|
else settings.useLed = true;
|
|
|
|
|
attack.refreshLed();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
settings.save();
|
|
|
|
|
server.send( 200, "text/json", "true" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void resetSettings(){
|
|
|
|
|
void resetSettings() {
|
|
|
|
|
settings.reset();
|
|
|
|
|
server.send( 200, "text/json", "true" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void deleteName(){
|
|
|
|
|
if(server.hasArg("num")) {
|
|
|
|
|
void deleteName() {
|
|
|
|
|
if (server.hasArg("num")) {
|
|
|
|
|
int _num = server.arg("num").toInt();
|
|
|
|
|
nameList.remove(_num);
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void clearNameList(){
|
|
|
|
|
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"));
|
|
|
|
|
void editClientName() {
|
|
|
|
|
if (server.hasArg("id") && server.hasArg("name")) {
|
|
|
|
|
nameList.edit(server.arg("id").toInt(), server.arg("name"));
|
|
|
|
|
server.send( 200, "text/json", "true");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|