Fork me on GitHub

分类 无线技术 下的文章

实战无线网络分析(篇一)无线监听

我一直对无线技术很感兴趣,记得大学里的时候买过好多本《无线电》杂志在寝室里研究,也幻想着搭建一个自己的无线电台,或者在茫茫的虚空中和另一个不知道躲在哪个角落中的家伙通讯。无线的魅力在于它的简洁,不拖泥带水,没有任何多余的部分。仔细想一想两个设备,它们之间不通过任何有形媒介进行通讯,这是一件多么不可思议的事情。

那个时候的自己,对无线技术只是感性的认识,仅仅停留在肤浅的表面,甚至完全不明白工作站(STA)和接入点(AP)之间是如何实现通信的。只知道照着网上的教程,使用 BT3 的工具包,破解了隔壁宿舍的 Wifi 密码,知其然,但不知其所以然。最近心血来潮,重温了一遍很久之前写的那篇破解 Wifi 密码的博客,又回过头来将无线的知识重新梳理了一遍。仅以此博客记录之。

这个博客共有三篇,第一篇介绍如何在我们的笔记本上监听无线通信,第二篇对无线通信的协议和原理进行分析,第三篇通过实例学习我们日常生活中最常见的 WPA/WPA2-PSK 的工作原理,以及如何破解它。

一、无线监听概述

当你使用笔记本在星巴克一边喝咖啡一边浏览网页时,或是使用手机聊着微信看着朋友圈时,你无时无刻不在无线通信。而你不知道的是,可能在不远处的某个角落,某个人正在监听着你的一举一动,因为我们周边的空气中到处都弥漫着无线电磁波,你的无线通信可以被所有人看到。

可能上面的说法有些耸人听闻,但事实就是这样,而现实生活中的窃听、拦截、篡改、钓鱼等等,比这个更有甚者。无线网络和有线网络最大的区别在于它们使用的通信媒介,有线网络使用的是实体的、物理存在的线缆作为传输的媒介,而无线网络则通过不可见的电波进行通信。由于电波通信是广播出去的,任何人都可以看到,所以如何确保无线通信的安全变得格外重要,也更困难。下面我们介绍如何监听无线网络。

二、无线网卡的监听模式

2.1 无线网卡的工作模式

无线网络的特性可能让人联想到古老的集线器(Hub)网络,在集线器网络中,所有通过集线器的数据都会被转发给该集线器所有的接口,也就是说,只要连接在该集线器上的机器,就可以监听该网络上的所有机器的网络通信。默认情况下,网卡只会接受发给自己的数据报文,将其他的报文统统丢弃。当然也可以让网卡接受所有的报文,这就是所谓的混杂模式(promiscuous mode)

无线网卡跟这个很类似,默认情况下无线网卡和无线接入点(Wireless Access Point,WAP)建立连接后,就处于托管模式(Managed mode),在这个模式下,无线网卡只专注于接受从 WAP 发给自己的数据报文。如果想让无线网卡监听空气中所有的无线通信,则可以将无线网卡设置成监听模式(Monitor mode,也叫 RFMON 模式),然后再使用诸如 Wireshark 之类的软件捕获数据报文进行分析。

无线网卡除了 Managed mode 和 Monitor mode 这两个模式之外,其实还支持好几种其他的模式,譬如:Ad hoc(也叫 IBSS 模式) 和 Master mode ,Linux Wireless 站点上对此有详细的介绍,也可以参考 Chris 的 《Wireshark 数据包分析实战》第 11 章,下面附一张无线网卡的几种工作模式的示意图。

wireless-mode.png

在这里我们最关心的自然是监听模式,下面将介绍几种方法来将无线网卡设置成监听模式。当然,如果你想将无线网卡设置成监听模式,首先你的无线网卡必须得支持,不同的无线网卡启用监听模式的方式可能也各不相同,所以进行后面的操作之前最好先 Google 一下你的网卡型号,参考官方的使用说明。我在上一篇博客中讲到了如何查看自己网卡的型号,以及如何安装无线网卡驱动,可以参考之。aircrack-ng 官网上也有一篇很好的文档介绍如何安装无线网卡驱动:Install drivers 。在确定自己的网卡型号和安装的驱动之后,可以在 Linux wireless 上查看下自己的网卡支持哪些模式。譬如我的无线网卡型号是 Atheros AR9280 ,安装的驱动是 ath9k ,从表格中可以看出它支持监听模式,另外还支持 cfg80211,AP 模式,IBSS 等等高级玩意,由于 ath9k 是一款完全免费并且开源(FOSS)的无线驱动,有时间可以去研究下它的源码。

wireless-drivers.png

2.2 使用 iwconfig 设置网卡的监听模式

在 Linux 环境下,有一个命令估计大家都用过:ifconfig,它用来显示或配置网络设备,譬如最常见的查看网卡 IP 地址,或者启用禁用某个网卡,修改网卡的 MAC 地址等等。如果要管理无线网卡,另一个命令是 iwconfig,可以用来查看无线网卡的状态,或修改无线网卡的模式。最简单的用法是不带任何参数,如下所示:

$ iwconfig
lo        no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"defenceOTA"  
          Mode:Managed  Frequency:2.412 GHz  Access Point: 6C:72:20:5D:7F:57   
          Bit Rate=130 Mb/s   Tx-Power=16 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=50/70  Signal level=-60 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:3  Invalid misc:4   Missed beacon:0

可以列出系统中当前正在使用的无线网卡,以及无线网卡的模式,支持的无线协议,ESSID(无线扩展服务设置 ID,Extended Service Set ID),信号强度等。从上面的例子中可以看出,wlan0 为无线网卡,当前网卡的运行模式为托管模式(Managed)。

大多数情况下,都可以使用下面的流程来启用无线网卡的监听模式(注意:必须以 root 身份运行):

$ su
# ifconfig wlan0 down
# iwconfig wlan0 mode monitor
# ifconfig wlan0 up

其中第一条命令将无线网卡 wlan0 停用,这一步有时不是必须的,但最好尝试先停用无线网卡,否则很可能报下面这样的错误:Device or resource busy 。

$ sudo iwconfig wlan0 mode monitor
Error for wireless request "Set Mode" (8B06) :
    SET failed on device wlan0 ; Device or resource busy.

第二条命令设置 wlan0 的模式,这里是将其设置成 monitor mode,当然也可以设置成其他的模式,譬如 iwconfig wlan0 mode master 可以将无线网卡设置成主模式。最后再启用无线网卡,这时无线网卡就是以监听模式运行的了,可以使用 iwconfig 命令确认一下。

最后我们还可以使用下面的命令改变监听的信道:

# iwconfig wlan0 channel 3

踩坑:为什么使用 iwconfig 将无线网卡设置成监听模式后,过几秒又会自动变成托管模式?

这个问题出现在你的笔记本已经连接上 Wifi 这种情况下,大多数情况下罪魁祸首就是 Network Manager 服务。如果无线网卡已经连接了 AP,则 Network Manager 会检测无线网卡的模式,自动将其设置为 managed mode。所以你可以尝试断开无线连接,或者使用下面的命令停止 Network Manager 服务。

# service network-manager stop

2.3 使用 airmon-ng 设置网卡的监听模式

如果你只是想将无线网卡设置成监听模式,使用 iwconfig 命令足矣,这时你就可以使用诸如 Wireshark 之类的抓包工具截取无线网络报文了。但是使用 iwconfig 有一点不爽的地方在于,抓包时网卡是处于监听模式的,这时不能通过 Wifi 连接互联网,否则网卡又会自动切换回托管模式,这在你想一边抓包一边上网时会非常不便。所以你有另一个选择,也是更好的选择:airmon-ng

相信很多学习无线破解的同学都是看着 aircrack-ng 的破解教程入门的,确实,在无线破解这个领域,aircrack-ng 的地位简直是神一般的存在。aircrack-ng 提供了一整套无线工具,每一个都小巧精练,各有春秋,如瑞士军刀一般,airmon-ng 就是其中之一。

首先不带任何参数直接运行它(必须以 root 身份执行):

$ sudo airmon-ng

Interface    Chipset        Driver

wlan0        Atheros AR9280    ath9k - [phy0]
enx0        Unknown     rtl8812au

可以列出当前所有的无线网卡,每一行显示出每个网卡接口的名字,芯片类型,以及安装的驱动程序。然后使用下面的命令将网卡设置成监听模式:

$ sudo airmon-ng start wlan0

Found 3 processes that could cause trouble.
If airodump-ng, aireplay-ng or airtun-ng stops working after
a short period of time, you may want to kill (some of) them!

PID    Name
12341    NetworkManager
12354    wpa_supplicant
12363    dhclient
Process with PID 12363 (dhclient) is running on interface wlan0

Interface    Chipset        Driver

wlan0        Atheros AR9280    ath9k - [phy0]
                (monitor mode enabled on mon0)

iwconfig 不同的是,airmon-ng 新建了一个虚拟网卡 mon0,并在 mon0 上启用了监听模式,真实的无线网卡 wlan0 保持不变,还是运行在托管模式下,这样你就可以上网抓包两不误了。这个命令还有一个有意思的地方在于,它会检测系统中当前正在运行的进程,分析出哪些进程可能会对无线抓包有影响,并显示出来。你可以单独使用 airmon-ng check 命令来做检测,还可以使用 airmon-ng check kill 直接 kill 掉那些可能有影响的进程。更多用法可以参考 airmon-ng 的官方文档

2.4 使用 iw 监听无线网络

iw 是 Linux 系统上的另一款无线配置工具,它的出现是为了解决 iwconfig 的很多不足,或者说它完全是为了取代 iwconfig 而开发的。

之所以要新开发一套无线配置工具,还要从无线扩展(Wireless-Extensions)说起。Wireless-Extensions(简称 WE,或者 Wext) 是由 Jean Tourrilhes 1997 年开发并添加到 Linux 内核的,它通过 Linux 的系统调用 ioctl() 来实现用户层和内核层之间的通信。由于设计的比较粗糙,使用 WE 开发的程序很难管理,并且由于它年代久远,WE 除了一些基本的 bugfix 之外也无人维护了,所以亟需一种新的无线驱动框架来指导无线程序的开发。于是便出现了 cfg80211nl80211 。需要特别指出的是 cfg80211 不再使用 ioctl 系统调用,而是使用 Netlink (基于 socket 通信)。iw 就是完全基于 cfg80211 框架重新设计并开发的。

使用 iw 不仅可以实现和 iwconfig 完全一样的功能,而且它的用法要更丰富(当然也更复杂),可以先使用 iw help 查看它的使用帮助(友情提醒:使用 iw 之前先得有个心理准备,iw 命令的输出大多比较晦涩,而且你可能会被它大片大片的技术信息所吓住,不用急,从上往下慢慢看)。下面的几个命令可能是你想尝试的:

# iw list

列出所有的无线设备,以及每个无线设备的详细信息,真的非常详细,非常专业,可能会吓住你,如果要显示的简单点,可以使用:

# iw dev
# iw dev wlan0 info
phy#0
    Interface wlan0
        ifindex 3
        wdev 0x1
        addr 00:17:c4:e8:67:20
        type managed
        channel 1 (2412 MHz), width: 40 MHz, center1: 2422 MHz

这个命令和 iwconfig 类似,显示出无线接口的名称,网卡模式,所处的频道等,这些都是接口的属性,无论有没有连接 AP ,只要你没有修改过它,接口的属性都是固定的,如果你连接了 AP ,还可以使用下面的命令查看跟连接相关的信息(SSID,频率,信号强度等):

# iw dev wlan0 link
Connected to 6c:72:20:5d:7f:57 (on wlan0)
    SSID: defenceOTA
    freq: 2412
    RX: 202000891 bytes (213176 packets)
    TX: 11249479 bytes (110592 packets)
    signal: -60 dBm
    tx bitrate: 108.0 MBit/s MCS 5 40MHz

    bss flags:    short-preamble short-slot-time
    dtim period:    1
    beacon int:    100

当然,我们最关心的,还是将网卡设置为监听模式:

# iw dev wlan0 interface add mon0 type monitor
# ifconfig mon0 up

上面的命令新增了一个虚拟网卡接口 mon0 ,并将 mon0 设置为监听模式。这个命令和上面的 airmon-ng 的效果几乎是一样的,wlan0 仍然保持 managed 模式不变,新增的 mon0 运行在 monitor 模式下。虚拟接口新增之后记得要使用 ifconfig up 启用起来,再通过下面的命令设置频率。

# iw dev mon0 set freq 2437

三、扫描无线网络

至此,我们已经准备就绪,网卡已经具备了监听周围无线信号的能力,这个时候你可以启动 Wireshark 开始数据分析之路了。但是直接分析,可能会完全没有头绪,找不到方向,因为 Wireshark 会捕获所有流经网卡的数据,如果你周围的无线热点很多,将是一场数据报灾难。所以,我们决定有的放矢,先扫描周围都有哪些无线热点,以及哪些无线设备,然后再有针对性的抓取指定热点的报文。

3.1 iw 和 iwlist

上节中介绍的 iw 命令,以及 Linux 自带的另一个无线命令 iwlist 可以实现简单的扫描功能,譬如 iw 的扫描命令如下:

$ sudo iw dev wlan0 scan
BSS 6c:72:20:5d:7f:57(on wlan0) -- associated
    TSF: 1060538844661 usec (12d, 06:35:38)
    freq: 2412
    beacon interval: 100 TUs
    capability: ESS Privacy ShortPreamble ShortSlotTime (0x0431)
    signal: -61.00 dBm
    last seen: 184 ms ago
    Information elements from Probe Response frame:
    SSID: defenceOTA
    Supported rates: 1.0* 2.0* 5.5* 11.0* 9.0 18.0 36.0 54.0 
    DS Parameter set: channel 1
    ERP: <no flags>
    Extended supported rates: 6.0 12.0 24.0 48.0 
    HT capabilities:
        Capabilities: 0x11ee
            HT20/HT40
            SM Power Save disabled
            RX HT20 SGI
            RX HT40 SGI
            TX STBC
            RX STBC 1-stream
            Max AMSDU length: 3839 bytes
            DSSS/CCK HT40
        Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
        Minimum RX AMPDU time spacing: 4 usec (0x05)
        HT RX MCS rate indexes supported: 0-15, 32
        HT TX MCS rate indexes are undefined
    HT operation:
         * primary channel: 1
         * secondary channel offset: above
         * STA channel width: any
         * RIFS: 0
         * HT protection: 20 MHz
         * non-GF present: 1
         * OBSS non-GF present: 0
         * dual beacon: 0
         * dual CTS protection: 0
         * STBC beacon: 0
         * L-SIG TXOP Prot: 0
         * PCO active: 0
         * PCO phase: 0
    WPA:     * Version: 1
         * Group cipher: TKIP
         * Pairwise ciphers: TKIP CCMP
         * Authentication suites: PSK
    RSN:     * Version: 1
         * Group cipher: TKIP
         * Pairwise ciphers: TKIP CCMP
         * Authentication suites: PSK
         * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
    WMM:     * Parameter version 1
         * BE: CW 15-1023, AIFSN 3
         * BK: CW 15-1023, AIFSN 7
         * VI: CW 7-15, AIFSN 2, TXOP 3008 usec
         * VO: CW 3-7, AIFSN 2, TXOP 1504 usec
    BSS Load:
         * station count: 4
         * channel utilisation: 164/255
         * available admission capacity: 31250 [*32us]
    Overlapping BSS scan params:
         * passive dwell: 20 TUs
         * active dwell: 10 TUs
         * channel width trigger scan interval: 300 s
         * scan passive total per channel: 200 TUs
         * scan active total per channel: 20 TUs
         * BSS width channel transition delay factor: 5
         * OBSS Scan Activity Threshold: 0.25 %
    Extended capabilities: HT Information Exchange Supported
    Country: CN    Environment: Indoor/Outdoor
        Channels [1 - 13] @ 16 dBm
    WPS:     * Version: 1.0
         * Wi-Fi Protected Setup State: 1 (Unconfigured)
         * Response Type: 3 (AP)
         * UUID: 28802880-2880-1880-a880-6c72205d7f57
         * Manufacturer: Ralink Technology, Corp.
         * Model: Ralink Wireless Access Point
         * Model Number: RT2860
         * Serial Number: 12345678
         * Primary Device Type: 6-0050f204-1
         * Device name: DIR-816
         * Config methods: Label, Display
         * RF Bands: 0x1
         * Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20

该命令会打印出大量的信息,每个无线热点以及它的详细信息都会被展示出来,可以使用下面的技巧只显示 SSID 和 BSS:

$ sudo iw dev wlan0 scan | egrep "^BSS|SSID"
BSS 6c:72:20:5d:7f:57(on wlan0) -- associated
    SSID: defenceOTA
BSS 14:75:90:ac:96:98(on wlan0)
    SSID: ak
BSS b0:48:7a:77:28:ee(on wlan0)
    SSID: TP-LINK_7728EE

使用 iwlist 的命令格式如下:

$ sudo iwlist wlan0 scan

同样的,这个命令会打印大量的信息。可以使用下面的技巧显示精简信息:

$ sudo iwlist wlan0 scan | egrep "Cell|ESSID|Channel"
          Cell 01 - Address: 6C:72:20:5D:7F:57
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    ESSID:"defenceOTA"
          Cell 02 - Address: 80:89:17:B9:2C:C2
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    ESSID:"wangshiyuan"
          Cell 03 - Address: EC:26:CA:CC:9B:9A
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    ESSID:"XIANGLAN'S FAMILY"

3.2 kismet

虽然 iwiwlist 命令的输出都不是很友好,但是在缺少其他选择的时候,这两个命令都可以帮上不少忙。当然,如果有更好的选择,我还是推荐使用下面的 kismetairodump-ng,他们不仅界面上很酷,而且功能上也更强大。我们先介绍 kismet 。

kismet 是一款 Linux 下的无线扫描程序,它的功能非常强大,不仅可以用来扫描周边的无线网络,也支持无线数据包的嗅探和破解,它还可以扫描出周围隐藏的无线热点,更厉害的是,它还内置了 IDS(Intrusion Detection System,入侵检测系统)功能,可以检测出周围是否有无线嗅探器(比如 NetStumbler)。此外,它的插件功能也很优秀,可以支持 GPS和蓝牙的扫描。它被收录在 Kali Tool 里。

在 Ubuntu 系统下可以直接使用 apt-get install kismet 来安装,安装完成之后,以 root 身份运行即可(kismet 也可以以非 root 身份运行,但功能会非常有限)。运行 kismet 之后,会弹出几个框框,使用 Tab 键移动焦点位置,选择 OK 一路往下。其中有一步会提供输入网卡接口的名称,上一节的几个命令都可以查看你的无线网卡接口名称,一般来说名称就叫 wlan0 或 ath0 之类的(特别注意的是,kismet 会自动将网卡设置成监听模式,如果你输入 wlan0,会创建出一个 wlan0mon 的监听网卡,所以如果你已经启用了监听模式,譬如使用上面的例子创建了一个 mon0 的监听网卡,可以直接填 mon0)。

完全配置好之后,我们就可以体验 kismet 的强大功能了。在这里我们只关心它的无线扫描功能,kismet 不仅可以扫描出周边所有的无线接入点,而且还可以扫描出每个无线接入点的客户端,这在我们有针对性的嗅探和攻击时非常有用。kismet 的使用界面如下图所示(very cool),具体的使用方法和快捷键参考 kismet 文档

kismet-demo.png

3.3 airodump-ng

我们要介绍的另一个无线扫描程序是 airodump-ng,看名字就知道,它也和 airmon-ng 一样,是 aircrack-ng 套件中的一个,而且它常常和 airmon-ng 配合使用,像下面这样:

# airmon-ng start wlan0
# airodump mon0

airodump-ng 的运行界面如下图所示:

airodump-demo.png

可以看到,airodump-ng 的功能和 kismet 可以说是不相上下,在扫描网络这一方面,两个工具都可以扫描到周围所有的无线接入点(包括隐藏的接入点),以及正在连接接入点的工作站(比如手机等)。图中信息量比较大,下面简单总结一下每一行每一列的意义,详细信息可以参考 airodump-ng 的文档

  • BSSID:表示无线 AP 的 Mac 地址。
  • PWR:信号强度,值越大,表示信号越强。它的值一般都是一个负数,所以上图中除了 -1, -57 是最大的,表示该接入点离的最近,信号最好。PWR 值为 -1,说明不支持信号强度的查看。
  • Beacons:Beacon 是无线数据包中最有用的一种,叫做信号数据包。802.11 的数据包按类型可以分成三类:管理、控制和数据。管理类数据包又可以分为三种子类型:认证(authentication)、关联(association)和信号(beacon)数据包。Beacon 由 WAP 发送,穿过无线信道通知所有无线客户端存在这个 WAP,并定义了连接它必须设置的一些参数。
  • #Data:捕获到的数据分组的数量,包括广播分组。
  • CH:信道号。
  • MB:WAP 所支持的最大速率。
  • ENC:使用的加密算法体系。OPN 表示无加密,WEP? 表示 WEP 或者 WPA/WPA2,WEP 表示静态的或者动态的 WEP,当然,WEP 加密很早就已经遭淘汰了,目前最常见的是 WPAWPA2
  • CIPHER:使用的加密算法。常见的算法有:CCMP、WRAAP、TKIP、WEP 等。
  • AUTH:使用的认证协议。常用的有:MGT(WPA/WPA2 使用独立的认证服务器,譬如 802.1x、RADIUS、EAP 等),SKA(WEP 的共享密钥),PSK(WPA/WPA2 的预共享密钥)和 OPN(开放式)。
  • ESSID:所谓的 SSID 号,如果启用隐藏的话,ESSID 可以为空,或者显示为 <length: 0>。
  • STATION:客户端的 Mac 地址,包括连上的和想要连的客户端。如果客户端没有连上 AP,ESSID 列显示成 (not associated)。
  • Probe:被客户端查探的 ESSID,如果客户端正在试图连接一个 AP,但是没有连接上,将会显示在这里。

四、抓包

到这里,万事具备,只欠东风。我们具备了监听无线通信的能力,也可以扫描出周围的无线接入点和客户端信息,下一步就是挑选一个你感兴趣的接入点,开始抓包吧。

4.1 使用 kismet 和 airodump-ng 抓包

上面在介绍 kismet 和 airodump-ng 的时候,都只是展示了它们扫描网络的功能,实际上,从 airodump-ng 的名字也可以看出来,它不仅可以扫描网络,还可以捕获无线数据报文。

譬如在启动 kismet 的时候,kismet 就会在启动目录生成好几个文件,如下。

$ ls -l Kis*
-rw-r--r-- 1 root root       0 8月  15 22:32 Kismet-20160815-22-32-05-1.alert
-rw-r--r-- 1 root root     264 8月  15 22:32 Kismet-20160815-22-32-05-1.gpsxml
-rw-r--r-- 1 root root   25111 8月  15 22:32 Kismet-20160815-22-32-05-1.nettxt
-rw-r--r-- 1 root root   57768 8月  15 22:32 Kismet-20160815-22-32-05-1.netxml
-rw-r--r-- 1 root root 1822733 8月  15 22:32 Kismet-20160815-22-32-05-1.pcapdump

其中,Kismet-*.pcapdump 就是捕获的数据包,可以使用 Wireshark 等数据包分析工具打开。默认情况下,kismet 会捕获所有的无线通信,数据包会变得非常大,可以通过指定 filter_tracker 参数来限制 kismet 只捕获特定 BSSID 的数据包,譬如下面这样:

$ sudo kismet --filter-tracker BSSID\(6C:72:20:5D:7F:57\)

而 airodump-ng 默认数据包是不存文件的,可以通过 --write-w 参数将数据包保存到指定文件中:

$ sudo airodump-ng -w pack mon0
$ ls -l pack*
-rw-r--r-- 1 root root  5645 8月  15 23:48 pack-01.cap
-rw-r--r-- 1 root root  1651 8月  15 23:48 pack-01.csv
-rw-r--r-- 1 root root  2457 8月  15 23:48 pack-01.kismet.csv
-rw-r--r-- 1 root root 13460 8月  15 23:48 pack-01.kismet.netxml

其中,xxx-01.cap 就是捕获的数据包文件,可以使用 Wireshark 打开分析。同样的,这个文件也有可能会很大,因为保存了所有的无线数据报文,如果只需要监听某一个接入点,可以通过 --bssid--essid 等参数指定:

$ sudo airodump-ng mon0 --bssid 6C:72:20:5D:7F:57

4.2 使用 Wireshark 和 tcpdump 抓包

通过上面的方法抓包完成之后,我们就可以使用 Wireshark 打开数据包文件来分析了。其实 Wireshark 除了可以分析数据包文件之外,也可以进行抓包。使用 Wireshark 抓包之前,首先将网卡设置为监听模式,然后在 Wireshark 启动界面中选择处于监听模式的网卡接口,这样就可以了。

使用这种方式,界面上没有 kismet 和 airodump-ng 直观,你将会看到大量的数据包迎面袭来,密集恐惧症患者慎用。好在 Wireshark 具有强大的过滤器功能,可以通过设置下面的过滤器来减少那些我们不感兴趣的数据。

wireshark-wireless-filters.png

我们这里只关心抓包的方法,关于数据包的分析,我们将在下一篇博客中介绍。最后要介绍的一个抓包工具是大名鼎鼎的 tcpdump,它可以说是抓包工具的鼻祖,命令如下:

$ sudo tcpdump -i mon0 -n -w wireless.cap

同样的,抓包文件可以使用 Wireshark 打开进行分析,这里不再赘述。

参考

  1. 《Wireshark 数据包分析实战》
  2. Monitor Mode Automatically Changes to Managed?
  3. Existing Linux Wireless drivers
  4. Wireless Extensions for Linux
  5. Capturing Wireless LAN Packets in Monitor Mode with iw
  6. Replacing iwconfig with iw
  7. Capturing Wireless LAN Packets on Ubuntu with tcpdump and Kismet
  8. Linux下的iwpriv(iwlist、iwconfig)的简单应用
  9. Kismet:一款超强的无线嗅探器
  10. 9.1 无线网络嗅探工具Kismet
  11. 第 3 章 监听 WiFi 网络
  12. Chapter 3 Wireshark
扫描二维码,在手机上阅读!

USB 无线网卡使用小记

鉴于笔记本网卡老化严重,信号太差,于是最近在京东上买了一个睿因(Wavlink)的 USB 无线网卡,WL-WN688A2 1200M 双频5g千兆 USB3.0 无线网卡,看官网上对这款产品的介绍,感觉还蛮高级的玩意,所以顺便学习了点无线网卡的知识,然后在自己的 Ubuntu 下成功安装其驱动并开始使用起来了。在此记录下。

wavlink.jpg

一、无线网卡基础知识

1.1 什么是 5G WiFi?

WiFi 技术从诞生到现在已经经历了五代的升级:从 a -> b -> g -> n 到 ac,第五代 WiFi 技术 IEEE 802.11ac 由于工作频率是 5GHz,所以叫做 5G WiFi 。如下图所示:

wifi-tech.png

相应的,目前最流行的是第四代,工作频率在 2.4GHz,所以叫做 2.4G WiFi。不过要注意的是,并不是工作频率在 5GHz 就是这里说的 5G WiFi,从上图中可以看到,第一代和第四代 WiFi 技术也有用到 5GHz 的频率,严格来说,这两种都不算 5G WiFi,只有第五代 802.11ac 才算是 5G WiFi。有些厂商经常吹嘘自己的网卡是 5G 网卡,实际上只是第四代的 802.11n,和第五代的区别还是很大的。百度上可以搜到 2.4G 和 5G WiFi 的区别

1.2 什么是双频?

这款无线网卡号称 AC1200 双频无线网卡,AC 好理解,上面解释了第五代 WiFi 技术就是 IEEE 802.11ac,1200 自然是指 1200Mbps 的传输速度。那双频是什么意思呢?

从上面的内容中我们可以看出 2.4G 和 5G 的很多区别,其实,对于用户感知来说,最重要区别只有两个:传输速率和距离。2.4G 传输速度比 5G 慢,但是传输距离远,穿墙能力强。而 5G 的最大优势则是近距离传输速度很快,适合看电影玩游戏。如下图(图片来自 Wavlin 广告)。

dual-hz.png

所谓双频,就是集 2.4G 和 5G 于一身,一张网卡,两个频段,既可以满足长距离传输的要求(2.4G),也可以满足传输速度的要求(5G)。其实这里厂商耍了一个滑头,它所宣称的 1200Mbps 传输速度,是双频合在一起的速度,2.4G 的速度是 300Mbps,5G 的速度是 867Mbps,加起来 1167Mbps,比 1200 还少了 33 呢。

另外,广告里宣称网卡还使用了 MIMO 架构CCA 空闲信道检测技术 来充分提升网卡的无线性能和稳定性,听起来还挺牛逼的,这些东西有时间再研究研究。

1.3 什么是 USB3.0 ?

和 WiFi 技术一样,USB 技术也经过二十年的发展,经历了三代,从 1996 年提出 USB1.0 规范开始,当时的传输速度只有 1.5Mbps,然后升级到 USB1.1,速度 12Mbps,到后来演变到 USB2.0,速度也升至 480Mbps,再到最新的 USB3.0 理论速度直接达到了 5Gbps,最新一代的 USB3.1 甚至达到了 10Gbps。

延伸:如何区分 USB2.0 和 USB3.0 插口

二、安装网卡驱动

做完功课之后,就开始无线网卡之旅了。无论是有线网卡还是无线网卡,大多数情况下,在使用之前都必须得安装好网卡驱动,随着 Wavlink 包装的有一个光盘,附带有网卡驱动,但是却是 Windows 系统的。所以在使用这个无线网卡之前,还得学习下如何在 Linux 系统下安装网卡驱动。

其实,无线网卡驱动的安装相当简单,可以分成下面两个步骤:

2.1 确定无线网卡的芯片类型

在安装驱动之前,我们首先需要确定无线网卡的芯片类型,这里有两个概念很容易混淆,品牌名和芯片名。有些人可能会说,我的无线网卡是 TP-LINK 的,要在哪里下载 TP-LINK 的网卡驱动呢?这个问题其实很难回答,在确定你的芯片类型之前,具体要安装什么样的驱动也是不能确定的。一般来说,买无线网卡的时候,产品说明书上会告诉你网卡的芯片信息,是 Atheros,还是 Realtek,还是 Broadcom 或者其他的什么芯片。

譬如,我买的这款无线网卡,产品文档上明确的写了:瑞昱 RTL8812AU 芯片,兼容主流操作系统。很显然芯片类型是 Realtek 的。

如果没有其他手段来得到网卡的芯片类型信息,可以使用 lsusb 命令来查看:

$ lsusb
Bus 002 Device 004: ID 04f2:b044 Chicony Electronics Co., Ltd Acer CrystalEye Webcam
Bus 002 Device 003: ID 0bda:8812 Realtek Semiconductor Corp. RTL8812AU 802.11a/b/g/n/ac WLAN Adapter
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

从第二行网卡的名称:RTL8812AU 802.11a/b/g/n/ac WLAN Adapter 中也能看出网卡是 RTL8812AU 芯片。

有时候很郁闷的是 lsusb 也看不到自己的网卡,这个时候也不知道是 usb 接口有问题,还是自己的网卡有问题,反正系统没有一点反应。如果出现这种情况,有一个小技巧可以使用,就是查看 /var/log/syslog 这个日志文件。先将 usb 无线网卡拔下,然后在终端中输入下面的命令:

$ sudo tail -f /var/log/syslog

然后再将网卡插入 usb 接口,这时如果不出意外,会出现大量的日志,像下面这样:

Jun 19 22:05:52 l-s kernel: [ 2836.763872] usb 2-1.2: new high-speed USB device number 5 using ehci-pci
Jun 19 22:05:53 l-s kernel: [ 2836.856752] usb 2-1.2: New USB device found, idVendor=0bda, idProduct=8812
Jun 19 22:05:53 l-s kernel: [ 2836.856758] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jun 19 22:05:53 l-s kernel: [ 2836.856762] usb 2-1.2: Product: 802.11n NIC
Jun 19 22:05:53 l-s kernel: [ 2836.856765] usb 2-1.2: Manufacturer: Realtek
Jun 19 22:05:53 l-s kernel: [ 2836.856768] usb 2-1.2: SerialNumber: 123456

如果出现日志,则说明网卡和 usb 接口都没有问题;如果没有出现任何日志,则说明网卡或 usb 接口坏了,可以换一个 usb 接口试试;如果出现一些报错信息,则 Google 之,在安装驱动之前,先将这些错误解决掉。

2.2 下载并安装驱动程序

无线网卡的官网,基本上都会提供驱动程序的下载,学会使用 Google 搜索。譬如我买的这款网卡产品名称是:睿因 WL-WN688A2,通过官网可以搜到该产品的很多文档:Download Drives And Manual ,其中就包括了 RTL8812AU 的驱动程序。

另外,我们已经知道了网卡的芯片类型是 Realtek ,也可以去 Realtek 的官网搜搜看。

但是不幸的是,官网提供的驱动程序,只支持到 Linux 内核版本 3.10,而我的 Ubuntu 16.04 内核版本是 4.4 ,自然编译都通不过。好在开源的世界里,从不缺少勇士,早就已经有人对官网的驱动程序进行改写了,使其支持最新的 Linux 系统。最后我选中了 github 上 gnab 的代码:Realtek 802.11n WLAN Adapter Linux driver

$ git clone https://github.com/gnab/rtl8812au.git
$ ./install.sh

代码中自带了安装脚本,使用 ./install.sh 即可安装。

2.3 附安装脚本

驱动程序的安装脚本挺简单的,贴上来学习一下。

#!/bin/bash

if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

make &&
cp 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless &&
depmod &&
echo "
                       ***Success***
***Module will be activated automatically at next reboot***
" &&

while true; do
    read -p "Do you wish to activate the module now? (y/n)" yn
    case $yn in
        [Yy]* ) insmod 8812au.ko && echo "***Module activated***" && break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

首先使用 make 命令编译源码,生成驱动文件 8812au.ko 。
然后将其复制到 /lib/modules/$(uname -r)/kernel/drivers/net/wireless 目录下,并运行 depmod 命令,这一步可以使驱动在开机时自动加载。depmod 命令的用处是创建模块依赖关系的列表,生成一个 modules.dep 文件,系统启动时,modprobe 会根据该文件自动加载驱动以及驱动的依赖关系。

最后脚本提示用户是否立即启用,如果输入 yes 则执行 insmod 8812au.ko 命令,insmodmodprobe 命令一样,用来立即安装驱动。如果不出意外,无线网卡的指示灯就开始闪烁起来了。

可以通过 lsmod 命令确定驱动是否已经成功安装:

$ lsmod | grep 88
8812au                991232  0

要卸载驱动,使用 rmmod 命令。

扫描二维码,在手机上阅读!