3

我正在尝试编写一个简单的代码来检测 ICMP 数据包的 IP 源地址scapy,问题是haslayer函数看起来没有返回任何内容。

from scapy.all import *

while 1:

    pkt = sniff ( iface="eth0" , count = 1 )
    pkt.summary()

    try:
        if pkt.haslayer(IP):
            ipsrc =pkt.getlayer(IP).src
            print ipsrc

    except:
        pass

结果是

Ether / IP / ICMP 10.0.2.15 > 10.0.2.11 echo-request 0 / Raw
Ether / IP / ICMP 10.0.2.15 > 10.0.2.11 echo-request 0 / Raw
Ether / IP / ICMP 10.0.2.15 > 10.0.2.11 echo-request 0 / Raw

所以我无法捕获 ICMP 请求的 IP 源地址有什么想法吗?

4

2 回答 2

1

您的泛型except掩盖了您的代码可能遇到的任何错误。更改passraise删除任何特定错误。例如,我遇到的第一个代码是:

socket.error: [Errno 1] Operation not permitted

root在我得到之后运行:

AttributeError: 'list' object has no attribute 'haslayer'

这使我将代码更改为有效的代码(运行为root):

from scapy.all import *

while 1:

    pktl = sniff ( iface="eth0" , count = 1 )
    pktl.summary()

    for pkt in pktl:
        try:
            if pkt.haslayer(IP):
                ipsrc =pkt.getlayer(IP).src
                print ipsrc
        except:
            raise

因此,您最好删除尝试-完全除外

于 2013-03-22T17:15:28.200 回答
1

@Hussam - 你不需要循环,但如果你使用语法 pkt = sniff() 那么它会返回一个数组。另一种写法是:

#!/usr/bin/env python

from scapy.all import *

pkt = sniff(count=1, filter="ip")

if pkt[0].haslayer(IP):
    print pkt[0][IP].src

您也可以使用传递给 sniff() 的函数来执行此操作,其中每个数据包都作为数据包而不是数组传递给函数。一个例子是:

#!/usr/bin/env python

from scapy.all import *

def print_ip_src(pkt):
    if pkt.haslayer(IP):
        print pkt[IP].src

sniff(prn=print_ip_src, filter="ip")

请注意,没有循环或从函数分配变量。这将无限期运行,每个数据包都将发送到我包含的 print_ip_src() 函数。

PS:我使用 BPF 过滤器仅捕获 IP 数据包,但是无论如何,作为安全措施,您仍然应该包含 haslayer() 函数。

于 2014-04-06T23:56:06.893 回答