Increase stealth - Change the bssid of AP + random mode

+++ Ability to set the bssid
+++ Ability to randomize the bssid at load time
++ Updated settings.html

++ Added Mac::randomize()
+ Updated Attack::generate to use Mac::randomize()

+ removed Mac::setMac() and overloaded Mac::set() with new parameters
void set(uint8_t* mac);
void set(Mac adr);
This commit is contained in:
N0vaPixel
2017-06-18 15:37:18 +02:00
parent 3bb2a804d0
commit 3ae0a10961
10 changed files with 132 additions and 17 deletions

View File

@@ -1,7 +1,6 @@
#include "Attack.h" #include "Attack.h"
Attack::Attack() { Attack::Attack() {
randomSeed(os_random());
} }
void Attack::generate() { void Attack::generate() {
@@ -13,8 +12,7 @@ void Attack::generate() {
for (int i = 0; i < macListLen; i++) channels[i] = random(1, maxChannel); for (int i = 0; i < macListLen; i++) channels[i] = random(1, maxChannel);
do { do {
getRandomVendorMac(_randomMacBuffer); _randomBeaconMac.randomize();
for (int i = 0; i < 6; i++) _randomBeaconMac.setAt(_randomMacBuffer[i], i);
} while (beaconAdrs.add(_randomBeaconMac) >= 0); } while (beaconAdrs.add(_randomBeaconMac) >= 0);
if (debug) Serial.println("done"); if (debug) Serial.println("done");
@@ -162,7 +160,7 @@ void Attack::run() {
if (apScan.isSelected(a)) { if (apScan.isSelected(a)) {
Mac _ap; Mac _ap;
int _ch = apScan.getAPChannel(a); int _ch = apScan.getAPChannel(a);
_ap.setMac(apScan.aps._get(a)); _ap.set(apScan.aps._get(a));
wifi_set_channel(_ch); wifi_set_channel(_ch);
@@ -317,7 +315,7 @@ void Attack::_log(int num){
for(int a=0;a<apScan.results;a++){ for(int a=0;a<apScan.results;a++){
if(apScan.isSelected(a)){ if(apScan.isSelected(a)){
Mac _ap; Mac _ap;
_ap.setMac(apScan.aps._get(a)); _ap.set(apScan.aps._get(a));
addLog(_ap.toString()); addLog(_ap.toString());
} }
} }

View File

@@ -15,16 +15,22 @@ void Mac::set(uint8_t first, uint8_t second, uint8_t third, uint8_t fourth, uint
adress[5] = sixth; adress[5] = sixth;
} }
void Mac::setAt(uint8_t first, int num) { void Mac::set(uint8_t* mac) {
if (num > -1 && num < 6) adress[num] = first; for(int i=0; i<6 || i<sizeof(mac); i++){
adress[i] = mac[i];
}
} }
void Mac::setMac(Mac adr) { void Mac::set(Mac adr) {
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
adress[i] = adr._get(i); adress[i] = adr._get(i);
} }
} }
void Mac::setAt(uint8_t first, int num) {
if (num > -1 && num < 6) adress[num] = first;
}
bool Mac::valid() { bool Mac::valid() {
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
if (adress[i] != 0xFF && adress[i] != 0x00) return true; if (adress[i] != 0xFF && adress[i] != 0x00) return true;
@@ -52,6 +58,10 @@ void Mac::_println() {
Serial.println(Mac::toString()); Serial.println(Mac::toString());
} }
uint8_t* Mac::_get() {
return adress;
}
uint8_t Mac::_get(int num) { uint8_t Mac::_get(int num) {
return adress[num]; return adress[num];
} }
@@ -63,4 +73,10 @@ bool Mac::compare(Mac target) {
return true; return true;
} }
void Mac::randomize() {
uint8_t randomMac[6];
getRandomVendorMac(randomMac);
this->set(randomMac);
}

View File

@@ -3,19 +3,24 @@
#include <Arduino.h> #include <Arduino.h>
extern void getRandomVendorMac(uint8_t *buf);
class Mac class Mac
{ {
public: public:
Mac(); Mac();
void set(uint8_t first, uint8_t second, uint8_t third, uint8_t fourth, uint8_t fifth, uint8_t sixth); void set(uint8_t first, uint8_t second, uint8_t third, uint8_t fourth, uint8_t fifth, uint8_t sixth);
void set(uint8_t* mac);
void set(Mac adr);
void setAt(uint8_t first, int num); void setAt(uint8_t first, int num);
void setMac(Mac adr);
String toString(); String toString();
void _print(); void _print();
void _println(); void _println();
uint8_t* _get();
uint8_t _get(int num); uint8_t _get(int num);
bool compare(Mac target); bool compare(Mac target);
bool valid(); bool valid();
void randomize();
private: private:
uint8_t adress[6]; uint8_t adress[6];
}; };

View File

@@ -14,7 +14,7 @@ bool MacList::contains(Mac adr) {
int MacList::add(Mac adr) { int MacList::add(Mac adr) {
if(num < len && adr.valid()) { if(num < len && adr.valid()) {
if (!contains(adr)) { if (!contains(adr)) {
macAdrs[num].setMac(adr); macAdrs[num].set(adr);
num++; num++;
return num - 1; return num - 1;
} }
@@ -58,6 +58,6 @@ void MacList::remove(Mac adr) {
} }
void MacList::set(int num, Mac adr) { void MacList::set(int num, Mac adr) {
macAdrs[num].setMac(adr); macAdrs[num].set(adr);
} }

View File

@@ -1,7 +1,29 @@
#include "Settings.h" #include "Settings.h"
Settings::Settings() { Settings::Settings() {
uint8_t tempMAC[6];
defaultMacAP.set(WiFi.softAPmacAddress(tempMAC));
if(!defaultMacAP.valid()) defaultMacAP.randomize();
}
void Settings::syncMacInterface(){
if(debug) Serial.println("Trying to sync the MAC addr with settings");
if(isSettingsLoaded){
Mac macToSync;
if(isMacAPRand){
macToSync.randomize();
wifi_set_macaddr(SOFTAP_IF, macToSync._get());
if(debug) Serial.println("Synced with a random mac addr : " + macToSync.toString());
}else if(macAP.valid()){
macToSync = macAP;
wifi_set_macaddr(SOFTAP_IF, macToSync._get());
if(debug) Serial.println("Synced with saved mac addr : " + macToSync.toString());
}else{
if(debug) Serial.println("Could not sync because of invalid settings !");
}
}else{
if(debug) Serial.println("Could not sync because settings are not loaded !");
}
} }
void Settings::load() { void Settings::load() {
@@ -31,6 +53,11 @@ void Settings::load() {
} else { } else {
apChannel = 1; apChannel = 1;
} }
for(int i=0; i<6; i++){
macAP.setAt((uint8_t)EEPROM.read(macAPAdr+i),i);
}
if(!macAP.valid()) macAP.set(defaultMacAP);
isMacAPRand = (bool)EEPROM.read(isMacAPRandAdr);
apScanHidden = (bool)EEPROM.read(apScanHiddenAdr); apScanHidden = (bool)EEPROM.read(apScanHiddenAdr);
@@ -46,6 +73,7 @@ void Settings::load() {
macInterval = eepromReadInt(macIntervalAdr); macInterval = eepromReadInt(macIntervalAdr);
beaconInterval = (bool)EEPROM.read(beaconIntervalAdr); beaconInterval = (bool)EEPROM.read(beaconIntervalAdr);
ledPin = (int)EEPROM.read(ledPinAdr); ledPin = (int)EEPROM.read(ledPinAdr);
isSettingsLoaded = 1;
} }
void Settings::reset() { void Settings::reset() {
@@ -58,6 +86,8 @@ void Settings::reset() {
ssidLen = ssid.length(); ssidLen = ssid.length();
passwordLen = password.length(); passwordLen = password.length();
macAP = defaultMacAP;
isMacAPRand = 0;
apScanHidden = true; apScanHidden = true;
@@ -91,6 +121,12 @@ void Settings::save() {
EEPROM.write(ssidHiddenAdr, ssidHidden); EEPROM.write(ssidHiddenAdr, ssidHidden);
EEPROM.write(apChannelAdr, apChannel); EEPROM.write(apChannelAdr, apChannel);
EEPROM.write(isMacAPRandAdr, isMacAPRand);
for(int i=0; i<6; i++){
EEPROM.write(macAPAdr+i, macAP._get(i));
}
EEPROM.write(apScanHiddenAdr, apScanHidden); EEPROM.write(apScanHiddenAdr, apScanHidden);
EEPROM.write(deauthReasonAdr, deauthReason); EEPROM.write(deauthReasonAdr, deauthReason);
@@ -124,6 +160,9 @@ void Settings::info() {
Serial.println("password: " + password); Serial.println("password: " + password);
Serial.println("password length: " + (String)passwordLen); Serial.println("password length: " + (String)passwordLen);
Serial.println("channel: " + (String)apChannel); Serial.println("channel: " + (String)apChannel);
Serial.println("Default MAC AP: " + defaultMacAP.toString());
Serial.println("Saved MAC AP: " + macAP.toString());
Serial.println("MAC AP random: " + (String)isMacAPRand);
Serial.println("Scan hidden APs: " + (String)apScanHidden); Serial.println("Scan hidden APs: " + (String)apScanHidden);
Serial.println("deauth reson: " + (String)(int)deauthReason); Serial.println("deauth reson: " + (String)(int)deauthReason);
Serial.println("attack timeout: " + (String)attackTimeout); Serial.println("attack timeout: " + (String)attackTimeout);
@@ -147,6 +186,8 @@ size_t Settings::getSize() {
json += "\"ssidHidden\":" + (String)ssidHidden + ","; json += "\"ssidHidden\":" + (String)ssidHidden + ",";
json += "\"password\":\"" + password + "\","; json += "\"password\":\"" + password + "\",";
json += "\"apChannel\":" + (String)apChannel + ","; json += "\"apChannel\":" + (String)apChannel + ",";
json += "\"macAp\":\"" + macAP.toString() + "\",";
json += "\"randMacAp\":" + (String)isMacAPRand + ",";
json += "\"apScanHidden\":" + (String)apScanHidden + ","; json += "\"apScanHidden\":" + (String)apScanHidden + ",";
json += "\"deauthReason\":" + (String)(int)deauthReason + ","; json += "\"deauthReason\":" + (String)(int)deauthReason + ",";
json += "\"attackTimeout\":" + (String)attackTimeout + ","; json += "\"attackTimeout\":" + (String)attackTimeout + ",";
@@ -174,6 +215,8 @@ void Settings::send() {
json += "\"ssidHidden\":" + (String)ssidHidden + ","; json += "\"ssidHidden\":" + (String)ssidHidden + ",";
json += "\"password\":\"" + password + "\","; json += "\"password\":\"" + password + "\",";
json += "\"apChannel\":" + (String)apChannel + ","; json += "\"apChannel\":" + (String)apChannel + ",";
json += "\"macAp\":\"" + macAP.toString() + "\",";
json += "\"randMacAp\":" + (String)isMacAPRand + ",";
json += "\"apScanHidden\":" + (String)apScanHidden + ","; json += "\"apScanHidden\":" + (String)apScanHidden + ",";
json += "\"deauthReason\":" + (String)(int)deauthReason + ","; json += "\"deauthReason\":" + (String)(int)deauthReason + ",";
json += "\"attackTimeout\":" + (String)attackTimeout + ","; json += "\"attackTimeout\":" + (String)attackTimeout + ",";

View File

@@ -8,6 +8,10 @@
#include "MacList.h" #include "MacList.h"
#include "NameList.h" #include "NameList.h"
extern "C" {
#include "user_interface.h"
}
extern void sendBuffer(); extern void sendBuffer();
extern void sendToBuffer(String str); extern void sendToBuffer(String str);
extern void sendHeader(int code, String type, size_t _size); extern void sendHeader(int code, String type, size_t _size);
@@ -37,6 +41,8 @@ extern NameList nameList;
#define macIntervalAdr 1103 #define macIntervalAdr 1103
#define beaconIntervalAdr 1105 #define beaconIntervalAdr 1105
#define ledPinAdr 1106 #define ledPinAdr 1106
#define macAPAdr 1107
#define isMacAPRandAdr 1113
#define checkNumAdr 2001 #define checkNumAdr 2001
#define checkNum 15 #define checkNum 15
@@ -50,6 +56,7 @@ class Settings
void save(); void save();
void send(); void send();
void info(); void info();
void syncMacInterface();
int ssidLen; int ssidLen;
String ssid = ""; String ssid = "";
@@ -70,6 +77,10 @@ class Settings
int macInterval; int macInterval;
bool beaconInterval; bool beaconInterval;
int ledPin; int ledPin;
Mac defaultMacAP;
Mac macAP;
bool isMacAPRand;
bool isSettingsLoaded = 0;
private: private:
size_t getSize(); size_t getSize();

File diff suppressed because one or more lines are too long

View File

@@ -392,6 +392,25 @@ void saveSettings() {
settings.apChannel = server.arg("apChannel").toInt(); settings.apChannel = server.arg("apChannel").toInt();
} }
} }
if (server.hasArg("macAp")) {
String macStr = server.arg("macAp");
macStr.replace(":","");
Mac tempMac;
if(macStr.length() == 12){
for(int i=0;i<6;i++){
const char* val = macStr.substring(i*2,i*2+2).c_str();
uint8_t valByte = strtoul(val, NULL, 16);
tempMac.setAt(valByte,i);
}
if(tempMac.valid()) settings.macAP.set(tempMac);
} else if(macStr.length() == 0){
settings.macAP.set(settings.defaultMacAP);
}
}
if (server.hasArg("randMacAp")) {
if (server.arg("randMacAp") == "false") settings.isMacAPRand = false;
else settings.isMacAPRand = true;
}
if (server.hasArg("ssidEnc")) { if (server.hasArg("ssidEnc")) {
if (server.arg("ssidEnc") == "false") settings.attackEncrypted = false; if (server.arg("ssidEnc") == "false") settings.attackEncrypted = false;
else settings.attackEncrypted = true; else settings.attackEncrypted = true;
@@ -440,6 +459,8 @@ void resetSettings() {
void setup() { void setup() {
randomSeed(os_random());
#ifdef USE_LED16 #ifdef USE_LED16
pinMode(16, OUTPUT); pinMode(16, OUTPUT);
digitalWrite(16, LOW); digitalWrite(16, LOW);
@@ -454,6 +475,7 @@ void setup() {
settings.load(); settings.load();
if (debug) settings.info(); if (debug) settings.info();
settings.syncMacInterface();
nameList.load(); nameList.load();
ssidList.load(); ssidList.load();
@@ -553,11 +575,9 @@ void setup() {
delay(2000); delay(2000);
#endif #endif
} }
} }
void loop() { void loop() {
if (clientScan.sniffing) { if (clientScan.sniffing) {
if (clientScan.stop()) startWifi(); if (clientScan.stop()) startWifi();
} else { } else {

View File

@@ -2,6 +2,8 @@ var ssid = getE('ssid');
var ssidHidden = getE('ssidHidden'); var ssidHidden = getE('ssidHidden');
var password = getE('password'); var password = getE('password');
var apChannel = getE('apChannel'); var apChannel = getE('apChannel');
var macAp = getE('macAp');
var randMacAp = getE('randMacAp');
var apScanHidden = getE('apScanHidden'); var apScanHidden = getE('apScanHidden');
var scanTime = getE('scanTime'); var scanTime = getE('scanTime');
var timeout = getE('timeout'); var timeout = getE('timeout');
@@ -33,6 +35,8 @@ function getData() {
ssidHidden.checked = res.ssidHidden; ssidHidden.checked = res.ssidHidden;
password.value = res.password; password.value = res.password;
apChannel.value = res.apChannel; apChannel.value = res.apChannel;
macAp.value = res.macAp;
randMacAp.checked = res.randMacAp;
apScanHidden.checked = res.apScanHidden; apScanHidden.checked = res.apScanHidden;
scanTime.value = res.clientScanTime; scanTime.value = res.clientScanTime;
timeout.value = res.attackTimeout; timeout.value = res.attackTimeout;
@@ -56,6 +60,8 @@ function saveSettings() {
url += "&ssidHidden=" + ssidHidden.checked; url += "&ssidHidden=" + ssidHidden.checked;
url += "&password=" + password.value; url += "&password=" + password.value;
url += "&apChannel=" + apChannel.value; url += "&apChannel=" + apChannel.value;
url += "&macAp=" + macAp.value;
url += "&randMacAp=" + randMacAp.checked;
url += "&apScanHidden=" + apScanHidden.checked; url += "&apScanHidden=" + apScanHidden.checked;
url += "&scanTime=" + scanTime.value; url += "&scanTime=" + scanTime.value;
url += "&timeout=" + timeout.value; url += "&timeout=" + timeout.value;

View File

@@ -61,6 +61,22 @@
<input type="number" id="apChannel" min="1" max="14"> <input type="number" id="apChannel" min="1" max="14">
</div> </div>
</div> </div>
<div class="row">
<div class="col-6">
<label for="apChannel">MAC</label>
</div>
<div class="col-6">
<input type="text" id="macAp" min="1" max="14">
</div>
</div>
<div class="row">
<div class="col-6">
<label for="ssidHidden">Random MAC</label>
</div>
<div class="col-6">
<input type="checkbox" name="randMacAp" id="randMacAp" value="false">
</div>
</div>
<br /> <br />
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">