소스 검색

Added support for sniff beacon stage in automation script

Allocation and writing of log and pcap files were also restructured.
tcpassos 2 년 전
부모
커밋
4a9f893541

+ 17 - 41
applications/external/wifi_marauder_companion/file/sequential_file.c

@@ -1,59 +1,35 @@
 #include "sequential_file.h"
 #include "sequential_file.h"
 
 
-SequentialFile* sequential_file_create(Storage* storage, const char* dir, const char* prefix, const char* extension) {
+char* sequential_file_resolve_path(Storage* storage, const char* dir, const char* prefix, const char* extension) {
     if (storage == NULL || dir == NULL || prefix == NULL || extension == NULL) {
     if (storage == NULL || dir == NULL || prefix == NULL || extension == NULL) {
         return NULL;
         return NULL;
     }
     }
-    char file_path[256];
-    File* file = storage_file_alloc(storage);
 
 
+    char file_path[256];
     int file_index = 0;
     int file_index = 0;
+
     do {
     do {
-        snprintf(file_path, sizeof(file_path),
-                 "%s/%s_%d.%s",
-                 dir, prefix, file_index, extension);
+        if (snprintf(file_path, sizeof(file_path), "%s/%s_%d.%s", dir, prefix, file_index, extension) < 0) {
+            return NULL;
+        }
         file_index++;
         file_index++;
     } while(storage_file_exists(storage, file_path));
     } while(storage_file_exists(storage, file_path));
 
 
-    if(!storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
-        storage_file_free(file);
-        return NULL;
-    }
-
-    SequentialFile* sequential_file = (SequentialFile*) malloc(sizeof(SequentialFile));
-    sequential_file->file = file;
-    sequential_file->path = (char*) malloc(strlen(file_path) + 1);
-    strcpy(sequential_file->path, file_path);
-    sequential_file->file_index = file_index - 1;
-
-    return sequential_file;
+    return strdup(file_path);
 }
 }
 
 
-
-uint16_t sequential_file_write(SequentialFile* sequential_file, const void *buffer, uint16_t bytes_to_write) {
-    if (sequential_file == NULL || sequential_file->file == NULL) {
-        return 0;
+bool sequential_file_open(Storage* storage, File* file, const char* dir, const char* prefix, const char* extension) {
+    if (storage == NULL || file == NULL || dir == NULL || prefix == NULL || extension == NULL) {
+        return false;
     }
     }
-    return storage_file_write(sequential_file->file, buffer, bytes_to_write);
-}
 
 
-void sequential_file_free_destroy_file(SequentialFile* sequential_file) {
-    if (sequential_file != NULL) {
-        if (sequential_file->file != NULL) {
-            storage_file_close(sequential_file->file);
-            storage_file_free(sequential_file->file);
-        }
-        free(sequential_file->path);
-        free(sequential_file);
+    char* file_path = sequential_file_resolve_path(storage, dir, prefix, extension);
+    if (file_path == NULL) {
+        return false;
     }
     }
-}
 
 
-void sequential_file_free_close_file(SequentialFile* sequential_file) {
-    if (sequential_file != NULL) {
-        if (sequential_file->file != NULL) {
-            storage_file_close(sequential_file->file);
-        }
-        free(sequential_file->path);
-        free(sequential_file);
-    }
+    bool success = storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS);
+    free(file_path);
+
+    return success;
 }
 }

+ 1 - 10
applications/external/wifi_marauder_companion/file/sequential_file.h

@@ -2,14 +2,5 @@
 
 
 #include <storage/storage.h>
 #include <storage/storage.h>
 
 
-typedef struct SequentialFile {
-    File* file;
-    char* path;
-    int file_index;
-} SequentialFile;
-
 char* sequential_file_resolve_path(Storage* storage, const char* dir, const char* prefix, const char* extension);
 char* sequential_file_resolve_path(Storage* storage, const char* dir, const char* prefix, const char* extension);
-SequentialFile* sequential_file_create(Storage* storage, const char* dir, const char* prefix, const char* extension);
-uint16_t sequential_file_write(SequentialFile* file, const void *buff, uint16_t bytes_to_write);
-void sequential_file_free_destroy_file(SequentialFile* file);
-void sequential_file_free_close_file(SequentialFile* file);
+bool sequential_file_open(Storage* storage, File* file, const char* dir, const char* prefix, const char* extension);

+ 20 - 13
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c

@@ -15,7 +15,8 @@ bool _wifi_marauder_is_save_pcaps_enabled(WifiMarauderApp* app) {
     // If it is a script that contains a sniff function
     // If it is a script that contains a sniff function
     if (app->script != NULL) {
     if (app->script != NULL) {
         WifiMarauderScriptStage* sniff_pmkid_stage = wifi_marauder_script_get_stage(app->script, WifiMarauderScriptStageTypeSniffPmkid);
         WifiMarauderScriptStage* sniff_pmkid_stage = wifi_marauder_script_get_stage(app->script, WifiMarauderScriptStageTypeSniffPmkid);
-        if (sniff_pmkid_stage != NULL) {
+        WifiMarauderScriptStage* sniff_beacon_stage = wifi_marauder_script_get_stage(app->script, WifiMarauderScriptStageTypeSniffBeacon);
+        if (sniff_pmkid_stage != NULL || sniff_beacon_stage != NULL) {
             return true;
             return true;
         }
         }
     }
     }
@@ -50,7 +51,7 @@ void wifi_marauder_console_output_handle_rx_packets_cb(uint8_t* buf, size_t len,
     WifiMarauderApp* app = context;
     WifiMarauderApp* app = context;
 
 
     if(app->is_writing_pcap) {
     if(app->is_writing_pcap) {
-        sequential_file_write(app->capture_file, buf, len);
+        storage_file_write(app->capture_file, buf, len);
     }
     }
 }
 }
 
 
@@ -107,21 +108,23 @@ void wifi_marauder_scene_console_output_on_enter(void* context) {
         // Create files *before* sending command
         // Create files *before* sending command
         // (it takes time to iterate through the directory)
         // (it takes time to iterate through the directory)
         if(app->ok_to_save_logs) {
         if(app->ok_to_save_logs) {
-            app->is_writing_log = true;
-            app->sequential_log_file = sequential_file_create(app->storage, MARAUDER_APP_FOLDER_LOGS, prefix, "log");
-            if (app->sequential_log_file) {
-                app->log_file = app->sequential_log_file->file;
-                strcpy(app->log_file_path, app->sequential_log_file->path);
+            strcpy(app->log_file_path, sequential_file_resolve_path(app->storage, MARAUDER_APP_FOLDER_LOGS, prefix, "log"));
+            if (app->log_file_path != NULL) {
+                if (storage_file_open(app->log_file, app->log_file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
+                    app->is_writing_log = true;
+                } else {
+                    dialog_message_show_storage_error(app->dialogs, "Cannot open log file");
+                }
             } else {
             } else {
-                dialog_message_show_storage_error(app->dialogs, "Cannot open log file");
+                dialog_message_show_storage_error(app->dialogs, "Cannot resolve log path");
             }
             }
         }
         }
 
 
         // If it is a sniff function or script, open the pcap file for recording
         // If it is a sniff function or script, open the pcap file for recording
         if (_wifi_marauder_is_save_pcaps_enabled(app)) {
         if (_wifi_marauder_is_save_pcaps_enabled(app)) {
-            app->is_writing_pcap = true;
-            app->capture_file = sequential_file_create(app->storage, MARAUDER_APP_FOLDER_PCAPS, prefix, "pcap");
-            if (app->capture_file == NULL) {
+            if (sequential_file_open(app->storage, app->capture_file, MARAUDER_APP_FOLDER_PCAPS, prefix, "pcap")) {
+                app->is_writing_pcap = true;
+            } else {
                 dialog_message_show_storage_error(app->dialogs, "Cannot open pcap file");
                 dialog_message_show_storage_error(app->dialogs, "Cannot open pcap file");
             }
             }
         }
         }
@@ -173,8 +176,12 @@ void wifi_marauder_scene_console_output_on_exit(void* context) {
     wifi_marauder_script_free(app->script);
     wifi_marauder_script_free(app->script);
 
 
     app->is_writing_pcap = false;
     app->is_writing_pcap = false;
-    sequential_file_free_destroy_file(app->capture_file);
+    if(app->capture_file && storage_file_is_open(app->capture_file)) {
+        storage_file_close(app->capture_file);
+    }
 
 
     app->is_writing_log = false;
     app->is_writing_log = false;
-    sequential_file_free_close_file(app->sequential_log_file);
+    if(app->log_file && storage_file_is_open(app->log_file)) {
+        storage_file_close(app->log_file);
+    }
 }
 }

+ 29 - 0
applications/external/wifi_marauder_companion/script/wifi_marauder_script.c

@@ -4,6 +4,7 @@
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN 15
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN 15
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH 30
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH 30
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF_PMKID 60
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF_PMKID 60
+#define WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF_BEACON 60
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON 60
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON 60
 
 
 WifiMarauderScript *wifi_marauder_script_alloc() {
 WifiMarauderScript *wifi_marauder_script_alloc() {
@@ -116,6 +117,21 @@ WifiMarauderScriptStageDeauth* _wifi_marauder_script_get_stage_deauth(cJSON *sta
     return deauth_stage;
     return deauth_stage;
 }
 }
 
 
+WifiMarauderScriptStageSniffBeacon* _wifi_marauder_script_get_stage_sniff_beacon(cJSON *stages) {
+    cJSON* sniffbeacon_stage_json = cJSON_GetObjectItem(stages, "sniffbeacon");
+    if (sniffbeacon_stage_json == NULL) {
+        return NULL;
+    }
+
+    cJSON* timeout_json = cJSON_GetObjectItem(sniffbeacon_stage_json, "timeout");
+    int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF_BEACON;
+
+    WifiMarauderScriptStageSniffBeacon *sniff_beacon_stage = (WifiMarauderScriptStageSniffBeacon*) malloc(sizeof(WifiMarauderScriptStageSniffBeacon));
+    sniff_beacon_stage->timeout = timeout;
+
+    return sniff_beacon_stage;
+}
+
 WifiMarauderScriptStageSniffPmkid* _wifi_marauder_script_get_stage_sniff_pmkid(cJSON *stages) {
 WifiMarauderScriptStageSniffPmkid* _wifi_marauder_script_get_stage_sniff_pmkid(cJSON *stages) {
     cJSON* sniffpmkid_stage_json = cJSON_GetObjectItem(stages, "sniffpmkid");
     cJSON* sniffpmkid_stage_json = cJSON_GetObjectItem(stages, "sniffpmkid");
     if (sniffpmkid_stage_json == NULL) {
     if (sniffpmkid_stage_json == NULL) {
@@ -230,6 +246,16 @@ void _wifi_marauder_script_load_stages(WifiMarauderScript *script, cJSON *stages
         );
         );
     }
     }
 
 
+    // Sniff beacon stage
+    WifiMarauderScriptStageSniffBeacon *sniff_beacon = _wifi_marauder_script_get_stage_sniff_beacon(stages);
+    if (sniff_beacon != NULL) {
+        _wifi_marauder_script_add_stage(
+            script,
+            _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSniffBeacon, sniff_beacon),
+            &prev_stage
+        );
+    }
+
     // Sniff PMKID stage
     // Sniff PMKID stage
     WifiMarauderScriptStageSniffPmkid *sniff_pmkid = _wifi_marauder_script_get_stage_sniff_pmkid(stages);
     WifiMarauderScriptStageSniffPmkid *sniff_pmkid = _wifi_marauder_script_get_stage_sniff_pmkid(stages);
     if (sniff_pmkid != NULL) {
     if (sniff_pmkid != NULL) {
@@ -328,6 +354,9 @@ void wifi_marauder_script_free(WifiMarauderScript *script) {
             case WifiMarauderScriptStageTypeSniffPmkid:
             case WifiMarauderScriptStageTypeSniffPmkid:
                 free(current_stage->stage);
                 free(current_stage->stage);
                 break;
                 break;
+            case WifiMarauderScriptStageTypeSniffBeacon:
+                free(current_stage->stage);
+                break;
             case WifiMarauderScriptStageTypeBeaconList:
             case WifiMarauderScriptStageTypeBeaconList:
                 for (int i = 0; i < ((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssid_count; i++) {
                 for (int i = 0; i < ((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssid_count; i++) {
                     free(((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssids[i]);
                     free(((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssids[i]);

+ 9 - 0
applications/external/wifi_marauder_companion/script/wifi_marauder_script.h

@@ -20,6 +20,7 @@
  * - Scan
  * - Scan
  * - Select
  * - Select
  * - Deauth
  * - Deauth
+ * - Sniff beacon
  * - Sniff PMKID
  * - Sniff PMKID
  * - Beacon List
  * - Beacon List
  * ----------------------------------------------------------------------------------------------------
  * ----------------------------------------------------------------------------------------------------
@@ -42,6 +43,9 @@
  *         "deauth": {
  *         "deauth": {
  *             "timeout": seconds
  *             "timeout": seconds
  *         },
  *         },
+ *         "sniffBeacon": {
+ *             "timeout": seconds
+ *         },
  *         "sniffPmkid": {
  *         "sniffPmkid": {
  *             "forceDeauth": true (default) | false,
  *             "forceDeauth": true (default) | false,
  *             "channel": 1-11,
  *             "channel": 1-11,
@@ -69,6 +73,7 @@ typedef enum {
     WifiMarauderScriptStageTypeScan,
     WifiMarauderScriptStageTypeScan,
     WifiMarauderScriptStageTypeSelect,
     WifiMarauderScriptStageTypeSelect,
     WifiMarauderScriptStageTypeDeauth,
     WifiMarauderScriptStageTypeDeauth,
+    WifiMarauderScriptStageTypeSniffBeacon,
     WifiMarauderScriptStageTypeSniffPmkid,
     WifiMarauderScriptStageTypeSniffPmkid,
     WifiMarauderScriptStageTypeBeaconList,
     WifiMarauderScriptStageTypeBeaconList,
 } WifiMarauderScriptStageType;
 } WifiMarauderScriptStageType;
@@ -108,6 +113,10 @@ typedef struct WifiMarauderScriptStageDeauth {
     int timeout;
     int timeout;
 } WifiMarauderScriptStageDeauth;
 } WifiMarauderScriptStageDeauth;
 
 
+typedef struct WifiMarauderScriptStageSniffBeacon {
+    int timeout;
+} WifiMarauderScriptStageSniffBeacon;
+
 typedef struct WifiMarauderScriptStageSniffPmkid {
 typedef struct WifiMarauderScriptStageSniffPmkid {
     bool force_deauth;
     bool force_deauth;
     int channel;
     int channel;

+ 10 - 0
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c

@@ -73,6 +73,13 @@ void _wifi_marauder_script_execute_deauth(WifiMarauderScriptStageDeauth* stage,
     _send_stop();
     _send_stop();
 }
 }
 
 
+void _wifi_marauder_script_execute_sniff_beacon(WifiMarauderScriptStageSniffBeacon* stage, WifiMarauderScriptWorker* worker) {
+    const char sniff_command[] = "sniffbeacon\n";
+    wifi_marauder_uart_tx((uint8_t*)sniff_command, strlen(sniff_command));
+    _wifi_marauder_script_delay(worker, stage->timeout);
+    _send_stop();
+}
+
 void _wifi_marauder_script_execute_sniff_pmkid(WifiMarauderScriptStageSniffPmkid* stage, WifiMarauderScriptWorker* worker) {
 void _wifi_marauder_script_execute_sniff_pmkid(WifiMarauderScriptStageSniffPmkid* stage, WifiMarauderScriptWorker* worker) {
     char attack_command[50] = "sniffpmkid";
     char attack_command[50] = "sniffpmkid";
     int len = strlen(attack_command);
     int len = strlen(attack_command);
@@ -126,6 +133,9 @@ void wifi_marauder_script_execute_stage(WifiMarauderScriptStage* stage, void *co
         case WifiMarauderScriptStageTypeDeauth:
         case WifiMarauderScriptStageTypeDeauth:
             _wifi_marauder_script_execute_deauth((WifiMarauderScriptStageDeauth*)stage_data, worker);
             _wifi_marauder_script_execute_deauth((WifiMarauderScriptStageDeauth*)stage_data, worker);
             break;
             break;
+        case WifiMarauderScriptStageTypeSniffBeacon:
+            _wifi_marauder_script_execute_sniff_beacon((WifiMarauderScriptStageSniffBeacon*)stage_data, worker);
+            break;
         case WifiMarauderScriptStageTypeSniffPmkid:
         case WifiMarauderScriptStageTypeSniffPmkid:
             _wifi_marauder_script_execute_sniff_pmkid((WifiMarauderScriptStageSniffPmkid*)stage_data, worker);
             _wifi_marauder_script_execute_sniff_pmkid((WifiMarauderScriptStageSniffPmkid*)stage_data, worker);
             break;
             break;

+ 2 - 0
applications/external/wifi_marauder_companion/wifi_marauder_app.c

@@ -27,6 +27,7 @@ WifiMarauderApp* wifi_marauder_app_alloc() {
     app->gui = furi_record_open(RECORD_GUI);
     app->gui = furi_record_open(RECORD_GUI);
     app->dialogs = furi_record_open(RECORD_DIALOGS);
     app->dialogs = furi_record_open(RECORD_DIALOGS);
     app->storage = furi_record_open(RECORD_STORAGE);
     app->storage = furi_record_open(RECORD_STORAGE);
+    app->capture_file = storage_file_alloc(app->storage);
     app->log_file = storage_file_alloc(app->storage);
     app->log_file = storage_file_alloc(app->storage);
     app->save_pcap_setting_file = storage_file_alloc(app->storage);
     app->save_pcap_setting_file = storage_file_alloc(app->storage);
     app->save_logs_setting_file = storage_file_alloc(app->storage);
     app->save_logs_setting_file = storage_file_alloc(app->storage);
@@ -147,6 +148,7 @@ void wifi_marauder_app_free(WifiMarauderApp* app) {
     text_box_free(app->text_box);
     text_box_free(app->text_box);
     furi_string_free(app->text_box_store);
     furi_string_free(app->text_box_store);
     text_input_free(app->text_input);
     text_input_free(app->text_input);
+    storage_file_free(app->capture_file);
     storage_file_free(app->log_file);
     storage_file_free(app->log_file);
     storage_file_free(app->save_pcap_setting_file);
     storage_file_free(app->save_pcap_setting_file);
     storage_file_free(app->save_logs_setting_file);
     storage_file_free(app->save_logs_setting_file);

+ 1 - 2
applications/external/wifi_marauder_companion/wifi_marauder_app_i.h

@@ -49,8 +49,7 @@ struct WifiMarauderApp {
     TextBox* text_box;
     TextBox* text_box;
     TextInput* text_input;
     TextInput* text_input;
     Storage* storage;
     Storage* storage;
-    SequentialFile* capture_file;
-    SequentialFile* sequential_log_file;
+    File* capture_file;
     File* log_file;
     File* log_file;
     char log_file_path[100];
     char log_file_path[100];
     File* save_pcap_setting_file;
     File* save_pcap_setting_file;