Compare commits

...

39 Commits

Author SHA1 Message Date
Just Call Me Koko
467c58fef3 Merge pull request #1067 from justcallmekoko/develop
Add commands for SAE sniff and attack
2026-01-20 11:38:41 -05:00
Just Call Me Koko
52eea5f4f7 Add commands for SAE sniff and attack 2026-01-20 11:15:05 -05:00
Just Call Me Koko
2430db99b3 Merge pull request #1066 from justcallmekoko/develop
Output SAE attack stats
2026-01-19 22:54:30 -05:00
Just Call Me Koko
1ed63e3386 Output SAE attack stats 2026-01-19 22:49:28 -05:00
Just Call Me Koko
0196c00220 Merge pull request #1065 from justcallmekoko/develop
Add SAE sniff and SAE spam attack
2026-01-19 20:24:55 -05:00
Just Call Me Koko
6456527f5f Sniff SAE tokens while attacking 2026-01-19 19:15:18 -05:00
Just Call Me Koko
e7e8fc7d80 Add SAE commit sniff and attack 2026-01-19 16:20:27 -05:00
Just Call Me Koko
5fdf09c8fa Adjust capture of ACT 2026-01-18 14:23:18 -05:00
Just Call Me Koko
af9938f8eb Merge pull request #1059 from justcallmekoko/develop
Capture and parse SAE commit frames
2026-01-17 10:26:37 -05:00
Just Call Me Koko
14e18a12bf Capture and parse SAE commit frames 2026-01-17 10:14:51 -05:00
Just Call Me Koko
0ba3d0f60a Merge pull request #1056 from justcallmekoko/develop
Remove v7.1 from build list
2026-01-15 16:47:16 -05:00
Just Call Me Koko
d94a059b81 Remove v7.1 from build list 2026-01-15 16:12:44 -05:00
Just Call Me Koko
140668448f Merge pull request #1055 from justcallmekoko/develop
Remove continuous BT wardrive
2026-01-14 10:03:10 -05:00
Just Call Me Koko
18e582b9a9 Remove continuous BT wardrive 2026-01-14 09:47:41 -05:00
Just Call Me Koko
961bcb6cf5 Merge pull request #1052 from justcallmekoko/develop
Fix PCAPs not saving for MAC tracker
2026-01-13 15:42:46 -05:00
Just Call Me Koko
2fa969552a Remove frame check print 2026-01-13 15:23:48 -05:00
Just Call Me Koko
e4528d9dea Fix tracking not saving PCAPs 2026-01-13 14:33:31 -05:00
Just Call Me Koko
774d5f0707 Merge pull request #1050 from justcallmekoko/develop
Update Sour Apple
2026-01-13 08:13:54 -05:00
Just Call Me Koko
bab011e618 Refactor sour apple 2026-01-13 07:37:59 -05:00
Just Call Me Koko
07a684a03e Merge pull request #1045 from justcallmekoko/develop
Following MACs save PCAPs
2026-01-11 14:24:16 -05:00
Just Call Me Koko
cbb2d33f24 Following MACs save PCAPs 2026-01-11 14:01:19 -05:00
Just Call Me Koko
3bb45c1ff3 Fix not saving APs during wardrive 2026-01-11 13:01:32 -05:00
Just Call Me Koko
e3fe40ede0 Merge pull request #1043 from justcallmekoko/develop
Fix distance threshold
2026-01-11 00:39:49 -05:00
Just Call Me Koko
b09be1c093 Fix distance threshold 2026-01-10 22:32:30 -05:00
Just Call Me Koko
8e0ed07483 Merge pull request #1042 from justcallmekoko/develop
Oopsie
2026-01-09 23:02:25 -05:00
Just Call Me Koko
0ff6411407 Oopsie 2026-01-09 22:57:35 -05:00
Just Call Me Koko
249ba6eabe Merge pull request #1041 from justcallmekoko/develop
MAC track BLE and revamp wardrive UI
2026-01-09 17:41:00 -05:00
Just Call Me Koko
7a19fcb458 MAC track BLE and revamp wardrive UI 2026-01-09 17:32:56 -05:00
Just Call Me Koko
88762063ff Merge pull request #1040 from justcallmekoko/develop
Add CLI command for MAC tracking
2026-01-08 12:45:44 -05:00
Just Call Me Koko
26370241ee Add CLI command for MAC tracking 2026-01-08 12:40:54 -05:00
Just Call Me Koko
9d2a1ab3aa Merge pull request #1036 from justcallmekoko/develop
GPS now operates at 115200 baud
2026-01-07 17:51:54 -05:00
Just Call Me Koko
6a360b236c GPS now operates at 115200 baud 2026-01-07 17:44:41 -05:00
Just Call Me Koko
a20b25a39c Merge pull request #1034 from justcallmekoko/develop
Fix eviction criteria and work mini displays
2026-01-06 16:35:03 -05:00
Just Call Me Koko
cb4a6cd51e Fix eviction criteria and work mini displays 2026-01-06 13:47:06 -05:00
Just Call Me Koko
a785a3b125 Merge pull request #1033 from justcallmekoko/develop
Add MAC tracking backend
2026-01-05 20:55:24 -05:00
Just Call Me Koko
7a7c01512b Fix non-display hardware 2026-01-05 20:29:42 -05:00
Just Call Me Koko
60f446245d Add location for MAC tracking 2026-01-05 19:02:02 -05:00
Just Call Me Koko
fb73afd359 Add backend for MAC tracking 2026-01-05 00:17:49 -05:00
Just Call Me Koko
337cf18dac Add menu item for mac monitor 2026-01-04 03:03:50 -05:00
15 changed files with 1571 additions and 378 deletions

View File

@@ -34,7 +34,6 @@ jobs:
- { name: "Marauder CYD 2432S024 GUITION", flag: "MARAUDER_CYD_GUITION", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S024_guition", tft: true, tft_file: "User_Setup_cyd_guition.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028 2 USB", flag: "MARAUDER_CYD_2USB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028_2usb", tft: true, tft_file: "User_Setup_cyd_2usb.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 3.5inch", flag: "MARAUDER_CYD_3_5_INCH", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_3_5_inch", tft: true, tft_file: "User_Setup_cyd_3_5_inch.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7.1", flag: "MARAUDER_V7_1", fbqn: "esp32:esp32:dfrobot_firebeetle2_esp32e:FlashSize=16M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "marauder_v7_1", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "dfrobot_firebeetle2_esp32e", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5Cardputer", flag: "MARAUDER_CARDPUTER", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=8M,PSRAM=disabled", file_name: "m5cardputer", tft: true, tft_file: "User_Setup_marauder_m5cardputer.h", build_dir: "esp32s3", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:FlashSize=8M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.4", nimble_ver: "2.3.6", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }

View File

@@ -52,6 +52,10 @@ void Buffer::open(bool is_pcap){
}
}
String Buffer::getFileName() {
return this->fileName;
}
void Buffer::openFile(String file_name, fs::FS* fs, bool serial, bool is_pcap, bool is_gpx) {
bool save_pcap = settings_obj.loadSetting<bool>("SavePCAP");
if (!save_pcap) {

View File

@@ -25,6 +25,7 @@ class Buffer {
void append(wifi_promiscuous_pkt_t *packet, int len);
void append(String log);
void save();
String getFileName();
private:
void createFile(String name, bool is_pcap, bool is_gpx = false);
void open(bool is_pcap);

View File

@@ -240,10 +240,12 @@ void CommandLine::runCommand(String input) {
Serial.println(HELP_SNIFF_ESP_CMD);
Serial.println(HELP_SNIFF_DEAUTH_CMD);
Serial.println(HELP_SNIFF_PMKID_CMD);
Serial.println(HELP_SNIFF_SAE_CMD);
Serial.println(HELP_STOPSCAN_CMD);
#ifdef HAS_GPS
Serial.println(HELP_WARDRIVE_CMD);
#endif
Serial.println(HELP_MAC_TRACK_CMD);
// WiFi attack
Serial.println(HELP_ATTACK_CMD);
@@ -323,7 +325,8 @@ void CommandLine::runCommand(String input) {
else if (cmd_args.get(0) == GPS_DATA_CMD) {
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
Serial.println("Getting GPS Data. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Getting GPS Data. Stop with "));
Serial.println((String)STOPSCAN_CMD);
wifi_scan_obj.currentScanMode = WIFI_SCAN_GPS_DATA;
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsInfoMenu);
@@ -388,7 +391,8 @@ void CommandLine::runCommand(String input) {
nmea_type="beidou_bd";
}
gps_obj.setType(nmea_type);
Serial.println("GPS Output Type Set To: " + nmea_type);
Serial.print(F("GPS Output Type Set To: "));
Serial.println(nmea_type);
}
else
Serial.println(F("You did not provide a valid argument"));
@@ -466,12 +470,14 @@ void CommandLine::runCommand(String input) {
int ch_set = this->argSearch(&cmd_args, "-s");
if (cmd_args.size() == 1) {
Serial.println("Current channel: " + (String)wifi_scan_obj.set_channel);
Serial.print(F("Current channel: "));
Serial.println(wifi_scan_obj.set_channel);
}
else if (ch_set != -1) {
wifi_scan_obj.set_channel = cmd_args.get(ch_set + 1).toInt();
wifi_scan_obj.changeChannel();
Serial.println("Set channel: " + (String)wifi_scan_obj.set_channel);
Serial.print(F("Set channel: "));
Serial.println(wifi_scan_obj.set_channel);
}
}
// Clear APs
@@ -529,7 +535,8 @@ void CommandLine::runCommand(String input) {
}
if (!result) {
Serial.println("Could not successfully update setting \"" + setting_name + "\"");
Serial.print(F("Could not successfully update setting \""));
Serial.println(setting_name + "\"");
return;
}
}
@@ -547,7 +554,8 @@ void CommandLine::runCommand(String input) {
// Signal strength scan
if (cmd_args.get(0) == SIGSTREN_CMD) {
Serial.println("Starting Signal Strength Scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Signal Strength Scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -557,7 +565,8 @@ void CommandLine::runCommand(String input) {
}
// Packet count
else if (cmd_args.get(0) == PACKET_COUNT_CMD) {
Serial.println("Starting Packet Count Scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Packet Count Scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -572,7 +581,8 @@ void CommandLine::runCommand(String input) {
int flk_sw = this->argSearch(&cmd_args, "-f");
if (flk_sw != -1) {
Serial.println("Starting Flock Wardrive. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Flock Wardrive. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -580,7 +590,8 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(BT_SCAN_FLOCK_WARDRIVE, TFT_GREEN);
}
else if (sta_sw != -1) {
Serial.println("Starting Station Wardrive. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Station Wardrive. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -735,6 +746,15 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_AP, TFT_MAGENTA);
}
// SAE sniff
else if (cmd_args.get(0) == SNIFF_SAE_CMD) {
Serial.println("Starting SAE Commit sniff. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_SAE_COMMIT, TFT_MAGENTA);
}
// Probe sniff
else if (cmd_args.get(0) == SNIFF_PROBE_CMD) {
Serial.println("Starting Probe sniff. Stop with " + (String)STOPSCAN_CMD);
@@ -822,6 +842,15 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(WIFI_SCAN_ACTIVE_EAPOL, TFT_VIOLET);
}
}
// MAC Tracking
else if (cmd_args.get(0) == MAC_TRACK_CMD) {
Serial.println("Starting MAC Tracker. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_DETECT_FOLLOW, TFT_MAGENTA);
}
//// MAC Address commands (Added by H4W9_4)
@@ -1075,6 +1104,14 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_FUNNY_BEACON, TFT_CYAN);
}
else if (attack_type == ATTACK_TYPE_SAE) {
Serial.println("Starting SAE Commit spam. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_SAE_COMMIT, TFT_CYAN);
}
else {
Serial.println(F("Attack type not properly defined"));
return;
@@ -1248,23 +1285,13 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_BT
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
int cont_sw = this->argSearch(&cmd_args, "-c");
if (cont_sw == -1) {
Serial.println("Starting BT Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE, TFT_GREEN);
}
else {Serial.println("Starting Continuous BT Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE_CONT, TFT_GREEN);
}
Serial.println("Starting BT Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE, TFT_GREEN);
}
else
Serial.println(F("GPS Module not detected"));

View File

@@ -78,6 +78,8 @@ const char PROGMEM WARDRIVE_CMD[] = "wardrive";
const char PROGMEM PING_CMD[] = "pingscan";
const char PROGMEM PORT_SCAN_CMD[] = "portscan";
const char PROGMEM ARP_SCAN_CMD[] = "arpscan";
const char PROGMEM MAC_TRACK_CMD[] = "mactrack";
const char PROGMEM SNIFF_SAE_CMD[] = "sniffsae";
// WiFi attack
const char PROGMEM ATTACK_CMD[] = "attack";
@@ -88,6 +90,7 @@ const char PROGMEM ATTACK_TYPE_FUNNY[] = "funny";
const char PROGMEM ATTACK_TYPE_RR[] = "rickroll";
const char PROGMEM ATTACK_TYPE_BM[] = "badmsg";
const char PROGMEM ATTACK_TYPE_S[] = "sleep";
const char PROGMEM ATTACK_TYPE_SAE[] = "sae";
// WiFi Aux
const char PROGMEM LIST_AP_CMD[] = "list";
@@ -152,9 +155,11 @@ const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s/-f]";
const char PROGMEM HELP_PING_CMD[] = "pingscan";
const char PROGMEM HELP_PORT_SCAN_CMD[] = "portscan [-a -t <ip index>]/[-s <ssh/telnet/dns/http/smtp/https/rdp>]";
const char PROGMEM HELP_ARP_SCAN_CMD[] = "arpscan [-f]";
const char PROGMEM HELP_MAC_TRACK_CMD[] = "mactrack";
const char PROGMEM HELP_SNIFF_SAE_CMD[] = "sniffsae";
// WiFi attack
const char PROGMEM HELP_ATTACK_CMD[] = "attack -t <beacon [-l/-r/-a]/deauth [-c]/[-s <src mac>] [-d <dst mac>]/probe/rickroll/badmsg [-c]/sleep [-c]>";
const char PROGMEM HELP_ATTACK_CMD[] = "attack -t <sae/beacon [-l/-r/-a]/deauth [-c]/[-s <src mac>] [-d <dst mac>]/probe/rickroll/badmsg [-c]/sleep [-c]>";
// WiFi Aux
const char PROGMEM HELP_LIST_AP_CMD_A[] = "list -s";
@@ -183,7 +188,7 @@ const char PROGMEM HELP_BT_SPOOFAT_CMD[] = "spoofat -t <index>";
//const char PROGMEM HELP_BT_SWIFTPAIR_SPAM_CMD[] = "swiftpair";
//const char PROGMEM HELP_BT_SAMSUNG_SPAM_CMD[] = "samsungblespam";
//onst char PROGMEM HELP_BT_SPAM_ALL_CMD[] = "btspamall";
const char PROGMEM HELP_BT_WARDRIVE_CMD[] = "btwardrive [-c]";
const char PROGMEM HELP_BT_WARDRIVE_CMD[] = "btwardrive";
const char PROGMEM HELP_BT_SKIM_CMD[] = "sniffskim";
const char PROGMEM HELP_FOOT[] = "==================================";

View File

@@ -13,7 +13,7 @@
#include <LinkedList.h>
#include <SPI.h>
//#include <lvgl.h>
#include <Ticker.h>
//#include <Ticker.h>
#include "SPIFFS.h"
#include "Assets.h"

View File

@@ -10,23 +10,22 @@ MicroNMEA nmea(nmeaBuffer, sizeof(nmeaBuffer));
HardwareSerial Serial2(GPS_SERIAL_INDEX);
static const char *PCAS_SET_115200 = "$PCAS01,5*19\r\n";
static const uint32_t PROBE_MS = 1200;
void GpsInterface::begin() {
/*#ifdef MARAUDER_MINI
pinMode(26, OUTPUT);
delay(1);
analogWrite(26, 243);
delay(1);
Serial.println("Activated GPS");
delay(100);
#endif*/
Serial2.begin(9600, SERIAL_8N1, GPS_TX, GPS_RX);
uint32_t gps_baud = this->initGpsBaudAndForce115200();
if ((gps_baud != 9600) && (gps_baud != 115200))
Serial.println("Could not detect GPS baudrate");
delay(1000);
MicroNMEA::sendSentence(Serial2, "$PSTMSETPAR,1201,0x00000042");
MicroNMEA::sendSentence(Serial2, "$PSTMSAVEPAR");
@@ -35,7 +34,6 @@ void GpsInterface::begin() {
delay(1000);
if (Serial2.available()) {
Serial.println("GPS Attached Successfully");
this->gps_enabled = true;
while (Serial2.available()) {
//Fetch the character one by one
@@ -58,6 +56,67 @@ void GpsInterface::begin() {
}
bool GpsInterface::probeBaud(uint32_t baud) {
Serial2.end();
delay(50);
Serial2.begin(baud, SERIAL_8N1, GPS_TX, GPS_RX);
uint32_t start = millis();
bool sawDollar = false;
bool parsedSentence = false;
while (millis() - start < PROBE_MS) {
while (Serial2.available()) {
char c = (char)Serial2.read();
if (c == '$') {
sawDollar = true;
}
// Feed characters directly to MicroNMEA
if (nmea.process(c)) {
parsedSentence = true;
}
// If weve seen real NMEA traffic and MicroNMEA parsed something,
// this baud is almost certainly correct
if (sawDollar && parsedSentence) {
return true;
}
}
delay(1);
}
return false;
}
void GpsInterface::setGpsTo115200From9600() {
Serial2.print(PCAS_SET_115200);
Serial2.flush();
delay(200);
}
uint32_t GpsInterface::initGpsBaudAndForce115200() {
if (probeBaud(115200)) {
return 115200;
}
if (probeBaud(9600)) {
setGpsTo115200From9600();
if (probeBaud(115200)) {
return 115200;
}
probeBaud(9600);
return 9600;
}
probeBaud(9600);
return 0;
}
//passthrough for other objects
void gps_nmea_notimp(MicroNMEA& nmea){
gps_obj.enqueue(nmea);
@@ -518,6 +577,9 @@ void GpsInterface::setGPSInfo() {
this->datetime = this->dt_string_from_gps();
this->lat_int = nmea.getLatitude();
this->lon_int = nmea.getLongitude();
this->lat = String((float)nmea.getLatitude()/1000000, 7);
this->lon = String((float)nmea.getLongitude()/1000000, 7);
long alt = 0;
@@ -543,6 +605,14 @@ String GpsInterface::getLon() {
return this->lon;
}
int32_t GpsInterface::getLatInt() {
return this->lat_int;
}
int32_t GpsInterface::getLonInt() {
return this->lon_int;
}
float GpsInterface::getAlt() {
return this->altf;
}

View File

@@ -46,6 +46,8 @@ class GpsInterface {
bool getGpsModuleStatus();
String getLat();
String getLon();
int32_t getLatInt();
int32_t getLonInt();
float getAlt();
float getAccuracy();
String getDatetime();
@@ -93,6 +95,8 @@ class GpsInterface {
String notparsed_nmea_sentence = "";
String lat = "";
String lon = "";
int32_t lat_int = 0;
int32_t lon_int = 0;
float altf = 0.0;
float accuracy = 0.0;
String datetime = "";
@@ -117,6 +121,9 @@ class GpsInterface {
void flush_queue_nmea();
String dt_string_from_gps();
void setGPSInfo();
bool probeBaud(uint32_t baud);
void setGpsTo115200From9600();
uint32_t initGpsBaudAndForce115200();
};
#endif

View File

@@ -203,6 +203,8 @@ void MenuFunctions::main(uint32_t currentTime)
{
// Stop the current scan
if ((wifi_scan_obj.currentScanMode == WIFI_SCAN_PROBE) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_SAE_COMMIT) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_DETECT_FOLLOW) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION_WAR_DRIVE) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_AP) ||
@@ -237,6 +239,7 @@ void MenuFunctions::main(uint32_t currentTime)
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_BAD_MSG) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP_TARGETED) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SAE_COMMIT) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_MIMIC) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_FUNNY_BEACON) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_RICK_ROLL) ||
@@ -300,6 +303,8 @@ void MenuFunctions::main(uint32_t currentTime)
{
// Stop the current scan
if ((wifi_scan_obj.currentScanMode == WIFI_SCAN_PROBE) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_SAE_COMMIT) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_DETECT_FOLLOW) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION_WAR_DRIVE) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_RAW_CAPTURE) ||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION) ||
@@ -336,6 +341,7 @@ void MenuFunctions::main(uint32_t currentTime)
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_BAD_MSG) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP_TARGETED) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SAE_COMMIT) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_MIMIC) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_FUNNY_BEACON) ||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_RICK_ROLL) ||
@@ -401,6 +407,7 @@ void MenuFunctions::main(uint32_t currentTime)
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_BAD_MSG) &&
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_SLEEP) &&
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_SLEEP_TARGETED) &&
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_SAE_COMMIT) &&
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_MIMIC) &&
(wifi_scan_obj.currentScanMode != WIFI_SCAN_PACKET_RATE) &&
(wifi_scan_obj.currentScanMode != WIFI_SCAN_RAW_CAPTURE) &&
@@ -1669,6 +1676,16 @@ void MenuFunctions::RunSetup()
this->drawStatusBar();
wifi_scan_obj.StartScan(WIFI_SCAN_SIG_STREN, TFT_CYAN);
});
this->addNodes(&wifiSnifferMenu, "MAC Monitor", TFTMAGENTA, NULL, SCANNERS, [this]() {
display_obj.clearScreen();
this->drawStatusBar();
wifi_scan_obj.StartScan(WIFI_SCAN_DETECT_FOLLOW, TFT_MAGENTA);
});
this->addNodes(&wifiSnifferMenu, "SAE Commit", TFTLIME, NULL, EAPOL, [this]() {
display_obj.clearScreen();
this->drawStatusBar();
wifi_scan_obj.StartScan(WIFI_SCAN_SAE_COMMIT, TFT_GREEN);
});
// Build Wardriving menu
#ifdef HAS_GPS
@@ -1835,6 +1852,11 @@ void MenuFunctions::RunSetup()
this->drawStatusBar();
wifi_scan_obj.StartScan(WIFI_ATTACK_SLEEP_TARGETED, TFT_MAGENTA);
});
this->addNodes(&wifiAttackMenu, "SAE Commit Flood", TFTLIME, NULL, EAPOL, [this]() {
display_obj.clearScreen();
this->drawStatusBar();
wifi_scan_obj.StartScan(WIFI_ATTACK_SAE_COMMIT, TFT_GREEN);
});
evilPortalMenu.parentMenu = &wifiAttackMenu;
this->addNodes(&evilPortalMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
@@ -2418,11 +2440,6 @@ void MenuFunctions::RunSetup()
this->drawStatusBar();
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE, TFT_GREEN);
});
this->addNodes(&bluetoothSnifferMenu, "BT Wardrive Continuous", TFTRED, NULL, REBOOT, [this]() {
display_obj.clearScreen();
this->drawStatusBar();
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE_CONT, TFT_GREEN);
});
}
#endif
this->addNodes(&bluetoothSnifferMenu, text_table1[35], TFTMAGENTA, NULL, CC_SKIMMERS, [this]() {

View File

@@ -193,7 +193,7 @@ class MenuFunctions
Menu evilPortalMenu;
static void lv_tick_handler();
//static void lv_tick_handler();
// Menu icons
@@ -260,7 +260,7 @@ class MenuFunctions
Menu infoMenu;
Menu apInfoMenu;
Ticker tick;
//Ticker tick;
uint16_t x = -1, y = -1;
boolean pressed = false;

File diff suppressed because it is too large Load Diff

View File

@@ -28,12 +28,17 @@
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#include <esp_timer.h>
#include "mbedtls/entropy.h"
#include "mbedtls/bignum.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/ecp.h"
#ifndef HAS_DUAL_BAND
#include <lwip/etharp.h>
#include <lwip/ip_addr.h>
#endif
#ifdef HAS_DUAL_BAND
#include "esp_system.h"
#include "esp_mac.h"
#endif
#if defined(HAS_BT) && !defined(HAS_DUAL_BAND)
#include "esp_bt.h"
@@ -144,6 +149,9 @@
#define BT_SCAN_SIMPLE 73
#define BT_SCAN_SIMPLE_TWO 74
#define BT_SCAN_FLOCK_WARDRIVE 75
#define WIFI_SCAN_DETECT_FOLLOW 76
#define WIFI_SCAN_SAE_COMMIT 77
#define WIFI_ATTACK_SAE_COMMIT 78
#define WIFI_ATTACK_FUNNY_BEACON 99
@@ -215,9 +223,29 @@ extern Settings settings_obj;
esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, bool en_sys_seq);
#ifdef HAS_DUAL_BAND
esp_err_t esp_base_mac_addr_set(uint8_t *Mac);
#endif
//#ifdef HAS_DUAL_BAND
// esp_err_t esp_base_mac_addr_set(uint8_t *Mac);
//#endif
#define EMPTY_ENTRY 0
#define VALID_ENTRY 1
#define TOMBSTONE_ENTRY 2
#pragma pack(push, 1)
struct MacEntry {
uint8_t mac[6];
uint32_t last_seen_ms;
uint16_t frame_count;
int32_t first_lat_e6;
int32_t first_lon_e6;
int32_t last_lat_e6;
int32_t last_lon_e6;
bool following;
int32_t dloc;
int8_t rssi;
bool bt;
};
#pragma pack(pop)
struct AirTag {
String mac; // MAC address of the AirTag
@@ -237,6 +265,11 @@ struct Flipper {
extern struct mac_addr* mac_history;
#endif
enum class MacSortMode : uint8_t {
MOST_RECENT,
MOST_FRAMES
};
class WiFiScan
{
private:
@@ -246,6 +279,8 @@ class WiFiScan
struct mac_addr mac_history[mac_history_len];
#endif
int current_act_len = 0;
uint32_t chanActTime = 0;
uint8_t ap_mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
@@ -281,6 +316,8 @@ class WiFiScan
//int num_deauth = 0; // RED
uint32_t initTime = 0;
uint32_t last_ui_update = 0;
uint32_t last_sour_apple_update = 0;
bool run_setup = true;
void initWiFi(uint8_t scan_mode);
uint8_t bluetoothScanTime = 5;
@@ -406,6 +443,15 @@ class WiFiScan
LinkedList<ConfirmedMultiSSID>* confirmed_multissid;
bool multissid_list_full_reported;
uint8_t sae_commit[32] = {
0xb0, 0x00, 0x00, 0x00, // Type/Subtype, Duration
0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, // Destination
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // Source
0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, // BSSID (Destination)
0x00, 0x00, // Frag num
0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00 // Auth alg (SAE), SAE sequence, group 19
};
// barebones packet
uint8_t packet[128] = { 0x80, 0x00, 0x00, 0x00, //Frame Control, Duration
/*4*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //Destination address
@@ -525,6 +571,7 @@ class WiFiScan
NimBLEAdvertisementData GetUniversalAdvertisementData(EBLEPayloadType type);
#endif
void updateTrackerUI();
void showNetworkInfo();
void setNetworkInfo();
void fullARP();
@@ -535,17 +582,19 @@ class WiFiScan
bool isHostAlive(IPAddress ip);
bool checkHostPort(IPAddress ip, uint16_t port, uint16_t timeout = 100);
String extractManufacturer(const uint8_t* payload);
int checkMatchAP(char addr[]);
int checkMatchAP(char addr[], bool update_ap = true);
bool beaconHasWPS(const uint8_t* payload, int len);
uint8_t getSecurityType(const uint8_t* beacon, uint16_t len);
void addAnalyzerValue(int16_t value, int rssi_avg, int16_t target_array[], int array_size);
bool mac_cmp(struct mac_addr addr1, struct mac_addr addr2);
bool mac_cmp(uint8_t addr1[6], uint8_t addr2[6]);
void clearMacHistory();
void executeWarDrive();
void executeSourApple();
void executeSpoofAirtag();
void executeSwiftpairSpam(EBLEPayloadType type);
void startWardriverWiFi();
void saeAttackLoop(uint32_t currentTime);
//void generateRandomMac(uint8_t* mac);
//void generateRandomName(char *name, size_t length);
String processPwnagotchiBeacon(const uint8_t* frame, int length);
@@ -564,6 +613,7 @@ class WiFiScan
void tftDrawChannelScaleButtons();
void tftDrawColorKey();
void tftDrawGraphObjects();
bool sendSAECommitFrame(uint8_t* targ_addr, uint8_t* src_addr) ;
void sendProbeAttack(uint32_t currentTime);
void sendDeauthAttack(uint32_t currentTime, String dst_mac_str = "ff:ff:ff:ff:ff:ff");
void sendBadMsgAttack(uint32_t currentTime, bool all = false);
@@ -590,6 +640,7 @@ class WiFiScan
void RunDeauthScan(uint8_t scan_mode, uint16_t color);
void RunEapolScan(uint8_t scan_mode, uint16_t color);
void RunProbeScan(uint8_t scan_mode, uint16_t color);
void RunSAEScan(uint8_t scan_mode, uint16_t color);
void RunPacketMonitor(uint8_t scan_mode, uint16_t color);
void RunBluetoothScan(uint8_t scan_mode, uint16_t color);
void RunSourApple(uint8_t scan_mode, uint16_t color);
@@ -601,6 +652,7 @@ class WiFiScan
void parseBSSID(const char* bssidStr, uint8_t* bssid);
void writeHeader(bool poi = false);
void writeFooter(bool poi = false);
void displayWardriveStats();
public:
@@ -610,6 +662,9 @@ class WiFiScan
//LinkedList<ssid>* ssids;
static MacEntry mac_entries[mac_history_len];
static uint8_t mac_entry_state[mac_history_len];
// Stuff for RAW stats
uint32_t mgmt_frames = 0;
uint32_t data_frames = 0;
@@ -730,7 +785,12 @@ class WiFiScan
#ifdef HAS_SCREEN
int8_t checkAnalyzerButtons(uint32_t currentTime);
#endif
bool seen_mac(unsigned char* mac);
bool seen_mac(unsigned char* mac, bool simple = true);
int16_t seen_mac_int(unsigned char* mac, bool simple = true);
int update_mac_entry(const uint8_t mac[6], int8_t rssi = 0, bool bt = false);
inline void insert_mac_entry(uint32_t idx, const uint8_t mac[6], uint32_t now_ms, int8_t rssi = 0, bool bt = false);
void evict_and_insert(const uint8_t mac[6], uint32_t now_ms);
uint8_t build_top10_for_ui(MacEntry* out_top10, MacSortMode mode);
void save_mac(unsigned char* mac);
#ifdef HAS_BT
void copyNimbleMac(const BLEAddress &addr, unsigned char out[6]);
@@ -760,8 +820,7 @@ class WiFiScan
bool scanning();
bool joinWiFi(String ssid, String password, bool gui = true);
bool startWiFi(String ssid, String password, bool gui = true);
String getStaMAC();
String getApMAC();
void getMAC(bool get_sta, uint8_t* mac);
String freeRAM();
void changeChannel();
void changeChannel(int chan);
@@ -795,7 +854,14 @@ class WiFiScan
void startGPX(String file_name);
//String macToString(const Station& station);
static bool initMbedtls();
static int mbedtls_entropy_source(void *data, unsigned char *output, size_t len);
static bool getSAEACT(const uint8_t *frame, size_t frame_len, uint16_t &group_out, size_t &act_len_out);
static bool sae_group_sizes(uint16_t group, size_t &scalar_len, size_t &element_len);
static bool mac_cmp(const uint8_t *a, const uint8_t *b);
static inline uint16_t le16(const uint8_t *p);
static void getMAC(char *addr, uint8_t* data, uint16_t offset);
static void getMAC(uint8_t* mac, const uint8_t* data, uint16_t offset);
static void pwnSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void beaconSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
//static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
@@ -811,5 +877,6 @@ class WiFiScan
static void pineScanSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type); // Pineapple
static int extractPineScanChannel(const uint8_t* payload, int len); // Pineapple
static void multiSSIDSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type); // MultiSSID
static inline uint32_t hash_mac(const uint8_t mac[6]);
};
#endif

View File

@@ -6,6 +6,8 @@
#define POLISH_POTATO
//#define DEVELOPER
//// BOARD TARGETS
//#define MARAUDER_M5STICKC
//#define MARAUDER_M5STICKCP2
@@ -32,10 +34,12 @@
//#define MARAUDER_V8
//// END BOARD TARGETS
#define MARAUDER_VERSION "v1.9.1"
#define MARAUDER_VERSION "v1.10.0"
#define GRAPH_REFRESH 100
#define TRACK_EVICT_SEC 90 // Seconds before marking tracked MAC as tombstone
#define DUAL_BAND_CHANNELS 51
//// HARDWARE NAMES

View File

@@ -154,6 +154,12 @@ void backlightOff() {
void setup()
{
randomSeed(esp_random());
#ifndef DEVELOPER
esp_log_level_set("*", ESP_LOG_NONE);
#endif
#ifndef HAS_DUAL_BAND
esp_spiram_init();
#endif

View File

@@ -56,6 +56,25 @@ uint8_t getDRAMUsagePercent() {
}
#endif
String hexDump(const uint8_t *buf, size_t len) {
String out;
out.reserve(len * 3); // "FF " per byte (approx)
for (size_t i = 0; i < len; i++) {
if (buf[i] < 0x10) {
out += '0';
}
out += String(buf[i], HEX);
if (i < len - 1) {
out += ' ';
}
}
out.toUpperCase();
return out;
}
String byteArrayToHexString(const std::vector<uint8_t>& byteArray) {
String result;
@@ -156,6 +175,14 @@ String macToString(uint8_t macAddr[6]) {
return String(macStr);
}
String macToString(const uint8_t macAddr[6]) {
char macStr[18]; // 17 characters for "XX:XX:XX:XX:XX:XX" + 1 null terminator
snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
macAddr[0], macAddr[1], macAddr[2],
macAddr[3], macAddr[4], macAddr[5]);
return String(macStr);
}
void convertMacStringToUint8(const String& macStr, uint8_t macAddr[6]) {
// Ensure the input string is in the format "XX:XX:XX:XX:XX:XX"
if (macStr.length() != 17) {