Mac下抓包

Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11)。Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的XQuartz(X11.app)。因此,在Mac OS X上安装Wireshark之前,需要先下载安装XQuartz。

1.安装XQuartz

XQuartz(XQuartz-2.7.6.dmg)安装完成后,按照提示需要注销重新登录,以使XQuartz作为默认的X11 Server。


安装成功后,在终端输入“xterm --help”可查看命令行帮助,输入“xterm -version”可查看xterm版本信息。在终端输入“xterm”或通过菜单“Applications->Terminal”可启动X Window(XQuartz)的终端(xterm)。

 

2.安装Wireshark

安装OS X 10.6 and later Intel 64-bit版本(Wireshark 1.12.0 Intel 64.dmg)。

安装成功后,在终端输入“wireshark --help”可查看命令行帮助,输入“wireshark --v”可查看wireshark版本信息。

 

3.启动Wireshark

首次启动Wireshark,提示通过前端X11窗口可以操控Wireshark;由于需要编译字体包,可能需要耗费几分钟。

如果事先没有安装X11(XQuartz),则会提示引导安装X11。

如果事先已经安装好XQuartz(X11),则会引导选择X11.app所在路径。——最新版本的Wireshark 1.12.4 Intel 64.dmg貌似会自动识别已安装的X11路径而无需手动指定。

点击Browse到“/Applications/Utilities/XQuartz.app”,将XQuartz作为Wireshark的X11前端。——最新版本的Wireshark 1.12.4 Intel 64.dmg貌似会自动识别已安装的X11路径而无需手动指定。

如果不出意外的话,Wireshark将成功启动。

4.选择网卡,开始抓包

点击启动首页中的“Interface List”(相当于菜单“Capture->Interfaces”),可以查看本机活跃网卡(通过系统菜单Apple->About This Mac->More Info->Overview->System Report或终端命令ifconfig也可查看)。

(如果弹出错误提示“There are no interfaces on which a capture can be done.”,在终端输入sudo wireshark给wireshark授root权限再重新登陆)

由于本人iMac使用无线接入,故en1(Wireless NIC)和lo0(本机环路)活跃(active),有线网卡en0(Wired NIC)未使用(inactive)。注意:MBP上无线网卡是en0,可通过ifconfig区分识别。

这里可以直接勾选en1,点击Start按钮使用默认Capture Options(默认勾选了混杂模式[promiscuous mode])进行抓包;可以在启动首页点选“Wi-Fi:en1”打开“Edit Interface Settings”,设置(例如可配置Capture Filters只捕捉指定类型或条件的数据包)或使用默认Capture Options开始抓包;也可以从菜单“Capture->Options”着手,选择网卡设置选项开始抓包。

这里选择了无线网卡(Wi-Fi: en1),怎么抓到的是以太网包(Ethernet Packet)呢?实际上它是某些BSD提供的伪以太网头(fake Ethernet headers)。如果要抓取IEEE802.11无线包(Beacon Frame等),则需要开启监听模式[monitor mode],并且将Link-layer header type选为802.11系列选项。

另外,在Display Filters中填写了“http”,将从捕捉到的数据包中过滤出并只显示HTTP协议包。

 

5.监听抓取802.11无线帧

在“Edit Interface Settings”或“Capture Options”中勾选“Capture packets in monitor mode”开启监听模式,然后勾选Link-layer header type为“802.11”开始抓取无线包。

 

说明:

(1)iMac开启Monitor Mode时,可能会阻塞网卡导致上不了网,参见下文相关说明。

(2)Windows下抓取802.11无线帧Management/Control/DataFrame),需要Wireshark配合AirPcap或使用OmniPeek

(3)常见802.11无线帧(802.11 frames)类型:

 

(1)Management Frame

 

Type/Subtype: Beacon frame (0x0008,Bit[5:0]=00,1000B)

 

Type/Subtype: Probe Response (0x0005,Bit[5:0]=00,0101B)

 

(2)Control Frame

 

Type/Subtype: 802.11 Block Ack (0x0019,Bit[5:0]=01,1001B)

 

Type/Subtype: Request-to-send (0x001b,Bit[5:0]=01,1011B)

 

Type/Subtype: Clear-to-send (0x001c,Bit[5:0]=01,1100B)

 

Type/Subtype: Acknowledgement (0x001d,Bit[5:0]=01,1101B)

 

(3)Data Frame

 

Type/Subtype: Data (0x0020,Bit[5:0]=10,0000B)

 

Type/Subtype: Null function (No data) (0x0024,Bit[5:0]=10,0100B)

 

Type/Subtype: QoS Data (0x0028,Bit[5:0]=10,1000B)

 

Type/Subtype: QoS Data + CF-Ack + CF-Poll (0x002b,Bit[5:0]=10,1011B)

 

6.通过RVI抓取iPhone数据包

(1)RVI简介

使用Mac抓取iPhone数据包可通过共享和代理两种方式:

 

  • 使用Mac的网络共享功能将Mac的网络通过WiFi共享给iPhone连接;
  • 使用代理软件(例如Charles)在Mac上建立HTTP代理服务器。

 

这两种方式都是将iPhone的网络流量导入到Mac电脑中,通过Mac连接互联网。这就要求Mac本身是联网的,对于网络共享的方式还要求Mac本身的网络不能使用WiFi,而且在iPhone上只能使用WiFi连接,无法抓取到2G/3G网络包。

苹果在iOS 5中新引入了“远程虚拟接口(Remote Virtual Interface,RVI)”的特性,可以在Mac中建立一个虚拟网络接口来作为iOS设备的网络栈,这样所有经过iOS设备的流量都会经过此虚拟接口。此虚拟接口只是监听iOS设备本身的协议栈(但并没有将网络流量中转到Mac本身的网络连接上),所有网络连接都是iOS设备本身的,与Mac电脑本身联不联网或者联网类型无关。iOS设备本身可以为任意网络类型(WiFi/2G/3G),这样在Mac电脑上使用任意抓包工具(tcpdump、Wireshark、CPA)抓取RVI接口上的数据包就实现了对iPhone的抓包。

Mac OS X对RVI的支持是通过终端命令rvictl提供的,在终端(Terminal)中输入“rvictl ?”命令可查看帮助:

==================================================

rvictl Options:

           -l, -L                     List currently active devices

           -s, -S                     Start a device or set of devices

           -x, -X                    Stop a device or set of devices

==================================================

(2)使用rvictl -s命令创建虚拟接口

首先,通过MFI USB数据线将iPhone连接到安装了Mac OS+Xcode 4.2(or later)的Mac机上。iOS 7以上需要搭配Xcode 5.0(or later),抓包过程中必须保持连接。

然后,通过iTunes->Summary或者Xcode->Organizer->Devices获取iPhone的UDID(identifier)。

接着,使用“rvictl -s”命令创建RVI接口,使用iPhone的UDID作为参数。

==================================================

$rvictl -s <UDID>

==================================================

创建成功后,在终端通过ifconfig命令可以看到多了一个rvi0接口。当有多个iOS设备连接iMac时,依次是rvi1,rvi2…,使用“rvictl -l”命令可以列出所有挂接的虚拟接口。

在Wireshark首页选择rvi0,使用默认的Capture Options即可开始对iPhone进行抓包。

下图为抓取的WiFi数据包:

其中iPhone手机连接WiFi动态获取的IP地址为192.168.199.230。

下图为抓取的3G数据包:

说明:联通3G上网动态分配的都是172.20网段(例如172.20.124.251)的这种B类私网地址(172.16.0.0~172.32.255.255)。手机百度中输入IP,ip138中显示的112.97.24.178是深圳联通附近基站对外的公网网关IP地址。

(3)使用rvictl -x命令删除虚拟接口

 

使用”rvictl -x“命令删除RVI接口,使用iPhone的UDID作为参数。

 

==================================================

 

$rvictl -x <UDID>

 

==================================================

7.关于监控模式(Monitor Mode)

 

(1)《Wireshark FAQ》:Q 10.1: How can I capture raw 802.11 frames, including non-data (management, beacon) frames?

NOTE: an interface running in monitor mode will, on most if not all platforms, not be able to act as a regular network interface; putting it into monitor mode will, in effect, take your machine off of whatever network it's on as long as the interface is in monitor mode, allowing it only to passively capture packets.

This means that you should disable name resolution when capturing in monitor mode; otherwise, when Wireshark (or TShark, or tcpdump) tries to display IP addresses as host names, it will probably block for a long time trying to resolve the name because it will not be able to communicate with any DNS or NIS servers.

 (2)AirSnort FAQ》:Q 3: What is the difference betwen monitor and promiscuous mode?

Monitor mode enables a wireless nic to capture packets without associating with an access point or ad-hoc network. This is desirable in that you can choose to "monitor" a specific channel, and you need never transmit any packets. In fact transmiting is sometimes not possible while in monitor mode (driver dependent). Another aspect of monitor mode is that the NIC does not care whether the CRC values are correct for packets captured in monitor mode, so some packets that you see may in fact be corrupted.

 

8.关于Wireshark的BPF权限问题

实际上,我在OS X 10.9.4上安装XQuartz+Wireshark非常顺利,没有出现什么诸如无法发现网卡(nointerface available)的权限问题。

安装前执行“ls -l /dev/bpf*”,bpf0/bpf1/bpf2/bpf3只有“rw-------”权限;安装完成时,再次执行“ls -l /dev/bpf*”,发现权限已经升级为了 “rw-rw----”,即Wireshark已经给当前安装使用Wireshark的user(administrator)所在的group配置了rw权限。相当于执行过“sudo chmod g+rw /dev/bpf*”,并且已经被配置到随机启动,下次开机不用重新执行该命令。

--------------------------------------------------------------------------------

/CapturePrivileges- you must have sufficient privileges to capture packets, e.g. special privileges allowing capturing as a normal user (preferred) or root / Administrator privileges.

In order to capture packets under BSD (including Mac OS X), you must have read access  to the BPF devices in /dev/bpf*.

Enabling and using the "root" user in Mac OS X

Platform-Specific information about capture privileges

Howto securely configure Mac OS X for network packet sniffing with Wireshark

--------------------------------------------------------------------------------

 

9.关于数据包的源/目的地址

以第4节中GET http://blog.csdn.net/phunxm为例,仅做简单的分析。

###############################################################

发包的源MAC/IP地址为本机MAC/IP地址。
(1)Destination Mac为00:00:0c:07:ac:24(CISCO All-HSRP-routers_24)
socket编程通常在IP层以上进行,一般不关心MAC地址。我们的电脑也不可能与CSDN博客服务器直接相连,一般要经过很多中间节点(hops)。根据邻居协议,目的MAC地址为下一跳(next hop,[default] gateway/Router)的MAC地址。
通过Network Utility或“route -n get default”或“netstat -rn”命令可获得默认网关为10.64.66.1。通过“arp -a”显示“? (10.64.66.1) at0:0:c:7:ac:24 on en1 ifscope [ethernet]”。
(2)Destination IP为10.14.36.100
按道理,目的IP地址应该为CSDN博客服务器(blog.csdn.net)主机的IP117.79.157.201),为什么这里的却为A类私网地址(10.14.36.100)呢?

这是因为内网使用了HTTP Proxy,10.14.36.100是proxy.pac基于域名判断出口返回的Proxy Server的IP地址。

###############################################################

收包HTTP/1.1 200 OK)的目的MAC/IP地址为接收方(本机)的MAC/IP地址。

(1)源IP地址为Proxy Server的IP地址,同上。

(2)源MAC地址一般应为【默认】网关的MAC地址(进出都要过关),实际抓包却发现MAC地址并非【默认】网关的MAC地址,这是什么情况呢?

通过Windoze的“route print”或Mac OS X/UNIX的 “netstat -r”可查看路由表(Routing Tables)信息。通过Windoze的“tracert  10.14.36.100”或Mac OS X/UNIX的“traceroute 10.14.36.100”查看本机到代理10.14.36.100之间的路由信息,第一跳并非默认网关(10.64.66.1),而是10.64.66.2!

这是因为采用了热备路由(HSRP),HSRP协议利用优先级决定哪个路由器成为活动路由器,收包的那个陌生源MAC地址即是热备路由(10.64.66.2)的MAC地址!

 

10.在越狱iPhone上指定网卡(WiFi/xG)抓包

上文主要讲解的是在不越狱正常权限情况下,通过RVI虚拟接口挂钩抓取iPhone数据包,一台iPhone通常只对应一个RVI虚拟接口。但是iPhone本身支持两种上网模式——WiFi/xG(类似PC工作站多网卡情形),当xG和WiFi同时活跃时(en0为无线网卡,pdp_ip0为3G网卡),iOS将WiFi作为优先默认路由通道。

那么,当需要调试分析xG/WiFi切换或并存时的一些路由策略或临界流量问题时,如何抓取指定通道(WiFi/xG)的数据包呢?使用RVI通过包源IP可能可以区分,但是由于权限等问题,总是不那么方便。此时,通过越狱,在iPhone上安装远程登录工具包(OpenSSH)、网络诊断分析命令行工具network-cmds(arp,ifconfig,ping,traceroute,netstat),然后在WinPC或iMac上通过SSH隧道发送tcpdump命令指定WiFi/xG网卡进行抓包(SSH远程控制iPhone运行tcpdump抓包),最后通过Wireshark对pcap文件进行分析或统计。


 

posted @ 2016-05-13 10:32  JunerLee  阅读(3671)  评论(0编辑  收藏  举报