OS X Scapy 混杂模式

0 投票
2 回答
4351 浏览
提问于 2025-04-18 04:39

我正在使用scapy这个工具,想要列出我网络上所有发送的http主机头信息。现在我写的代码是这样的:

#!/usr/bin/env python
import sys
sys.path.append("/usr/local/lib/python2.7/site-packages")
import re
from scapy.all import *
import os
import urllib


conf.sniff_promisc=True

HOST_REGEX = "(?<=\r\nHost\: )([A-Za-z\.]){4,40}(?=\r\n)"

def print_host_header(pckt):
  if pckt:
    raw = pckt.getlayer(Raw)
    if raw:
      raw_pckt_data = raw.load
      host_results = re.search(HOST_REGEX, raw_pckt_data)
      if host_results:
        print "[*] Request to: "+str(host_results.group(0))
if __name__ == "__main__":
  if os.getuid()!=0:
    print "[!] Not running as root."
    exit(1)
  sniff(filter='tcp', prn=print_host_header, store=0)

这个方法效果很好(当然,它无法读取用ssl/tls加密的流量),但是我似乎只捕获到了来自我笔记本电脑的包(也就是运行这个脚本的电脑)。我把conf.promisc设置为true,并且根据ifconfig的显示,我确实处于混杂模式:

735Tesla # ifconfig en1
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    ether 60:c5[...]
    inet6 fe80::62c5:47ff:fe8b:3768%en1 prefixlen 64 scopeid 0x5 
    inet 192.168.1.8 netmask 0xffffff00 broadcast 192.168.1.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    status: active
735Tesla # 

还有其他原因导致我无法捕获发往其他电脑的数据包吗?

我正在使用OS X 10.9.1(我想我真的应该更新一下,或者修补一下goto fail这个问题 :P)

2 个回答

3

这里是Wireshark对这个话题的详细解释:http://www.wireshark.org/faq.html#q7.1

问 7.1:我用Wireshark抓包时,为什么只看到我机器的流量,或者没有看到我想监控的机器的所有流量?

答:这可能是因为你抓包的网络接口连接的是以太网或令牌环交换机。在一个交换网络中,两个端口之间的单播流量不会出现在其他端口上,只有广播和组播流量会发送到所有端口。 即使你的机器连接的是集线器,这个“集线器”也可能是一个交换集线器,这样你仍然是在一个交换网络中。 另外,Linksys网站上提到他们的自动感应集线器“只会将10Mb的数据包广播到10Mb的端口,而将100Mb的数据包广播到100Mb的端口”,这意味着如果你在10Mb的端口上抓包,你将看不到发送到100Mb端口的流量,反之亦然。这个问题在Netgear的双速集线器上也有报告,可能在其他“自动感应”或“双速”集线器上也存在。 一些交换机可以将所有端口的流量复制到一个单独的端口,这样你就可以将分析仪插入那个端口来抓取所有流量。你需要查看交换机的文档,看看是否可以这样做,如果可以,如何操作。有关某些交换机的信息,请查看Wireshark Wiki上的交换机参考页面。(注意,这是一个Wiki,所以你可以更新或修正这些信息,或者自己添加关于这些交换机或新交换机的信息。) 还要注意,许多防火墙/NAT设备内部都有一个交换机;这包括许多“电缆/DSL路由器”设备。如果你有这样的设备,里面有一个带有多个以太网端口的交换机,你可以将网络上的机器插入这些端口,还有一个以太网端口用于连接电缆或DSL调制解调器,你至少可以通过将路由器连接到调制解调器的以太网端口、调制解调器的以太网端口和运行Wireshark的机器插入一个集线器(确保它不是一个交换集线器,并且如果是双速集线器,所有三个端口都在同一速度下运行)来抓取网络和互联网之间的流量。 如果你的机器没有连接到交换网络或双速集线器,或者它连接到了交换网络但端口设置为复制所有流量,那么问题可能是你抓包的网络接口不支持“混杂模式”,或者你的操作系统无法将接口设置为混杂模式。通常,网络接口只会向主机提供:

  • 发送到该主机的某个链路层地址的数据包;
  • 广播数据包;
  • 发送到主机已配置为接受的组播地址的组播数据包。

大多数网络接口也可以设置为“混杂模式”,在这种模式下,它们会向主机提供它们看到的所有网络数据包。Wireshark会尝试将它抓包的接口设置为混杂模式,除非在“抓包选项”对话框中关闭了“以混杂模式捕获数据包”选项,而TShark也会尝试将其抓包的接口设置为混杂模式,除非指定了-p选项。然而,有些网络接口不支持混杂模式,有些操作系统可能不允许将接口设置为混杂模式。 如果接口没有在混杂模式下运行,它将看不到任何不是专门发给你机器的流量。它会看到广播数据包和发送到接口设置为接收的组播MAC地址的组播数据包。 你应该询问你的网络接口供应商是否支持混杂模式。如果支持,你还应该问提供该接口驱动程序的人(供应商或你机器上运行的操作系统的供应商)是否支持该网络接口的混杂模式。 对于令牌环接口,Windows上某些驱动程序可能需要你启用混杂模式才能在混杂模式下抓包。有关详细信息,请查看Wireshark Wiki上关于令牌环抓包的内容。 对于无线局域网接口,当这些接口在混杂模式下抓包时,它们的运行模式与作为普通网络接口时的模式有显著不同(以至于这些驱动程序同时支持混杂抓包和作为普通网络接口运行会非常困难),所以可能Windows的这些接口驱动程序不支持混杂模式。

2

如果 en1 是一个以太网适配器,那么它连接的网络上还有哪些其他机器呢?en1 是不是插在一个交换机上?如果是的话,可以参考Wireshark的维基页面,了解如何在以太网网络上进行数据捕获

如果 en1 是一个无线网卡,你需要在监控模式下进行捕获。我不太清楚Scapy是如何支持开启监控模式的,但你可能需要把链路层的头部类型设置为“带有radiotap头的802.11”,才能进入监控模式。在监控模式下,如果网络是一个“受保护”的网络(使用WEP或WPA/WPA2加密),你还需要在链路层解密数据包——Scapy可能不支持这个功能。

撰写回答