WiFiScan.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. #ifndef WiFiScan_h
  2. #define WiFiScan_h
  3. #include "configs.h"
  4. //#include <BLEDevice.h>
  5. //#include <BLEUtils.h>
  6. //#include <BLEScan.h>
  7. //#include <BLEAdvertisedDevice.h>
  8. #include <ArduinoJson.h>
  9. // Testing NimBLE
  10. #ifdef HAS_BT
  11. #include <NimBLEDevice.h>
  12. #endif
  13. #include <WiFi.h>
  14. #include <math.h>
  15. #include "esp_wifi.h"
  16. #include "esp_wifi_types.h"
  17. #ifdef HAS_BT
  18. #include "esp_bt.h"
  19. #endif
  20. #ifdef HAS_SCREEN
  21. #include "Display.h"
  22. #endif
  23. #include "SDInterface.h"
  24. #include "Buffer.h"
  25. #include "BatteryInterface.h"
  26. #include "TemperatureInterface.h"
  27. #include "settings.h"
  28. #include "Assets.h"
  29. #include "flipperLED.h"
  30. #include "LedInterface.h"
  31. //#include "MenuFunctions.h"
  32. #define bad_list_length 3
  33. #define OTA_UPDATE 100
  34. #define SHOW_INFO 101
  35. #define ESP_UPDATE 102
  36. #define WIFI_SCAN_OFF 0
  37. #define WIFI_SCAN_PROBE 1
  38. #define WIFI_SCAN_AP 2
  39. #define WIFI_SCAN_PWN 3
  40. #define WIFI_SCAN_EAPOL 4
  41. #define WIFI_SCAN_DEAUTH 5
  42. #define WIFI_SCAN_ALL 6
  43. #define WIFI_PACKET_MONITOR 7
  44. #define WIFI_ATTACK_BEACON_SPAM 8
  45. #define WIFI_ATTACK_RICK_ROLL 9
  46. #define BT_SCAN_ALL 10
  47. #define BT_SCAN_SKIMMERS 11
  48. #define WIFI_SCAN_ESPRESSIF 12
  49. #define LV_JOIN_WIFI 13
  50. #define LV_ADD_SSID 14
  51. #define WIFI_ATTACK_BEACON_LIST 15
  52. #define WIFI_SCAN_TARGET_AP 16
  53. #define LV_SELECT_AP 17
  54. #define WIFI_ATTACK_AUTH 18
  55. #define WIFI_ATTACK_MIMIC 19
  56. #define WIFI_ATTACK_DEAUTH 20
  57. #define WIFI_ATTACK_AP_SPAM 21
  58. #define WIFI_SCAN_TARGET_AP_FULL 22
  59. #define WIFI_SCAN_ACTIVE_EAPOL 23
  60. #define WIFI_ATTACK_DEAUTH_MANUAL 24
  61. #define WIFI_SCAN_RAW_CAPTURE 25
  62. #define GRAPH_REFRESH 100
  63. #define MAX_CHANNEL 14
  64. #ifdef HAS_SCREEN
  65. extern Display display_obj;
  66. #endif
  67. extern SDInterface sd_obj;
  68. extern Buffer buffer_obj;
  69. extern BatteryInterface battery_obj;
  70. extern TemperatureInterface temp_obj;
  71. extern Settings settings_obj;
  72. extern flipperLED flipper_led;
  73. extern LedInterface led_obj;
  74. esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, bool en_sys_seq);
  75. //int ieee80211_raw_frame_sanity_check(int32_t arg, int32_t arg2, int32_t arg3);
  76. struct ssid {
  77. String essid;
  78. int bssid[6];
  79. bool selected;
  80. };
  81. struct AccessPoint {
  82. String essid;
  83. int channel;
  84. int bssid[6];
  85. bool selected;
  86. LinkedList<char>* beacon;
  87. int rssi;
  88. };
  89. class WiFiScan
  90. {
  91. private:
  92. // Settings
  93. int channel_hop_delay = 1;
  94. bool force_pmkid = false;
  95. bool force_probe = false;
  96. bool save_pcap = false;
  97. int x_pos; //position along the graph x axis
  98. float y_pos_x; //current graph y axis position of X value
  99. float y_pos_x_old = 120; //old y axis position of X value
  100. float y_pos_y; //current graph y axis position of Y value
  101. float y_pos_y_old = 120; //old y axis position of Y value
  102. float y_pos_z; //current graph y axis position of Z value
  103. float y_pos_z_old = 120; //old y axis position of Z value
  104. int midway = 0;
  105. byte x_scale = 1; //scale of graph x axis, controlled by touchscreen buttons
  106. byte y_scale = 1;
  107. bool do_break = false;
  108. bool wsl_bypass_enabled = false;
  109. //int num_beacon = 0; // GREEN
  110. //int num_probe = 0; // BLUE
  111. //int num_deauth = 0; // RED
  112. uint32_t initTime = 0;
  113. bool run_setup = true;
  114. void initWiFi(uint8_t scan_mode);
  115. int bluetoothScanTime = 5;
  116. int packets_sent = 0;
  117. const wifi_promiscuous_filter_t filt = {.filter_mask=WIFI_PROMIS_FILTER_MASK_MGMT | WIFI_PROMIS_FILTER_MASK_DATA};
  118. #ifdef HAS_BT
  119. NimBLEScan* pBLEScan;
  120. #endif
  121. //String connected_network = "";
  122. String alfa = "1234567890qwertyuiopasdfghjkklzxcvbnm QWERTYUIOPASDFGHJKLZXCVBNM_";
  123. char* rick_roll[8] = {
  124. "01 Never gonna give you up",
  125. "02 Never gonna let you down",
  126. "03 Never gonna run around",
  127. "04 and desert you",
  128. "05 Never gonna make you cry",
  129. "06 Never gonna say goodbye",
  130. "07 Never gonna tell a lie",
  131. "08 and hurt you"
  132. };
  133. char* prefix = "G";
  134. typedef struct
  135. {
  136. int16_t fctl;
  137. int16_t duration;
  138. uint8_t da;
  139. uint8_t sa;
  140. uint8_t bssid;
  141. int16_t seqctl;
  142. unsigned char payload[];
  143. } __attribute__((packed)) WifiMgmtHdr;
  144. typedef struct {
  145. uint8_t payload[0];
  146. WifiMgmtHdr hdr;
  147. } wifi_ieee80211_packet_t;
  148. // barebones packet
  149. uint8_t packet[128] = { 0x80, 0x00, 0x00, 0x00, //Frame Control, Duration
  150. /*4*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //Destination address
  151. /*10*/ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, //Source address - overwritten later
  152. /*16*/ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, //BSSID - overwritten to the same as the source address
  153. /*22*/ 0xc0, 0x6c, //Seq-ctl
  154. /*24*/ 0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00, //timestamp - the number of microseconds the AP has been active
  155. /*32*/ 0x64, 0x00, //Beacon interval
  156. /*34*/ 0x01, 0x04, //Capability info
  157. /* SSID */
  158. /*36*/ 0x00
  159. };
  160. /*uint8_t auth_packet[128] = {0xB0, 0x00, 0x3C, 0x00, // Frame Control, Duration
  161. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Dest
  162. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
  163. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Dest BSSID
  164. 0x00, 0x01, // Sequence number
  165. 0x00, 0x00, // Algo
  166. 0x01, 0x00, // Auth sequence number
  167. 0x00, 0x00, // Status Code
  168. 0x7F, 0x08,
  169. 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x40,
  170. 0xDD, 0x0B, 0x00, 0x17, 0xF2, 0x0A, 0x00, 0x01, // Say it was Apple
  171. 0x04, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x0A, 0x00,
  172. 0x10, 0x18, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00,
  173. 0x00
  174. };*/
  175. uint8_t auth_packet[65] = {0xb0, 0x00, 0x3c, 0x00,
  176. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
  177. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
  178. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
  179. 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  180. 0x7f, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
  181. 0x00, 0x40, 0xdd, 0x0b, 0x00, 0x17, 0xf2, 0x0a,
  182. 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0xdd,
  183. 0x0a, 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x10,
  184. 0x00, 0x00, 0x00};
  185. uint8_t prob_req_packet[128] = {0x40, 0x00, 0x00, 0x00,
  186. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // Destination
  187. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
  188. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // Dest
  189. 0x01, 0x00, // Sequence
  190. 0x00, // SSID Parameter
  191. 0x00, // SSID Length
  192. /* SSID */
  193. };
  194. uint8_t deauth_frame_default[26] = {
  195. 0xc0, 0x00, 0x3a, 0x01,
  196. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  197. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  198. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  199. 0xf0, 0xff, 0x02, 0x00
  200. };
  201. void startWiFiAttacks(uint8_t scan_mode, uint16_t color, String title_string);
  202. void packetMonitorMain(uint32_t currentTime);
  203. void eapolMonitorMain(uint32_t currentTime);
  204. void updateMidway();
  205. void tftDrawXScalButtons();
  206. void tftDrawYScaleButtons();
  207. void tftDrawChannelScaleButtons();
  208. void tftDrawColorKey();
  209. void tftDrawGraphObjects();
  210. void sendProbeAttack(uint32_t currentTime);
  211. void sendDeauthAttack(uint32_t currentTime, String dst_mac_str = "ff:ff:ff:ff:ff:ff");
  212. void sendDeauthFrame(uint8_t bssid[6], int channel, String dst_mac_str = "ff:ff:ff:ff:ff:ff");
  213. void broadcastRandomSSID(uint32_t currentTime);
  214. void broadcastCustomBeacon(uint32_t current_time, ssid custom_ssid);
  215. void broadcastCustomBeacon(uint32_t current_time, AccessPoint custom_ssid);
  216. void broadcastSetSSID(uint32_t current_time, char* ESSID);
  217. void RunAPScan(uint8_t scan_mode, uint16_t color);
  218. //void RunRickRoll(uint8_t scan_mode, uint16_t color);
  219. //void RunBeaconSpam(uint8_t scan_mode, uint16_t color);
  220. //void RunProbeFlood(uint8_t scan_mode, uint16_t color);
  221. //void RunDeauthFlood(uint8_t scan_mode, uint16_t color);
  222. void RunMimicFlood(uint8_t scan_mode, uint16_t color);
  223. //void RunBeaconList(uint8_t scan_mode, uint16_t color);
  224. void RunEspressifScan(uint8_t scan_mode, uint16_t color);
  225. void RunPwnScan(uint8_t scan_mode, uint16_t color);
  226. void RunBeaconScan(uint8_t scan_mode, uint16_t color);
  227. void RunRawScan(uint8_t scan_mode, uint16_t color);
  228. void RunDeauthScan(uint8_t scan_mode, uint16_t color);
  229. void RunEapolScan(uint8_t scan_mode, uint16_t color);
  230. void RunProbeScan(uint8_t scan_mode, uint16_t color);
  231. void RunPacketMonitor(uint8_t scan_mode, uint16_t color);
  232. void RunBluetoothScan(uint8_t scan_mode, uint16_t color);
  233. void RunLvJoinWiFi(uint8_t scan_mode, uint16_t color);
  234. #ifdef HAS_BT
  235. static void scanCompleteCB(BLEScanResults scanResults);
  236. #endif
  237. //int ieee80211_raw_frame_sanity_check(int32_t arg, int32_t arg2, int32_t arg3);
  238. public:
  239. WiFiScan();
  240. //AccessPoint ap_list;
  241. //LinkedList<ssid>* ssids;
  242. int set_channel = 1;
  243. int old_channel = 0;
  244. bool orient_display = false;
  245. bool wifi_initialized = false;
  246. bool ble_initialized = false;
  247. String free_ram = "";
  248. String old_free_ram = "";
  249. String connected_network = "";
  250. String dst_mac = "ff:ff:ff:ff:ff:ff";
  251. byte src_mac[6] = {};
  252. //lv_obj_t * scr = lv_cont_create(NULL, NULL);
  253. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  254. char* stringToChar(String string);
  255. void RunSetup();
  256. int clearSSIDs();
  257. int clearAPs();
  258. bool addSSID(String essid);
  259. int generateSSIDs(int count = 20);
  260. bool shutdownWiFi();
  261. bool shutdownBLE();
  262. bool scanning();
  263. void joinWiFi(String ssid, String password);
  264. String getStaMAC();
  265. String getApMAC();
  266. String freeRAM();
  267. void changeChannel();
  268. void changeChannel(int chan);
  269. void RunInfo();
  270. void RunShutdownWiFi();
  271. void RunShutdownBLE();
  272. void RunGenerateSSIDs(int count = 20);
  273. void RunClearSSIDs();
  274. void RunClearAPs();
  275. void channelHop();
  276. uint8_t currentScanMode = 0;
  277. void main(uint32_t currentTime);
  278. void StartScan(uint8_t scan_mode, uint16_t color = 0);
  279. void StopScan(uint8_t scan_mode);
  280. static void getMAC(char *addr, uint8_t* data, uint16_t offset);
  281. static void espressifSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  282. static void pwnSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  283. static void beaconSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  284. static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  285. static void apSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  286. static void apSnifferCallbackFull(void* buf, wifi_promiscuous_pkt_type_t type);
  287. static void deauthSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  288. static void probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  289. static void beaconListSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  290. static void activeEapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  291. static void eapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  292. static void wifiSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
  293. };
  294. #endif