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就好了。

关于鸡鸭脱毛

街上、超市里买家禽,已经很少见到带羽毛或者绒毛的,都是很干净的去毛鸡鸭。怎么做到的呢?我搜索总结如下:

  1. 开水烫,然后一根一根拔。传统的工艺,绝对安全,绝对没效率。要是不细心的话,脱不干净。自家买的活鸡一般就是这样处理啦。
  2. 机械式脱毛机,还是要开水烫,然后就是自动帮你拔啦。只要机器没问题,绝对安全,效率也没得说,但是这东西很贵的,一般的小摊贩可没有。
  3. 沥青,粘住毛冷却后再敲掉,毛就跟着被拔干净了。不能吃,有毒。能耗高,因为沥青软化点比较高。黑巷子里能看到。
  4. 工业松香,和沥青原理一样。不能吃,有毒。能耗高,因为松香熔点比较高。
  5. 食用松香,和沥青原理一样。基本认为无毒,曾经是推荐的脱毛方法。能耗高,因为松香熔点比较高。因为和工业松香长得很像,所以经常被查。
  6. 高温家禽脱毛蜡,和沥青原理一样。基本认为无毒,曾经用于替代松香,降低成本。能耗高,因为是高温嘛。
  7. 低温家禽脱毛蜡,和沥青原理一样。基本认为无毒,现在推荐的脱毛方法。能耗比较低,因为低温嘛。

怎么劝人不要吃狗肉

不断地有朋友(转)发关于不要吃狗肉的宣言、帖子、状态、朋友圈,大概的内容是这样的:“狗是人类的好朋友,他们忠诚很萌很可爱,我爱狗狗,我不吃狗狗,你们也不要去吃他们~~”

呃,我觉得这个说法对我一点都没有用啊,虽然不知道别人是不是会因为看到这样一条状态就真的不吃狗肉了。我的回复大概会长这个样子:“猫猪牛羊兔鸡鸭鹅鱼蛇鸽龟蛤等纷纷表示,我们也是人类的好朋友;花草树木藤蔓苔藓白菜莴苣生菜木耳西兰花等纷纷表示,我们也有生命。”

那么,哪里有问题呢?我觉得大概是这么两方面:

  1. 为什么就是狗特别呢?吃牛肉的时候不觉得牛也是一样么?
  2. 你不吃那就是你不吃,为什么要管我吃不吃呢?

所以要劝人不吃狗肉,我们得看看这两个问题咋解决。首先说一下背景,狗肉火锅可是相当好吃的,号召不吃狗的人要是吃过一次,弄不好有一些要打退堂鼓的。吃的是什么狗呢?不是什么狗都拿来做火锅的,这东西一般叫做土狗,学名中华田园犬。听这个名字就知道,吃狗肉和中国人的关系大概是不小的。在重视狗的权利的国家,比如美国,是没有吃狗肉的习俗的,自然不能理解中国人为啥要吃这么可爱的朋友。但是美国绝对不会去保护牛,也许可以保护猪,但是绝对不会保护牛,要知道,美国的传统美食里,牛排可是非常受欢迎的。

所以,狗为什么特别呢?为什么要专门说不吃狗肉呢?其实狗没有什么特别的,只是因为欧美不吃,而中国吃,不理解而已。而其他的动物,要么是都吃,比如牛,要么都不吃,比如猫。为什么不宣扬不吃猪呢?因为猪是专门饲养来给人吃的?以我的理解,问题1其实是无解的,这个更接近于伦理问题了,除非说狗肉不适合人类食用等技术原因,不然别的动物不被这样保护是值得思考的。

关于问题2,事不关己,你为什么要把你的价值观强加于我呢?我吃狗肉并没有造成健康问题,没有违反法律,没有导致邻居投诉,为什么不可以吃?对于民众,法无禁止既是允许,而道德,本身就没有对与错的问题。

所以,要号召别人不吃狗肉,问题1得回避,我们需要把问题2解决了。如果不是道德问题,那就得是技术问题了,不然就这么劝别人“提高道德水平”,是肯定没有效果的。

然而,吃狗肉是真的有技术问题的。吃狗肉会导致1、健康问题。2、社会问题。

有没有人想过狗是从哪里来的?大量的中华田园犬,是从专门的肉狗厂来的么?猪肉是有出处的,而且通常会有相关监管部门。如果买过国家肉联厂的猪肉就会知道皮子上是有一个蓝色的检疫章的。但是狗肉往往为了鲜美,狗肉馆子是把狗直接关在门口的笼子里的,要哪条直接杀。(不少羊肉也是哈,水产店也是这样不过水产有专门的检疫程序)这绝对不会是正规的肉源,因为活体检疫与现场屠宰,都是没办法跟踪到最后一刻的,如果下手之前给你下了药怎么办?工商也没办法抽查,来查的时候狗还是活的,难道割一刀来化验?动物检验检疫一般如果不是出入境,也不是立刻就能出结果的。

而且,除了一部分真正的肉狗饲养厂,狗的一个重要来源,是偷来的。这个不奇怪,养了那么久的狗怎么都有感情,怎么下得了手,要么是别人家的。(野狗病死狗也可能,安全性就更没保证了。)从附近的几个村子偷一趟,够卖两天了,能挣几千块钱。怎么偷狗呢?两个简单办法,一个比较安全但是效率低:拿母狗去勾引;另一个就非常之糟糕了:下药。作为护院狗,被打死或者活捉一点声音都不发,肯定是中毒,不是食物中毒,就是专门的毒药打狗弩。狗到手之后,内脏处理掉,把肉拿来吃。安全么?“呵呵”。

所以,吃狗要非常小心,活体狗没有监管,如果有疫情没办法知道。死狗就更不好说了,如果是被药弩打死的,千万别吃,肌肉里可能有残留。

用这样的理由,别管是不是科学(其实不科学,没有专门的考证,没有参考文献,没有权威部门的确认,就是我自己瞎掰的),但是再去给别人劝说不要吃狗肉的时候,对方会认为你真的是从为他好的立场出发的,而且真的会对狗肉的安全性和社会影响性感到担忧,你的目的就达到了。

哦,是的,我是吃狗肉的,非常好吃。