请想象一下这样的情景:你可以任意伪造很多个WiFi热点,然后穿梭在人群中,你身边的人搜索WiFi热点时,满屏幕都是你伪造的WiFi热点,比如这样:
(上图中“1.此广告位招租” “2.楼上是傻逼” “3.嫁人就嫁程序员”三个热点就是我伪造的)
你可以用这种技术来广播各种信息,比如表白或求炮友咳咳。当然,这些接入点是无法连接上的,因为它们都是假的!
想知道这是怎么做到的吗? 那就一步步跟着学吧~
对了,先说明一下,这个技术只能在linux上使用,而且对无线网卡也有一定的挑剔,具体的下面会讲~
=====================阶段一:基本原理===================
首先需要搞清楚的是,手机、电脑等支持WiFi的设备,是如何得知周围无线热点的存在的?无线热点(通常就是无线路由器)会周期性地向外发送Beacon帧,中文名为信标帧。信标帧一个最重要的作用就是宣示无线网络的存在(但不仅仅这个作用)。
信标帧里面包含了该无线热点的一些基本信息,比如ESSID(也就是常说的网络名称,比如上图中的“1.此广告位招租”)、BSSID(接入点的MAC地址)、加密方式(比如开放无密码、WEP加密或者WPA/WPA2加密)、支持的传输速率等等。
当无线设备接收到信标帧之后,就能得知周围这个接入点的存在。那么,如果我能够构造一个Beacon帧并且发送出去,那么无线设备收到以后也一样会认为存在这么一个热点。那么当我构造很多个Beacon帧,每个帧都宣示一个接入点,并且周期性地发送这些帧,那么无线设备就会以为周边存在很多个接入点。
这就是伪造任意WiFi热点的基本原理。
====================阶段二:熟悉Beacon帧格式=================
那么接下来的目标就很明晰了——构造Beacon帧。要构造Beacon帧,就得知道一个Beacon帧的格式。而在给出Beacon帧的格式之前,需要先说明一下802.11管理帧的通用格式:
格式中每一个字段上面的数字是指该字段占用的字节数,比如Frame Control占用2字节,Destination Address占用6字节等等。
一、Frame Control,中文名为帧控制字段,占2个字节,各个位的定义如下:
(1)Protocol字段由两位构成,用以显示该帧所使用的版本号。目前802.11只有一个版本,编号为0。所以Protocol的值是00。
(2)Type字段由两位构成,Sub type字段由4位构成。802.11帧共有三种类型的帧,分别是管理帧、控制帧与数据帧。而每种类型又分为多种子类型。Beacon帧的Type字段值为00(管理帧),而Sub type字段值为1000。
(3)To DS位与From DS位用来指示帧的目的地是否为分布式系统,定义如下:
TO DS | FROM DS | 含义 |
---|---|---|
0 | 0 | 所有管理与控制帧、非基础结构型数据帧 |
0 | 1 | 基础结构型网络里无线工作站所收到的数据帧 |
1 | 0 | 基础结构型网络里无线工作站所传送的数据帧 |
1 | 1 | 无线桥接器上的数据帧 |
由于Beacon帧属于管理帧,所以To DS与From DS都是0。
(4)Mor Fragments位,类似于IP分包的more fragments位。因为802.11帧对负载有长度限制,所以当上层传入很大的数据时,需要分段传送。Beacon帧不需要分段,所以该位为0。
(5)Retry位。有时需要重传帧,任何重传的帧都要将此位置为1,否则为0。Beacon帧不存在重传的情况,所以该位为0。
(6)Power Management位。很多无线设备是以电池供电的,比如手机。当没有数据流量时,关闭无线发射器可以延长电池的使用时间。如果无线设备要把该位置为1,那么就意味着这个帧(或者这次数据交换)传送完成之后,无线设备将进入省电模式。由于接入点是不允许进入省电模式的,所以Beacon帧的该位为0。
(7)More data位。为了服务处于省电模式中的无线设备,接入点会将那些要传给无线设备的帧加以缓存。如果无线设备从省电模式中醒来之后,收到一个帧中发现该位置1,说明接入点还有更多的缓存的数据要发送给无线设备。如果只是为了伪造Beacon帧的话,那么这一位一直为0即可。
(8)Protected Frame位如果被置为1的话,则说明该帧是受到链路层安全协议的保护的,比如WEP和WPA/WPA2。Beacon管理帧是不需要加密的,所以为0。
(9)Order位如果被置位,那么就表明帧进入了严格依次传送模式,不过发送端与接收端必须付出额外的代价。Beacon帧的该位为0。
由此可得,我们构造的Beacon帧的Frame Control字段为0×80 0×00(按图中的顺序就是00000001,00000000,考虑高位在后,那么就是二进制的10000000,00000000,即0×80 0×00)。
二、Duration字段在802.11帧中用来预约媒介占用时间。简单来说就是,每一个帧都会通过Duration字段来告知所有的无线设备:“我还要占用媒介多长时间!”。Duration字段保障了一系列原子操作不被打断,当然,前提是大家都遵守802.11协议~而Beacon帧属于广播,没有后续数据交互,所以其Duration为0,即0×00 0×00。
三、Destination Address即为目的地址,为接收端的MAC地址。由于Beacon帧是广播帧,所以目的地址就是广播地址,即FF:FF:FF:FF:FF:FF。
四、Source Address即为源地址,为发送端的MAC地址。发送端地址通常就是接入点的MAC地址,但是也有例外,比如中间加了一个中继器,那么发送端的MAC地址就是中继器的地址了。
五、BSSID就是接入点的MAC地址了。
六、Seq-ID(Sequence Control)字段中文名为顺序控制字段,它的低4位是分段编号,而高12位为顺序编号。帧片段之间的差异在于分段编号。第一个片段的编号为0,其后每个片段的分段编号依次加以,而它们的顺序编号相同。除了最后一个分段,所有分段的More data位都置位。由于Beacon帧通常不分段,所以低4位为0000,高12位为顺序编号。
七、Frame body即为帧主体。如果该帧是数据帧,那么帧主题就是数据的有效载荷,如果是管理帧,那么通常是各种信息元素(将在下面讲解)。
八、FCS,中文名帧校验序列,通常就是循环冗余校验码CRC。
===================阶段三:熟悉Beacon帧主体=====