Linux上常用的抓包工具有tcpdump,还有大名鼎鼎的wireshark(图形界面)。它们都可以抓无线网络WIFI包。本文介绍用两者如何在Linux系统中抓包,假设系统已经正确安装无线网卡驱动,并能识别到wlan0设备。
802.11帧有三种,管理帧、控制帧,数据帧。当我们的手机扫瞄周边WIFI热点时,会发现probe请求,它是管理帧的一种。其中包含了手机的MAC地址。更多802.11帧格式,请自行搜索,本文不涉及。
在使用无线上网时,用wireshark抓包发现其格式与802.3是完全一样的,一度怀疑自己看错,因为明明是使用无线网络,应该是802.11格式的才对。经过研究跟踪内核源码,发现在内核ieee80211驱动会将数据包转换成802.3,然后才上传到网络协议栈,但是,当无线网卡为monitor模式时,不会做转换。有兴趣可参阅内核源码文件net/mac80211/rx.c的ieee80211_rx函数。这方面涉及太多知识,本文只略提一下——其实主要是自己还没研究透,无法写出来。
因此,如果要抓的包有probe等类型时,必须将网卡设置为monitor模式。
设置无线网卡模式使用iwconfig命令,如下命令设置为monitor模式:
iwconfig wlan0 mode monitor
也可以使用iw命令,下面是设置为managed模式(作为AP或STA时处于该模式):
iw wlan0 set type managed
# iwconfig wlan0 mode monitor
Error for wireless request "Set Mode" (8B06) :
SET failed on device wlan0 ; Device or resource busy
# ifconfig wlan0 down
# iwconfig wlan0 mode monitor
# iwconfig wlan0
wlan0 IEEE 802.11abgn Mode:Monitor Tx-Power=20 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
# ifconfig wlan0 up
# iw wlan0 interface add mon0 type monitor // 添加一个别名mon0,monitor模式
# ifconfig mon0 up // 启用mon0,默认不启用
默认情况下,系统启动后,wlan0是managed模式,另建一个mon0作为抓包使用比较方便,不与原有网卡冲突,当使用wlan0抓包时,为802.3格式;而使用mon0则为802.11。
使用tcpdump抓包命令:
# tcpdump -i wlan0
# tcpdump -i mon0
如果需要将抓的包用wireshark分析,可以使用-w foo.cap保存成文件,然后用wireshark打开查看。
另外,wireshark工具有Linux版本,在ubuntu输入:
sudo apt-get install wireshark
即可安装,其使用与Windows系统下无差异。在wireshark下使用wlan.fc.type_subtype == 0x04过滤得到probe包,就可以知道有哪些手机或电脑发现probe帧了,知道了MAC的OUI,自然知道手机厂商,就可以知道周边的人使用Apple多些还是Android多点。这或许是传说中的“WIFI探宝”,据说有些商场就使用类似的应用,定位客户,查看流量,等等。
注:本文仅是热身,下面将使用代码方式对无线网卡进行抓包。而802.11 netlink编码正在打算中。
李迟 2016.10.28 周五深夜