Просмотр исходного кода

Added support for deauth stage in automation script

tcpassos 2 лет назад
Родитель
Сommit
0834bfccfa

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

@@ -2,6 +2,7 @@
 #include "wifi_marauder_script.h"
 
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN 15
+#define WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH 30
 #define WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON 60
 
 WifiMarauderScript *wifi_marauder_script_alloc() {
@@ -50,11 +51,14 @@ WifiMarauderScriptStageScan* _wifi_marauder_script_get_stage_scan(cJSON *stages)
     } else {
         return NULL;
     }
+    cJSON* channel = cJSON_GetObjectItem(stage_scan, "channel");
+    int scan_channel = channel != NULL ? (int)cJSON_GetNumberValue(channel) : 0;
     cJSON* timeout = cJSON_GetObjectItem(stage_scan, "timeout");
     int scan_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN;
 
     WifiMarauderScriptStageScan *scan_stage = (WifiMarauderScriptStageScan*) malloc(sizeof(WifiMarauderScriptStageScan));
     scan_stage->type = scan_type;
+    scan_stage->channel = scan_channel;
     scan_stage->timeout = scan_timeout;
 
     return scan_stage;
@@ -95,6 +99,21 @@ WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON *sta
     return stage_select;
 }
 
+WifiMarauderScriptStageDeauth* _wifi_marauder_script_get_stage_deauth(cJSON *stages) {
+    cJSON *deauth_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "deauth");
+    if (deauth_stage_json == NULL) {
+        return NULL;
+    }
+
+    cJSON* timeout = cJSON_GetObjectItem(deauth_stage_json, "timeout");
+    int deauth_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH;
+
+    WifiMarauderScriptStageDeauth *deauth_stage = (WifiMarauderScriptStageDeauth*) malloc(sizeof(WifiMarauderScriptStageDeauth));
+    deauth_stage->timeout = deauth_timeout;
+
+    return deauth_stage;
+}
+
 WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON *stages) {
     cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconlist");
     if (stage_beaconlist == NULL) {
@@ -178,6 +197,16 @@ void _wifi_marauder_script_load_stages(WifiMarauderScript *script, cJSON *stages
         );
     }
 
+    // Deauth stage
+    WifiMarauderScriptStageDeauth *stage_deauth = _wifi_marauder_script_get_stage_deauth(stages);
+    if (stage_deauth != NULL) {
+        _wifi_marauder_script_add_stage(
+            script,
+            _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeDeauth, stage_deauth),
+            &prev_stage
+        );
+    }
+
     // Beacon List stage
     WifiMarauderScriptStageBeaconList *stage_beacon_list = _wifi_marauder_script_get_stage_beacon_list(stages);
     if (stage_beacon_list != NULL) {
@@ -239,6 +268,9 @@ void wifi_marauder_script_free(WifiMarauderScript *script) {
                 free(((WifiMarauderScriptStageSelect *) current_stage->stage)->filter);
                 free(current_stage->stage);
                 break;
+            case WifiMarauderScriptStageTypeDeauth:
+                free(current_stage->stage);
+                break;
             case WifiMarauderScriptStageTypeSniffPmkid:
                 free(current_stage->stage);
                 break;

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

@@ -19,8 +19,39 @@
  * IMPLEMENTED STAGES (In order of execution):
  * - Scan
  * - Select
+ * - Deauth
  * - Beacon List
  * ----------------------------------------------------------------------------------------------------
+ * SCRIPT SYNTAX:
+ * {
+ *     "meta": {
+ *         "description": "My script",
+ *         "repeat": times the script will repeat
+ *     },
+ *     "stages": {
+ *         "scan": {
+ *             "type": "ap" | "station",
+ *             "timeout": seconds,
+ *             "channel": 1-11
+ *         },
+ *         "select": {
+ *             "type": "ap" | "station" | "ssid",
+ *             "filter": "all" | "contains \"{SSID fragment}\" or equals \"{SSID}\" or ..."
+ *         },
+ *         "deauth": {
+ *             "timeout": seconds
+ *         },
+ *         "beaconlist": {
+ *             "ssids": [
+ *                 "SSID 1",
+ *                 "SSID 2",
+ *                 "SSID 3"
+ *             ],
+ *             "timeout": seconds
+ *         }
+ *     }
+ * }
+ * ----------------------------------------------------------------------------------------------------
  */
 
 #pragma once
@@ -31,6 +62,7 @@
 typedef enum {
     WifiMarauderScriptStageTypeScan,
     WifiMarauderScriptStageTypeSelect,
+    WifiMarauderScriptStageTypeDeauth,
     WifiMarauderScriptStageTypeSniffPmkid,
     WifiMarauderScriptStageTypeBeaconList,
 } WifiMarauderScriptStageType;
@@ -55,6 +87,7 @@ typedef struct WifiMarauderScriptStage {
 
 typedef struct WifiMarauderScriptStageScan {
     WifiMarauderScriptScanType type;
+    int channel;
     int timeout;
 } WifiMarauderScriptStageScan;
 
@@ -65,6 +98,10 @@ typedef struct WifiMarauderScriptStageSelect {
     bool allow_repeat;
 } WifiMarauderScriptStageSelect;
 
+typedef struct WifiMarauderScriptStageDeauth {
+    int timeout;
+} WifiMarauderScriptStageDeauth;
+
 typedef struct WifiMarauderScriptStageSniffPmkid {
     bool force_deauth;
     int timeout;

+ 23 - 1
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c

@@ -15,8 +15,20 @@ void _send_line_break() {
     wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
 }
 
+void _send_channel_select(int channel) {
+    char command[30];
+    wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
+    snprintf(command, sizeof(command), "channel -s %d\n", channel);
+    wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
+}
+
 void _wifi_marauder_script_execute_scan(WifiMarauderScriptStageScan* stage, WifiMarauderScriptWorker* worker) {
-    char command[10];
+    char command[15];
+    // Set channel
+    if (stage->channel > 0) {
+        _send_channel_select(stage->channel);
+    }
+    // Start scan
     if (stage->type == WifiMarauderScriptScanTypeAp) {
         snprintf(command, sizeof(command), "scanap\n");
     } else {
@@ -54,6 +66,13 @@ void _wifi_marauder_script_execute_select(WifiMarauderScriptStageSelect* stage)
     wifi_marauder_uart_tx((uint8_t*)command, command_length);
 }
 
+void _wifi_marauder_script_execute_deauth(WifiMarauderScriptStageDeauth* stage, WifiMarauderScriptWorker* worker) {
+    const char attack_command[] = "attack -t deauth\n";
+    wifi_marauder_uart_tx((uint8_t*)(attack_command), strlen(attack_command));
+    _wifi_marauder_script_delay(worker, stage->timeout);
+    _send_stop();
+}
+
 void _wifi_marauder_script_execute_beacon_list(WifiMarauderScriptStageBeaconList* stage, WifiMarauderScriptWorker* worker) {
     char command[100];
     char *ssid;
@@ -81,6 +100,9 @@ void wifi_marauder_script_execute_stage(WifiMarauderScriptStage* stage, void *co
         case WifiMarauderScriptStageTypeSelect:
             _wifi_marauder_script_execute_select((WifiMarauderScriptStageSelect*)stage_data);
             break;
+        case WifiMarauderScriptStageTypeDeauth:
+            _wifi_marauder_script_execute_deauth((WifiMarauderScriptStageDeauth*)stage_data, worker);
+            break;
         case WifiMarauderScriptStageTypeBeaconList:
             _wifi_marauder_script_execute_beacon_list((WifiMarauderScriptStageBeaconList*)stage_data, worker);
             break;