Mac OS 抓取iPhone 包

  • 用数据线将iphone 和 mac 连接,打开 itunes 查看 iphone 的设备号,然后在终端下输入

    rvictl -s 80a2e3da2dc0cf0532de85f503b00d411c36e742

这时会提示:

`Starting device 80a2e3da2dc0cf0532de85f503b00d411c36e742 ![pic](SUCCEEDED) with interface rvi0`

打开 wireshak 会发现有个 rvi0 的网卡,只要抓这个网卡的数据就可以了,也可以用 tcpdump 来抓取。

结束时只需要输入:

`rvictl -x 80a2e3da2dc0cf0532de85f503b00d411c36e742`

tcpdump 用法

  • 监视指定网络接口的数据包
    tcpdump -i eth1

  • 监视指定主机的数据包

    • 打印所有进入或离开sundown的数据包.
      tcpdump host sundown

    • 截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
      tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    • 打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
      tcpdump ip host ace and not helios

    • 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
      tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    • 截获主机hostname发送的所有数据
      tcpdump -i eth0 src host hostname

    • 监视所有送到主机hostname的数据包
      tcpdump -i eth0 dst host hostname

  • 监视指定主机和端口的数据包
    tcpdump tcp port 23 and host 210.27.48.1

  • 监视指定网络的数据包

    • 打印所有通过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析)
      tcpdump 'gateway snup and (port ftp or ftp-data)'
  • 监视指定协议的数据包

    • 打印TCP会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机.(nt: localnet, 实际使用时要真正替换成本地网络的名字))
      tcpdump 'tcp![pic](tcpflags) & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

    • 打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包.(ipv6的版本的表达式可做练习)
      tcpdump 'tcp port 80 and (((ip![pic](2:2) - ((ip![pic](0)&0xf)<<2)) - ((tcp![pic](12)&0xf0)>>2)) != 0)'

    (nt: 可理解为, ippic表示整个ip数据包的长度, (ippic&0xf)<<2)表示ip数据包包头的长度(ippic&0xf代表包中的IHL域, 而此域的单位为32bit, 要换算

    成字节数需要乘以4, 即左移2. (tcppic&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcppic&0xf0) >> 4) << 2, 
    即 ((tcppic&0xf0)>>2). ((ippic - ((ippic&0xf)<<2)) - ((tcppic&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去
    tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的’Payload Length’ 与 ‘tcp头的长度’的差值, 并且其中表达方式’ip[]’需换成’ip6[]’.)

    • 打印长度超过576字节, 并且网关地址是snup的IP数据包
      tcpdump 'gateway snup and ip![pic](2:2) > 576'

tcpdump 与wireshark

Wireshark(以前是ethereal)是Windows下非常简单易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具。
还好有Tcpdump。我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap

* tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
* -i eth1 : 只抓经过接口eth1的包
* -t : 不显示时间戳
* -s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
* -c 100 : 只抓取100个数据包
* dst port ! 22 : 不抓取目标端口是22的数据包
* src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
* -w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
  • 使用tcpdump抓取HTTP包
    tcpdump -XvvennSs 0 -i eth0 tcp![pic](20:2)=0x4745 or tcp![pic](20:2)=0x4854
    0x4745 为”GET”前两个字母”GE”,0x4854 为”HTTP”前两个字母”HT”。

sudo tcpdump -XvvennSs 0 -i rvi0 -t -c 5000 -w weixin.cap

sudo tcpdump -XvvennSs 0 -i rvi0 -t -c 1000 tcp![pic](20:2)=0x4745 or tcp![pic](20:2)=0x4854 -w weixin.cap