Explorar o código

Add SSID commands

Just Call Me Koko %!s(int64=3) %!d(string=hai) anos
pai
achega
a80bba9b18

+ 136 - 21
esp32_marauder/CommandLine.cpp

@@ -39,8 +39,6 @@ LinkedList<String> CommandLine::parseCommand(String input, char* delim) {
   
   
   if (input != "") {
   if (input != "") {
     
     
-    //char delim[] = " ";
-
     char fancy[input.length() + 1] = {};
     char fancy[input.length() + 1] = {};
     input.toCharArray(fancy, input.length() + 1);
     input.toCharArray(fancy, input.length() + 1);
         
         
@@ -51,13 +49,6 @@ LinkedList<String> CommandLine::parseCommand(String input, char* delim) {
   
   
       ptr = strtok(NULL, 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;
   return cmd_args;
@@ -72,6 +63,20 @@ int CommandLine::argSearch(LinkedList<String>* cmd_args_list, String key) {
   return -1;
   return -1;
 }
 }
 
 
+bool CommandLine::checkValueExists(LinkedList<String>* 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) {
 void CommandLine::runCommand(String input) {
   if (input != "")
   if (input != "")
     Serial.println("#" + input);
     Serial.println("#" + input);
@@ -115,7 +120,7 @@ void CommandLine::runCommand(String input) {
     ESP.restart();
     ESP.restart();
   }
   }
 
 
-  //// WiFi Scan commands
+  //// WiFi Scan/Attack commands
   if (!wifi_scan_obj.scanning()) {
   if (!wifi_scan_obj.scanning()) {
 
 
     // AP Scan
     // AP Scan
@@ -151,6 +156,8 @@ void CommandLine::runCommand(String input) {
     // attack
     // attack
     if (cmd_args.get(0) == ATTACK_CMD) {
     if (cmd_args.get(0) == ATTACK_CMD) {
       int attack_type_switch = this->argSearch(&cmd_args, "-t"); // Required
       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) {
       if (attack_type_switch == -1) {
         Serial.println("You must specify an attack type");
         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);
         String attack_type = cmd_args.get(attack_type_switch + 1);
   
   
         // Branch on attack type
         // Branch on attack type
+        // Deauth
         if (attack_type == ATTACK_TYPE_DEAUTH) {
         if (attack_type == ATTACK_TYPE_DEAUTH) {
           #ifdef HAS_SCREEN
           #ifdef HAS_SCREEN
             display_obj.clearScreen();
             display_obj.clearScreen();
@@ -167,6 +175,28 @@ void CommandLine::runCommand(String input) {
           #endif
           #endif
           wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH, TFT_RED);
           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 {
         else {
           Serial.println("Attack type not properly defined");
           Serial.println("Attack type not properly defined");
           return;
           return;
@@ -177,23 +207,41 @@ void CommandLine::runCommand(String input) {
 
 
 
 
   //// WiFi aux commands
   //// WiFi aux commands
-
   // List access points
   // List access points
   if (cmd_args.get(0) == LIST_AP_CMD) {
   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
   // Select access points or stations
   else if (cmd_args.get(0) == SEL_CMD) {
   else if (cmd_args.get(0) == SEL_CMD) {
     // Get switches
     // Get switches
     int ap_sw = this->argSearch(&cmd_args, "-a");
     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) {
     if (ap_sw != -1) {
       // Get list of indices
       // Get list of indices
       LinkedList<String> ap_index = this->parseCommand(cmd_args.get(ap_sw + 1), ",");
       LinkedList<String> ap_index = this->parseCommand(cmd_args.get(ap_sw + 1), ",");
@@ -201,6 +249,10 @@ void CommandLine::runCommand(String input) {
       // Mark APs as selected
       // Mark APs as selected
       for (int i = 0; i < ap_index.size(); i++) {
       for (int i = 0; i < ap_index.size(); i++) {
         int index = ap_index.get(i).toInt();
         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) {
         if (access_points->get(index).selected) {
           // Unselect "selected" ap
           // Unselect "selected" ap
           AccessPoint new_ap = access_points->get(index);
           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<String> 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;
     }
     }
   }
   }
 }
 }

+ 5 - 1
esp32_marauder/CommandLine.h

@@ -17,6 +17,7 @@
 
 
 extern WiFiScan wifi_scan_obj;
 extern WiFiScan wifi_scan_obj;
 extern LinkedList<AccessPoint>* access_points;
 extern LinkedList<AccessPoint>* access_points;
+extern LinkedList<ssid>* ssids;
 extern const String PROGMEM version_number;
 extern const String PROGMEM version_number;
 
 
 //// Commands
 //// Commands
@@ -40,14 +41,17 @@ const char PROGMEM ATTACK_TYPE_BEACON[] = "beacon";
 const char PROGMEM ATTACK_TYPE_PROBE[] = "probe";
 const char PROGMEM ATTACK_TYPE_PROBE[] = "probe";
 
 
 // WiFi Aux
 // 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 SEL_CMD[] = "select";
+const char PROGMEM SSID_CMD[] = "ssid";
 
 
 class CommandLine {
 class CommandLine {
   private:
   private:
     String getSerialInput();
     String getSerialInput();
     LinkedList<String> parseCommand(String input, char* delim);
     LinkedList<String> parseCommand(String input, char* delim);
     void runCommand(String input);
     void runCommand(String input);
+    bool checkValueExists(LinkedList<String>* cmd_args_list, int index);
+    bool inRange(int max, int index);
     int argSearch(LinkedList<String>* cmd_args, String key);
     int argSearch(LinkedList<String>* cmd_args, String key);
 
 
     const char* ascii_art =
     const char* ascii_art =

+ 6 - 6
esp32_marauder/WiFiScan.cpp

@@ -162,22 +162,22 @@ int WiFiScan::clearSSIDs() {
 }
 }
 
 
 bool WiFiScan::addSSID(String essid) {
 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);
   ssids->add(s);
   Serial.println(ssids->get(ssids->size() - 1).essid);
   Serial.println(ssids->get(ssids->size() - 1).essid);
 
 
   return true;
   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++) {
   for (uint8_t x = 0; x < num_gen; x++) {
     String essid = "";
     String essid = "";
 
 
     for (uint8_t i = 0; i < 6; i++)
     for (uint8_t i = 0; i < 6; i++)
       essid.concat(alfa[random(65)]);
       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);
     ssids->add(s);
     Serial.println(ssids->get(ssids->size() - 1).essid);
     Serial.println(ssids->get(ssids->size() - 1).essid);
   }
   }
@@ -570,7 +570,7 @@ void WiFiScan::RunClearSSIDs() {
   #endif
   #endif
 }
 }
 
 
-void WiFiScan::RunGenerateSSIDs() {
+void WiFiScan::RunGenerateSSIDs(int count) {
   #ifdef HAS_SCREEN
   #ifdef HAS_SCREEN
     display_obj.tft.setTextWrap(false);
     display_obj.tft.setTextWrap(false);
     display_obj.tft.setFreeFont(NULL);
     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[14] + (String)this->generateSSIDs());
     display_obj.tft.println(text_table4[15] + (String)ssids->size());
     display_obj.tft.println(text_table4[15] + (String)ssids->size());
   #else
   #else
-    this->generateSSIDs();
+    this->generateSSIDs(count);
   #endif
   #endif
 }
 }
 
 

+ 3 - 2
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 {
 struct ssid {
   String essid;
   String essid;
   int bssid[6];
   int bssid[6];
+  bool selected;
 };
 };
 
 
 struct AccessPoint {
 struct AccessPoint {
@@ -279,7 +280,7 @@ class WiFiScan
     int clearSSIDs();
     int clearSSIDs();
     int clearAPs();
     int clearAPs();
     bool addSSID(String essid);
     bool addSSID(String essid);
-    int generateSSIDs();
+    int generateSSIDs(int count = 20);
     bool shutdownWiFi();
     bool shutdownWiFi();
     bool shutdownBLE();
     bool shutdownBLE();
     bool scanning();
     bool scanning();
@@ -291,7 +292,7 @@ class WiFiScan
     void RunInfo();
     void RunInfo();
     void RunShutdownWiFi();
     void RunShutdownWiFi();
     void RunShutdownBLE();
     void RunShutdownBLE();
-    void RunGenerateSSIDs();
+    void RunGenerateSSIDs(int count = 20);
     void RunClearSSIDs();
     void RunClearSSIDs();
     void RunClearAPs();
     void RunClearAPs();
     void channelHop();
     void channelHop();

+ 3 - 2
esp32_marauder/configs.h

@@ -4,12 +4,12 @@
 
 
   #define POLISH_POTATO
   #define POLISH_POTATO
   
   
-  #define MARAUDER_MINI
+  //#define MARAUDER_MINI
   //#define MARAUDER_V4
   //#define MARAUDER_V4
   //#define MARAUDER_V6
   //#define MARAUDER_V6
   //#define MARAUDER_KIT
   //#define MARAUDER_KIT
   //#define GENERIC_ESP32
   //#define GENERIC_ESP32
-  //#define MARAUDER_FLIPPER
+  #define MARAUDER_FLIPPER
 
 
   #define MARAUDER_VERSION "v0.9.8"
   #define MARAUDER_VERSION "v0.9.8"
 
 
@@ -384,6 +384,7 @@
     #define TFT_GRAY 0
     #define TFT_GRAY 0
     #define TFT_MAGENTA 0
     #define TFT_MAGENTA 0
     #define TFT_VIOLET 0
     #define TFT_VIOLET 0
+    #define TFT_ORANGE 0
     #define STANDARD_FONT_CHAR_LIMIT 40
     #define STANDARD_FONT_CHAR_LIMIT 40
     #define FLASH_BUTTON -1
     #define FLASH_BUTTON -1