100元的嗅探利器

最近手头的工作需要和手机应用打交道,不过在手机上抓包调试是一件很让人不愉快的事情。就算是手机允许你挂载调试器到特定应用上抓包,这也不包含操作系统本身的一些网络流,比如DNS解析,而手机操作系统根本就不允许你在普通情况下获得本机抓包的能力。

退而求其次,从手机外面抓,电脑开一个热点,然后在电脑上抓。麻烦一点的是这需要电脑有无线网卡,而我手头偏偏只有台式机。笔记本也需要装很多软件,热点控制、DHCP、DNS等等一大堆,最后把自己活生生变成一台路由器。

看着手头的一堆路由器,把这些现成的路由器改装成嗅探器不就好了。于是折腾了三天,终于实现了利用TL-WR720N来多种方式嗅探,电脑上只要装一个嗅探器就可以了,不用特殊配置。

TL-WR720N,是我最熟悉的tplink系列里稍微比较特殊的一款,三模式硬件切换开关,双以太网接口,全功能USB接口,802.11n无线网卡。特殊就在双以太网上,这是一般的便携路由不具备的。基本思路是wifi的流量从wan口路由出去,但是把流量全部镜像到lan口上,使得电脑可以捕获。为了测试运营商网络,也贡献了手里一个闲置的3G猫,实创兴贴牌的WCDMA猫,联通定制,型号SRT-H800。

第零步,效果。

开关拨到AP,这就是一款传统的路由器,wifi和lan都通过路由穿过wan口,没别的功能。
开关拨到3G,wifi流量通过路由穿过3G猫,同时lan口上可以嗅探到。lan不能上网。
开关拨到Router,wifi流量通过路由穿过wan,同时lan口上可以嗅探到。lan不能上网。

第一步,刷OpenWRT。

从官网git下载了trunk今年5月9号的版本,支持TL-WR720N。
除了基本的配置以外,需要增加以下包:

  • kmod-usb-serial-option:USB转串口驱动,实测SRT-H800这种杂牌猫可以驱动。
  • kmod-usb-storage:支持3G猫上的micro-SD口。
  • kmod-scsi-cdrom:支持3G猫切换模式之前的cdrom。
  • iptables-mod-tee:支持TEE模式镜像流量。
  • usb-modeswitch:用于把3G猫从cdrom模式切换到modem模式。
  • comgt:用于modem拨号。

此外需要启用内核的debugfs,支持硬件切换开关。

其他一些包也可以加,比如我把cdrom和vfat也加上了,这样真的可以去读那个micro-SD。为了防止电脑突然不舒服,也加了tcpdump-mini,可以紧急情况下直接在路由器上抓包。(赠送一点:要想挂载U盘或者SD卡的FAT32或者NTFS文件系统,要加上kmod-nls-cp437和kmod-nls-utf8,不然mount的时候会报字符集搞不定。)

第二步,支持三模式硬件切换开关。

既然有硬开关,就可以在不修改闪存的情况下启用三种不同的配置,方便,也节约闪存寿命。在OpenWRT里,硬件通知并不是通过udev完成,而是使用hotplug。由于hotplug只是在硬件状态改变时得到通知,如果路由器掉电的时候有人拨动了模式开关,那就会工作不正确。TL-WR720N里要读到开关的当前状态,就必须用debugfs的gpio状态,没找到别的办法。

TL-WR720N的三模式开关使用了两个gpio口,gpio-18(sw1)对应BTN_0,gpio-20(sw2)对应BTN_1。读取很简单,/sys/kernel/debug/gpio文件grep+awk即可。

AP:sw1-hi,sw2-hi
3G:sw1-hi,sw2-lo
Router:sw1-lo,sw2-hi

为了节约模式切换时的闪存寿命,把/etc下必要的配置文件全部软链接到/tmp/profile,然后开机时根据模式修改/tmp/profile下的文件即可。

#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org

START=15
start() {
    local sw1=`fgrep sw1 /sys/kernel/debug/gpio | awk '{ print $NF }'`
    local sw2=`fgrep sw2 /sys/kernel/debug/gpio | awk '{ print $NF }'`
    local profile='router'

    if [ x"${sw1}" = x"hi" ] && [ x"${sw2}" = x"hi" ]; then
        profile='ap'
    elif [ x"${sw1}" = x"hi" ] && [ x"${sw2}" = x"lo" ]; then
        profile='3g'
    fi

    mkdir -p -m 0755 /tmp/profile
    ln -sf /etc/config/profile-"${profile}"/* /tmp/profile/
}

然后加入运行时检测开关拨动的脚本/etc/hotplug.d/button/10-profile

if [ x"${BUTTON}" = x"BTN_0" ] || [ x"${BUTTON}" = x"BTN_1" ]; then
    reboot
fi

这样如果发现开关被拨动,就会重启路由器,然后重新初始化一次。

第三步,支持3G猫。

很多3G猫有一个功能就是插到电脑上显示是一个cdrom,里面放着这个猫的驱动,这样就不需要再另外提供光盘了。然后驱动程序会发送指令命令3G猫把自己切换成猫状态,就可以正常拨号了。对于Linux系来说,这个动作通过usb_modeswitch工具完成。很幸运的是SRT-H800是一个比较多见的杂牌猫,所以usb_modeswitch原生支持。如果你的猫比较特别,可能需要自己找一下模式切换的指令,并且加入到/etc/usb-mode.json里。

紧接着就很莫名其妙了,不管怎么修改配置,usbmode -s总是报错无法发送模式切换命令。经历了几个小时的探索也没能解决这个问题,却发现如果是上电的时候猫就插在USB口上,那么第一次模式切换就会成功,之后插上的就不行了。网上的建议是可能有一些USB相关的内核模块存在配合上的问题,修改了几个配置,甚至rmmod再insmod,的确能看到有一些变化,但是就是不能switch。这个问题就放弃了,要求用户在使用运营商抓包的时候必须插好猫再上电。如果成功切换模式,会看到猫的硬件ID从ven=0x1e89 dev=0xf000变成ven=0x1e89 dev=0x1a20。

模式切换之后3G猫就是猫形态了,现在需要给它加载猫驱动。本质上所有的modem都是串行协议,所以需要载一个usb-serial驱动。很不幸,SRT-H800作为杂牌猫,3.10内核并不原生支持。不过发现usbserial_generic或者更加推荐的usbserial_option都可以驱动这个猫,只是需要命令驱动去激活这个不认识的设备。

加入/etc/hotplug.d/usb/80-srt-h800文件:

HTPID='1e89/1a20/0'
USPID='1e89 1a20 ff'

if [ x"${PRODUCT}" = x"${HTPID}" ]; then
    if [ x"${ACTION}" = x"add" ]; then
        echo "${USPID}" >/sys/bus/usb-serial/drivers/option1/new_id
    fi
fi

这样开机的时候就会把1e89:1a20这个设备加到usbserial_option的激活列表里。修改好配置重启,应该会看到/dev下出现了ttyUSB0~2三个串口设备,3G猫就激活了。比较坑爹的一点是,开始用ttyUSB0怎么都无法和猫通讯,后来一个一个试发现SRT-H800居然是用ttyUSB2来通讯的。3G拨号的设置和OpenWRT官网上的说明是一样的,而且发现即使默认用的是TD-SCDMA拨号指令,这个猫也可以拨通联通3G网络。手里没有电信猫所以就不知道能不能也拨通电信了。额外注意一点的是SIM卡一定要开PIN,不然有可能出奇怪的问题。

第四步,配置网络。

TL-WR720N一共有eth0、eth1、wlan0三个物理网卡,然后还有一个3G猫生成的动态网卡,为了和pppoe的习惯一样叫做ppp0。三个模式分别定义为:
AP:eth1和wlan0桥接,然后通过NAT穿过wan,ppp0禁用。
3G:wlan0通过NAT穿过ppp0,eth0禁用,eth1不配置forward。
Router:wlan0通过NAT穿过eth0,ppp0禁用,eth1不配置forward。

出于嗅探方便的考虑,eth1上开DHCP,并且把地址池设置为只有一个IP,其实就是静态IP,但是不需要电脑配置。为了尽可能不干扰被嗅探网络,把wifi的地址池设置为比较奇怪的C段。也为了减少干扰,wifi上开启加密。写法psd-mixed/ccmp+tkip,这是最兼容的模式,WPA+WPA2,TKIP+AES全都支持。不建议开启HT40-模式,就用HT20,兼容性好。

网络都通了以后,配TEE模块。因为OpenWRT并不原生支持TEE,所以修改/etc/firewall.user,在里面添加相关命令:

iptables -t mangle -I PREROUTING -i wlan0 -j TEE —gateway=192.168.0.5
iptables -t mangle -I POSTROUTING -o wlan0 -j TEE —gateway=192.168.0.5

两个注意点:1、OpenWRT建议使用-I而不是-A。2、gateway是eth1上唯一的那个IP。

第五步,电脑侧。

Wireshark或者Network Monitor,随便。由于使用的是TEE模块,所以网卡不需要开启混杂就可以嗅探。所有的wifi包(不包括wifi自己的链路包比如WPA握手)都是以明文传递给eth1的,你可以看到MAC是从路由器发往电脑,而IP却是wifi发往外网。只需要注意这种情况下电脑不要打开forwarding就好了。