From a80bba9b18f92059c4465428d56ee6859280f965 Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Thu, 2 Jun 2022 17:13:54 -0400 Subject: [PATCH] Add SSID commands --- esp32_marauder/CommandLine.cpp | 157 ++++++++++++++++++++++++++++----- esp32_marauder/CommandLine.h | 6 +- esp32_marauder/WiFiScan.cpp | 12 +-- esp32_marauder/WiFiScan.h | 5 +- esp32_marauder/configs.h | 5 +- 5 files changed, 153 insertions(+), 32 deletions(-) diff --git a/esp32_marauder/CommandLine.cpp b/esp32_marauder/CommandLine.cpp index 060ec8d..3f75952 100644 --- a/esp32_marauder/CommandLine.cpp +++ b/esp32_marauder/CommandLine.cpp @@ -39,8 +39,6 @@ LinkedList CommandLine::parseCommand(String input, char* delim) { if (input != "") { - //char delim[] = " "; - char fancy[input.length() + 1] = {}; input.toCharArray(fancy, input.length() + 1); @@ -51,13 +49,6 @@ LinkedList CommandLine::parseCommand(String input, char* delim) { ptr = strtok(NULL, delim); } - - //memset(fancy, 0, sizeof(fancy)); - - // Display the segmented cmd - //for (int i = 0; i < cmd_args.size(); i++) { - // Serial.println(cmd_args.get(i)); - //} } return cmd_args; @@ -72,6 +63,20 @@ int CommandLine::argSearch(LinkedList* cmd_args_list, String key) { return -1; } +bool CommandLine::checkValueExists(LinkedList* cmd_args_list, int index) { + if (index < cmd_args_list->size() - 1) + return true; + + return false; +} + +bool CommandLine::inRange(int max, int index) { + if ((index >= 0) && (index < max)) + return true; + + return false; +} + void CommandLine::runCommand(String input) { if (input != "") Serial.println("#" + input); @@ -115,7 +120,7 @@ void CommandLine::runCommand(String input) { ESP.restart(); } - //// WiFi Scan commands + //// WiFi Scan/Attack commands if (!wifi_scan_obj.scanning()) { // AP Scan @@ -151,6 +156,8 @@ void CommandLine::runCommand(String input) { // attack if (cmd_args.get(0) == ATTACK_CMD) { int attack_type_switch = this->argSearch(&cmd_args, "-t"); // Required + int list_beacon_sw = this->argSearch(&cmd_args, "-l"); + int rand_beacon_sw = this->argSearch(&cmd_args, "-r"); if (attack_type_switch == -1) { Serial.println("You must specify an attack type"); @@ -160,6 +167,7 @@ void CommandLine::runCommand(String input) { String attack_type = cmd_args.get(attack_type_switch + 1); // Branch on attack type + // Deauth if (attack_type == ATTACK_TYPE_DEAUTH) { #ifdef HAS_SCREEN display_obj.clearScreen(); @@ -167,6 +175,28 @@ void CommandLine::runCommand(String input) { #endif wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH, TFT_RED); } + // Beacon + else if (attack_type == ATTACK_TYPE_BEACON) { + // spam by list + if (list_beacon_sw != -1) { + #ifdef HAS_SCREEN + display_obj.clearScreen(); + menu_function_obj.drawStatusBar(); + #endif + wifi_scan_obj.StartScan(WIFI_ATTACK_BEACON_LIST, TFT_RED); + } + // spam with random + else if (rand_beacon_sw != -1) { + #ifdef HAS_SCREEN + display_obj.clearScreen(); + menu_function_obj.drawStatusBar(); + #endif + wifi_scan_obj.StartScan(WIFI_ATTACK_BEACON_SPAM, TFT_ORANGE); + } + else { + Serial.println("You did not specify a beacon attack type"); + } + } else { Serial.println("Attack type not properly defined"); return; @@ -177,23 +207,41 @@ void CommandLine::runCommand(String input) { //// WiFi aux commands - // List access points if (cmd_args.get(0) == LIST_AP_CMD) { - for (int i = 0; i < access_points->size(); i++) { - if (access_points->get(i).selected) - Serial.println("[" + (String)i + "] " + access_points->get(i).essid + " (selected)"); - else - Serial.println("[" + (String)i + "] " + access_points->get(i).essid); + int ap_sw = this->argSearch(&cmd_args, "-a"); + int ss_sw = this->argSearch(&cmd_args, "-s"); + + // List APs + if (ap_sw != -1) { + for (int i = 0; i < access_points->size(); i++) { + if (access_points->get(i).selected) + Serial.println("[" + (String)i + "] " + access_points->get(i).essid + " (selected)"); + else + Serial.println("[" + (String)i + "] " + access_points->get(i).essid); + } + } + // List SSIDs + else if (ss_sw != -1) { + for (int i = 0; i < ssids->size(); i++) { + if (ssids->get(i).selected) + Serial.println("[" + (String)i + "] " + ssids->get(i).essid + " (selected)"); + else + Serial.println("[" + (String)i + "] " + ssids->get(i).essid); + } + } + else { + Serial.println("You did not specify which list to show"); + return; } } // Select access points or stations else if (cmd_args.get(0) == SEL_CMD) { // Get switches int ap_sw = this->argSearch(&cmd_args, "-a"); - int st_sw = this->argSearch(&cmd_args, "-s"); + int ss_sw = this->argSearch(&cmd_args, "-s"); - // Access points + // select Access points if (ap_sw != -1) { // Get list of indices LinkedList ap_index = this->parseCommand(cmd_args.get(ap_sw + 1), ","); @@ -201,6 +249,10 @@ void CommandLine::runCommand(String input) { // Mark APs as selected for (int i = 0; i < ap_index.size(); i++) { int index = ap_index.get(i).toInt(); + if (!this->inRange(access_points->size(), index)) { + Serial.println("Index not in range: " + (String)index); + continue; + } if (access_points->get(index).selected) { // Unselect "selected" ap AccessPoint new_ap = access_points->get(index); @@ -215,9 +267,72 @@ void CommandLine::runCommand(String input) { } } } - // Stations - else if (st_sw != -1) { - + // select ssids + else if (ss_sw != -1) { + // Get list of indices + LinkedList ss_index = this->parseCommand(cmd_args.get(ss_sw + 1), ","); + + // Mark APs as selected + for (int i = 0; i < ss_index.size(); i++) { + int index = ss_index.get(i).toInt(); + if (!this->inRange(ssids->size(), index)) { + Serial.println("Index not in range: " + (String)index); + continue; + } + if (ssids->get(index).selected) { + // Unselect "selected" ap + ssid new_ssid = ssids->get(index); + new_ssid.selected = false; + ssids->set(index, new_ssid); + } + else { + // Select "unselected" ap + ssid new_ssid = ssids->get(index); + new_ssid.selected = true; + ssids->set(index, new_ssid); + } + } + } + else { + Serial.println("You did not specify which list to select from"); + return; + } + } + // SSID stuff + else if (cmd_args.get(0) == SSID_CMD) { + int add_sw = this->argSearch(&cmd_args, "-a"); + int gen_sw = this->argSearch(&cmd_args, "-g"); + int spc_sw = this->argSearch(&cmd_args, "-n"); + int rem_sw = this->argSearch(&cmd_args, "-r"); + + // Add ssid + if (add_sw != -1) { + // Generate random + if (gen_sw != -1) { + int gen_count = cmd_args.get(gen_sw + 1).toInt(); + wifi_scan_obj.generateSSIDs(gen_count); + } + // Add specific + else if (spc_sw != -1) { + String essid = cmd_args.get(spc_sw + 1); + wifi_scan_obj.addSSID(essid); + } + else { + Serial.println("You did not specify how to add SSIDs"); + } + } + // Remove SSID + else if (rem_sw != -1) { + int index = cmd_args.get(rem_sw + 1).toInt(); + if (!this->inRange(ssids->size(), index)) { + Serial.println("Index not in range: " + (String)index); + return; + } + ssids->remove(index); + } + else { + Serial.println("You did not specify whether to add or remove SSIDs"); + return; } } } diff --git a/esp32_marauder/CommandLine.h b/esp32_marauder/CommandLine.h index 6fb09c4..b983cde 100644 --- a/esp32_marauder/CommandLine.h +++ b/esp32_marauder/CommandLine.h @@ -17,6 +17,7 @@ extern WiFiScan wifi_scan_obj; extern LinkedList* access_points; +extern LinkedList* ssids; extern const String PROGMEM version_number; //// Commands @@ -40,14 +41,17 @@ const char PROGMEM ATTACK_TYPE_BEACON[] = "beacon"; const char PROGMEM ATTACK_TYPE_PROBE[] = "probe"; // WiFi Aux -const char PROGMEM LIST_AP_CMD[] = "listap"; +const char PROGMEM LIST_AP_CMD[] = "list"; const char PROGMEM SEL_CMD[] = "select"; +const char PROGMEM SSID_CMD[] = "ssid"; class CommandLine { private: String getSerialInput(); LinkedList parseCommand(String input, char* delim); void runCommand(String input); + bool checkValueExists(LinkedList* cmd_args_list, int index); + bool inRange(int max, int index); int argSearch(LinkedList* cmd_args, String key); const char* ascii_art = diff --git a/esp32_marauder/WiFiScan.cpp b/esp32_marauder/WiFiScan.cpp index ccb2905..fb2f517 100644 --- a/esp32_marauder/WiFiScan.cpp +++ b/esp32_marauder/WiFiScan.cpp @@ -162,22 +162,22 @@ int WiFiScan::clearSSIDs() { } bool WiFiScan::addSSID(String essid) { - ssid s = {essid, {random(256), random(256), random(256), random(256), random(256), random(256)}}; + ssid s = {essid, {random(256), random(256), random(256), random(256), random(256), random(256)}, false}; ssids->add(s); Serial.println(ssids->get(ssids->size() - 1).essid); return true; } -int WiFiScan::generateSSIDs() { - uint8_t num_gen = 20; +int WiFiScan::generateSSIDs(int count) { + uint8_t num_gen = count; for (uint8_t x = 0; x < num_gen; x++) { String essid = ""; for (uint8_t i = 0; i < 6; i++) essid.concat(alfa[random(65)]); - ssid s = {essid, {random(256), random(256), random(256), random(256), random(256), random(256)}}; + ssid s = {essid, {random(256), random(256), random(256), random(256), random(256), random(256)}, false}; ssids->add(s); Serial.println(ssids->get(ssids->size() - 1).essid); } @@ -570,7 +570,7 @@ void WiFiScan::RunClearSSIDs() { #endif } -void WiFiScan::RunGenerateSSIDs() { +void WiFiScan::RunGenerateSSIDs(int count) { #ifdef HAS_SCREEN display_obj.tft.setTextWrap(false); display_obj.tft.setFreeFont(NULL); @@ -583,7 +583,7 @@ void WiFiScan::RunGenerateSSIDs() { display_obj.tft.println(text_table4[14] + (String)this->generateSSIDs()); display_obj.tft.println(text_table4[15] + (String)ssids->size()); #else - this->generateSSIDs(); + this->generateSSIDs(count); #endif } diff --git a/esp32_marauder/WiFiScan.h b/esp32_marauder/WiFiScan.h index fd63d75..4827c41 100644 --- a/esp32_marauder/WiFiScan.h +++ b/esp32_marauder/WiFiScan.h @@ -78,6 +78,7 @@ esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, b struct ssid { String essid; int bssid[6]; + bool selected; }; struct AccessPoint { @@ -279,7 +280,7 @@ class WiFiScan int clearSSIDs(); int clearAPs(); bool addSSID(String essid); - int generateSSIDs(); + int generateSSIDs(int count = 20); bool shutdownWiFi(); bool shutdownBLE(); bool scanning(); @@ -291,7 +292,7 @@ class WiFiScan void RunInfo(); void RunShutdownWiFi(); void RunShutdownBLE(); - void RunGenerateSSIDs(); + void RunGenerateSSIDs(int count = 20); void RunClearSSIDs(); void RunClearAPs(); void channelHop(); diff --git a/esp32_marauder/configs.h b/esp32_marauder/configs.h index bcdfb99..2d86e44 100644 --- a/esp32_marauder/configs.h +++ b/esp32_marauder/configs.h @@ -4,12 +4,12 @@ #define POLISH_POTATO - #define MARAUDER_MINI + //#define MARAUDER_MINI //#define MARAUDER_V4 //#define MARAUDER_V6 //#define MARAUDER_KIT //#define GENERIC_ESP32 - //#define MARAUDER_FLIPPER + #define MARAUDER_FLIPPER #define MARAUDER_VERSION "v0.9.8" @@ -384,6 +384,7 @@ #define TFT_GRAY 0 #define TFT_MAGENTA 0 #define TFT_VIOLET 0 + #define TFT_ORANGE 0 #define STANDARD_FONT_CHAR_LIMIT 40 #define FLASH_BUTTON -1